backintime-1.2.1/AUTHORS0000644000175000017500000000026113530533316014206 0ustar germargermarOprea Dan () Bart de Koning () Richard Bailey () Germar Reitze () Taylor Raack (taylor@raack.info) backintime-1.2.1/CHANGES0000644000175000017500000013275713530533316014151 0ustar germargermarBack In Time Version 1.2.1 * Fix bug: TypeError in backintime.py if mount failed while running a snapshot (https://github.com/bit-team/backintime/issues/1005) Version 1.2.0 * Fix bug: Exit code is linked to the wrong status message (https://github.com/bit-team/backintime/issues/906) * minor changes to allow running BiT inside Docker (https://github.com/bit-team/backintime/pull/959) * Fix bug: AppName showed 'python3' instead of 'Back In Time' (https://github.com/bit-team/backintime/issues/950) * Fix bug: configured cipher is not used with all ssh-commands (https://github.com/bit-team/backintime/issues/934) * remove progressbar on systray icon until BiT has it's own icon (https://github.com/bit-team/backintime/issues/902) * Fix bug: 'make test' fails because local SSH server is running on non-standard port (https://github.com/bit-team/backintime/issues/945) * clearify 'nocache' option (https://github.com/bit-team/backintime/issues/857) * create a config-backup in root dir if backup is encrypted (https://github.com/bit-team/backintime/issues/556) * Fix bug: 23:00 is missing in the list of every day hours (https://github.com/bit-team/backintime/issues/736) * Fix bug: ssh-agent output changed (https://github.com/bit-team/backintime/issues/840) * remove unused and undocumented userscript plugin * Fix bug: exception on making backintime folder world writeable (https://github.com/bit-team/backintime/issues/812) * Fix bug: stat free space for snapshot folder instead of backintime folder (https://github.com/bit-team/backintime/issues/733) * add contextmenu for logview dialog which can copy, exclude and decode lines * move progressbar under statusbar * Fix bug: backintime root crontab doesn't run; missinng line-feed 0x0A on last line (https://github.com/bit-team/backintime/issues/781) * Fix bug: IndexError in inhibitSuspend (https://github.com/bit-team/backintime/issues/772) * alleviate default exclude [Tt]rash* (https://github.com/bit-team/backintime/issues/759) * enable high DPI scaling (https://github.com/bit-team/backintime/issues/732) * Fix bug: polkit CheckAuthorization: race condition in privilege authorization (https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-7572) * Fix bug: OSError when running backup-job from systemd (https://github.com/bit-team/backintime/issues/720) * Smart Remove try to keep healthy snapshots (https://github.com/bit-team/backintime/issues/703) * Fix critical bug: restore filesystem-root without 'Full rsync mode' with ACL and/or xargs activated broke whole system (https://github.com/bit-team/backintime/issues/708) * Fix bug: use current folder if no file is selected in files view (https://github.com/bit-team/backintime/issues/687, https://github.com/bit-team/backintime/issues/685) * Fix bug: don't reload profile after editing profile name (https://github.com/bit-team/backintime/issues/706) * Fix bug: Exception in FileInfo * ask for restore-to path before confirm (https://github.com/bit-team/backintime/issues/678) * fix 'Back in Time (root)' on wayland (https://github.com/bit-team/backintime/issues/640) * sort int values in config nummerical instead if alphabetical (https://github.com/bit-team/backintime/issues/175#issuecomment-272941811) * set timestamp directly after new snapshot (https://github.com/bit-team/backintime/issues/584) * add shortcut CTRL+H for toggle show hidden files to fileselect dialog (https://github.com/bit-team/backintime/issues/378) * add 'Edit user-callback' dialog * Fix bug: failed to restore suid permissions (https://github.com/bit-team/backintime/issues/661) * redesign restore menu (https://github.com/bit-team/backintime/issues/661) * Fix bug: on remount user-callback got called AFTER trying to mount (https://github.com/bit-team/backintime/issues/654) * add ability to disable SSH command- and ping-check (https://github.com/bit-team/backintime/issues/647) * enable bwlimit for local profiles (https://github.com/bit-team/backintime/issues/646) * import remote host-key into known_hosts from Settings * copy public SSH key to remote host from Settings * create a new SSH key from Settings * Fix bug: confirm restore dialog has no scroll bar (https://github.com/bit-team/backintime/issues/625) * Fix bug: DEFAULT_EXCLUDE not deletable (https://github.com/bit-team/backintime/issues/634) * rename debian package from backintime-qt4 into backintime-qt * rename paths and methods from *qt4* into *qt* * rename executable backintime-qt4 into backintime-qt * new config version 6, rename qt4 keys into qt, add new domain for schedule * check crontab entries on every GUI startup (https://github.com/bit-team/backintime/issues/129) * start a new ssh-agent instance only if necessary * add cli command 'shutdown' (https://github.com/bit-team/backintime/issues/596) * Fix bug: GUI status bar unreadable (https://github.com/bit-team/backintime/issues/612) * Fix bug: udev schedule not working (https://github.com/bit-team/backintime/issues/605) * add cli command 'smart-remove' * make LogView and Settings Dialog non-modal (https://github.com/bit-team/backintime/issues/608) * Fix bug: decode path spooled from /etc/mtab (https://github.com/bit-team/backintime/pull/607) * Fix bug: in snapshots.py, gives more helpful advice if a lock file is present that shouldn't be. (https://github.com/bit-team/backintime/issues/601) * port to Qt5/pyqt5 (https://github.com/bit-team/backintime/issues/518) * Fix bug: Fail to create remote snapshot path with spaces (https://github.com/bit-team/backintime/issues/567) * Fix bug: broken new_snapshot can run into infinite saveToContinue loop (https://github.com/bit-team/backintime/issues/583) * Recognize changes on previous runs while continuing new snapshots * Fix bug: udev schedule didn't work with LUKS encrypted drives (https://github.com/bit-team/backintime/issues/466) * Add pause, resume and stop function for running snapshots (https://github.com/bit-team/backintime/issues/474, https://github.com/bit-team/backintime/issues/195) * Fix bug: sshMaxArg failed on none default ssh port (https://github.com/bit-team/backintime/issues/581) * Fix bug: failed if remote host send SSH banner (https://github.com/bit-team/backintime/issues/581) * Fix bug: incorrect handling of IPv6 addresses (https://github.com/bit-team/backintime/issues/577) * use rsync to save permissions * replace os.system calls with subprocess.Popen * automatically refresh log view if a snapshot is currently running * Fix bug: Snapshot Log View freeze on big log files (https://github.com/bit-team/backintime/issues/456) * Fix bug: 'inotify_add_watch failed: file or directory not found' after deleting snapshot * remove dependency for extended 'find' command on remote host * make full-rsync mode default, remove the other mode * Fix bug: a continued snapshot was not incremental (https://github.com/bit-team/backintime/issues/557) * use rsync to remove snapshots which will give a nice speedup (https://github.com/bit-team/backintime/issues/151) * open temporary local copy of files instead of original backup on double-click in GUI * add option to decrypt paths in systray menu with mode ssh-encrypted * open current log directly from systray icon during taking a snapshot * add tool-tips to restore menu * Fix bug: config backup in snapshot had wrong name if using --config option * add --share-path option * use Monospace font in logview * add restore option --only-new * add button 'Take snapshot with checksums' * Fix bug: Can't open files with spaces in name (https://github.com/bit-team/backintime/issues/552) * Fix bug: BIT-root won't start from .desktop file (https://github.com/bit-team/backintime/issues/549) * Fix bug: Keyring doesn't work with KDE Plasma5 (https://github.com/bit-team/backintime/issues/545) * Fix bug: Qt4 built-in phrases where not translated (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=816197) * Fix bug: configure ingnore unknown args (https://github.com/bit-team/backintime/issues/547) * Fix bug: snapshots-list on command-line was not sorted * Fix bug: SHA256 ssh-key fingerprint was not detected * change default configure option to --no-fuse-group as Ubuntu >= 12.04 don't need fuse group-membership anymore * Fix bug: new snapshot did not show up after finished * Fix bug: TimeLine headers were not correct * Fix lintian warning: manpage-has-errors-from-man: bad argument name 'P' * Fix bug: wildcards ? and [] wasn't recognized correctly * Fix bug: last char of last element in tools.get_rsync_caps got cut off * Fix bug: TypeError in tools.get_git_ref_hash * Do not print 'SnapshotID' or 'SnapshotPath' if running 'snapshots-list' command (and other) with '--quiet' * Remove dependency 'ps' * Fix bug: don't include empty values in list (https://github.com/bit-team/backintime/issues/521) * Fix bug: bash-completion doesn't work for backintime-qt4 * Fix bug: 'make unittest' incorrectly used 'coverage' by default (https://github.com/bit-team/backintime/issues/522) * Fix bug: pm-utils is deprecated; Remove dependency (https://github.com/bit-team/backintime/issues/519) * rewrite huge parts of snapshots.py * remove backwards compatibility to version < 1.0 Version 1.1.12 * Fix bug: remove x-terminal-emulator dependency (https://github.com/bit-team/backintime/issues/515) * Fix bug: AttributeError in About Dialog (https://github.com/bit-team/backintime/issues/515) Version 1.1.10 * Fix bug: failed to remove empty lock file (https://github.com/bit-team/backintime/issues/505) * Add Icon 'show-hidden' (https://github.com/bit-team/backintime/issues/507) * Add Modify for Full System Backup button to settings page, to change some profile settings * Fix bug: Restore the correct file owner and group fail if they are not present in system (https://github.com/bit-team/backintime/issues/58) * add get|set_list_value to configfile * Fix bug: QObject::startTimer error on closing app * subclass ApplicationInstance in GUIApplicationInstance to reduce redundant code * speed up app start by adding snapshots to timeline in background thread * add warning on failed permission restore (https://github.com/bit-team/backintime/issues/58) * add unittest (thanks to Dorian, Alexandre, Aurélien and Gregory from IAGL) * Fix bug: FileNotFoundError while starting pw-cache from source * continue an unfinished new_snapshot if possible (https://github.com/bit-team/backintime/issues/400) * Fix bug: suppress warning about failed inhibit suspend if run as root (https://github.com/bit-team/backintime/issues/500) * Fix bug: UI blocked/greyed out while removing snapshot (https://github.com/bit-team/backintime/issues/487) * Fix bug: pw-cache failed on leftover PID file, using ApplicationInstance now (https://github.com/bit-team/backintime/issues/468) * Fix bug: failed to parse some arguments (https://github.com/bit-team/backintime/issues/492) * Fix bug: failed to start GUI if launched from systray icon * Fix bug: deleted snapshot is still listed in Timeline if using mode SSH (https://github.com/bit-team/backintime/issues/493) * Fix bug: PermissionError while deleting readonly files on sshfs mounted share (https://github.com/bit-team/backintime/issues/490) * Add Nautilus-like shortcuts for navigating in file browser (https://github.com/bit-team/backintime/issues/483) * speed up mounting of SSH+encrypted profiles * Fix bug: creat new encrypted profiles with encfs >= 1.8.0 failed (https://github.com/bit-team/backintime/issues/477) * Fix bug: AttributeError in common/tools.py if keyring is missing (https://github.com/bit-team/backintime/issues/473) * Fix bug: remote rename of 'new_snapshot' folder sometimes isn't recognized locally; rename local now (https://answers.launchpad.net/questions/271792) * Move source code and bug tracking to GitHub Version 1.1.8 * Fix bug: unlock private SSH key run into 5sec timeout if password is empty * show current app name and profile ID in syslog (https://launchpad.net/bugs/906213) * Fix bug: BiT freeze when activate 'Decode path' in 'Snapshot Log View' * Show 'Profiles' dropdown only in 'Last Log Viewer', add 'Snapshots' dropdown in 'Snapshot Log Viewer' (https://launchpad.net/bugs/1478219) * Fix bug: empty grey window appears when starting the gui as root (https://launchpad.net/bugs/1493020) * do not restore permission if they are identical with current permissions * Fix bug: gnu_find_suffix_support doesn't set back to True (https://launchpad.net/bugs/1487781) * security issue: do not run user-callback in a shell * add option to not log user-callback output * Fix lintian warning dbus-policy-without-send-destination * apply timestamps-in-gzip.patch from Debian backintime/1.1.6-1 package * run multiple smart-remove jobs in one screen session (https://launchpad.net/bugs/1487781) * add error messages if PID file creation fail * Fix bug: dbus exception if dbus systembus is not running * Fix bug: depend on virtual package cron-daemon instead of cron for compatiblity with other cron implementations (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776856) * Fix bug: wasn't able to start from alternate install dir (https://launchpad.net/bugs/478689) * Fix bug: wasn't able to start from source dir * Add Warning about unsupported filesystems * use native Python code to check mountpoint * Add expert option for stdout and stderr redirection in cronjobs (https://answers.launchpad.net/questions/270105) * Fix bug: 'Inhibit Suspend' fails with 'org.freedesktop.PowerManagement.Inhibit' (https://launchpad.net/bugs/1485242) * Fix bug: No mounting while selecting a secondary profile in the gui (https://launchpad.net/bugs/1481267) * remove shebang in common/askpass.py and common/create-manpage-backintime-config.py * Fix bug: fix for bug #1419466 broke crontab on Slackware (https://launchpad.net/bugs/1478576) * Fix bug: fix for bug #1431305 broke pw-cache on Ubuntu (https://launchpad.net/bugs/1431305) * Fix bash-complete * show 'man backintime' on Help; remove link to backintime.le-web.org (https://launchpad.net/bugs/1475995) * add --debug argument * Fix bug: Settings accepted empty strings for Host/User/Profile-ID (https://launchpad.net/bugs/1477733) * Fix bug: IndexError on 'check_remote_commands' due to too long args (https://launchpad.net/bugs/1471930) * add --local-backup, --no-local-backup and --delete option to restore on command-line (https://launchpad.net/bugs/1467239) * add 'backup on restore' option to confirm dialog * add check-config command for command-line * rewrite command-line argument parsing. Now using argparse * add expert option SSH command prefix * Fix bug: Makefile has no uninstall target (https://launchpad.net/bugs/1469152) Version 1.1.6 * show Profile name in systrayicon menu * Fix bug: encrypted remote backup hangs on 'start encfsctl encode process' (https://launchpad.net/bugs/1455925) * make own Exceptions a childclass from BackInTimeException * Fix bug: missing profile.name crashed GUI * Fix bug: Segmentation fault caused by two QApplication instances (https://launchpad.net/bugs/1463732) * remove consolekit from dependencies * Fix bug: no Changes [C] log entries with 'Check for changes' disabled (https://launchpad.net/bugs/1463367) * Fix bug: some changed options from Settingsdialog where not respected during automatic tests after hitting OK * Fix bug: python version check fails on python 3.3 (https://launchpad.net/bugs/1463686) * Specifying the SSH private key whenever ssh is called (https://launchpad.net/bugs/1433682) * add to in-/exclude directly from mainwindow (https://launchpad.net/bugs/1454856) * Fix bug: pw-cache didn't start on Mint KDE because of missing stdout and stderr (https://launchpad.net/bugs/1431305) * add option to run Smart Remove in background on remote host (https://launchpad.net/bugs/1457210) * Use current profile when starting GUI from Systray * Fix bug: failed to restore file names with white spaces using CLI (https://launchpad.net/bugs/1435602) * Fix bug: UnboundLocalError with 'last_snapshot' in _free_space (https://launchpad.net/bugs/1437623) Version 1.1.4 * add option to keep new snapshot with 'full rsync mode' regardless of changes (https://launchpad.net/bugs/1434722) * Fix bug: wrong quote in 'Save config file' * Fix bug: Deleting the last snapshot does not update the last_snapshot symlink (https://launchpad.net/bugs/1434724) * remove base64 encoding for passwords as it doesn't add any security but broke the password process (https://launchpad.net/bugs/1431305) * add confirm dialog before restoring (https://launchpad.net/bugs/438079) * Fix bug: Wrong status text in the tray icon (https://launchpad.net/bugs/1429400) * add option to run only one snapshot at a time * Fix bug: restore permissions of lots of files made BackInTime unresposive (https://launchpad.net/bugs/1428423) * Fix bug: failed to restore file owner and group * cache uuid in config so it doesn't fail if the device isn't pluged in (https://launchpad.net/bugs/1426881) * add warning about wrong Python version in configure * prevent snapshots from being removed with restore and delete; show warning if restore and delete filesystem root (https://answers.launchpad.net/questions/262837) * Fix bug: OSError in free_space; add alternate method to get free space * add bash-completion * Fix bug: ugly theme while running as root on Gnome based DEs (https://launchpad.net/bugs/1418447) * Fix bug: filename with broken charset throwed UnicodeError exception (https://launchpad.net/bugs/1419694) * use 'crontab' instead of 'crontab -' to read from stdin (https://launchpad.net/bugs/1419466) Version 1.1.2 * sort 'Backup folders' in main window * save in- and exclude sort order * use PolicyKit to install Udev rules * move compression from install to build in Makefiles * use pkexec to start backintime-qt4 as root Version 1.1.0 * add tooltips for rsync options * make only one debian/control * multiselect files to restore (https://launchpad.net/bugs/1135886) * force run manual snapshots on battery (https://launchpad.net/bugs/861553) * backup encfs config to local config folder * apply 'install-docs-move.patch' from Debian package by Jonathan Wiltshire * add restore option to delete new files during restore (https://launchpad.net/bugs/1371951) * use flock to prevent two instances running at the same time * restore config dialog added (https://launchpad.net/bugs/480391) * inhibit suspend/hibernate while take_snapshot or restore * use more reliable code for get_user * implement anacrons functions inside BIT => more flexible schedules and no new timestamp if there was an error * automatically run in background if started with 'backintime --backup-job' * fix typos and style warnings in manpages reported by Lintian (https://lintian.debian.org/full/jmw@debian.org.html#backintime_1.0.34-0.1) * add exclude files by size (https://launchpad.net/bugs/823719) * remove 'Auto Host/User/Profile-ID' as this is more confiusing than helping * Fix bug: check procname of pid-locks (https://launchpad.net/bugs/1341414) * optional run 'rsync' with 'nocache' (https://launchpad.net/bugs/1344528) * mark invalid exclude pattern with mode ssh-encrypted * make Settingsdialog tabs scrollable * remove colon (:) restriction in exclude pattern * prevent starting new snapshot if restore is running * Fix bug: Port check failed on IPv6 (https://launchpad.net/bugs/1361634) * add top-level directory for tarball (https://launchpad.net/bugs/1359076) * add more user-callback events (on App start and exit, on mount and unmount) * add context menu to files view * remove snapshots from commandline * multi selection in timeline => remove multiple snapshots with one click * print warning if started with sudo * add more default exclude; remove [Cc]ache* from exclude * Fix bug: 'inotify_add_watch failed' while closing BIT * add option for custom rsync-options * add ProgressBar for rsync * add progress for smart-remove * remove old status-bar message after a snapshot crashed. * ask to include symlinks target instead link (https://launchpad.net/bugs/1117709) * port to Python 3.x * returncode >0 if there was an error (https://launchpad.net/bugs/1040995) * Enable user-callback script to cancel a backup by returning a non-zero exit code. * merge backintime-notify into backintime-qt4 * add --gksu/--gksudo arg to qt4/configure * remember last path for each profile (https://bugs.launchpad.net/bugs/1254870) * sort include and exclude list (https://bugs.launchpad.net/bugs/1193149) * Timeline show tooltip 'Last check' * Fix bug: systray icon didn't show up (https://bugs.launchpad.net/backintime/+bug/658424) * show hidden files in FileDialog (https://bugs.launchpad.net/backintime/+bug/995925) * add button text for all buttons (https://bugs.launchpad.net/backintime/+bug/992020) * add shortcuts (https://bugs.launchpad.net/backintime/+bug/686694) * add menubar (https://bugs.launchpad.net/backintime/+bug/528851) * port KDE4 GUI to pure Qt4 to replace both KDE4 and Gnome GUI Version 1.0.40 * use fingerprint to check if ssh key was unlocked correctly (https://answers.launchpad.net/questions/256408) * add fallback method to get UUID (https://answers.launchpad.net/questions/254140) * Fix bug: 'Attempt to unlock mutex that was not locked'... this time for good Version 1.0.38 * Fix bug: 'Attempt to unlock mutex that was not locked' in gnomeplugin (https://answers.launchpad.net/questions/255225) * compare os.path.realpath instead of os.stat to get devices UUID * Fix bug: housekeeping by gnome-session-daemon might delete backup and original data (https://bugs.launchpad.net/bugs/1374343) * Fix bug: Type Error in 'backintime --decode' (https://bugs.launchpad.net/bugs/1365072) * Fix bug: take_snapshot didn't wait for snapshot folder come available if notifications are disabled (https://bugs.launchpad.net/bugs/1332979) Version 1.0.36 * remove UbuntuOne from exclude (https://bugs.launchpad.net/bugs/1340131) * Gray out 'Add Profile' if 'Main Profile' isn't configured yet (https://bugs.launchpad.net/bugs/1335545) * Don't check for fuse group-membership if group doesn't exist * Fix bug: backintime-kde4 as root failed to load ssh-key (https://bugs.launchpad.net/bugs/1276348) * Fix bug: kdesystrayicon.py crashes because of missing environ (https://bugs.launchpad.net/bugs/1332126) * Fix bug: OSError if sshfs/encfs is not installed (https://bugs.launchpad.net/bugs/1316288) * Fix bug: TypeError in config.py check_config() (https://bugzilla.redhat.com/show_bug.cgi?id=1091644) * Fix bug: unhandled exception in create_last_snapshot_symlink() (https://bugs.launchpad.net/bugs/1269991) * disable keyring for root Version 1.0.34 * sync/flush all disks before shutdown (https://bugs.launchpad.net/bugs/1261031) * Fix bug: BIT running as root shutdown after snapshot, regardless of option checked (https://bugs.launchpad.net/bugs/1261022) Version 1.0.32 * Fix bug: cron scheduled snapshots won't start with 1.0.30 Version 1.0.30 * scheduled and manual snapshots use --config * make configure scripts portable (https://bugs.launchpad.net/backintime/+bug/377429) * Fix bug: udev rule doesn't finish (https://bugs.launchpad.net/backintime/+bug/1249466) * add symlink last_snapshot (https://bugs.launchpad.net/backintime/+bug/787118) * add virtual package backintime-kde for PPA * Fix multiple errors in PPA build process; reorganise updateversion.sh * Fix bug: Mate and xfce desktop didn't show systray icon (https://bugs.launchpad.net/backintime/+bug/658424/comments/31) * add option to run rsync with 'nice' or 'ionice' on remote host (https://bugs.launchpad.net/backintime/+bug/1240301) * add Shutdown button to shutdown system after snapshot has finished (https://bugs.launchpad.net/backintime/+bug/838742) * Fix bug: Ubuntu Lucid dosn't provide SecretServiceKeyring (https://bugs.launchpad.net/backintime/+bug/1243911) * wrap long lines for syslog * Fix bug: 'gksu backintime-gnome' failed with dbus.exceptions.DBusException Version 1.0.28 * remove config on 'apt-get purge' * add more options for configure scripts; update README * add udev schedule (run BIT as soon as the drive is connected) * Fix bug: AttributeError with python-keyring>1.6.1 (https://bugs.launchpad.net/backintime/+bug/1234024) * Fix bug: TypeError: KDirModel.removeColumns() is a private method in kde4/app.py (https://bugs.launchpad.net/backintime/+bug/1232694) * add '--checksum' commandline option (https://bugs.launchpad.net/backintime/+bug/886021) * Fix bug: sshfs mount disconnect after a while due to some firewalls (add ServerAliveInterval) (https://answers.launchpad.net/backintime/+question/235685) * Fix bug: Ping fails if ICMP is disabled on remote host (https://bugs.launchpad.net/backintime/+bug/1226718) * Fix bug: KeyError in getgrnam if there is no 'fuse' group (https://bugs.launchpad.net/backintime/+bug/1225561) * Fix bug: anacrontab won't work with profilename with spaces (https://bugs.launchpad.net/backintime/+bug/1224620) * Fix bug: NameError in tools.move_snapshots_folder (https://bugs.launchpad.net/backintime/+bug/871466) * Fix bug: KPassivePopup is not defined (https://bugs.launchpad.net/backintime/+bug/871475) * multi selection for include and exclude list (https://bugs.launchpad.net/backintime/+bug/660753) * Fix bug: ValueError while reading pw-cache PID (https://answers.launchpad.net/backintime/+question/235407) Version 1.0.26 * add feature: keep min free inodes * roll back commit 836.1.5 (check free-space on ssh remote host): statvfs DOES work over sshfs. But not with quite outdated sshd * add daily anacron schedule * add delete button and 'list only equal' in Snapshot dialog; multiSelect in snapshot list * add manpage backintime-config and config-examples * Fix bug: Restore makes files public during the operation * Fix bug: Cannot keep modifications to cron (https://bugs.launchpad.net/backintime/+bug/698106) * add feature: restore from command line; add option --config * Fix bug: cannot stat 'backintime-kde4-root.desktop.kdesudo' (https://bugs.launchpad.net/backintime/+bug/696659) * Fix bug: unreadable dark KDE color schemes (https://bugs.launchpad.net/backintime/+bug/1184920) * use 'ps ax' to check if 'backintime --pw-cache' is still running * mount after locking, unmount before unlocking in take_snapshot * Fix bug: permission denied if remote uid wasn't the same as local uid * add option --bwlimit for rsync * redirect logger.error and .warning to stderr; new argument --quiet * deactivate 'Save Password' if no keyring is available * use Password-cache for user-input too * handle two Passwords * add 'SSH encrypted': mount / with encfs reverse and sync encrypted with rsync. EXPERIMENTEL! * add 'Local encrypted': mount encfs Version 1.0.24 * hide check_for_canges if full_rsync_mode is checked * DEFAULT_EXCLUDE system folders with /foo/* so at least the folder itself will backup * DEFAULT_EXCLUDE /run; exclude MOUNT_ROOT with higher priority and not with DEFAULT_EXCLUDE anymore * Fix bug: 'CalledProcessError' object has no attribute 'strerror' * Fix bug: quote rsync remote path with spaces * 'Save Password' default off to avoid problems with existing profiles * if restore uid/gid failed try to restore at least gid * SSH need to store permissions in seperate file with "Full rsync mode" because remote user might not be able to store ownership * Fix bug: restore permission failed on "Full rsync mode" * Fix bug: glib.GError: Unknown internal child: selection * Fix bug: GtkWarning: Unknown property: GtkLabel.margin-top * Fix bug: check keyring backend only if password is needed * switch to 'find -exec cmd {} +' (https://bugs.launchpad.net/backintime/+bug/1157639) * change all indent tabs to 4 spaces Version 1.0.22 * check free-space on ssh remote host (statvfs didn't work over sshfs) * Add Password storage mode ssh * Add "Full rsync mode" (can be faster but ...) * Fix bug: "Restore to..." failed due to spaces in directory name (https://bugs.launchpad.net/backintime/+bug/1096319) * Fix bug: host not found in known_hosts if port != 22 (https://bugs.launchpad.net/backintime/+bug/1130356) * Fix bug: sshtools.py used not POSIX conform conditionals Version 1.0.20 * Fix bug: restore remote path with spaces using mode ssh returned error Version 1.0.18 * Fix packages: man & translations * Fix bug: https://bugs.launchpad.net/backintime/+bug/1077446 * Fix bug: https://bugs.launchpad.net/backintime/+bug/1078979 * Fix bug: https://bugs.launchpad.net/backintime/+bug/1079479 * Map multiple arguments for gettext so they can be rearranged by translators Version 1.0.16 * Fix a package dependecy problem ... this time for good (https://bugs.launchpad.net/backintime/+bug/1077446) Version 1.0.14 * Fix a package dependecy problem Versoin 1.0.12 * Add links to: website, documentation, report a bug, answers, faq * Use libnotify for gnome/kde4 notifications instead of gnome specific libraries * Fix bug: https://bugs.launchpad.net/backintime/+bug/1059247 * Add more schedule options: every 30 min, every 2 hours, every 4 hours, every 6 hours & every 12 hours * Add generic mount-framework * Add mode 'SSH' for backups on remote host using ssh protocol. * Fix bug: wrong path if restore system root * Fix bug: glade (xml) files did not translate * Fix bug: https://bugs.launchpad.net/backintime/+bug/1073867 Version 1.0.10 * Add "Restore to ..." in replacement of copy (with or without drag & drop) because copy don't restore user/group/rights Version 1.0.8 * Fix bug: https://bugs.launchpad.net/backintime/+bug/723545 * Fix bug: https://bugs.launchpad.net/backintime/+bug/705237 * Fix bug: https://bugs.launchpad.net/backintime/+bug/696663 * Fix bug: https://bugs.launchpad.net/backintime/+bug/671946 Version 1.0.6 * Fix bug: https://bugs.launchpad.net/backintime/+bug/676223 * Smart remove: configurable options (https://bugs.launchpad.net/backintime/+bug/406765) * Fix bug: https://bugs.launchpad.net/backintime/+bug/672705 Version 1.0.4 * SettingsDialog: show highly recommended excludes * Fix bug: https://bugs.launchpad.net/backintime/+bug/664783 * Option to use checksum to detect changes (https://bugs.launchpad.net/backintime/+bug/666964) * Option to select log verbosity (https://bugs.launchpad.net/backintime/+bug/664423) * Gnome: use gloobus-preview if installed Version 1.0.2 * reduce log file (no more duplicate "Compare with..." lines) * declare backintime-kde4 packages as a replacement of backintime-kde Version 1.0 * add '.dropbox*' to default exclude patterns (https://bugs.launchpad.net/backintime/+bug/628172) * add option to take a snapshot at every boot (https://bugs.launchpad.net/backintime/+bug/621810) * fix xattr * add continue on errors (https://bugs.launchpad.net/backintime/+bug/616299) * add expert options: copy unsafe links & copy links * "user-callback" replace "user.callback" and receive profile informations * documentation: on-line only (easier to maintain) * add error log and error log view dialog (Gnome & KDE4) * merge with: lp:~dave2010/backintime/minor-edits * merge with: lp:~mcfonty/backintime/unique-snapshots-view * fix bug: https://bugs.launchpad.net/backintime/+bug/588841 * fix bug: https://bugs.launchpad.net/backintime/+bug/588215 * fix bug: https://bugs.launchpad.net/backintime/+bug/588393 * fix bug: https://bugs.launchpad.net/backintime/+bug/426400 * fix bug: https://bugs.launchpad.net/backintime/+bug/575022 * fix bug: https://bugs.launchpad.net/backintime/+bug/571894 * fix bug: https://bugs.launchpad.net/backintime/+bug/553441 * fix bug: https://bugs.launchpad.net/backintime/+bug/550765 * fix bug: https://bugs.launchpad.net/backintime/+bug/507246 * fix bug: https://bugs.launchpad.net/backintime/+bug/538855 * fix bug: https://bugs.launchpad.net/backintime/+bug/386230 * fix bug: https://bugs.launchpad.net/backintime/+bug/527039 * reduce memory usage during compare with previous snapshot process * fix bug: https://bugs.launchpad.net/backintime/+bug/520956 * fix bug: https://bugs.launchpad.net/backintime/+bug/520930 * fix bug: https://bugs.launchpad.net/backintime/+bug/521223 * custom backup hour (for daily backups or mode): https://bugs.launchpad.net/backintime/+bug/507451 * fix bug: https://bugs.launchpad.net/backintime/+bug/516066 * fix bug: https://bugs.launchpad.net/backintime/+bug/512813 * smart remove was slightly changed (https://bugs.launchpad.net/backintime/+bug/502435) * fix bug: https://bugs.launchpad.net/backintime/+bug/503859 * make backup on restore optional * fix bug: https://bugs.launchpad.net/backintime/+bug/501285 * add ionice support for user/cron backup process * fix bug: https://bugs.launchpad.net/backintime/+bug/493558 * fix bug that could cause "ghost" folders in snapshots (LP: 406092) * fix bug that converted / into // (LP: #455149) * fix bug: https://bugs.launchpad.net/backintime/+bug/441628 * remove "schedule per included directory" (profiles do that) (+ bug LP: #412470) * fig bug: https://bugs.launchpad.net/backintime/+bug/489380 * fix bug: https://bugs.launchpad.net/backintime/+bug/489319 * fix bug: https://bugs.launchpad.net/backintime/+bug/447841 * fix bug: https://bugs.launchpad.net/backintime/+bug/412695 * update Slovak translation (Tomáš Vadina ) * multiple profiles support * GNOME: fix notification * backintime snapshot folder is restructured to ../backintime/machine/user/profile_id/ * added the possibility to include other snapshot folders within a profile, it can only read those, there is not a GUI implementation yet * added a tag suffix to the snapshot_id, to avoid double snapshot_ids * added a desktop file for kdesu and a test if kdesu or kdesudo should be used (LP: #389988) * added expert option to disable snapshots when on battery (LP: #388178) * fix bug handling big files by the GNOME GUI (LP: #409130) * fix bug in handling of & characters by GNOME GUI (LP: #415848) * fix a security bug in chmods before snapshot removal (LP: #419774) * snapshots are stored entirely read-only (LP: #386275) * fix exclude patterns in KDE4 (LP:#432537) * fix opening german files with external applications in KDE (LP: #404652) * changed default exclude patterns to caches, thumbnails, trashbins, and backups (LP: #422132) * write access to snapshot folder is checked & change to snapshot version 2 (LP: #423086) * fix small bugs (a.o. LP: #474307) * Used a more standard crontab syntax (LP: #409783) * Stop the "Over zealous removal of crontab entries" (LP: #451811) Version 0.9.26 * update translations from Launchpad * Fix a bug in smart-remove algorithm (https://bugs.launchpad.net/backintime/+bug/376104) * Fix bug: https://bugs.launchpad.net/backintime/+bug/374477 * Fix bug: https://bugs.launchpad.net/backintime/+bug/375113 * update German translation (Michael Wiedmann ) * add '--no-check' option to configure scripts * use only 'folder' term (more consistent with GNOME/KDE) * add 'expert option': enable/disable nice for cron jobs * GNOME & KDE4: refresh snapshots button force files view to update too * you can include a backup parent directory (backup directory will auto-exclude itself) * fix some small bugs Version 0.9.24 * update translations * KDE4: fix python string <=> QString problems * KDE4 FilesView/SnapshotsDialog: ctrl-click just select (don't execute) * KDE4: fix crush after "take snapshot" process (https://bugs.launchpad.net/backintime/+bug/366241) * store basic permission in a special file so it can restore them correctly (event from NTFS) * add config version * implement Gnome/KDE4 systray icons and user.callback as plugins * reorganize code: common/GNOME/KDE4 * GNOME: break the big glade file in multiple file * backintime is no longer aware of 'backintime-gnome' and 'backintime-kde4' (you need run 'backintime-gnome' for GNOME version and 'backintime-kde4' for KDE4 version) Version 0.9.22.1 * fix French translation Version 0.9.22 * update translations from Launchpad * KDE4: fix some translation problems * remove --safe-links for save/restore (this means copy symlinks as symlinks) * update German translation (Michael Wiedmann ) * create directory now use python os.makedirs (replace use of mkdir command) * KDE4: fix a crush related to QString - python string conversion * GNOME & KDE4 SettingsDialog: if schedule automatic backups per directory is set, global schedule is hidden * GNOME FilesView: thread "*~" files (backup files) as hidden files * GNOME: use gtk-preferences icon for SettingsDialog (replace gtk-execute icon) * expert option: $XDG_CONFIG_HOME/backintime/user.callback (if exists) is called a different steps of a "take snapshot" process (before, after, on error, is a new snapshot was taken). * add more command line options: --snapshots-list, --snapshots-list-path, --last-snapshot, --last-snapshot-path * follow FreeDesktop directories specs: $XDG_DATA_HOME (default: $HOME/.local/share) to store app.lock files $XDG_CONFIG_HOME (default: $HOME/.config) to save settings * new install system: use more common steps (./configure; make; sudo make install) Version 0.9.20 * smart remove: fix an important bug and make it more verbose in syslog * update Spanish translation (Francisco Manuel García Claramonte ) Version 0.9.18 * update translations from Launchpad * update Slovak translation (Tomáš Vadina ) * update French translation (Michel Corps ) * update German translation (Michael Wiedmann ) * GNOME bugfix: fix a crush in files view for files with special characters (ex: "a%20b") * GNOME SettingsDialog bugfix: if snapshots path is a new created folder, snapshots navigation (files view) don't work * update doc * GNOME & KDE4 MainWindow: Rename "Places" list with "Snapshots" * GNOME SettingsDialog bugfix: modify something, then press cancel. If you reopen the dialog it show wrong values (the ones before cancel) * GNOME & KDE4: add root mode menu entries (use gksu for gnome and kdesudo for kde) * GNOME & KDE4: MainWindow - Files view: if the current directory don't exists in current snapshot display a message * SettingDialog: add an expert option to enable to schedule automatic backups per directory * SettingDialog: schedule automatic backups - if the application can't find crontab it show an error * SettingDialog: if the application can't write in snapshots directory there should be an error message * add Polish translation (Paweł Hołuj ) * add cron in common package dependencies * GNOME & KDE4: rework settings dialog * SettingDialog: add an option to enable/disable notifications Version 0.9.16.1 * fix a bug/crush for French version Version 0.9.16 * update Spanish translation (Francisco Manuel García Claramonte ) * add Slovak translation (Tomáš Vadina ) * update Swedish translation (Niklas Grahn ) * update French translation (Michel Corps ) * update German translation (Michael Wiedmann ) * update Slovenian translation (Vanja Cvelbar ) * don't show the snapshot that is being taken in snapshots list * GNOME & KDE4: when the application starts and snapshots directory don't exists show a messagebox * give more information for 'take snapshot' progress (to prove that is not blocked) * MainWindow: rename 'Timeline' column with 'Snapshots' * when it tries to take a snapshot if the snapshots directory don't exists (it is on a removable drive that is not plugged) it will notify and wait maximum 30 seconds (for the drive to be plugged) * GNOME & KDE4: add notify if the snapshots directory don't exists * KDE4: rework MainWindow Version 0.9.14 * update German translation (Michael Wiedmann ) * update Swedish translation (Niklas Grahn ) * update Spanish translation (Francisco Manuel García Claramonte ) * update French translation (Michel Corps ) * GNOME & KDE4: rework MainWindow * GNOME & KDE4: rework SettingsDialog * GNOME & KDE4: add "smart" remove Version 0.9.12 * bug fix: now if you include ".abc" folder and exclude ".*", ".abc" will be saved in the snapshot * KDE4: add help * add Slovenian translation (Vanja Cvelbar ) * bug fix (GNOME): bookmarks with special characters Version 0.9.10 * add Swedish translation (Niklas Grahn ) * KDE4: drop and drop from backintime files view to any file manager * bug fix: fix a segfault when running from cron Version 0.9.8 * update Spanish translation (Francisco Manuel García Claramonte ) * bug fix: unable to restore files that contains space char in their name * unsafe links are ignored (that means that a link to a file/directory outside of include directories are ignored) * KDE4: add copy to clipboard * KDE4: sort files by name, size or date * cron 5/10 minutes: replace mutiple lines with a single crontab line using divide (*/5 or */10) * cron: when called from cron redirect output (stdout & stderr) to /dev/null Version 0.9.6 * update Spanish translation (Francisco Manuel García Claramonte ) * update German translation (Michael Wiedmann ) * GNOME: update docbook * KDE4: add snapshots dialog * GNOME & KDE4: add update snapshots button * GNOME: handle special folders icons (home, desktop) Version 0.9.4 * update German translation (Michael Wiedmann ) * gnome: better handling of 'take snapshot' status icon * KDE4 (>= 4.1): first version (not finished) * update man Version 0.9.2 * update Spanish translation (Francisco Manuel García Claramonte ) * update German translation (Michael Wiedmann ) * bug fix: if you add "/a" in include directories and "/a/b" in exclude patterns, "/a/b*" items are not excluded * replace diff with rsync to check if a new snapshot is needed * code cleanup * add show hidden & backup files toggle button for files view * bug fix: it does not include ".*" items even if they are not excluded (the items was included but not showed because hidden & backup files was never displayed in files view in previous versions) Version 0.9 * update Spanish translation (Francisco Manuel García Claramonte ) * make deb packages more debian friendly (thanks to Michael Wiedmann ) * update German translation (Michael Wiedmann ) * bug fix: when you open snapshots dialog for the second time ( or more ) and you make a diff it will make the diff on the file for the first dialog ( all previous dialogs ) and then for the current one * better separation between common and gnome specific files and divide backintime package in backintime-common & backintime-gnome (this will allow me to write other GUI front-ends like KDE4 or KDE) * code cleanup Version 0.8.20 * bug fix: sorting files/directories by name is now case insensitive * getmessages.sh: ignore "gtk-" items (this are gtk stock item ids and should not be changed) Version 0.8.18 * update man/docbook * add sort columns in MainWindow/FileView (by name, by size or by date) and SnapshotsDialog (by date) * fix German translation (Michael Wiedmann ) Version 0.8.16 * add Drag & Drop from MainWindow:FileView/SnapshotsDialog to Nautilus * update German translation (Michael Wiedmann ) Version 0.8.14 * add more command line parameters ( --version, --snapshots, --help ) * fix a crush for getting info on dead symbolic links * when taking a new backup based on the previous one don't copy the previous extra info (ex: name) * copy unsafe links when taking a snapshot Version 0.8.12 * add German translation (Michael Wiedmann ) * add SnapshotNameDialog * add Name/Remove snapshot in main toolbar * change the way it detects if the mainwindow is the ative window (no dialogs) * toolbars: show icons only * update Spanish translation (Francisco Manuel García Claramonte ) Version 0.8.10 * SnapshotsDialog: add right-click popup-menu and a toolbar with copy & restore buttons * use a more robust backup lock file * log using syslog * fix a small bug in copy to clipboard * update Spanish translation (Francisco Manuel García Claramonte ) Version 0.8.8 * SnapshotsDialog: add diff * update Spanish translation (Francisco Manuel García Claramonte ) Version 0.8.6 * fix change backup path crush * add SnapshotsDialog Version 0.8.2 * add right-click menu in files list: open (using gnome-open), copy (you can paste in Nautilus), restore (for snapshots only) * add Copy toolbar button for files list Version 0.8.1 * add every 5/10 minutes automatic backup Version 0.8 * don't show backup files (*~) * add backup files to default exclude patterns (*~) * makedeb.sh: make a single package with all languages included * install.sh: install all languages * add English manual (man) * add English help (docbook) * add help button in main toolbar * the application can be started with a 'path' to a folder or file as command line parameter * when the application start, if it is already runnig pass its command line to the first instance (this allow a basic integration with file-managers - see README) * bug fix: when the application was started a second time it raise the first application's window but not always focused Version 0.7.4 * if there is already a GUI instance running raise it * add Spanish translation (Francisco Manuel García Claramonte ) Version 0.7.2 * better integration with gnome icons (use mime-types) * remember last path * capitalize month in timeline (bug in french translation) Version 0.7 * fix cron segfault * fix a crush when launched the very first time (not configured) * multi-lingual support * add French translation Version 0.6.4 * remove About & Settings dialogs from the pager * allow only one instance of the application Version 0.6.2 * remember window position & size Version 0.6 * when it make a snapshot it display an icon in systray area * the background color for group items in timeline and places reflect more the system color scheme * during restore only restore button is grayed ( even if everything is blocked ) Version 0.5.1 * add size & date columns in files view * changed some texts Version 0.5 * This is the first release. backintime-1.2.1/LICENSE0000644000175000017500000004310313530533316014145 0ustar germargermar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. backintime-1.2.1/TODO0000644000175000017500000000041713530533316013631 0ustar germargermarTODO: * use rsync return code to check that the snapshot was really taken (no out of space, copy error ...) * uid/gid translate table with 'Full rsync mode' * grep DBUS_SESSION_BUS_ADDRESS from session-managers environ (https://github.com/bit-team/backintime/issues/723) backintime-1.2.1/README.md0000644000175000017500000000734513530533316014427 0ustar germargermar# Back In Time Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze, Taylor Raack [![Build Status](https://travis-ci.org/bit-team/backintime.svg?branch=master)](https://travis-ci.org/bit-team/backintime) [![Coverage Status](https://coveralls.io/repos/github/bit-team/backintime/badge.svg?branch=master)](https://coveralls.io/github/bit-team/backintime?branch=master) [![Documentation Status](https://readthedocs.org/projects/backintime-dev/badge/?version=latest)](http://backintime.readthedocs.org/projects/backintime-dev/en/latest/?badge=latest) ## About Back In Time is a simple backup tool for Linux, inspired by "flyback project". It provides a command line client 'backintime' and a Qt5 GUI 'backintime-qt' both written in Python3. You only need to specify 3 things: * where to save snapshots * what folders to backup * backup frequency (manual, every hour, every day, every month) ## Documentation The documentation is currently under development in https://backintime.readthedocs.org/ ## Support Please ask questions and report bug on https://github.com/bit-team/backintime/issues ## Download Please find the latest versions on https://github.com/bit-team/backintime/releases/latest ## INSTALL Back In Time is included in many distributions and can be installed from their repositories. ##### Ubuntu PPA We provide a PPA (Private Package Archive) with current stable version (ppa:bit-team/stable) and a testing PPA (ppa:bit-team/testing) sudo add-apt-repository ppa:bit-team/stable sudo apt-get update sudo apt-get install backintime-qt4 or sudo add-apt-repository ppa:bit-team/testing sudo apt-get update sudo apt-get install backintime-qt ##### Debian/Ubuntu make packages ./makedeb.sh sudo dpkg -i ../backintime-common-.deb sudo dpkg -i ../backintime-qt-.deb ##### ArchLinux Back In Time is available through AUR. You need to import a public key once before installing gpg --keyserver pgp.mit.edu --recv-keys 615F366D944B4826 # Fingerprint: 3E70 692E E3DB 8BDD A599 1C90 615F 366D 944B 4826 wget https://aur.archlinux.org/cgit/aur.git/snapshot/backintime.tar.gz tar xvzf backintime.tar.gz cd backintime makepkg -srci ### From sources ##### Common * dependencies - python3 (>= 3.3) - rsync - cron-daemon - openssh-client - python3-keyring - python3-dbus * recomended - sshfs - encfs * Command cd common ./configure make make test sudo make install ##### Qt5 GUI * dependencies - x11-utils - python3-pyqt5 - libnotify-bin - policykit-1 - python3-dbus.mainloop.pyqt5 - backintime-common * recomended - python3-secretstorage or - python3-keyring-kwallet or - python3-gnomekeyring - kompare or - meld * Command cd qt ./configure make sudo make install ## configure options first value is default: --no-fuse-group | --fuse-group (only COMMON) Some distributions require user to be in group 'fuse' to use sshfs and encfs. This toggles the check on or off. --python3 | --python (all) Use either 'python3' or 'python' to start Python Version 3.x ## NewsFeed Back In Time has a RSS feed https://feeds.launchpad.net/backintime/announcements.atom ## Contribute There is a dev-docu on https://backintime-dev.readthedocs.org It's not complete yet but I'm working on it. If you'd like to contribute please add docstrings following the [Google style guide](https://sphinxcontrib-napoleon.readthedocs.org/en/latest/example_google.html) and add unit-tests for new methods in common. To run unit-test locally you can run `cd common && ./configure && make test` December 2016 backintime-1.2.1/TRANSLATIONS0000644000175000017500000000100513530533316014777 0ustar germargermarSpanish: Francisco Manuel García Claramonte German: Michael Wiedmann Swedish: Niklas Grahn Slovenian: Vanja Cvelbar French: Michel Corps Slovak: Tomáš Vadina Polish: Paweł Hołuj Russian: Vadim Peretokin Other languages: Launchpad translators backintime-1.2.1/VERSION0000644000175000017500000000000613530533316014203 0ustar germargermar1.2.1 backintime-1.2.1/makedeb.sh0000755000175000017500000000013213530533316015062 0ustar germargermar#!/bin/bash PKGNAME=backintime PKGVER=$(cat VERSION) ARCH=all dpkg-buildpackage -us -uc backintime-1.2.1/common/0000755000175000017500000000000013530533316014427 5ustar germargermarbackintime-1.2.1/common/backintime0000755000175000017500000000206313530533316016464 0ustar germargermar#!/bin/sh # Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. CUR_PATH="$(dirname $(readlink -m $0))" if [ -f "${CUR_PATH}/backintime.py" ]; then APP_PATH=$CUR_PATH else APP_PATH=$(readlink -m "${CUR_PATH}/../share/backintime/common") fi python3 -Es $APP_PATH/backintime.py "$@" backintime-1.2.1/common/man/0000755000175000017500000000000013530533316015202 5ustar germargermarbackintime-1.2.1/common/man/C/0000755000175000017500000000000013530533316015364 5ustar germargermarbackintime-1.2.1/common/man/C/backintime-config.10000644000175000017500000004356113530533316021030 0ustar germargermar.TH backintime-config 1 "Nov 2017" "version 1.2.1" "USER COMMANDS" .SH NAME config \- BackInTime configuration files. .SH SYNOPSIS ~/.config/backintime/config .br /etc/backintime/config .SH DESCRIPTION Back In Time was developed as pure GUI program and so most functions are only useable with backintime-qt. But it is possible to use Back In Time e.g. on a headless server. You have to create the configuration file (~/.config/backintime/config) manually. Look inside /usr/share/doc/backintime\-common/examples/ for examples. .PP The configuration file has the following format: .br keyword=arguments .PP Arguments don't need to be quoted. All characters are allowed except '='. .PP Run 'backintime check-config' to verify the configfile, create the snapshot folder and crontab entries. .SH POSSIBLE KEYWORDS .IP "\fIconfig.version\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Internal version of current config .PP Default: 6 .RE .IP "\fIglobal.hash_collision\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Internal value used to prevent hash collisions on mountpoints. Do not change this. .PP Default: 0 .RE .IP "\fIglobal.use_flock\fR" 6 .RS Type: bool Allowed Values: true|false .br Prevent multiple snapshots (from different profiles or users) to be run at the same time .PP Default: false .RE .IP "\fIprofile.name\fR" 6 .RS Type: str Allowed Values: text .br Name of this profile. .PP Default: Main profile .RE .IP "\fIprofile.schedule.custom_time\fR" 6 .RS Type: str Allowed Values: comma separated int (8,12,18,23) or */3 .br Custom hours for cronjob. Only valid for \fIprofile.schedule.mode\fR = 19 .PP Default: 8,12,18,23 .RE .IP "\fIprofile.schedule.day\fR" 6 .RS Type: int Allowed Values: 1-28 .br Which day of month the cronjob should run? Only valid for \fIprofile.schedule.mode\fR >= 40 .PP Default: 1 .RE .IP "\fIprofile.schedule.mode\fR" 6 .RS Type: int Allowed Values: 0|1|2|4|7|10|12|14|16|18|19|20|25|27|30|40|80 .br Which schedule used for crontab. The crontab entry will be generated with 'backintime check-config'. .br 0 = Disabled .br 1 = at every boot .br 2 = every 5 minute .br 4 = every 10 minute .br 7 = every 30 minute .br 10 = every hour .br 12 = every 2 hours .br 14 = every 4 hours .br 16 = every 6 hours .br 18 = every 12 hours .br 19 = custom defined hours .br 20 = every day .br 25 = daily anacron .br 27 = when drive get connected .br 30 = every week .br 40 = every month .br 80 = every year .PP Default: 0 .RE .IP "\fIprofile.schedule.repeatedly.period\fR" 6 .RS Type: int Allowed Values: 0-99999 .br How many units to wait between new snapshots with anacron? Only valid for \fIprofile.schedule.mode\fR = 25|27 .PP Default: 1 .RE .IP "\fIprofile.schedule.repeatedly.unit\fR" 6 .RS Type: int Allowed Values: 10|20|30|40 .br Units to wait between new snapshots with anacron. .br 10 = hours .br 20 = days .br 30 = weeks .br 40 = months .br Only valid for \fIprofile.schedule.mode\fR = 25|27 .PP Default: 20 .RE .IP "\fIprofile.schedule.time\fR" 6 .RS Type: int Allowed Values: 0-24 .br What time the cronjob should run? Only valid for \fIprofile.schedule.mode\fR >= 20 .PP Default: 0 .RE .IP "\fIprofile.schedule.weekday\fR" 6 .RS Type: int Allowed Values: 1 = monday \- 7 = sunday .br Which day of week the cronjob should run? Only valid for \fIprofile.schedule.mode\fR = 30 .PP Default: 7 .RE .IP "\fIprofile.snapshots.backup_on_restore.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Rename existing files before restore into FILE.backup.YYYYMMDD .PP Default: true .RE .IP "\fIprofile.snapshots.bwlimit.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Limit rsync bandwidth usage over network. Use this with mode SSH. For mode Local you should rather use ionice. .PP Default: false .RE .IP "\fIprofile.snapshots.bwlimit.value\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Bandwidth limit in KB/sec. .PP Default: 3000 .RE .IP "\fIprofile.snapshots.continue_on_errors\fR" 6 .RS Type: bool Allowed Values: true|false .br Continue on errors. This will keep incomplete snapshots rather than deleting and start over again. .PP Default: true .RE .IP "\fIprofile.snapshots.copy_links\fR" 6 .RS Type: bool Allowed Values: true|false .br When symlinks are encountered, the item that they point to (the reference) is copied, rather than the symlink. .PP Default: false .RE .IP "\fIprofile.snapshots.copy_unsafe_links\fR" 6 .RS Type: bool Allowed Values: true|false .br This tells rsync to copy the referent of symbolic links that point outside the copied tree. Absolute symlinks are also treated like ordinary files. .PP Default: false .RE .IP "\fIprofile.snapshots.cron.ionice\fR" 6 .RS Type: bool Allowed Values: true|false .br Run cronjobs with 'ionice \-c2 \-n7'. This will give BackInTime the lowest IO bandwidth priority to not interrupt any other working process. .PP Default: true .RE .IP "\fIprofile.snapshots.cron.nice\fR" 6 .RS Type: bool Allowed Values: true|false .br Run cronjobs with 'nice \-n19'. This will give BackInTime the lowest CPU priority to not interrupt any other working process. .PP Default: true .RE .IP "\fIprofile.snapshots.cron.redirect_stderr\fR" 6 .RS Type: bool Allowed Values: true|false .br redirect stderr to /dev/null in cronjobs .PP Default: False .RE .IP "\fIprofile.snapshots.cron.redirect_stdout\fR" 6 .RS Type: bool Allowed Values: true|false .br redirect stdout to /dev/null in cronjobs .PP Default: true .RE .IP "\fIprofile.snapshots.dont_remove_named_snapshots\fR" 6 .RS Type: bool Allowed Values: true|false .br Keep snapshots with names during smart_remove. .PP Default: true .RE .IP "\fIprofile.snapshots.exclude.bysize.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Enable exclude files by size. .PP Default: false .RE .IP "\fIprofile.snapshots.exclude.bysize.value\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Exclude files bigger than value in MiB. With 'Full rsync mode' disabled this will only affect new files because for rsync this is a transfer option, not an exclude option. So big files that has been backed up before will remain in snapshots even if they had changed. .PP Default: 500 .RE .IP "\fIprofile.snapshots.exclude..value\fR" 6 .RS Type: str Allowed Values: file, folder or pattern (relative or absolute) .br Exclude this file or folder. must be a counter starting with 1 .PP Default: '' .RE .IP "\fIprofile.snapshots.exclude.size\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Quantity of profile.snapshots.exclude. entries. .PP Default: \-1 .RE .IP "\fIprofile.snapshots.include..type\fR" 6 .RS Type: int Allowed Values: 0|1 .br Specify if \fIprofile.snapshots.include..value\fR is a folder (0) or a file (1). .PP Default: 0 .RE .IP "\fIprofile.snapshots.include..value\fR" 6 .RS Type: str Allowed Values: absolute path .br Include this file or folder. must be a counter starting with 1 .PP Default: '' .RE .IP "\fIprofile.snapshots.include.size\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Quantity of profile.snapshots.include. entries. .PP Default: \-1 .RE .IP "\fIprofile.snapshots.keep_only_one_snapshot.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br NOT YET IMPLEMENTED. Remove all snapshots but one. .PP Default: false .RE .IP "\fIprofile.snapshots.local.nocache\fR" 6 .RS Type: bool Allowed Values: true|false .br Run rsync on local machine with 'nocache'. This will prevent files from being cached in memory. .PP Default: false .RE .IP "\fIprofile.snapshots.local_encfs.path\fR" 6 .RS Type: str Allowed Values: absolute path .br Where to save snapshots in mode 'local_encfs'. .PP Default: '' .RE .IP "\fIprofile.snapshots.log_level\fR" 6 .RS Type: int Allowed Values: 1-3 .br Log level used during takeSnapshot. .br 1 = Error .br 2 = Changes .br 3 = Info .PP Default: 3 .RE .IP "\fIprofile.snapshots.min_free_inodes.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Remove snapshots until \fIprofile.snapshots.min_free_inodes.value\fR free inodes in % is reached. .PP Default: true .RE .IP "\fIprofile.snapshots.min_free_inodes.value\fR" 6 .RS Type: int Allowed Values: 1-15 .br Keep at least value % free inodes. .PP Default: 2 .RE .IP "\fIprofile.snapshots.min_free_space.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Remove snapshots until \fIprofile.snapshots.min_free_space.value\fR free space is reached. .PP Default: true .RE .IP "\fIprofile.snapshots.min_free_space.unit\fR" 6 .RS Type: int Allowed Values: 10|20 .br 10 = MB .br 20 = GB .PP Default: 20 .RE .IP "\fIprofile.snapshots.min_free_space.value\fR" 6 .RS Type: int Allowed Values: 1-99999 .br Keep at least value + unit free space. .PP Default: 1 .RE .IP "\fIprofile.snapshots.mode\fR" 6 .RS Type: str Allowed Values: local|local_encfs|ssh|ssh_encfs .br Use mode (or backend) for this snapshot. Look at 'man backintime' section 'Modes'. .PP Default: local .RE .IP "\fIprofile.snapshots..password.save\fR" 6 .RS Type: bool Allowed Values: true|false .br Save password to system keyring (gnome-keyring or kwallet). must be the same as \fIprofile.snapshots.mode\fR .PP Default: false .RE .IP "\fIprofile.snapshots..password.use_cache\fR" 6 .RS Type: bool Allowed Values: true|false .br Cache password in RAM so it can be read by cronjobs. Security issue: root might be able to read that password, too. must be the same as \fIprofile.snapshots.mode\fR .PP Default: true if home is not encrypted .RE .IP "\fIprofile.snapshots.no_on_battery\fR" 6 .RS Type: bool Allowed Values: true|false .br Don't take snapshots if the Computer runs on battery. .PP Default: false .RE .IP "\fIprofile.snapshots.notify.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Display notifications (errors, warnings) through libnotify. .PP Default: true .RE .IP "\fIprofile.snapshots.path\fR" 6 .RS Type: str Allowed Values: absolute path .br Where to save snapshots in mode 'local'. This path must contain a folderstructure like 'backintime///' .PP Default: '' .RE .IP "\fIprofile.snapshots.path.host\fR" 6 .RS Type: str Allowed Values: text .br Set Host for snapshot path .PP Default: local hostname .RE .IP "\fIprofile.snapshots.path.profile\fR" 6 .RS Type: str Allowed Values: 1-99999 .br Set Profile-ID for snapshot path .PP Default: current Profile-ID .RE .IP "\fIprofile.snapshots.path.user\fR" 6 .RS Type: str Allowed Values: text .br Set User for snapshot path .PP Default: local username .RE .IP "\fIprofile.snapshots.path.uuid\fR" 6 .RS Type: str Allowed Values: text .br Devices uuid used to automatically set up udev rule if the drive is not connected. .PP Default: '' .RE .IP "\fIprofile.snapshots.preserve_acl\fR" 6 .RS Type: bool Allowed Values: true|false .br Preserve ACL. The source and destination systems must have compatible ACL entries for this option to work properly. .PP Default: false .RE .IP "\fIprofile.snapshots.preserve_xattr\fR" 6 .RS Type: bool Allowed Values: true|false .br Preserve extended attributes (xattr). .PP Default: false .RE .IP "\fIprofile.snapshots.remove_old_snapshots.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Remove all snapshots older than value + unit .PP Default: true .RE .IP "\fIprofile.snapshots.remove_old_snapshots.unit\fR" 6 .RS Type: int Allowed Values: 20|30|80 .br 20 = days .br 30 = weeks .br 80 = years .PP Default: 80 .RE .IP "\fIprofile.snapshots.remove_old_snapshots.value\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Snapshots older than this times units will be removed .PP Default: 10 .RE .IP "\fIprofile.snapshots.rsync_options.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Past additional options to rsync .PP Default: false .RE .IP "\fIprofile.snapshots.rsync_options.value\fR" 6 .RS Type: str Allowed Values: text .br rsync options. Options must be quoted e.g. \-\-exclude-from="/path/to/my exclude file" .PP Default: '' .RE .IP "\fIprofile.snapshots.smart_remove\fR" 6 .RS Type: bool Allowed Values: true|false .br Run smart_remove to clean up old snapshots after a new snapshot was created. .PP Default: false .RE .IP "\fIprofile.snapshots.smart_remove.keep_all\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Keep all snapshots for X days. .PP Default: 2 .RE .IP "\fIprofile.snapshots.smart_remove.keep_one_per_day\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Keep one snapshot per day for X days. .PP Default: 7 .RE .IP "\fIprofile.snapshots.smart_remove.keep_one_per_month\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Keep one snapshot per month for X month. .PP Default: 24 .RE .IP "\fIprofile.snapshots.smart_remove.keep_one_per_week\fR" 6 .RS Type: int Allowed Values: 0-99999 .br Keep one snapshot per week for X weeks. .PP Default: 4 .RE .IP "\fIprofile.snapshots.smart_remove.run_remote_in_background\fR" 6 .RS Type: bool Allowed Values: true|false .br If using mode SSH or SSH-encrypted, run smart_remove in background on remote machine .PP Default: false .RE .IP "\fIprofile.snapshots.ssh.check_commands\fR" 6 .RS Type: bool Allowed Values: true|false .br Check if all commands (used during takeSnapshot) work like expected on the remote host. .PP Default: true .RE .IP "\fIprofile.snapshots.ssh.check_ping\fR" 6 .RS Type: bool Allowed Values: true|false .br Check if the remote host is available before trying to mount. .PP Default: true .RE .IP "\fIprofile.snapshots.ssh.cipher\fR" 6 .RS Type: str Allowed Values: default | aes192-cbc | aes256-cbc | aes128-ctr | aes192-ctr | aes256-ctr | arcfour | arcfour256 | arcfour128 | aes128-cbc | 3des-cbc | blowfish-cbc | cast128-cbc .br Cipher that is used for encrypting the SSH tunnel. Depending on the environment (network bandwidth, cpu and hdd performance) a different cipher might be faster. .PP Default: default .RE .IP "\fIprofile.snapshots.ssh.host\fR" 6 .RS Type: str Allowed Values: IP or domain address .br Remote host used for mode 'ssh' and 'ssh_encfs'. .PP Default: '' .RE .IP "\fIprofile.snapshots.ssh.ionice\fR" 6 .RS Type: bool Allowed Values: true|false .br Run rsync and other commands on remote host with 'ionice \-c2 \-n7' .PP Default: false .RE .IP "\fIprofile.snapshots.ssh.max_arg_length\fR" 6 .RS Type: int Allowed Values: 0, >700 .br Maximum argument length of commands run on remote host. This can be tested with 'python3 /usr/share/backintime/common/sshMaxArg.py USER@HOST'. .br 0 = unlimited .PP Default: 0 .RE .IP "\fIprofile.snapshots.ssh.nice\fR" 6 .RS Type: bool Allowed Values: true|false .br Run rsync and other commands on remote host with 'nice \-n19' .PP Default: false .RE .IP "\fIprofile.snapshots.ssh.nocache\fR" 6 .RS Type: bool Allowed Values: true|false .br Run rsync on remote host with 'nocache'. This will prevent files from being cached in memory. .PP Default: false .RE .IP "\fIprofile.snapshots.ssh.path\fR" 6 .RS Type: str Allowed Values: absolute or relative path .br Snapshot path on remote host. If the path is relative (no leading '/') it will start from remote Users homedir. An empty path will be replaced with './'. .PP Default: '' .RE .IP "\fIprofile.snapshots.ssh.port\fR" 6 .RS Type: int Allowed Values: 0-65535 .br SSH Port on remote host. .PP Default: 22 .RE .IP "\fIprofile.snapshots.ssh.prefix.enabled\fR" 6 .RS Type: bool Allowed Values: true|false .br Add prefix to every command which run through SSH on remote host. .PP Default: false .RE .IP "\fIprofile.snapshots.ssh.prefix.value\fR" 6 .RS Type: str Allowed Values: text .br Prefix to run before every command on remote host. Variables need to be escaped with \\$FOO. This doesn't touch rsync. So to add a prefix for rsync use \fIprofile.snapshots.rsync_options.value\fR with --rsync-path="FOO=bar:\\$FOO /usr/bin/rsync" .PP Default: 'PATH=/opt/bin:/opt/sbin:\\$PATH' .RE .IP "\fIprofile.snapshots.ssh.private_key_file\fR" 6 .RS Type: str Allowed Values: absolute path to private key file .br Private key file used for password-less authentication on remote host. .PP Default: ~/.ssh/id_dsa .RE .IP "\fIprofile.snapshots.ssh.user\fR" 6 .RS Type: str Allowed Values: text .br Remote SSH user .PP Default: local users name .RE .IP "\fIprofile.snapshots.take_snapshot_regardless_of_changes\fR" 6 .RS Type: bool Allowed Values: true|false .br Create a new snapshot regardless if there were changes or not. .PP Default: false .RE .IP "\fIprofile.snapshots.use_checksum\fR" 6 .RS Type: bool Allowed Values: true|false .br Use checksum to detect changes rather than size + time. .PP Default: false .RE .IP "\fIprofile.snapshots.user_backup.ionice\fR" 6 .RS Type: bool Allowed Values: true|false .br Run BackInTime with 'ionice \-c2 \-n7' when taking a manual snapshot. This will give BackInTime the lowest IO bandwidth priority to not interrupt any other working process. .PP Default: false .RE .IP "\fIprofile.user_callback.no_logging\fR" 6 .RS Type: bool Allowed Values: true|false .br Do not catch std{out|err} from user-callback script. The script will only write to current TTY. Default is to catch std{out|err} and write it to syslog and TTY again. .PP Default: false .RE .IP "\fIprofiles\fR" 6 .RS Type: str Allowed Values: int separated by colon (e.g. 1:3:4) .br All active Profiles ( in profile.snapshots...). .PP Default: 1 .RE .IP "\fIprofiles.version\fR" 6 .RS Type: int Allowed Values: 1 .br Internal version of profiles config. .PP Default: 1 .RE .SH SEE ALSO backintime, backintime-qt. .PP Back In Time also has a website: https://github.com/bit-team/backintime .SH AUTHOR This manual page was written by BIT Team(). backintime-1.2.1/common/man/C/backintime.10000644000175000017500000003247613530533316017570 0ustar germargermar.TH backintime 1 "Aug 2016" "version 1.2.1" "USER COMMANDS" .SH NAME backintime \- a simple backup tool for Linux. .PP This is the command line tool. The graphical tool is backintime-qt. .SH SYNOPSIS .B backintime [\-\-checksum] [\-\-config PATH] [\-\-debug] [\-\-delete] [\-\-help | \-h] [\-\-keep\-mount] [\-\-license] [\-\-local\-backup | \-\-no\-local\-backup] [\-\-no\-crontab] [\-\-only\-new] [\-\-profile NAME | \-\-profile\-id ID] [\-\-quiet] [\-\-share\-path PATH] [\-\-version] { backup | backup\-job | benchmark-cipher [FILE-SIZE] | check-config | decode [PATH] | last\-snapshot | last\-snapshot\-path | pw\-cache [start|stop|restart|reload|status] | remove[\-and\-do\-not\-ask\-again] [SNAPSHOT_ID] | restore [WHAT [WHERE [SNAPSHOT_ID]]] | shutdown | smart\-remove | snapshots\-list | snapshots\-list\-path | snapshots\-path | unmount } .SH DESCRIPTION Back In Time is a simple backup tool for Linux. The backup is done by taking snapshots of a specified set of folders. .PP All you have to do is configure: where to save snapshots, what folders to backup. You can also specify a backup schedule: disabled, every 5 minutes, every 10 minutes, every hour, every day, every week, every month. To configure it use one of the graphical interfaces available (backintime-gnome or backintime-kde4). .PP It acts as a 'user mode' backup tool. This means that you can backup/restore only folders you have write access to (actually you can backup read\-only folders, but you can't restore them). .PP If you want to run it as root you need to use 'sudo -i backintime'. .PP A new snapshot is created only if something changed since the last snapshot (if any). .PP A snapshot contains all the files from the selected folders (except for exclude patterns). In order to reduce disk space it use hard\-links (if possible) between snapshots for unchanged files. This way a file of 10MiB, unchanged for 10 snapshots, will use only 10MiB on the disk. .PP When you restore a file 'A', if it already exists on the file system it will be renamed to 'A.backup.currentdate'. .PP For automatic backup it use 'cron' so there is no need for a daemon, but 'cron' must be running. .SS Modes .IP "\fILocal\fR" 4 .RS Store snapshots on local HDD's (internal or USB). The drive has to be mounted before creating a new snapshot. .RE .IP "\fILocal encrypted\fR" 4 .RS Store encrypted snapshots on local HDD's (internal or USB). Back In Time uses 'encfs' with standard configuration to encrypt all data. Please take a look at \fIA NOTE ON SECURITY\fR. .RE .IP "\fISSH \fR" 4 .RS With Mode set to SSH you can store the backup on a remote host using the SecureShellHost protocol (ssh). The remote path will be mount local using sshfs to provide file-access for the graphical interface and the backup process. Rsync and other processes called during backup process will run directly on the remote host using ssh. .PP To prepare your user account for ssh-mode you have to create a password-less login to the remote host (for further information look at http://www.debian-administration.org/articles/152). Type in terminal 'ssh-keygen \-t rsa' hit enter for default path and enter a passphrase for the private key. .PP Finally type 'ssh-copy-id \-i ~/.ssh/id_rsa.pub @' and enter your password on remote host. .PP In Settingsdialog you need to set the host and remote user. If you enter a relative path (no leading / ) it will start from remote users homedir. The password has to be the passphrase for your private key. .PP .B Cipher (the algorithm used to encrypt the data during transfer) .br To optimize performance you can choose the cipher used by ssh. Depending on your environment you can have a massive speed increase compared to the default cipher. .PP \fIbenchmark\-cipher\fR will give you an overview over which cipher is the fastest in your environment. .PP If the bottleneck of your environment is the hard-drive or the network you will not see a big difference between the ciphers. In this case you should rather stay on 'default'. .PP Please read security information about the cipher before using them in untrusted networks (Wifi, Internet). Some of them (Arcfour, 3DES, ...) should be handled as not secure anymore. .PP .B "Remote Host" .br If your remote host is an embedded Linux NAS or any other device with limited functions, you could run into some problems caused by feature-less commands. For example some devices may not have hardlink support for 'cp', 'chmod' and 'rsync'. In this case it may help to install so-called Optware or Entware on your device if available. .PP .B WARNING: THIS IS ONLY FOR EXPERIENCED USERS! .br If you don't know how to compile packages and how to modify a Linux system you should NOT try to do this. There is a significant chance to break your device and make it completely unusable with the following procedure. We will not take any warranty for this. Make a backup of your device before proceed! You have been warned! .PP You should install at least packages called 'bash', 'coreutils' and 'rsync'. You will have to change users default shell from '/bin/sh' to '/opt/bin/bash' in '/etc/passwd'. To add '/opt/bin:/opt/sbin:' to the start of the PATH environment you can use 'Add prefix to SSH commands' in 'Expert Options' with 'PATH=/opt/bin:/opt/sbin:\\$PATH'. .PP To check if it does work you can compare the output of '/bin/cp \-\-help' and '/opt/bin/cp \-\-help'. If 'ssh @ cp \-\-help' called from your PC will print the same as '/opt/bin/cp \-\-help' called on the remote host (via interactive ssh session) you are ready to go. .PP If you have questions on how to install and configure the Optware please refer to the community of your device. You can also take a look on Back In Time FAQ on GitHub https://github.com/bit-team/backintime/wiki/FAQ .PP If you successfully modified your device to be able to make backups over ssh, it would be nice if you write a 'How to' on Launchpad's Answers so we can add this to the FAQ. .RE .IP "\fISSH encrypted\fR" 4 .RS Store encrypted snapshots on remote hosts using SSH. Backintime uses 'encfs \-\-reverse' to mount the root filesystem '/'. Rsync will sync this encrypted view of '/' to a remote host over SSH. All encoding will be done on the local machine. So the password will never be exposed to the remote host and you can use the (normally) more powerful processor in you local machine for encryption instead of weak NAS CPU's. The downside on this is 'encfs \-\-reverse' does not support 'Filename Initialization Vector Chaining' and 'Per-File Initialization Vectors' from the standard configuration (take a look at 'man encfs' for further information). Please take a look at \fIA NOTE ON SECURITY\fR. .PP Because of all data is transferred encrypted the log output shows encrypted filenames, too. In the Logview-Dialog you can use 'decode' option to decrypt the paths automatically or you can use 'backintime decode' to manually decrypt paths. Back In Time will show all snapshots decoded so you can browse all files as normal. .PP Exclude does not support wildcards ('foo*', '[fF]oo', 'fo?') because after encoding a file these wildcards can't match any more. Only separate asterisk that match a full file or folder will work ('foo/*', 'foo/**/bar'). All other excludes that have wildcards will be silently ignored. .PP Please refer to the 'SSH' section above for information on setting up the SSH connection. .RE .SS Password If 'Save Password to Keyring' is activated Back In Time will save the Password into GnomeKeyring (Seahorse) or KDE-KWallet. Both are secure password storages which encrypt the password with the users login-password. So they can only be accessed if the user is logged in. .PP A backup cronjob during the user isn't logged in can not collect the password from keyring. Also if the homedir is encrypted the keyring is not accessible from cronjobs (even if the user is logged in). For these cases the password can be cached in RAM. If 'Cache Password for Cron' is activated Back In Time will start a small daemon in user-space which will collect the password from keyring and provide them for cronjobs. They will never be written to the harddrive but a user with root permissions could access the daemon and read the password. .SS user-callback During backup process the application can call a user callback at different steps. This callback is "$XDG_CONFIG_HOME/backintime/user-callback" (by default $XDG_CONFIG_HOME is ~/.config). .PP The first argument is the profile id (1=Main Profile, ...). .PP The second argument is the profile name. .PP The third argument is the reason: .RS .TP 1 Backup process begins. .TP 2 Backup process ends. .TP 3 A new snapshot was taken. The extra arguments are snapshot ID and snapshot path. .TP 4 There was an error. The second argument is the error code. .RS Error codes: .TP 1 The application is not configured. .TP 2 A "take snapshot" process is already running. .TP 3 Can't find snapshots folder (is it on a removable drive ?). .TP 4 A snapshot for "now" already exist. .RE .TP 5 On (graphical) App start. .TP 6 On (graphical) App close. .TP 7 Mount all necessary drives. .TP 8 Unmount all drives. .SH OPTIONS .TP \-\-checksum Force to use checksum for checking if files have been changed. This is the same as 'Use checksum to detect changes' in Options. But you can use this to periodically run checksums from cronjobs. Only valid with \fIbackup\fR, \fIbackup-job\fR and \fIrestore\fR. .TP \-\-config PATH Read config from PATH. Default = ~/.config/backintime/config .TP --debug Show debug messages. .TP --delete Restore and delete newer files which are not in the snapshot. WARNING: deleting files in filesystem root could break your whole system!!! Only valid with \fIrestore\fR. .TP \-h, \-\-help Display a short help .TP \-\-keep\-mount Don't unmount on exit. Only valid with \fIsnapshots\-path\fR, \fIsnapshots\-list\-path\fR and \fIlast\-snapshot\-path\fR. .TP \-\-license Show license .TP --local-backup Create backup files before changing local files. Only valid with \fIrestore\fR. .TP --no-crontab Do not install crontab entries. Only valid with \fIcheck-config\fR. .TP --no-local-backup Temporary disable creation of backup files before changing local files. Only valid with \fIrestore\fR. .TP --only-new Only restore files which does not exist or are newer than those in destination. Using "rsync --update" option. Only valid with \fIrestore\fR. .TP \-\-profile NAME Select profile by name .TP \-\-profile\-id ID Select profile by id .TP \-\-quiet Suppress status messages on standard output. .TP \-\-share\-path PATH Write runtime data (locks, messages, log and mountpoints) to PATH. .TP \-v, \-\-version Show version .SH COMMANDS .TP backup | \-b | \-\-backup Take a snapshot now. .TP backup\-job | \-\-backup\-job Take a snapshot (if needed) depending on schedule rules (used for cron jobs). Back In Time will run in background for this. .TP benchmark-cipher | \-\-benchmark-cipher [FILE-SIZE] Show a benchmark of all ciphers for ssh transfer. .TP check-config Verify the profile in config, create snapshot path and crontab entries. .TP decode | \-\-decode [PATH] Decode encrypted PATH. If no PATH is given Back In Time will read paths from standard input. .TP last\-snapshot | \-\-last\-snapshot Display last snapshot ID (if any) .TP last\-snapshot\-path | \-\-last\-snapshot\-path Display the path to the last snapshot (if any) .TP pw\-cache | \-\-pw\-cache [start|stop|restart|reload|status] Control the Password Cache Daemon. If no argument is given the Password Cache will start in foreground. .TP remove[\-and\-do\-not\-ask\-again] | \-\-remove[\-and\-do\-not\-ask\-again] [SNAPSHOT_ID] Remove the snapshot. If SNAPSHOT_ID is missing it will be prompted. SNAPSHOT_ID can be an index (starting with 0 for the last snapshot) or the exact SnapshotID (19 caracters like '20130606-230501-984'). \fIremove\-and\-do\-not\-ask\-again\fR will remove the snapshot immediately. Be careful with this! .TP restore | \-\-restore [WHAT [WHERE [SNAPSHOT_ID]]] Restore file WHAT to path WHERE from snapshot SNAPSHOT_ID. If arguments are missing they will be prompted. To restore to the original path WHERE can be an empty string '' or just press Enter at the prompt. SNAPSHOT_ID can be an index (starting with 0 for the last snapshot) or the exact SnapshotID (19 caracters like '20130606-230501-984') .TP shutdown Shutdown the computer after the snapshot is done. .TP smart\-remove Remove snapshots based on the configured Smart-Remove pattern. .TP snapshots\-list | \-\-snapshots\-list Display the list of snapshot IDs (if any) .TP snapshots\-list\-path | \-\-snapshots\-list\-path Display the paths to snapshots (if any) .TP snapshots\-path | \-\-snapshots\-path Display path where is saves the snapshots (if configured) .TP unmount | \-\-unmount Unmount the profile. .SH A NOTE ON SECURITY There was a paid security audit for EncFS in Feb 2014 which revealed several potential vulnerabilities. .TP From https://defuse.ca/audits/encfs.htm EncFS is probably safe as long as the adversary only gets one copy of the ciphertext and nothing more. EncFS is not safe if the adversary has the opportunity to see two or more snapshots of the ciphertext at different times. EncFS attempts to protect files from malicious modification, but there are serious problems with this feature. .PP This might be a problem with Back In Time snapshots. .SH SEE ALSO backintime-qt, backintime-config. .PP Back In Time also has a website: https://github.com/bit-team/backintime .SH AUTHOR This manual page was written by BIT Team(). backintime-1.2.1/common/man/C/backintime-askpass.10000644000175000017500000000164213530533316021222 0ustar germargermar.TH backintime-askpass 1 "Jan 2015" "version 1.2.1" "USER COMMANDS" .SH NAME backintime-askpass \- a simple backup tool for Linux. .PP This is the command line tool for piping passwords into ssh/sshfs and encfs. .SH SYNOPSIS .B backintime-askpass .SH DESCRIPTION Back In Time is a simple backup tool for Linux. This is a helper tool for piping passwords into ssh/sshfs and encfs. Options will will be read from environ variables. It doesn't provide any useful enduser service. .SH ENVIRON .TP ASKPASS_PROFILE_ID Back In Time Profile-ID. .TP ASKPASS_MODE Backup mode (or backend). Take a look at 'man backintime-config' section \fIprofile.snapshots.mode\fR .TP ASKPASS_TEMP Temp FIFO socket used to pipe the password .SH SEE ALSO backintime, backintime-config. .PP Back In Time also has a website: https://github.com/bit-team/backintime .SH AUTHOR This manual page was written by BIT Team(). backintime-1.2.1/common/sshtools.py0000644000175000017500000011565313530533316016672 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import grp import subprocess import gettext import string import random import tempfile import socket import re import atexit import signal from time import sleep import config import logger import tools import password_ipc from mount import MountControl from exceptions import MountException, NoPubKeyLogin, KnownHost import bcolors _=gettext.gettext class SSH(MountControl): """ This is a backend for the mount API :py:class:`mount.MountControl`. This will mount the remote path with ``sshfs``, prepair the remote path and check that everything is set up correctly for `Back In Time` to run snapshots through SSH. This class will only mount the remote path. The real takeSnapshot process will use rsync over ssh. Other commands run remote over ssh. Args: cfg (config.Config): current config (handled by inherited :py:class:`mount.MountControl`) user (str): User name on remote host host (str): Name or IP Address of remote host port (int): Port used by SSHd on remote host path (str): remote path where snapshots are stored. Can be either relative from remote users homedir or an absolute path cipher (str): Cipher used to encrypt the network transfer private_key_file (str): Private key which is able to log on with Public/Private Key-Method on remote host nice (bool): use ``nice -n 19`` to run commands with low CPU priority on remote host ionice (bool): use ``ionice -c2 -n7`` to run commands with low IO priority on remote host nocache (bool): use ``nocache`` to deactivate RAM caching of files on remote host password (str): password to unlock the private key profile_id (str): profile ID that should be used (handled by inherited :py:class:`mount.MountControl`) hash_id (str): crc32 hash used to identify identical mountpoints (handled by inherited :py:class:`mount.MountControl`) tmp_mount (bool): if ``True`` mount to a temporary destination (handled by inherited :py:class:`mount.MountControl`) parent (QWidget): parent widget for QDialogs or ``None`` if there is no parent (handled by inherited :py:class:`mount.MountControl`) symlink (bool): if ``True`` set symlink to mountpoint (handled by inherited :py:class:`mount.MountControl`) mode (str): one of ``local``, ``local_encfs``, ``ssh`` or ``ssh_encfs`` (handled by inherited :py:class:`mount.MountControl`) hash_collision (int): global value used to prevent hash collisions on mountpoints (handled by inherited :py:class:`mount.MountControl`) Note: All Arguments are optional. Default values will be fetched from :py:class:`config.Config`. But after changing Settings we need to test the new values **before** storing them into :py:class:`config.Config`. This is why all values will be added as arguments. """ def __init__(self, *args, **kwargs): #init MountControl super(SSH, self).__init__(*args, **kwargs) self.setattrKwargs('user', self.config.sshUser(self.profile_id), **kwargs) self.setattrKwargs('host', self.config.sshHost(self.profile_id), **kwargs) self.setattrKwargs('port', self.config.sshPort(self.profile_id), **kwargs) self.setattrKwargs('path', self.config.sshSnapshotsPath(self.profile_id), **kwargs) self.setattrKwargs('cipher', self.config.sshCipher(self.profile_id), **kwargs) self.setattrKwargs('private_key_file', self.config.sshPrivateKeyFile(self.profile_id), **kwargs) self.setattrKwargs('nice', self.config.niceOnRemote(self.profile_id), store = False, **kwargs) self.setattrKwargs('ionice', self.config.ioniceOnRemote(self.profile_id), store = False, **kwargs) self.setattrKwargs('nocache', self.config.nocacheOnRemote(self.profile_id), store = False, **kwargs) self.setattrKwargs('password', None, store = False, **kwargs) if not self.path: self.path = './' self.setDefaultArgs() # config strings used in ssh-calls self.user_host_path = '%s@%s:%s' % (self.user, tools.escapeIPv6Address(self.host), self.path) self.user_host = '%s@%s' % (self.user, self.host) self.mountproc = 'sshfs' self.symlink_subfolder = None self.log_command = '%s: %s' % (self.mode, self.user_host_path) self.private_key_fingerprint = sshKeyFingerprint(self.private_key_file) if not self.private_key_fingerprint: logger.warning('Couldn\'t get fingerprint for private key %(path)s. ' 'Most likely because the public key %(path)s.pub wasn\'t found. ' 'Using fallback to private keys path instead. ' 'But this can make troubles with passphrase-less keys.' %{'path': self.private_key_file}, self) self.private_key_fingerprint = self.private_key_file self.unlockSshAgent() def _mount(self): """ Backend mount method. This will call ``sshfs`` to mount the remote path. Raises: exceptions.MountException: if mount wasn't successful """ sshfs = [self.mountproc] sshfs += self.config.sshDefaultArgs(self.profile_id) sshfs += ['-p', str(self.port)] if not self.cipher == 'default': sshfs.extend(['-o', 'Ciphers=%s' % self.cipher]) sshfs.extend(['-o', 'idmap=user', '-o', 'cache_dir_timeout=2', '-o', 'cache_stat_timeout=2']) sshfs.extend([self.user_host_path, self.currentMountpoint]) #bugfix: sshfs doesn't mount if locale in LC_ALL is not available on remote host #LANG or other envirnoment variable are no problem. env = os.environ.copy() if 'LC_ALL' in list(env.keys()): env['LC_ALL'] = 'C' logger.debug('Call mount command: %s' %' '.join(sshfs), self) proc = subprocess.Popen(sshfs, env = env, stdout = subprocess.DEVNULL, stderr = subprocess.PIPE, universal_newlines = True) err = proc.communicate()[1] if proc.returncode: raise MountException(_('Can\'t mount %s') % ' '.join(sshfs) + '\n\n' + err) def preMountCheck(self, first_run = False): """ Check that everything is prepaired and ready for successfully mount the remote path. Default is to run a light version of checks which will only make sure the remote host is online, ``sshfs`` is installed and the remote folder is available. After changing settings this should be run with ``first_run = True`` to run a full check with all tests. Args: first_run (bool): run a full test with all checks Raises: exceptions.MountException: if one test failed an we can not mount the remote path """ self.checkPingHost() self.checkFuse() if first_run: self.unlockSshAgent(force = True) self.checkKnownHosts() self.checkLogin() if first_run: self.checkCipher() self.checkRemoteFolder() if first_run: self.checkRemoteCommands() return True def startSshAgent(self): """ Start a new ``ssh-agent`` if it is not already running. Raises: exceptions.MountException: if starting ``ssh-agent`` failed """ SOCK = 'SSH_AUTH_SOCK' PID = 'SSH_AGENT_PID' if os.getenv(SOCK, '') and os.getenv(PID, ''): logger.debug('ssh-agent already running. Skip starting a new one.', self) return sshAgent = tools.which('ssh-agent') if not sshAgent: raise MountException('ssh-agent not found. Please make sure it is installed.') if isinstance(sshAgent, str): sshAgent = [sshAgent, ] sa = subprocess.Popen(sshAgent, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True) out, err = sa.communicate() if sa.returncode: raise MountException('Failed to start ssh-agent: [{}] {}'.format(sa.returncode, err)) m = re.match(r'.*{}(?:=|\s)([^;]+);.*{}(?:=|\s)(\d+);'.format(SOCK, PID), out, re.DOTALL | re.MULTILINE) if m: logger.debug('ssh-agent started successful: {}={} | {}={}'.format(SOCK, m.group(1), PID, m.group(2)), self) os.environ[SOCK] = m.group(1) os.environ[PID] = m.group(2) atexit.register(os.kill, int(m.group(2)), signal.SIGKILL) else: raise MountException('No matching output from ssh-agent: {} | {}'.format(out, err)) def unlockSshAgent(self, force = False): """ Unlock the private key in ``ssh-agent`` which will provide it for all other commands. The password to unlock the key will be provided by ``backintime-askpass``. Args: force (bool): force to unlock the key by removing it first and add it again to make sure, the given values are correct Raises: exceptions.MountException: if unlock failed """ self.startSshAgent() env = os.environ.copy() env['SSH_ASKPASS'] = 'backintime-askpass' env['ASKPASS_PROFILE_ID'] = self.profile_id env['ASKPASS_MODE'] = self.mode if force: #remove private key first so we can check if the given password is valid logger.debug('Remove private key %s from ssh agent' % self.private_key_file, self) proc = subprocess.Popen(['ssh-add', '-d', self.private_key_file], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, universal_newlines = True) proc.communicate() proc = subprocess.Popen(['ssh-add', '-l'], stdout = subprocess.PIPE, universal_newlines = True) output = proc.communicate()[0] if force or not output.find(self.private_key_fingerprint) >= 0: logger.debug('Add private key %s to ssh agent' % self.private_key_file, self) password_available = any([self.config.passwordSave(self.profile_id), self.config.passwordUseCache(self.profile_id), not self.password is None ]) logger.debug('Password available: %s' %password_available, self) if not password_available and not tools.checkXServer(): #we need to unlink stdin from ssh-add in order to make it #use our own backintime-askpass. #But because of this we can NOT use getpass inside backintime-askpass #if password is not saved and there is no x-server. #So, let's just keep ssh-add asking for the password in that case. alarm = tools.Alarm() alarm.start(10) try: proc = subprocess.call(['ssh-add', self.private_key_file]) alarm.stop() except tools.Timeout: pass else: if self.password: logger.debug('Provide password through temp FIFO', self) thread = password_ipc.TempPasswordThread(self.password) env['ASKPASS_TEMP'] = thread.temp_file thread.start() proc = subprocess.Popen(['ssh-add', self.private_key_file], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env = env, preexec_fn = os.setsid, universal_newlines = True) output, error = proc.communicate() if proc.returncode: logger.error('Failed to unlock SSH private key %s: %s' %(self.private_key_file, error), self) if self.password: thread.stop() proc = subprocess.Popen(['ssh-add', '-l'], stdout = subprocess.PIPE, universal_newlines = True) output = proc.communicate()[0] if not output.find(self.private_key_fingerprint) >= 0: logger.debug('Was not able to unlock private key %s' %self.private_key_file, self) raise MountException(_('Could not unlock ssh private key. Wrong password ' 'or password not available for cron.')) else: logger.debug('Private key %s is already unlocked in ssh agent' %self.private_key_file, self) def checkLogin(self): """ Try to login to remote host with public/private-key-method (passwordless). Raises: exceptions.NoPubKeyLogin: if login failed """ logger.debug('Check login', self) ssh = self.config.sshCommand(cmd = ['echo', '"Hello"'], custom_args = ['-o', 'PreferredAuthentications=publickey', '-p', str(self.port), self.user_host], port = False, user_host = False, nice = False, ionice = False, profile_id = self.profile_id) proc = subprocess.Popen(ssh, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, universal_newlines = True) err = proc.communicate()[1] if proc.returncode: raise NoPubKeyLogin(_('Password-less authentication for %(user)s@%(host)s ' 'failed. Look at \'man backintime\' for further ' 'instructions.') % {'user' : self.user, 'host' : self.host} + '\n\n' + err) def checkCipher(self): """ Try to login to remote host with the choosen cipher. This should make sure both `localhost` and the remote host support the choosen cipher. Raises: exceptions.MountException: if login with the cipher failed """ if not self.cipher == 'default': logger.debug('Check cipher', self) ssh = self.config.sshCommand(cmd = ['echo', '"Hello"'], custom_args = ['-o', 'Ciphers=%s' % self.cipher, '-p', str(self.port), self.user_host], port = False, cipher = False, user_host = False, nice = False, ionice = False, profile_id = self.profile_id) proc = subprocess.Popen(ssh, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, universal_newlines = True) err = proc.communicate()[1] if proc.returncode: logger.debug('Ciper %s is not supported' %self.config.SSH_CIPHERS[self.cipher], self) raise MountException(_('Cipher %(cipher)s failed for %(host)s:\n%(err)s') % {'cipher' : self.config.SSH_CIPHERS[self.cipher], 'host' : self.host, 'err' : err}) def benchmarkCipher(self, size = 40): """ Rudimental benchmark to compare transfer speed of all available ciphers. Args: size (int): size of the testfile in MiB """ temp = tempfile.mkstemp()[1] print('create random data file') subprocess.call(['dd', 'if=/dev/urandom', 'of=%s' % temp, 'bs=1M', 'count=%s' % size]) keys = list(self.config.SSH_CIPHERS.keys()) keys.sort() for cipher in keys: if cipher == 'default': continue print('%s%s:%s' %(bcolors.BOLD, cipher, bcolors.ENDC)) for i in range(2): # scp uses -P instead of -p for port subprocess.call(['scp', '-P', str(self.port), '-c', cipher, temp, self.user_host_path]) ssh = self.config.sshCommand(cmd = ['rm', os.path.join(self.path, os.path.basename(temp))], custom_args = ['-p', str(self.port), self.user_host], port = False, cipher = False, user_host = False, nice = False, ionice = False, profile_id = self.profile_id) subprocess.call(ssh) os.remove(temp) def checkKnownHosts(self): """ Check if the remote host is in current users ``known_hosts`` file. Raises: exceptions.KnownHost: if the remote host wasn't found in ``known_hosts`` file """ logger.debug('Check known hosts file', self) for host in (self.host, '[%s]:%s' % (self.host, self.port)): proc = subprocess.Popen(['ssh-keygen', '-F', host], stdout=subprocess.PIPE, universal_newlines = True) output = proc.communicate()[0] #subprocess.check_output doesn't exist in Python 2.6 (Debian squeeze default) if output.find('Host %s found' % host) >= 0: logger.debug('Host %s was found in known hosts file' % host, self) return True logger.debug('Host %s is not in known hosts file' %self.host, self) raise KnownHost(_('%s not found in ssh_known_hosts.') % self.host) def checkRemoteFolder(self): """ Check the remote path. If the remote path doesn't exist this will create it. If it already exist this will check, that it is a folder and has correct permissions. Raises: exceptions.MountException: if remote path couldn't be created or doesn't have correct permissions. """ logger.debug('Check remote folder', self) cmd = 'd=0;' cmd += 'test -e "%s" || d=1;' % self.path #path doesn't exist. set d=1 to indicate cmd += 'test $d -eq 1 && mkdir "%s"; err=$?;' % self.path #create path, get errorcode from mkdir cmd += 'test $d -eq 1 && exit $err;' #return errorcode from mkdir cmd += 'test -d "%s" || exit 11;' % self.path #path is no directory cmd += 'test -w "%s" || exit 12;' % self.path #path is not writable cmd += 'test -x "%s" || exit 13;' % self.path #path is not executable cmd += 'exit 20' #everything is fine ssh = self.config.sshCommand(cmd = [cmd], custom_args = ['-p', str(self.port), self.user_host], port = False, user_host = False, nice = False, ionice = False, profile_id = self.profile_id) logger.debug('Call command: %s' %' '.join(ssh), self) proc = subprocess.Popen(ssh, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) proc.communicate() if proc.returncode: logger.debug('Command returncode: %s' %proc.returncode, self) if proc.returncode == 20: #clean exit pass elif proc.returncode == 11: raise MountException(_('Remote path exists but is not a directory:\n %s') % self.path) elif proc.returncode == 12: raise MountException(_('Remote path is not writable:\n %s') % self.path) elif proc.returncode == 13: raise MountException(_('Remote path is not executable:\n %s') % self.path) else: raise MountException(_('Couldn\'t create remote path:\n %s') % self.path) else: #returncode is 0 logger.info('Create remote folder %s' %self.path, self) def checkPingHost(self): """ Check if the remote host is online. Other than methods name may let suppose this does not use Ping (``ICMP``) but try to open a connection to the configured port on the remote host. In this way it will even work on remote hosts which have ``ICMP`` disabled. If connection failed it will retry five times before failing. Raises: exceptions.MountException: if connection failed most probably because remote host is offline """ if not self.config.sshCheckPingHost(self.profile_id): return logger.debug('Check ping host', self) count = 0 while count < 5: try: with socket.create_connection((self.host, self.port), 2.0) as s: result = s.connect_ex(s.getpeername()) except: result = -1 if result == 0: logger.debug('Host %s is available' %self.host, self) return logger.debug('Could not ping host %s. Try again' %self.host, self) count += 1 sleep(0.2) if result != 0: logger.debug('Failed pinging host %s' %self.host, self) raise MountException(_('Ping %s failed. Host is down or wrong address.') % self.host) def checkRemoteCommands(self, retry = False): """ Try out all relevant commands used by `Back In Time` on the remote host to make sure snapshots will be successful with the remote host. This will also check that hard-links are supported on the remote host. This check can be disabled with :py:func:`config.Config.sshCheckCommands` Args: retry (bool): retry to run the commands if it failed because the command string was to long Raises: exceptions.MountException: if a command is not supported on remote host or if hard-links are not supported """ if not self.config.sshCheckCommands(): return logger.debug('Check remote commands', self) def maxArg(): if retry: raise MountException("Checking commands on remote host didn't return any output. " "We already checked the maximum argument lenght but it seem like " "there is an other problem") logger.warning('Looks like the command was to long for remote SSHd. We will test max arg length now and retry.', self) import sshMaxArg mid = sshMaxArg.maxArgLength(self.config) sshMaxArg.reportResult(self.host, mid) self.config.setSshMaxArgLength(mid, self.profile_id) return self.checkRemoteCommands(retry = True) remote_tmp_dir_1 = os.path.join(self.path, 'tmp_%s' % self.randomId()) remote_tmp_dir_2 = os.path.join(self.path, 'tmp_%s' % self.randomId()) with tempfile.TemporaryDirectory() as tmp: tmp_file = os.path.join(tmp, 'a') with open(tmp_file, 'wt') as f: f.write('foo') #check rsync rsync1 = tools.rsyncPrefix(self.config, no_perms = False, progress = False) rsync1.append(tmp_file) rsync1.append('%s@%s:"%s"/' %(self.user, tools.escapeIPv6Address(self.host), remote_tmp_dir_1)) #check remote rsync hard-link support rsync2 = tools.rsyncPrefix(self.config, no_perms = False, progress = False) rsync2.append('--link-dest=../%s' %os.path.basename(remote_tmp_dir_1)) rsync2.append(tmp_file) rsync2.append('%s@%s:"%s"/' %(self.user, tools.escapeIPv6Address(self.host), remote_tmp_dir_2)) for cmd in (rsync1, rsync2): logger.debug('Check rsync command: %s' %cmd, self) proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True) out, err = proc.communicate() if err or proc.returncode: logger.debug('rsync command returned error: %s' %err, self) raise MountException(_('Remote host %(host)s doesn\'t support \'%(command)s\':\n' '%(err)s\nLook at \'man backintime\' for further instructions') % {'host' : self.host, 'command' : cmd, 'err' : err}) #check cp chmod find and rm head = 'tmp1="%s"; tmp2="%s"; ' %(remote_tmp_dir_1, remote_tmp_dir_2) #first define a function to clean up and exit head += 'cleanup(){ ' head += 'test -e "$tmp1/a" && rm "$tmp1/a" >/dev/null 2>&1; ' head += 'test -e "$tmp2/a" && rm "$tmp2/a" >/dev/null 2>&1; ' head += 'test -e smr.lock && rm smr.lock >/dev/null 2>&1; ' head += 'test -e "$tmp1" && rmdir "$tmp1" >/dev/null 2>&1; ' head += 'test -e "$tmp2" && rmdir "$tmp2" >/dev/null 2>&1; ' head += 'test -n "$tmp3" && test -e "$tmp3" && rmdir "$tmp3" >/dev/null 2>&1; ' head += 'exit $1; }; ' tail = [] #list inodes cmd = 'ls -i "$tmp1/a"; ls -i "$tmp2/a"; ' tail.append(cmd) #try nice -n 19 if self.nice: cmd = 'echo \"nice -n 19\"; nice -n 19 true >/dev/null; err_nice=$?; ' cmd += 'test $err_nice -ne 0 && cleanup $err_nice; ' tail.append(cmd) #try ionice -c2 -n7 if self.ionice: cmd = 'echo \"ionice -c2 -n7\"; ionice -c2 -n7 true >/dev/null; err_nice=$?; ' cmd += 'test $err_nice -ne 0 && cleanup $err_nice; ' tail.append(cmd) #try nocache if self.nocache: cmd = 'echo \"nocache\"; nocache true >/dev/null; err_nocache=$?; ' cmd += 'test $err_nocache -ne 0 && cleanup $err_nocache; ' tail.append(cmd) #try screen, bash and flock used by smart-remove running in background if self.config.smartRemoveRunRemoteInBackground(self.profile_id): cmd = 'echo \"screen -d -m bash -c ...\"; screen -d -m bash -c \"true\" >/dev/null; err_screen=$?; ' cmd += 'test $err_screen -ne 0 && cleanup $err_screen; ' tail.append(cmd) cmd = 'echo \"(flock -x 9) 9>smr.lock\"; bash -c \"(flock -x 9) 9>smr.lock\" >/dev/null; err_flock=$?; ' cmd += 'test $err_flock -ne 0 && cleanup $err_flock; ' tail.append(cmd) cmd = 'echo \"rmdir \$(mktemp -d)\"; tmp3=$(mktemp -d); test -z "$tmp3" && cleanup 1; rmdir $tmp3 >/dev/null; err_rmdir=$?; ' cmd += 'test $err_rmdir -ne 0 && cleanup $err_rmdir; ' tail.append(cmd) #if we end up here, everything should be fine cmd = 'echo \"done\"; cleanup 0' tail.append(cmd) maxLength = self.config.sshMaxArgLength(self.profile_id) additionalChars = len('echo ""') + len(self.config.sshPrefixCmd(self.profile_id, cmd_type = str)) output = '' err = '' returncode = 0 for cmd in tools.splitCommands(tail, head = head, maxLength = maxLength - additionalChars): if cmd.endswith('; '): cmd += 'echo ""' c = self.config.sshCommand(cmd = [cmd], custom_args = ['-p', str(self.port), self.user_host], port = False, user_host = False, nice = False, ionice = False, profile_id = self.profile_id) try: logger.debug('Call command: %s' %' '.join(c), self) proc = subprocess.Popen(c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines = True) ret = proc.communicate() except OSError as e: #Argument list too long if e.errno == 7: logger.debug('Argument list too log (Python exception)', self) return maxArg() else: raise logger.debug('Command stdout: %s' %ret[0], self) logger.debug('Command stderr: %s' %ret[1], self) logger.debug('Command returncode: %s' %proc.returncode, self) output += ret[0].strip('\n') + '\n' err += ret[1].strip('\n') + '\n' returncode += proc.returncode if proc.returncode: break output_split = output.strip('\n').split('\n') while True: if output_split and not output_split[-1]: output_split = output_split[:-1] else: break if not output_split: return maxArg() if returncode or not output_split[-1].startswith('done'): for command in ('rm', 'nice', 'ionice', 'nocache', 'screen', '(flock'): if output_split[-1].startswith(command): raise MountException(_('Remote host %(host)s doesn\'t support \'%(command)s\':\n' '%(err)s\nLook at \'man backintime\' for further instructions') % {'host' : self.host, 'command' : output_split[-1], 'err' : err}) raise MountException(_('Check commands on host %(host)s returned unknown error:\n' '%(err)s\nLook at \'man backintime\' for further instructions') % {'host' : self.host, 'err' : err}) inodes = [] for tmp in (remote_tmp_dir_1, remote_tmp_dir_2): for line in output_split: m = re.match(r'^(\d+).*?%s' %tmp, line) if m: inodes.append(m.group(1)) logger.debug('remote inodes: ' + ' | '.join(inodes), self) if len(inodes) == 2 and inodes[0] != inodes[1]: raise MountException(_('Remote host %s doesn\'t support hardlinks') % self.host) def randomId(self, size=6, chars=string.ascii_uppercase + string.digits): """ Create a random string. Args: size (int): length of the string chars (str): characters used as basis for the random string Returns: str: random string with lenght ``size`` """ return ''.join(random.choice(chars) for x in range(size)) def sshKeyGen(keyfile): """ Generate a new ssh-key pair (private and public key) in ``keyfile`` and ``keyfile``.pub Args: keyfile (str): path for private key file Returns: bool: True if successful; False if ``keyfile`` already exist or if there was an error """ if os.path.exists(keyfile): logger.warning('SSH keyfile "{}" already exist. Skip creating a new one'.format(keyfile)) return False cmd = ['ssh-keygen', '-t', 'rsa', '-N', '', '-f', keyfile] proc = subprocess.Popen(cmd, stdout = subprocess.DEVNULL, stderr = subprocess.PIPE, universal_newlines = True) out, err = proc.communicate() if proc.returncode: logger.error('Failed to create a new ssh-key: {}'.format(err)) else: logger.info('Successfully create new ssh-key "{}"'.format(keyfile)) return not proc.returncode def sshCopyId(pubkey, user, host, port = '22', askPass = 'backintime-askpass', cipher = None): """ Copy SSH public key ``pubkey`` to remote ``host``. Args: pubkey (str): path to the public key file user (str): remote user host (str): remote host port (str): ssh port on remote host askPass (str): program used to pipe password into ssh cipher (str): cipher used for ssh Returns: bool: True if successful """ if not os.path.exists(pubkey): logger.warning('SSH public key "{}" does not exist. Skip copy to remote host'.format(pubkey)) return False env = os.environ.copy() env['SSH_ASKPASS'] = askPass env['ASKPASS_MODE'] = 'USER' env['ASKPASS_PROMPT'] = _('Copy public ssh-key "%(pubkey)s" to remote host "%(host)s".\nPlease enter password for "%(user)s":')\ %{'pubkey': pubkey, 'host': host, 'user': user} cmd = ['ssh-copy-id', '-i', pubkey, '-p', port] if cipher and cipher != 'default': cmd.extend(['-o', 'Ciphers={}'.format(cipher)]) cmd.append('{}@{}'.format(user,host)) logger.debug('Call command "{}"'.format(' '.join(cmd))) proc = subprocess.Popen(cmd, env = env, stdout = subprocess.DEVNULL, stderr = subprocess.PIPE, preexec_fn = os.setsid, # cut of ssh from current # terminal to make it use # backintime-askpass universal_newlines = True) out, err = proc.communicate() if proc.returncode: logger.error('Failed to copy ssh-key "{}" to "{}@{}": [{}] {}'.format(pubkey, user, host, proc.returncode, err)) else: logger.info('Successfully copied ssh-key "{}" to "{}@{}"'.format(pubkey, user, host)) return not proc.returncode def sshKeyFingerprint(path): """ Get the hex fingerprint from a given ssh key. Args: path (str): full path to key file Returns: str: hex fingerprint from key """ if not os.path.exists(path): return cmd = ['ssh-keygen', '-l', '-f', path] proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.DEVNULL) output = proc.communicate()[0] m = re.match(b'\d+\s+(SHA256:\S+|[a-fA-F0-9:]+)\s.*', output) if m: return m.group(1).decode('UTF-8') def sshHostKey(host, port = '22'): """ Get the remote host key from ``host``. Args: host (str): host name or IP address port (str): port number of remote ssh-server Returns: tuple: three item tuple with (fingerprint, hashed host key, key type) """ for t in ('ecdsa', 'rsa'): cmd = ['ssh-keyscan', '-t', t, '-p', port, host] proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.DEVNULL) hostKey = proc.communicate()[0].strip() if hostKey: break if hostKey: logger.debug('Found {} key for host "{}"'.format(t.upper(), host)) with tempfile.TemporaryDirectory() as tmp: keyFile = os.path.join(tmp, 'key') with open(keyFile, 'wb') as f: f.write(hostKey + b'\n') hostKeyFingerprint = sshKeyFingerprint(keyFile) cmd = ['ssh-keygen', '-H', '-f', keyFile] proc = subprocess.Popen(cmd, stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL) proc.communicate() with open(keyFile, 'rt') as f: hostKeyHash = f.read().strip() return (hostKeyFingerprint, hostKeyHash, t.upper()) return (None, None, None) def writeKnownHostsFile(key): """ Write host key ``key`` into `~/.ssh/known_hosts`. Args: key (str): host key """ sshDir = os.path.expanduser('~/.ssh') knownHostFile = os.path.join(sshDir, 'known_hosts') if not os.path.isdir(sshDir): tools.mkdir(sshDir, 0o700) with open(knownHostFile, 'at') as f: logger.info('Write host key to {}'.format(knownHostFile)) f.write(key + '\n') backintime-1.2.1/common/backintime.desktop0000644000175000017500000000034513530533316020132 0ustar germargermar[Desktop Entry] Version=1.0 Name=Backintime Password Cache Exec=/bin/sh -c "backintime pw-cache start 2>&1 >/dev/null" Comment=Cache passwords for non-interactive Backintime cronjobs Icon=gtk-save Terminal=false Type=Application backintime-1.2.1/common/applicationinstance.py0000644000175000017500000001352413530533316021036 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import fcntl import errno import logger import tools class ApplicationInstance: """ Class used to handle one application instance mechanism. Args: pidFile (str): full path of file used to save pid and procname autoExit (bool): automatically call sys.exit if there is an other instance running flock (bool): use file-locks to make sure only one instance is checking at the same time """ def __init__(self, pidFile, autoExit = True, flock = False): self.pidFile = pidFile self.pid = 0 self.procname = '' self.flock = None if flock: self.flockExclusiv() if autoExit: if self.check(True): self.startApplication() def __del__(self): self.flockUnlock() def check(self, autoExit = False): """ Check if the current application is already running Args: autoExit (bool): automatically call sys.exit if there is an other instance running Returns: bool: ``True`` if this is the only application instance """ #check if the pidfile exists if not os.path.isfile(self.pidFile): return True self.pid, self.procname = self.readPidFile() #check if the process with specified by pid exists if 0 == self.pid: return True if not tools.processAlive(self.pid): return True #check if the process has the same procname #check cmdline for backwards compatibility if self.procname and \ self.procname != tools.processName(self.pid) and \ self.procname != tools.processCmdline(self.pid): return True if autoExit: #exit the application print("The application is already running !") exit(0) #exit raise an exception so don't put it in a try/except block return False def busy(self): """ Check if one application with this instance is currently running. Returns: bool: ``True`` if an other instance is currently running. """ return not self.check() def startApplication(self): """ Called when the single instance starts to save its pid """ pid = os.getpid() procname = tools.processName(pid) try: with open(self.pidFile, 'wt') as f: f.write('{}\n{}'.format(pid, procname)) except OSError as e: logger.error('Failed to write PID file %s: [%s] %s' %(e.filename, e.errno, e.strerror)) self.flockUnlock() def exitApplication(self): """ Called when the single instance exit (remove pid file) """ try: os.remove(self.pidFile) except: pass def flockExclusiv(self): """ Create an exclusive lock to block a second instance while the first instance is starting. """ try: self.flock = open(self.pidFile + '.flock', 'w') fcntl.flock(self.flock, fcntl.LOCK_EX) except OSError as e: logger.error('Failed to write flock file %s: [%s] %s' %(e.filename, e.errno, e.strerror)) def flockUnlock(self): """ Remove the exclusive lock. Second instance can now continue but should find it self to be obsolete. """ if self.flock: fcntl.fcntl(self.flock, fcntl.LOCK_UN) self.flock.close() try: os.remove(self.flock.name) except: #an other instance was faster #race condition while using 'if os.path.exists(...)' pass self.flock = None def readPidFile(self): """ Read the pid and procname from the file Returns: tuple: tuple of (pid(int), procname(str)) """ pid = 0 procname = '' try: with open(self.pidFile, 'rt') as f: data = f.read() data = data.split('\n', 1) if data[0].isdigit(): pid = int(data[0]) if len(data) > 1: procname = data[1].strip('\n') except OSError as e: logger.warning('Failed to read PID and process name from %s: [%s] %s' %(e.filename, e.errno, e.strerror)) except ValueError as e: logger.warning('Failed to extract PID and process name from %s: %s' %(self.pidFile, str(e))) return (pid, procname) if __name__ == '__main__': import time #create application instance appInstance = ApplicationInstance('/tmp/myapp.pid') #do something here print("Start MyApp") time.sleep(5) #sleep 5 seconds print("End MyApp") #remove pid file appInstance.exitApplication() backintime-1.2.1/common/cli.py0000644000175000017500000001547013530533316015557 0ustar germargermar# -*- coding: utf-8 -*- # Back In Time # Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import tools import snapshots import bcolors def restore(cfg, snapshot_id = None, what = None, where = None, **kwargs): if what is None: what = input('File to restore: ') what = tools.preparePath(os.path.abspath(os.path.expanduser(what))) if where is None: where = input('Restore to (empty for original path): ') if where: where = tools.preparePath(os.path.abspath(os.path.expanduser(where))) snapshotsList = snapshots.listSnapshots(cfg) sid = selectSnapshot(snapshotsList, cfg, snapshot_id, 'SnapshotID to restore') print('') RestoreDialog(cfg, sid, what, where, **kwargs).run() def remove(cfg, snapshot_ids = None, force = None): snapshotsList = snapshots.listSnapshots(cfg) if not snapshot_ids: snapshot_ids = (None,) sids = [selectSnapshot(snapshotsList, cfg, sid, 'SnapshotID to remove') for sid in snapshot_ids] if not force: print('Do you really want to remove this snapshots?') [print(sid.displayName) for sid in sids] if not 'yes' == input('(no/yes): '): return s = snapshots.Snapshots(cfg) [s.remove(sid) for sid in sids] def checkConfig(cfg, crontab = True): import mount from exceptions import MountException def announceTest(): print() print(frame(test)) def failed(): print(test + ': ' + bcolors.FAIL + 'failed' + bcolors.ENDC) def okay(): print(test + ': ' + bcolors.OKGREEN + 'done' + bcolors.ENDC) def errorHandler(msg): print(bcolors.WARNING + 'WARNING: ' + bcolors.ENDC + msg) cfg.setErrorHandler(errorHandler) mode = cfg.snapshotsMode() if cfg.SNAPSHOT_MODES[mode][0] is not None: #preMountCheck test = 'Run mount tests' announceTest() mnt = mount.Mount(cfg = cfg, tmp_mount = True) try: mnt.preMountCheck(mode = mode, first_run = True) except MountException as ex: failed() print(str(ex)) return False okay() #okay, lets try to mount test = 'Mount' announceTest() try: hash_id = mnt.mount(mode = mode, check = False) except MountException as ex: failed() print(str(ex)) return False okay() test = 'Check/prepair snapshot path' announceTest() snapshots_path = cfg.snapshotsPath(mode = mode, tmp_mount = True) if not cfg.setSnapshotsPath(snapshots_path, mode = mode): failed() return False okay() #umount if not cfg.SNAPSHOT_MODES[mode][0] is None: test = 'Unmount' announceTest() try: mnt.umount(hash_id = hash_id) except MountException as ex: failed() print(str(ex)) return False okay() test = 'Check config' announceTest() if not cfg.checkConfig(): failed() return False okay() if crontab: test = 'Install crontab' announceTest() if not cfg.setupCron(): failed() return False okay() return True def selectSnapshot(snapshotsList, cfg, snapshot_id = None, msg = 'SnapshotID'): """ check if given snapshot is valid. If not print a list of all snapshots and ask to choose one """ len_snapshots = len(snapshotsList) if not snapshot_id is None: try: sid = snapshots.SID(snapshot_id, cfg) if sid in snapshotsList: return sid else: print('SnapshotID %s not found.' % snapshot_id) except ValueError: try: index = int(snapshot_id) return snapshotsList[index] except (ValueError, IndexError): print('Invalid SnaphotID index: %s' % snapshot_id) snapshot_id = None columns = (terminalSize()[1] - 25) // 26 + 1 rows = len_snapshots // columns if len_snapshots % columns > 0: rows += 1 print('SnapshotID\'s:') for row in range(rows): line = [] for column in range(columns): index = row + column * rows if index > len_snapshots - 1: continue line.append('{i:>4}: {s}'.format(i = index, s = snapshotsList[index])) print(' '.join(line)) print('') while snapshot_id is None: try: index = int(input(msg + ' (0 - %d): ' % (len_snapshots - 1))) snapshot_id = snapshotsList[index] except (ValueError, IndexError): print('Invalid Input') continue return snapshot_id def terminalSize(): """ get terminal size """ for fd in (sys.stdin, sys.stdout, sys.stderr): try: import fcntl, termios, struct return [int(x) for x in struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234'))] except: pass return [24, 80] def frame(msg, size = 32): ret = ' +' + '-' * size + '+\n' ret += ' |' + msg.center(size) + '|\n' ret += ' +' + '-' * size + '+' return ret class RestoreDialog(object): def __init__(self, cfg, sid, what, where, **kwargs): self.config = cfg self.sid = sid self.what = what self.where = where self.kwargs = kwargs self.logFile = self.config.restoreLogFile() if os.path.exists(self.logFile): os.remove(self.logFile) def callback(self, line, *params): if not line: return print(line) with open(self.logFile, 'a') as log: log.write(line + '\n') def run(self): s = snapshots.Snapshots(self.config) s.restore(self.sid, self.what, self.callback, self.where, **self.kwargs) print('\nLog saved to %s' % self.logFile) class BackupJobDaemon(tools.Daemon): def __init__(self, func, args): super(BackupJobDaemon, self).__init__() self.func = func self.args = args def run(self): self.func(self.args, False) backintime-1.2.1/common/doc-dev/0000755000175000017500000000000013530533316015750 5ustar germargermarbackintime-1.2.1/common/doc-dev/logger.rst0000644000175000017500000000015513530533316017762 0ustar germargermarlogger module ============= .. automodule:: logger :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/exceptions.rst0000644000175000017500000000017113530533316020662 0ustar germargermarexceptions module ================= .. automodule:: exceptions :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/conf.py0000644000175000017500000002111513530533316017247 0ustar germargermar#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # BackInTime documentation build configuration file, created by # sphinx-quickstart on Sat Jan 9 00:04:35 2016. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) sys.path.insert(0, os.path.abspath(os.path.join(os.pardir))) #import config to solve race conditions between config an mount import config # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.intersphinx', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = 'BackInTime' copyright = '2016, Germar Reitze' author = 'Germar Reitze' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.1' # The full version, including alpha/beta/rc tags. release = '1.1.12' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Intersphinx options -------------------------------------------------- intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None)} # -- Napoleon include private members which have docstrings --------------- napoleon_include_private_with_doc = True # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'classic' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'BackInTimeDevDoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'BackInTime.tex', 'Back In Time Development Documentation', 'Germar Reitze', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'backintime', 'Back In Time Development Documentation', ['Germar Reitze'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'BackInTime', 'Back In Time Development Documentation', 'Germar Reitze', 'BackInTime', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False backintime-1.2.1/common/doc-dev/password_ipc.rst0000644000175000017500000000017713530533316021204 0ustar germargermarpassword_ipc module =================== .. automodule:: password_ipc :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/dummytools.rst0000644000175000017500000000017113530533316020715 0ustar germargermardummytools module ================= .. automodule:: dummytools :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/driveinfo.rst0000644000175000017500000000016613530533316020472 0ustar germargermardriveinfo module ================ .. automodule:: driveinfo :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/_build/0000755000175000017500000000000013530533316017206 5ustar germargermarbackintime-1.2.1/common/doc-dev/_build/.dummy0000644000175000017500000000000013530533316020330 0ustar germargermarbackintime-1.2.1/common/doc-dev/askpass.rst0000644000175000017500000000016013530533316020144 0ustar germargermaraskpass module ============== .. automodule:: askpass :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/pluginmanager.rst0000644000175000017500000000020213530533316021325 0ustar germargermarpluginmanager module ==================== .. automodule:: pluginmanager :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/sshMaxArg.rst0000644000175000017500000000016613530533316020402 0ustar germargermarsshMaxArg module ================ .. automodule:: sshMaxArg :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/snapshotlog.rst0000644000175000017500000000017413530533316021045 0ustar germargermarsnapshotlog module ================== .. automodule:: snapshotlog :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/encfstools.rst0000644000175000017500000000017113530533316020660 0ustar germargermarencfstools module ================= .. automodule:: encfstools :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/sshtools.rst0000644000175000017500000000016313530533316020360 0ustar germargermarsshtools module =============== .. automodule:: sshtools :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/_templates/0000755000175000017500000000000013530533316020105 5ustar germargermarbackintime-1.2.1/common/doc-dev/_templates/.dummy0000644000175000017500000000000013530533316021227 0ustar germargermarbackintime-1.2.1/common/doc-dev/bcolors.rst0000644000175000017500000000016013530533316020142 0ustar germargermarbcolors module ============== .. automodule:: bcolors :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/index.rst0000644000175000017500000000070213530533316017610 0ustar germargermar.. BackInTime documentation master file, created by sphinx-quickstart on Sat Jan 9 00:04:35 2016. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to BackInTime's documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 modules.rst Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` backintime-1.2.1/common/doc-dev/tools.rst0000644000175000017500000000015213530533316017640 0ustar germargermartools module ============ .. automodule:: tools :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/modules.rst0000644000175000017500000000054213530533316020153 0ustar germargermarcommon ====== .. toctree:: :maxdepth: 4 applicationinstance askpass backintime bcolors cli config configfile driveinfo dummytools encfstools exceptions guiapplicationinstance logger mount password password_ipc pluginmanager progress snapshotlog snapshots sshMaxArg sshtools tools backintime-1.2.1/common/doc-dev/configfile.rst0000644000175000017500000000017113530533316020606 0ustar germargermarconfigfile module ================= .. automodule:: configfile :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/progress.rst0000644000175000017500000000016313530533316020346 0ustar germargermarprogress module =============== .. automodule:: progress :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/cli.rst0000644000175000017500000000014413530533316017250 0ustar germargermarcli module ========== .. automodule:: cli :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/applicationinstance.rst0000644000175000017500000000022413530533316022530 0ustar germargermarapplicationinstance module ========================== .. automodule:: applicationinstance :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/Makefile0000644000175000017500000001526013530533316017414 0ustar germargermar# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/BackInTime.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/BackInTime.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/BackInTime" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/BackInTime" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." htmlOpen: html xdg-open $(BUILDDIR)/html/index.html backintime-1.2.1/common/doc-dev/_static/0000755000175000017500000000000013530533316017376 5ustar germargermarbackintime-1.2.1/common/doc-dev/_static/.dummy0000644000175000017500000000000013530533316020520 0ustar germargermarbackintime-1.2.1/common/doc-dev/password.rst0000644000175000017500000000016313530533316020344 0ustar germargermarpassword module =============== .. automodule:: password :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/backintime.rst0000644000175000017500000000017113530533316020607 0ustar germargermarbackintime module ================= .. automodule:: backintime :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/config.rst0000644000175000017500000000015513530533316017750 0ustar germargermarconfig module ============= .. automodule:: config :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/snapshots.rst0000644000175000017500000000016613530533316020527 0ustar germargermarsnapshots module ================ .. automodule:: snapshots :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/guiapplicationinstance.rst0000644000175000017500000000023513530533316023237 0ustar germargermarguiapplicationinstance module ============================= .. automodule:: guiapplicationinstance :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/doc-dev/mount.rst0000644000175000017500000000015213530533316017642 0ustar germargermarmount module ============ .. automodule:: mount :members: :undoc-members: :show-inheritance: backintime-1.2.1/common/test/0000755000175000017500000000000013530533316015406 5ustar germargermarbackintime-1.2.1/common/test/test_restore.py0000644000175000017500000001701413530533316020505 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation,Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import unittest import pwd import grp import stat from tempfile import TemporaryDirectory from test import generic sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import config import snapshots import mount CURRENTUID = os.geteuid() CURRENTUSER = pwd.getpwuid(CURRENTUID).pw_name CURRENTGID = os.getegid() CURRENTGROUP = grp.getgrgid(CURRENTGID).gr_name class RestoreTestCase(generic.SnapshotsWithSidTestCase): def setUp(self): super(RestoreTestCase, self).setUp() self.include = TemporaryDirectory() generic.create_test_files(self.sid.pathBackup(self.include.name)) def tearDown(self): super(RestoreTestCase, self).tearDown() self.include.cleanup() def prepairFileInfo(self, restoreFile, mode = 33260): d = self.sid.fileInfo d[restoreFile.encode('utf-8', 'replace')] = (mode, CURRENTUSER.encode('utf-8', 'replace'), CURRENTGROUP.encode('utf-8', 'replace')) self.sid.fileInfo = d class TestRestore(RestoreTestCase): def test_restore_multiple_files(self): restoreFile1 = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile1) restoreFile2 = os.path.join(self.include.name, 'foo', 'bar', 'baz') self.prepairFileInfo(restoreFile2) self.sn.restore(self.sid, (restoreFile1, restoreFile2)) self.assertIsFile(restoreFile1) with open(restoreFile1, 'rt') as f: self.assertEqual(f.read(), 'bar') self.assertEqual(33260, os.stat(restoreFile1).st_mode) self.assertIsFile(restoreFile2) with open(restoreFile2, 'rt') as f: self.assertEqual(f.read(), 'foo') self.assertEqual(33260, os.stat(restoreFile2).st_mode) def test_restore_to_different_destination(self): restoreFile = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile) with TemporaryDirectory() as dest: destRestoreFile = os.path.join(dest, 'test') self.sn.restore(self.sid, restoreFile, restore_to = dest) self.assertIsFile(destRestoreFile) with open(destRestoreFile, 'rt') as f: self.assertEqual(f.read(), 'bar') self.assertEqual(33260, os.stat(destRestoreFile).st_mode) def test_restore_folder_to_different_destination(self): restoreFolder = self.include.name self.prepairFileInfo(restoreFolder) self.prepairFileInfo(os.path.join(restoreFolder, 'test')) self.prepairFileInfo(os.path.join(restoreFolder, 'file with spaces')) with TemporaryDirectory() as dest: destRestoreFile = os.path.join(dest, os.path.basename(restoreFolder), 'test') self.sn.restore(self.sid, restoreFolder, restore_to = dest) self.assertIsFile(destRestoreFile) with open(destRestoreFile, 'rt') as f: self.assertEqual(f.read(), 'bar') self.assertEqual(33260, os.stat(destRestoreFile).st_mode) def test_delete(self): restoreFolder = self.include.name junkFolder = os.path.join(self.include.name, 'junk') os.makedirs(junkFolder) self.assertExists(junkFolder) self.prepairFileInfo(restoreFolder) self.sn.restore(self.sid, restoreFolder, delete = True) self.assertIsFile(restoreFolder, 'test') self.assertNotExists(junkFolder) def test_backup(self): restoreFile = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile) with open(restoreFile, 'wt') as f: f.write('fooooooooooooooooooo') self.sn.restore(self.sid, restoreFile, backup = True) self.assertIsFile(restoreFile) with open(restoreFile, 'rt') as f: self.assertEqual(f.read(), 'bar') backupFile = restoreFile + self.sn.backupSuffix() self.assertIsFile(backupFile) with open(backupFile, 'rt') as f: self.assertEqual(f.read(), 'fooooooooooooooooooo') def test_no_backup(self): restoreFile = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile) with open(restoreFile, 'wt') as f: f.write('fooooooooooooooooooo') self.sn.restore(self.sid, restoreFile, backup = False) self.assertIsFile(restoreFile) with open(restoreFile, 'rt') as f: self.assertEqual(f.read(), 'bar') backupFile = restoreFile + self.sn.backupSuffix() self.assertIsNoFile(backupFile) def test_only_new(self): restoreFile = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile) with open(restoreFile, 'wt') as f: f.write('fooooooooooooooooooo') # change mtime to be newer than the one in snapshot st = os.stat(restoreFile) atime = st[stat.ST_ATIME] mtime = st[stat.ST_MTIME] new_mtime = mtime + 3600 os.utime(restoreFile, (atime, new_mtime)) self.sn.restore(self.sid, restoreFile, only_new = True) self.assertIsFile(restoreFile) with open(restoreFile, 'rt') as f: self.assertEqual(f.read(), 'fooooooooooooooooooo') class TestRestoreLocal(RestoreTestCase): """ Tests which should run on local and ssh profile """ def test_restore(self): restoreFile = os.path.join(self.include.name, 'test') self.prepairFileInfo(restoreFile) self.sn.restore(self.sid, restoreFile) self.assertIsFile(restoreFile) with open(restoreFile, 'rt') as f: self.assertEqual(f.read(), 'bar') self.assertEqual(33260, os.stat(restoreFile).st_mode) def test_restore_file_with_spaces(self): restoreFile = os.path.join(self.include.name, 'file with spaces') self.prepairFileInfo(restoreFile) self.sn.restore(self.sid, restoreFile) self.assertIsFile(restoreFile) with open(restoreFile, 'rt') as f: self.assertEqual(f.read(), 'asdf') self.assertEqual(33260, os.stat(restoreFile).st_mode) @unittest.skipIf(not generic.LOCAL_SSH, 'Skip as this test requires a local ssh server, public and private keys installed') class TestRestoreSSH(generic.SSHSnapshotsWithSidTestCase, TestRestoreLocal): def setUp(self): super(TestRestoreSSH, self).setUp() self.include = TemporaryDirectory() generic.create_test_files(os.path.join(self.remoteSIDBackupPath, self.include.name[1:])) #mount self.cfg.setCurrentHashId(mount.Mount(cfg = self.cfg).mount()) def tearDown(self): #unmount mount.Mount(cfg = self.cfg).umount(self.cfg.current_hash_id) super(TestRestoreSSH, self).tearDown() self.include.cleanup() backintime-1.2.1/common/test/test_snapshotlog.py0000644000175000017500000001441113530533316021361 0ustar germargermar# Back In Time # Copyright (C) 2016-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import unittest import re from test import generic from tempfile import TemporaryDirectory from datetime import datetime sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import snapshotlog import config import snapshots class TestLogFilter(generic.TestCase): #TODO: add decode test def __init__(self, *args, **kwargs): super(TestLogFilter, self).__init__(*args, **kwargs) self.e = '[E] foo bar' self.c = '[C] foo bar' self.i = '[I] foo bar' self.n = '' self.h = '========== header ===========' def test_filter(self): #No filter logFilter = snapshotlog.LogFilter() for line in (self.e, self.c, self.i, self.n, self.h): self.assertEqual(line, logFilter.filter(line)) #Error filter logFilter = snapshotlog.LogFilter(mode = snapshotlog.LogFilter.ERROR) for line in (self.e, self.n, self.h): self.assertEqual(line, logFilter.filter(line)) for line in (self.c, self.i): self.assertIsNone(logFilter.filter(line)) #Changes filter logFilter = snapshotlog.LogFilter(mode = snapshotlog.LogFilter.CHANGES) for line in (self.c, self.n, self.h): self.assertEqual(line, logFilter.filter(line)) for line in (self.e, self.i): self.assertIsNone(logFilter.filter(line)) #Information filter logFilter = snapshotlog.LogFilter(mode = snapshotlog.LogFilter.INFORMATION) for line in (self.i, self.n, self.h): self.assertEqual(line, logFilter.filter(line)) for line in (self.c, self.e): self.assertIsNone(logFilter.filter(line)) #Error + Changes filter logFilter = snapshotlog.LogFilter(mode = snapshotlog.LogFilter.ERROR_AND_CHANGES) for line in (self.e, self.c, self.n, self.h): self.assertEqual(line, logFilter.filter(line)) for line in (self.i,): self.assertIsNone(logFilter.filter(line)) class TestSnapshotLog(generic.SnapshotsTestCase): def setUp(self): super(TestSnapshotLog, self).setUp() self.logFile = os.path.join(self.cfg._LOCAL_DATA_FOLDER, 'takesnapshot_.log') def test_new(self): log = snapshotlog.SnapshotLog(self.cfg) now = datetime.today() with open(self.logFile, 'wt') as f: f.write('foo\nbar\n') log.new(now) log.flush() self.assertExists(self.logFile) with open(self.logFile, 'rt') as f: self.assertRegex(f.read(), re.compile(r'''========== Take snapshot \(profile .*\): .* ========== ''', re.MULTILINE)) def test_new_continue(self): log = snapshotlog.SnapshotLog(self.cfg) now = datetime.today() with open(self.logFile, 'wt') as f: f.write('foo\nbar\n') new = snapshots.NewSnapshot(self.cfg) new.makeDirs() new.saveToContinue = True log.new(now) log.flush() self.assertExists(self.logFile) with open(self.logFile, 'rt') as f: self.assertRegex(f.read(), re.compile(r'''foo bar Last snapshot didn't finish but can be continued. ======== continue snapshot \(profile .*\): .* ======== ''', re.MULTILINE)) def test_append(self): log = snapshotlog.SnapshotLog(self.cfg) log.append('foo', 1) log.flush() self.assertExists(self.logFile) with open(self.logFile, 'rt') as f: self.assertEqual(f.read(), 'foo\n') def test_append_log_level(self): self.cfg.setLogLevel(2) log = snapshotlog.SnapshotLog(self.cfg) log.append('foo', 3) log.flush() self.assertNotExists(self.logFile) log.append('bar', 1) log.flush() self.assertExists(self.logFile) with open(self.logFile, 'rt') as f: self.assertEqual(f.read(), 'bar\n') def test_get(self): log = snapshotlog.SnapshotLog(self.cfg) log.append('foo bar', 1) log.flush() self.assertExists(self.logFile) self.assertEqual('\n'.join(log.get()), 'foo bar') def test_get_filter(self): log = snapshotlog.SnapshotLog(self.cfg) log.append('foo bar', 1) log.append('[I] 123', 1) log.append('[C] baz', 1) log.append('[E] bla', 1) log.flush() self.assertExists(self.logFile) self.assertEqual('\n'.join(log.get(mode = snapshotlog.LogFilter.CHANGES)), 'foo bar\n[C] baz') def test_skipLines_show_all(self): log = snapshotlog.SnapshotLog(self.cfg) for i in range(10): log.append(str(i), 1) log.flush() self.assertEqual('\n'.join(log.get(skipLines = 0)), '\n'.join([str(i) for i in range(10)])) def test_skipLines(self): log = snapshotlog.SnapshotLog(self.cfg) for i in range(10): log.append(str(i), 1) log.flush() self.assertEqual('\n'.join(log.get(skipLines = 4)), '\n'.join([str(i) for i in range(4, 10)])) def test_skipLines_filtered(self): log = snapshotlog.SnapshotLog(self.cfg) log.append('foo bar', 1) log.append('[I] 123', 1) log.append('[C] baz', 1) log.append('[E] bla', 1) log.append('[C] 456', 1) log.append('[C] 789', 1) log.append('[E] qwe', 1) log.append('[C] asd', 1) log.flush() self.assertEqual('\n'.join(log.get(mode = snapshotlog.LogFilter.CHANGES, skipLines = 2)), '[C] 456\n[C] 789\n[C] asd') backintime-1.2.1/common/test/test_encfstools.py0000644000175000017500000000310713530533316021177 0ustar germargermar# Back In Time # Copyright (C) 2016-2019 Taylor Raack, Germar Reitze # # 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 2 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, write to the Free Software Foundation,Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys from test import generic sys.path.append(os.path.join(os.path.dirname(__file__), '..')) class TestEncFS_mount(generic.TestCase): # encrypted filesystem verification seems quite complex to unit test at the moment, partially due to # UI elements being created and expecting input, without tests for pre-prepared unit test fixture data # TODO - perhaps pass encrypted fs class object which can be queried for passwords when necessary (so runtime # can pass UI classes which can bring up actual UI elements and return credentials or unit tests can pass # objects which can return hard coded passwords to prevent UI pop-ups in Travis) # TODO - then - code actual tests and remove this one def setUp(self): super(TestEncFS_mount, self).setUp() def test_dummy(self): self.assertTrue(True) backintime-1.2.1/common/test/test_snapshots.py0000644000175000017500000010530013530533316021040 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation,Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import shutil import stat import pwd import grp import re import unittest from unittest.mock import patch from datetime import date, datetime from threading import Thread from tempfile import TemporaryDirectory from test import generic sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import config import snapshots import tools CURRENTUID = os.geteuid() CURRENTUSER = pwd.getpwuid(CURRENTUID).pw_name CURRENTGID = os.getegid() CURRENTGROUP = grp.getgrgid(CURRENTGID).gr_name #all groups the current user is member in GROUPS = [i.gr_name for i in grp.getgrall() if CURRENTUSER in i.gr_mem] NO_GROUPS = not GROUPS IS_ROOT = os.geteuid() == 0 class TestSnapshots(generic.SnapshotsTestCase): ############################################################################ ### takeSnapshotMessage ### ############################################################################ def test_setTakeSnapshotMessage_info(self): self.sn.setTakeSnapshotMessage(0, 'first message') self.sn.snapshotLog.flush() # test NotifyPlugin self.mockNotifyPlugin.assert_called_once_with(self.sn.config.currentProfile(), self.sn.config.profileName(), 0, 'first message', -1) self.assertExists(self.sn.config.takeSnapshotMessageFile()) # test message file with open(self.sn.config.takeSnapshotMessageFile(), 'rt') as f: message = f.read() self.assertEqual(message, '0\nfirst message') # test snapshot log self.assertEqual('\n'.join(self.sn.snapshotLog.get()), '[I] first message') def test_setTakeSnapshotMessage_error(self): self.sn.setTakeSnapshotMessage(1, 'second message') self.sn.snapshotLog.flush() # test NotifyPlugin self.mockNotifyPlugin.assert_called_once_with(self.sn.config.currentProfile(), self.sn.config.profileName(), 1, 'second message', -1) # test message file self.assertExists(self.sn.config.takeSnapshotMessageFile()) with open(self.sn.config.takeSnapshotMessageFile(), 'rt') as f: message = f.read() self.assertEqual(message, '1\nsecond message') # test snapshot log self.assertEqual('\n'.join(self.sn.snapshotLog.get()), '[E] second message') ############################################################################ ### uid ### ############################################################################ def test_uid_valid(self): self.assertEqual(self.sn.uid('root'), 0) self.assertEqual(self.sn.uid(b'root'), 0) self.assertEqual(self.sn.uid(CURRENTUSER), CURRENTUID) self.assertEqual(self.sn.uid(CURRENTUSER.encode()), CURRENTUID) def test_uid_invalid(self): self.assertEqual(self.sn.uid('nonExistingUser'), -1) self.assertEqual(self.sn.uid(b'nonExistingUser'), -1) def test_uid_backup(self): self.assertEqual(self.sn.uid('root', backup = 99999), 0) self.assertEqual(self.sn.uid(b'root', backup = 99999), 0) self.assertEqual(self.sn.uid('nonExistingUser', backup = 99999), 99999) self.assertEqual(self.sn.uid(b'nonExistingUser', backup = 99999), 99999) self.assertEqual(self.sn.uid(CURRENTUSER, backup = 99999), CURRENTUID) self.assertEqual(self.sn.uid(CURRENTUSER.encode(), backup = 99999), CURRENTUID) ############################################################################ ### gid ### ############################################################################ def test_gid_valid(self): self.assertEqual(self.sn.gid('root'), 0) self.assertEqual(self.sn.gid(b'root'), 0) self.assertEqual(self.sn.gid(CURRENTGROUP), CURRENTGID) self.assertEqual(self.sn.gid(CURRENTGROUP.encode()), CURRENTGID) def test_gid_invalid(self): self.assertEqual(self.sn.gid('nonExistingGroup'), -1) self.assertEqual(self.sn.gid(b'nonExistingGroup'), -1) def test_gid_backup(self): self.assertEqual(self.sn.gid('root', backup = 99999), 0) self.assertEqual(self.sn.gid(b'root', backup = 99999), 0) self.assertEqual(self.sn.gid('nonExistingGroup', backup = 99999), 99999) self.assertEqual(self.sn.gid(b'nonExistingGroup', backup = 99999), 99999) self.assertEqual(self.sn.gid(CURRENTGROUP, backup = 99999), CURRENTGID) self.assertEqual(self.sn.gid(CURRENTGROUP.encode(), backup = 99999), CURRENTGID) ############################################################################ ### userName ### ############################################################################ def test_userName_valid(self): self.assertEqual(self.sn.userName(0), 'root') self.assertEqual(self.sn.userName(CURRENTUID), CURRENTUSER) def test_userName_invalid(self): self.assertEqual(self.sn.userName(99999), '-') ############################################################################ ### groupName ### ############################################################################ def test_groupName_valid(self): self.assertEqual(self.sn.groupName(0), 'root') self.assertEqual(self.sn.groupName(CURRENTGID), CURRENTGROUP) def test_groupName_invalid(self): self.assertEqual(self.sn.groupName(99999), '-') ############################################################################ ### takeSnapshot helper scripts ### ############################################################################ def test_rsyncRemotePath(self): self.assertEqual(self.sn.rsyncRemotePath('/foo'), '/foo') self.assertEqual(self.sn.rsyncRemotePath('/foo', quote = '\\\"'), '/foo') self.assertEqual(self.sn.rsyncRemotePath('/foo', use_mode = ['local']), '/foo') self.assertEqual(self.sn.rsyncRemotePath('/foo', use_mode = ['local'], quote = '\\\"'), '/foo') #set up SSH profile self.cfg.setSnapshotsMode('ssh') self.cfg.setSshHost('localhost') self.cfg.setSshUser('foo') self.assertEqual(self.sn.rsyncRemotePath('/bar'), 'foo@localhost:"/bar"') self.assertEqual(self.sn.rsyncRemotePath('/bar', quote = '\\\"'), 'foo@localhost:\\\"/bar\\\"') self.assertEqual(self.sn.rsyncRemotePath('/bar', use_mode = []), '/bar') def test_createLastSnapshotSymlink(self): sid1 = snapshots.SID('20151219-010324-123', self.cfg) sid1.makeDirs() symlink = self.cfg.lastSnapshotSymlink() self.assertNotExists(symlink) self.assertTrue(self.sn.createLastSnapshotSymlink(sid1)) self.assertIsLink(symlink) self.assertEqual(os.path.realpath(symlink), sid1.path()) sid2 = snapshots.SID('20151219-020324-123', self.cfg) sid2.makeDirs() self.assertTrue(self.sn.createLastSnapshotSymlink(sid2)) self.assertIsLink(symlink) self.assertEqual(os.path.realpath(symlink), sid2.path()) def flockSecondInstance(self): cfgFile = os.path.abspath(os.path.join(__file__, os.pardir, 'config')) cfg = config.Config(cfgFile) sn = snapshots.Snapshots(cfg) sn.GLOBAL_FLOCK = self.sn.GLOBAL_FLOCK cfg.setGlobalFlock(True) sn.flockExclusive() sn.flockRelease() def test_flockExclusive(self): RWUGO = 33206 #-rw-rw-rw self.cfg.setGlobalFlock(True) thread = Thread(target = self.flockSecondInstance, args = ()) self.sn.flockExclusive() self.assertExists(self.sn.GLOBAL_FLOCK) mode = os.stat(self.sn.GLOBAL_FLOCK).st_mode self.assertEqual(mode, RWUGO) thread.start() thread.join(0.01) self.assertTrue(thread.is_alive()) self.sn.flockRelease() thread.join() self.assertFalse(thread.is_alive()) def test_statFreeSpaceLocal(self): self.assertIsInstance(self.sn.statFreeSpaceLocal('/'), int) @patch('time.sleep') # speed up unittest def test_makeDirs(self, sleep): self.assertFalse(self.sn.makeDirs('/')) self.assertTrue(self.sn.makeDirs(os.getcwd())) with TemporaryDirectory() as d: path = os.path.join(d, 'foo', 'bar') self.assertTrue(self.sn.makeDirs(path)) ############################################################################ ### rsync Ex-/Include and suffix ### ############################################################################ def test_rsyncExclude_unique_items(self): exclude = self.sn.rsyncExclude(['/foo', '*bar', '/baz/1']) self.assertListEqual(list(exclude), ['--exclude=/foo', '--exclude=*bar', '--exclude=/baz/1']) def test_rsyncExclude_duplicate_items(self): exclude = self.sn.rsyncExclude(['/foo', '*bar', '/baz/1', '/foo', '/baz/1']) self.assertListEqual(list(exclude), ['--exclude=/foo', '--exclude=*bar', '--exclude=/baz/1']) def test_rsyncInclude_unique_items(self): i1, i2 = self.sn.rsyncInclude([('/foo', 0), ('/bar', 1), ('/baz/1/2', 1)]) self.assertListEqual(list(i1), ['--include=/foo/', '--include=/baz/1/', '--include=/baz/']) self.assertListEqual(list(i2), ['--include=/foo/**', '--include=/bar', '--include=/baz/1/2']) def test_rsyncInclude_duplicate_items(self): i1, i2 = self.sn.rsyncInclude([('/foo', 0), ('/bar', 1), ('/foo', 0), ('/baz/1/2', 1), ('/baz/1/2', 1)]) self.assertListEqual(list(i1), ['--include=/foo/', '--include=/baz/1/', '--include=/baz/']) self.assertListEqual(list(i2), ['--include=/foo/**', '--include=/bar', '--include=/baz/1/2']) def test_rsyncInclude_root(self): i1, i2 = self.sn.rsyncInclude([('/', 0), ]) self.assertListEqual(list(i1), []) self.assertListEqual(list(i2), ['--include=/', '--include=/**']) def test_rsyncSuffix(self): suffix = self.sn.rsyncSuffix(includeFolders = [('/foo', 0), ('/bar', 1), ('/baz/1/2', 1)], excludeFolders = ['/foo/bar', '*blub', '/bar/2']) self.assertIsInstance(suffix, list) self.assertRegex(' '.join(suffix), r'^--chmod=Du\+wx ' + r'--exclude=/tmp/.*? ' + r'--exclude=.*?\.local/share/backintime ' + r'--exclude=\.local/share/backintime/mnt ' + r'--include=/foo/ ' + r'--include=/baz/1/ ' + r'--include=/baz/ ' + r'--exclude=/foo/bar ' + r'--exclude=\*blub ' + r'--exclude=/bar/2 ' + r'--include=/foo/\*\* ' + r'--include=/bar ' + r'--include=/baz/1/2 ' + r'--exclude=\* /$') ############################################################################ ### callback ### ############################################################################ def test_restoreCallback(self): msg = 'foo' callback = lambda x: self.callback(self.assertEqual, x, msg) self.sn.restoreCallback(callback, True, msg) self.assertTrue(self.run) self.assertFalse(self.sn.restorePermissionFailed) self.run = False callback = lambda x: self.callback(self.assertRegex, x, r'{} : \w+'.format(msg)) self.sn.restoreCallback(callback, False, msg) self.assertTrue(self.run) self.assertTrue(self.sn.restorePermissionFailed) @unittest.skip('Not yet implemented') def test_filterRsyncProgress(self): pass def test_rsyncCallback(self): params = [False, False] self.sn.rsyncCallback('foo', params) self.assertListEqual([False, False], params) with open(self.cfg.takeSnapshotMessageFile(), 'rt') as f: self.assertEqual('0\nTake snapshot (rsync: foo)', f.read()) self.sn.snapshotLog.flush() with open(self.cfg.takeSnapshotLogFile(), 'rt') as f: self.assertEqual('[I] Take snapshot (rsync: foo)\n', f.read()) def test_rsyncCallback_keep_params(self): params = [True, True] self.sn.rsyncCallback('foo', params) self.assertListEqual([True, True], params) def test_rsyncCallback_transfer(self): params = [False, False] self.sn.rsyncCallback('BACKINTIME: $TRAP; ' %self.remotePath) ssh = sshtools.SSH(cfg = self.cfg) with self.assertRaisesRegex(MountException, r"Remote host .+ doesn't support hardlinks"): ssh.checkRemoteCommands() def test_check_remote_command_with_spaces(self): self.cfg.setSmartRemoveRunRemoteInBackground(tools.checkCommand('screen') and tools.checkCommand('flock')) self.remotePath = os.path.join(self.tmpDir.name, 'foo bar') self.cfg.setSshSnapshotsPath(self.remotePath) os.mkdir(self.remotePath) ssh = sshtools.SSH(cfg = self.cfg) ssh.checkRemoteCommands() def test_randomId(self): ssh = sshtools.SSH(cfg = self.cfg) self.assertRegex(ssh.randomId(size = 6), r'[A-Z0-9]{6}') class TestSshKey(generic.TestCaseCfg): def test_sshKeyGen(self): with TemporaryDirectory() as tmp: secKey = os.path.join(tmp, 'key') pubKey = secKey + '.pub' # create new key self.assertTrue(sshtools.sshKeyGen(secKey)) self.assertIsFile(secKey) self.assertIsFile(pubKey) # do not overwrite existing keys self.assertFalse(sshtools.sshKeyGen(secKey)) @unittest.skipIf(getpass.getuser() != 'germar', 'Password login does not work on Travis-ci.') @unittest.skipIf(not generic.LOCAL_SSH, 'Skip as this test requires a local ssh server, public and private keys installed') def test_sshCopyId(self): with TemporaryDirectory() as tmp: secKey = os.path.join(tmp, 'key') pubKey = secKey + '.pub' authKeys = os.path.expanduser('~/.ssh/authorized_keys') authKeysSic = os.path.join(tmp, 'sic') if os.path.exists(authKeys): shutil.copyfile(authKeys, authKeysSic) os.remove(authKeys) # create new key sshtools.sshKeyGen(secKey) self.assertIsFile(pubKey) with open(pubKey, 'rt') as f: pubKeyValue = f.read() try: # test copy pubKey self.assertTrue(sshtools.sshCopyId(pubKey, self.cfg.user(), 'localhost', askPass = 'test/mock_askpass')) self.assertExists(authKeys) with open(authKeys, 'rt') as f: self.assertIn(pubKeyValue, f.readlines()) finally: # restore original ~/.ssh/authorized_keys file without test pubKey if os.path.exists(authKeysSic): shutil.copyfile(authKeysSic, authKeys) @unittest.skipIf(not tools.checkCommand('ssh-keygen'), "'ssh-keygen' not found.") def test_sshKeyFingerprint(self): self.assertIsNone(sshtools.sshKeyFingerprint(os.path.abspath(__file__))) with TemporaryDirectory() as d: key = os.path.join(d, 'key') cmd = ['ssh-keygen', '-q', '-N', '', '-f', key] proc = subprocess.Popen(cmd) proc.communicate() fingerprint = sshtools.sshKeyFingerprint(key) self.assertIsInstance(fingerprint, str) if fingerprint.startswith('SHA256'): self.assertEqual(len(fingerprint), 50) self.assertRegex(fingerprint, r'^SHA256:[a-zA-Z0-9/+]+$') else: self.assertEqual(len(fingerprint), 47) self.assertRegex(fingerprint, r'^[a-fA-F0-9:]+$') @unittest.skipIf(not generic.LOCAL_SSH, 'Skip as this test requires a local ssh server, public and private keys installed') def test_sshHostKey(self): fingerprint, keyHash, keyType = sshtools.sshHostKey('localhost') self.assertIsInstance(fingerprint, str) self.assertIsInstance(keyHash, str) self.assertIsInstance(keyType, str) if fingerprint.startswith('SHA256'): self.assertEqual(len(fingerprint), 50) self.assertRegex(fingerprint, r'^SHA256:[a-zA-Z0-9/+]+$') else: self.assertEqual(len(fingerprint), 47) self.assertRegex(fingerprint, r'^[a-fA-F0-9:]+$') self.assertIn(keyType, ('ECDSA', 'RSA')) hostKey = '/etc/ssh/ssh_host_{}_key.pub'.format(keyType.lower()) self.assertExists(hostKey) self.assertEqual(3, len(keyHash.split())) try: with open(hostKey, 'rt') as f: pubKey = f.read().split()[1] self.assertEqual(pubKey, keyHash.split()[2]) except (IOError, IndexError): pass def test_writeKnownHostFile(self): KEY = '|1|abcdefghijklmnopqrstuvwxyz= ecdsa-sha2-nistp256 AAAAABCDEFGHIJKLMNOPQRSTUVWXYZ=' with TemporaryDirectory() as tmp: knownHosts = os.path.expanduser('~/.ssh/known_hosts') knownHostsSic = os.path.join(tmp, 'known_hosts') if os.path.exists(knownHosts): shutil.copyfile(knownHosts, knownHostsSic) try: sshtools.writeKnownHostsFile(KEY) self.assertExists(knownHosts) with open(knownHosts, 'rt') as f: self.assertIn(KEY, [x.strip() for x in f.readlines()]) finally: # restore original known_hosts file if os.path.exists(knownHostsSic): shutil.copyfile(knownHostsSic, knownHosts) @unittest.skipIf(not generic.LOCAL_SSH, 'Skip as this test requires a local ssh server, public and private keys installed') class TestStartSshAgent(generic.SSHTestCase): # running this test requires that user has public / private key pair created and ssh server running SOCK = 'SSH_AUTH_SOCK' PID = 'SSH_AGENT_PID' def setUp(self): super(TestStartSshAgent, self).setUp() self.ssh = sshtools.SSH(cfg = self.cfg) self.currentSock = os.environ.pop(self.SOCK, '') self.currentPid = os.environ.pop(self.PID, '') def tearDown(self): os.environ[self.SOCK] = self.currentSock os.environ[self.PID] = self.currentPid def test_startSshAgent(self): self.ssh.startSshAgent() self.assertTrue(self.SOCK in os.environ) self.assertTrue(self.PID in os.environ) @patch('tools.which') @patch('os.kill') def test_startSshAgentEqualSign(self, mockKill, mockWhich): mockWhich.return_value = ['echo', 'setenv SSH_AUTH_SOCK=/tmp/ssh-zWg8uTdgh1QJ/agent.9070;\n', 'setenv SSH_AGENT_PID=9071;\n' 'echo Agent pid 9071;'] self.ssh.startSshAgent() self.assertTrue(self.SOCK in os.environ) self.assertTrue(self.PID in os.environ) @patch('tools.which') @patch('os.kill') def test_startSshAgentSpace(self, mockKill, mockWhich): mockWhich.return_value = ['echo', 'setenv SSH_AUTH_SOCK /tmp/ssh-zWg8uTdgh1QJ/agent.9070;\n', 'setenv SSH_AGENT_PID 9071;\n' 'echo Agent pid 9071;'] self.ssh.startSshAgent() self.assertTrue(self.SOCK in os.environ) self.assertTrue(self.PID in os.environ) @patch('tools.which') @patch('os.kill') def test_startSshAgentExport(self, mockKill, mockWhich): mockWhich.return_value = ['echo', 'SSH_AUTH_SOCK=/tmp/ssh-zWg8uTdgh1QJ/agent.9070; export SSH_AUTH_SOCK;\n', 'SSH_AGENT_PID=9071; export SSH_AGENT_PID;\n' 'echo Agent pid 9071;'] self.ssh.startSshAgent() self.assertTrue(self.SOCK in os.environ) self.assertTrue(self.PID in os.environ) @patch('tools.which') def test_startSshAgentError(self, mockWhich): mockWhich.return_value = '/bin/false' with self.assertRaises(MountException): self.ssh.startSshAgent() @patch('tools.which') def test_startSshAgentMissing(self, mockWhich): mockWhich.return_value = '' with self.assertRaises(MountException): self.ssh.startSshAgent() backintime-1.2.1/common/test/test_configfile.py0000644000175000017500000006645213530533316021141 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation,Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys from tempfile import NamedTemporaryFile import unittest from test import generic sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import configfile class TestConfigFile(generic.TestCase): """ Tests for the ConfigFile class in the configfile module """ def test_save(self): """ Saves the config file in the tmp directory """ with NamedTemporaryFile() as cfgFile: cf = configfile.ConfigFile() self.assertTrue(cf.save(cfgFile.name)) self.assertExists(cfgFile.name) #test fail routine in ConfigFile.save with NamedTemporaryFile() as fakeDir: self.assertFalse(cf.save(os.path.join(fakeDir.name, 'foo'))) def test_load(self): """ ConfigFile should be able to load its content from a previously saved ConfigFile object. """ with NamedTemporaryFile() as cfgFile: original_cf = configfile.ConfigFile() key = "config_key" value = "config_value" original_cf.setStrValue(key, value) original_cf.save(cfgFile.name) cf = configfile.ConfigFile() cf.load(cfgFile.name) self.assertEqual(len(cf.keys()), len(original_cf.keys())) for k in original_cf.keys(): with self.subTest(k = k): #workaround for py.test3 2.5.1 doesn't support subTest msg = 'k = %s' %k self.assertTrue(cf.hasKey(k), msg) self.assertEqual(original_cf.strValue(k), cf.strValue(k)) def test_remapKey(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': '123', 'bar': '456'} #old key not in dict cfg.remapKey('notExistedKey', 'baz') self.assertEqual(cfg.strValue('foo'), '123') self.assertEqual(cfg.strValue('bar'), '456') #valid remap cfg.remapKey('foo', 'baz') self.assertEqual(cfg.strValue('foo'), '') self.assertEqual(cfg.strValue('baz'), '123') self.assertEqual(cfg.strValue('bar'), '456') #do not overwrite existing keys cfg.remapKey('baz', 'bar') self.assertEqual(cfg.strValue('baz'), '') self.assertEqual(cfg.strValue('bar'), '456') def test_remapKeyRegex(self): cfg = configfile.ConfigFile() cfg.dict = {'asdf.foo.qwertz': '123', 'foo.qwertz': '456', 'asdf.foo': '789', 'yxcv': 'jkl'} cfg.remapKeyRegex('foo', 'bar') self.assertEqual(cfg.strValue('asdf.bar.qwertz', 'WrongValue'), '123') self.assertEqual(cfg.strValue('bar.qwertz', 'WrongValue'), '456') self.assertEqual(cfg.strValue('asdf.bar', 'WrongValue'), '789') self.assertEqual(cfg.strValue('asdf.foo.qwertz', ''), '') self.assertEqual(cfg.strValue('foo.qwertz', ''), '') self.assertEqual(cfg.strValue('asdf.foo', ''), '') self.assertEqual(cfg.strValue('yxcv', 'WrongValue'), 'jkl') def test_hasKey(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'bar'} self.assertTrue(cfg.hasKey('foo')) self.assertFalse(cfg.hasKey('non_existend_key')) ############################################################################ ### str_value ### ############################################################################ def test_strValue(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'bar'} self.assertEqual(cfg.strValue('foo', 'default'), 'bar') def test_strValue_default(self): cfg = configfile.ConfigFile() self.assertEqual(cfg.strValue('non_existend_key', 'default'), 'default') def test_setStrValue(self): cfg = configfile.ConfigFile() cfg.setStrValue('foo', 'bar') self.assertDictEqual(cfg.dict, {'foo': 'bar'}) ############################################################################ ### int_value ### ############################################################################ def test_intValue(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': '11'} self.assertEqual(cfg.intValue('foo', 22), 11) def test_intValue_default(self): cfg = configfile.ConfigFile() self.assertEqual(cfg.intValue('non_existend_key', 33), 33) def test_setIntValue(self): cfg = configfile.ConfigFile() cfg.setIntValue('foo', 44) self.assertDictEqual(cfg.dict, {'foo': '44'}) ############################################################################ ### bool_value ### ############################################################################ def test_boolValue(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'true', 'bar': '1', 'baz': 'false', 'bla': '0'} self.assertEqual(cfg.boolValue('foo', False), True) self.assertEqual(cfg.boolValue('bar', False), True) self.assertEqual(cfg.boolValue('baz', True), False) self.assertEqual(cfg.boolValue('bla', True), False) def test_boolValue_default(self): cfg = configfile.ConfigFile() self.assertEqual(cfg.boolValue('non_existend_key', False), False) self.assertEqual(cfg.boolValue('non_existend_key', True), True) def test_setBoolValue(self): cfg = configfile.ConfigFile() cfg.setBoolValue('foo', True) cfg.setBoolValue('bar', False) self.assertDictEqual(cfg.dict, {'foo': 'true', 'bar': 'false'}) ############################################################################ ### listValue ### ############################################################################ def test_listValue_default(self): cfg = configfile.ConfigFile() self.assertListEqual(cfg.listValue('test', 'str:value', ['asdf']), ['asdf']) def test_listValue_int(self): cfg = configfile.ConfigFile() cfg.dict = {'aaa.size': '3', 'aaa.1.bla': '55', 'aaa.2.bla': '66', 'aaa.3.bla': '77'} self.assertListEqual(cfg.listValue('aaa', 'int:bla'), [55, 66, 77]) def test_listValue_str(self): cfg = configfile.ConfigFile() cfg.dict = {'bbb.size': '3', 'bbb.1.value': 'foo', 'bbb.2.value': 'bar', 'bbb.3.value': 'baz'} self.assertListEqual(cfg.listValue('bbb', 'str:value'), ['foo', 'bar', 'baz']) def test_listValue_bool(self): cfg = configfile.ConfigFile() cfg.dict = {'ccc.size': '2', 'ccc.1.foo': 'true', 'ccc.2.foo': 'false'} self.assertListEqual(cfg.listValue('ccc', 'bool:foo'), [True, False]) def test_listValue_tuple(self): cfg = configfile.ConfigFile() cfg.dict = {'ddd.size': '3', 'ddd.1.value': 'foo', 'ddd.1.type': '11', 'ddd.1.enabled': 'true', 'ddd.2.value': 'bar', 'ddd.2.type': '22', 'ddd.2.enabled': 'false', 'ddd.3.value': 'baz', 'ddd.3.type': '33', 'ddd.3.enabled': 'true'} self.assertListEqual(cfg.listValue('ddd', ('str:value', 'int:type', 'bool:enabled')), [('foo', 11, True), ('bar', 22, False), ('baz', 33, True)]) def test_listValue_tuple_missing_values(self): """ Don't include missing values. Bug #521 https://github.com/bit-team/backintime/issues/521 """ cfg = configfile.ConfigFile() cfg.dict = {'eee.size': '3', 'eee.1.value': 'foo', 'eee.1.enabled': 'true', 'eee.2.type': '22', 'eee.2.enabled': 'false', 'eee.3.value': 'baz', 'eee.3.type': '33'} self.assertListEqual(cfg.listValue('eee', ('str:value', 'int:type', 'bool:enabled')), [('foo', 0, True), ('baz', 33, False)]) def test_listValue_invalid_type(self): cfg = configfile.ConfigFile() cfg.dict = {'aaa.size': '3', 'aaa.1.value': '55', 'aaa.2.value': '66', 'aaa.3.value': '77'} with self.assertRaises(TypeError): cfg.listValue('aaa', 'non_existend_type:value') with self.assertRaises(TypeError): cfg.listValue('aaa', {'dict:value'}) with self.assertRaises(TypeError): cfg.listValue('aaa', 1) def test_listValue_wrong_size(self): """ Don't include empty values if size is wrong. Bug #521 https://github.com/bit-team/backintime/issues/521 """ cfg = configfile.ConfigFile() cfg.dict = {'bbb.size': '4', 'bbb.1.value': 'foo', 'bbb.2.value': 'bar', 'bbb.3.value': 'baz'} self.assertListEqual(cfg.listValue('bbb', 'str:value'), ['foo', 'bar', 'baz']) def test_listValue_zero_count(self): cfg = configfile.ConfigFile() cfg.dict = {'ccc.size': '2', 'ccc.0.value': 'foo', 'ccc.1.value': 'bar', 'ccc.2.value': 'baz'} self.assertListEqual(cfg.listValue('ccc', 'str:value'), ['bar', 'baz']) def test_listValue_missing_values(self): """ Don't include missing values. Bug #521 https://github.com/bit-team/backintime/issues/521 """ cfg = configfile.ConfigFile() cfg.dict = {'ddd.size': '4', 'ddd.1.value': 'foo', 'ddd.2.value': 'bar', 'ddd.4.value': 'baz'} self.assertListEqual(cfg.listValue('ddd', 'str:value'), ['foo', 'bar', 'baz']) def test_listValue_empty_list(self): cfg = configfile.ConfigFile() cfg.dict = {'eee.size': '0'} self.assertListEqual(cfg.listValue('eee', 'str:value', default = ['foo', 'bar']), []) ############################################################################ ### setListValue ### ############################################################################ def test_setListValue_int(self): cfg = configfile.ConfigFile() cfg.setListValue('aaa', 'int:bla', [55, 66, 77]) self.assertDictEqual(cfg.dict, {'aaa.size': '3', 'aaa.1.bla': '55', 'aaa.2.bla': '66', 'aaa.3.bla': '77'}) def test_setListValue_str(self): cfg = configfile.ConfigFile() cfg.setListValue('bbb', 'str:value', ['foo', 'bar', 'baz']) self.assertDictEqual(cfg.dict, {'bbb.size': '3', 'bbb.1.value': 'foo', 'bbb.2.value': 'bar', 'bbb.3.value': 'baz'}) def test_setListValue_bool(self): cfg = configfile.ConfigFile() cfg.setListValue('ccc', 'bool:foo', [True, False]) self.assertDictEqual(cfg.dict, {'ccc.size': '2', 'ccc.1.foo': 'true', 'ccc.2.foo': 'false'}) def test_setListValue_tuple(self): cfg = configfile.ConfigFile() cfg.setListValue('ddd', ('str:value', 'int:type', 'bool:enabled'), [('foo', 11, True), ('bar', 22, False), ('baz', 33, True)]) self.assertDictEqual(cfg.dict, {'ddd.size': '3', 'ddd.1.value': 'foo', 'ddd.1.type': '11', 'ddd.1.enabled': 'true', 'ddd.2.value': 'bar', 'ddd.2.type': '22', 'ddd.2.enabled': 'false', 'ddd.3.value': 'baz', 'ddd.3.type': '33', 'ddd.3.enabled': 'true'}) def test_setListValue_tuple_missing_values(self): cfg = configfile.ConfigFile() cfg.setListValue('ddd', ('str:value', 'int:type', 'bool:enabled'), [('foo', 11, True), ('bar', 22), ('baz',)]) self.assertDictEqual(cfg.dict, {'ddd.size': '3', 'ddd.1.value': 'foo', 'ddd.1.type': '11', 'ddd.1.enabled': 'true', 'ddd.2.value': 'bar', 'ddd.2.type': '22', 'ddd.3.value': 'baz'}) def test_setListValue_remove_leftovers(self): cfg = configfile.ConfigFile() cfg.dict = {'eee.size': '5', 'eee.1.bla': '55', 'eee.2.bla': '66', 'eee.3.bla': '77', 'eee.4.bla': '88', 'eee.5.bla': '99'} cfg.setListValue('eee', 'int:bla', [55, 66, 77]) self.assertDictEqual(cfg.dict, {'eee.size': '3', 'eee.1.bla': '55', 'eee.2.bla': '66', 'eee.3.bla': '77'}) def test_setListValue_remove_leftovers_tuple(self): cfg = configfile.ConfigFile() cfg.dict = {'fff.size': '5', 'fff.1.value': 'foo', 'fff.1.type': '11', 'fff.1.enabled': 'true', 'fff.2.value': 'bar', 'fff.2.type': '22', 'fff.2.enabled': 'false', 'fff.3.value': 'baz', 'fff.3.type': '33', 'fff.3.enabled': 'true', 'fff.4.value': 'boom', 'fff.4.type': '44', 'fff.4.enabled': 'true', 'fff.5.value': 'bam', 'fff.5.type': '55', 'fff.5.enabled': 'true'} cfg.setListValue('fff', ('str:value', 'int:type', 'bool:enabled'), [('foo', 11, True), ('bar', 22), ('baz',)]) self.assertDictEqual(cfg.dict, {'fff.size': '3', 'fff.1.value': 'foo', 'fff.1.type': '11', 'fff.1.enabled': 'true', 'fff.2.value': 'bar', 'fff.2.type': '22', 'fff.3.value': 'baz'}) def test_setListValue_invalid_type_for_type_key(self): cfg = configfile.ConfigFile() with self.assertRaises(TypeError): cfg.setListValue('aaa', 'non_existend_type:value', ['foo',]) with self.assertRaises(TypeError): cfg.setListValue('aaa', {'dict:value'}, ['foo',]) with self.assertRaises(TypeError): cfg.setListValue('aaa', 1, ['foo',]) def test_setListValue_invalid_type_for_value(self): cfg = configfile.ConfigFile() with self.assertRaises(TypeError): cfg.setListValue('bbb', 'str:value', 'foo') with self.assertRaises(TypeError): cfg.setListValue('bbb', 'str:value', {'foo': 'bar'}) ############################################################################ ### remove keys ### ############################################################################ def test_remove_key(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'true', 'bar': '1', 'baz': 'false', 'bla': '0'} cfg.removeKey('bla') self.assertDictEqual(cfg.dict, {'foo': 'true', 'bar': '1', 'baz': 'false'}) def test_remove_keys_start_with(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'true', 'bar': '1', 'baz': 'false', 'bla': '0'} cfg.removeKeysStartsWith('ba') self.assertDictEqual(cfg.dict, {'foo': 'true', 'bla': '0'}) def test_remove_keys_start_with_not_matching_prefix(self): cfg = configfile.ConfigFile() cfg.dict = {'foo': 'true', 'bar': '1', 'baz': 'false', 'bla': '0'} cfg.removeKeysStartsWith('not_matching') self.assertDictEqual(cfg.dict, {'foo': 'true', 'bar': '1', 'baz': 'false', 'bla': '0'}) class TestConfigFileWithProfiles(generic.TestCase): def setUp(self): super(TestConfigFileWithProfiles, self).setUp() self.cfg = configfile.ConfigFileWithProfiles('DefaultProfileName') self.cfg.addProfile('foo') self.cfg.addProfile('bar') self.cfg.addProfile('baz') def test_load(self): """ ConfigFile should be able to load its content from a previously saved ConfigFile object. """ with NamedTemporaryFile() as cfgFile: origCfg = configfile.ConfigFileWithProfiles() origCfg.setIntValue('profiles.version', 1) key = "config_key" value = "config_value" origCfg.setProfileStrValue(key, value) origCfg.setProfileStrValue(key, value, profile_id = '2') origCfg.save(cfgFile.name) self.cfg.load(cfgFile.name) self.assertEqual(len(self.cfg.keys()), len(origCfg.keys())) for k in origCfg.keys(): with self.subTest(k = k): #workaround for py.test3 2.5.1 doesn't support subTest msg = 'k = %s' %k self.assertTrue(self.cfg.hasKey(k), msg) self.assertEqual(origCfg.strValue(k), self.cfg.strValue(k)) def test_profiles(self): emptyCfg = configfile.ConfigFileWithProfiles() self.assertListEqual(emptyCfg.profiles(), ['1',]) self.assertListEqual(self.cfg.profiles(), ['1', '2', '3', '4']) self.cfg.removeProfile('3') self.assertListEqual(self.cfg.profiles(), ['1', '2', '4']) def test_profilesSortedByName(self): self.assertListEqual(self.cfg.profilesSortedByName(), ['3', '4', '1', '2']) def test_current_profile(self): self.assertEqual(self.cfg.currentProfile(), '1') self.assertTrue(self.cfg.setCurrentProfile(4)) self.assertEqual(self.cfg.currentProfile(), '4') self.assertTrue(self.cfg.setCurrentProfile('3')) self.assertEqual(self.cfg.currentProfile(), '3') self.assertFalse(self.cfg.setCurrentProfile('9')) self.assertEqual(self.cfg.currentProfile(), '3') def test_current_profile_by_name(self): self.assertEqual(self.cfg.currentProfile(), '1') self.assertTrue(self.cfg.setCurrentProfileByName('bar')) self.assertEqual(self.cfg.currentProfile(), '3') self.assertFalse(self.cfg.setCurrentProfileByName('NotExistingProfile')) self.assertEqual(self.cfg.currentProfile(), '3') def test_profileExists(self): self.assertTrue(self.cfg.profileExists('2')) self.assertTrue(self.cfg.profileExists(3)) self.assertFalse(self.cfg.profileExists('9')) self.assertFalse(self.cfg.profileExists(10)) def test_profileExistsByName(self): self.assertTrue(self.cfg.profileExistsByName('foo')) self.assertFalse(self.cfg.profileExistsByName('NotExistingProfile')) def test_profileName(self): self.assertEqual(self.cfg.profileName('1'), 'DefaultProfileName') self.assertEqual(self.cfg.profileName('2'), 'foo') self.assertEqual(self.cfg.profileName(3), 'bar') self.assertEqual(self.cfg.profileName(), 'DefaultProfileName') self.cfg.setCurrentProfile('3') self.assertEqual(self.cfg.profileName(), 'bar') self.assertEqual(self.cfg.profileName('4'), 'baz') del self.cfg.dict['profile4.name'] self.assertEqual(self.cfg.profileName('4'), 'Profile 4') def test_addProfile(self): #add already existing profile self.assertIsNone(self.cfg.addProfile('foo')) #new valid profile self.assertEqual(self.cfg.addProfile('asdf'), '5') #new valid profile fill an old profile ID self.cfg.removeProfile('3') self.assertEqual(self.cfg.addProfile('qwertz'), '3') def test_removeProfile(self): for profile in self.cfg.profiles(): self.cfg.setProfileStrValue('foo', 'bar', profile) self.assertFalse(self.cfg.removeProfile('9')) self.assertTrue(self.cfg.removeProfile('3')) self.assertNotIn('3', self.cfg.profiles()) self.assertNotIn('profile3.foo', self.cfg.dict) self.cfg.setCurrentProfile('4') self.assertTrue(self.cfg.removeProfile()) self.assertNotIn('4', self.cfg.profiles()) self.assertNotIn('profile4.foo', self.cfg.dict) self.assertEqual(self.cfg.currentProfile(), '1') self.assertTrue(self.cfg.removeProfile(2)) self.assertNotIn('2', self.cfg.profiles()) self.assertNotIn('profile2.foo', self.cfg.dict) self.assertFalse(self.cfg.removeProfile()) def test_setProfileName(self): self.assertFalse(self.cfg.setProfileName('foo', '3')) self.assertEqual(self.cfg.profileName('3'), 'bar') self.assertTrue(self.cfg.setProfileName('newName', '4')) self.assertEqual(self.cfg.profileName('4'), 'newName') self.assertTrue(self.cfg.setProfileName('otherName', 3)) self.assertEqual(self.cfg.profileName('3'), 'otherName') self.assertTrue(self.cfg.setProfileName('thirdName')) self.assertEqual(self.cfg.profileName('1'), 'thirdName') def test_get_profile_key(self): self.assertEqual(self.cfg.profileKey('foo'), 'profile1.foo') self.assertEqual(self.cfg.profileKey('foo', '2'), 'profile2.foo') self.assertEqual(self.cfg.profileKey('foo', 3), 'profile3.foo') def test_removeProfileKey(self): for profile in self.cfg.profiles(): self.cfg.setProfileStrValue('foo', 'bar', profile) self.assertIn('profile1.foo', self.cfg.dict) self.cfg.removeProfileKey('foo') self.assertNotIn('profile1.foo', self.cfg.dict) self.assertIn('profile3.foo', self.cfg.dict) self.cfg.removeProfileKey('foo', '3') self.assertNotIn('profile3.foo', self.cfg.dict) def test_removeProfileKeysStartsWith(self): for profile in self.cfg.profiles(): self.cfg.setProfileStrValue('foo', 'bar', profile) self.assertIn('profile1.foo', self.cfg.dict) self.cfg.removeProfileKeysStartsWith('f') self.assertNotIn('profile1.foo', self.cfg.dict) self.assertIn('profile3.foo', self.cfg.dict) self.cfg.removeProfileKeysStartsWith('f', '3') self.assertNotIn('profile3.foo', self.cfg.dict) def test_remapProfileKey(self): for profile in self.cfg.profiles(): self.cfg.setProfileStrValue('foo', '123', profile) self.cfg.setProfileStrValue('bar', '456', profile) # old key not in cfg self.cfg.remapProfileKey('notExistedKey', 'baz', 1) self.assertEqual(self.cfg.profileStrValue('foo', '', 1), '123') self.assertEqual(self.cfg.profileStrValue('bar', '', 1), '456') # valid remap self.cfg.remapProfileKey('foo', 'baz', 1) self.assertEqual(self.cfg.profileStrValue('foo', '', 1), '') self.assertEqual(self.cfg.profileStrValue('baz', '', 1), '123') self.assertEqual(self.cfg.profileStrValue('foo', '', 2), '123') self.assertEqual(self.cfg.profileStrValue('foo', '', 3), '123') # do not overwrite existing keys self.cfg.remapProfileKey('foo', 'bar', 1) self.assertEqual(self.cfg.profileStrValue('foo', '', 2), '123') self.assertEqual(self.cfg.profileStrValue('baz', '', 2), '') self.assertEqual(self.cfg.profileStrValue('bar', '', 2), '456') def test_hasProfileKey(self): for profile in self.cfg.profiles(): self.cfg.setProfileStrValue('foo', 'bar', profile) self.assertTrue(self.cfg.hasProfileKey('foo')) self.assertFalse(self.cfg.hasProfileKey('baz')) self.assertTrue(self.cfg.hasProfileKey('foo', '3')) self.assertFalse(self.cfg.hasProfileKey('baz', '3')) def test_set_profile_value(self): methods = {'str': ('foo', 'FOO'), 'int': ('bar', 123), 'bool': ('baz', True)} for profile in (None, '3'): for t in methods: with self.subTest(profile = profile, t = t): #workaround for py.test3 2.5.1 doesn't support subTest msg = 'profile = {}, t = {}'.format(profile, t) key, value = methods[t] setFunc = getattr(self.cfg, 'setProfile{}Value'.format(t.capitalize())) getFunc = getattr(self.cfg, 'profile{}Value'.format(t.capitalize())) setFunc(key, value, profile_id = profile) self.assertEqual(getFunc(key, profile_id = profile), value, msg) with self.subTest(profile = profile): #workaround for py.test3 2.5.1 doesn't support subTest msg = 'profile = {}'.format(profile) self.cfg.setProfileListValue('bla', 'str:value', ['ASDF', 'QWERTZ'], profile_id = profile) result = self.cfg.profileListValue('bla', 'str:value', profile_id = profile) self.assertListEqual(result, ['ASDF', 'QWERTZ'], msg) if __name__ == '__main__': unittest.main() backintime-1.2.1/common/test/__init__.py0000644000175000017500000000146213530533316017522 0ustar germargermar# Back In Time # Copyright (C) 2015-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from test import * if __name__ == '__main__': pass backintime-1.2.1/common/test/mock_askpass0000755000175000017500000000003013530533316020003 0ustar germargermar#!/bin/sh echo "travis" backintime-1.2.1/common/test/test_applicationinstance.py0000644000175000017500000002270613530533316023056 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation,Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import subprocess import os import sys import unittest from unittest.mock import patch from threading import Thread from test import generic sys.path.append(os.path.join(os.path.dirname(__file__), "..")) from applicationinstance import ApplicationInstance import tools class TestApplicationInstance(generic.TestCase): def setUp(self): super(TestApplicationInstance, self).setUp() self.temp_file = '/tmp/temp.txt' self.file_name = "/tmp/file_with_pid" self.inst = ApplicationInstance(os.path.abspath(self.file_name), False) self.subproc = None def tearDown(self): super(TestApplicationInstance, self).tearDown() for f in (self.temp_file, self.file_name): if os.path.exists(f): os.remove(f) self.killProcess() def createProcess(self): dummyPath = os.path.join(os.path.dirname(__file__), generic.DUMMY) self.subproc = subprocess.Popen(dummyPath) return self.subproc.pid def killProcess(self): if self.subproc: self.subproc.kill() self.subproc.wait() self.subproc = None def test_create_and_remove_pid_file(self): #create pid file self.inst.startApplication() self.assertIsFile(self.file_name) #remove pid file self.inst.exitApplication() self.assertIsNoFile(self.file_name) def test_write_pid_file(self): self.inst.startApplication() #get pid/procname of current process this_pid = os.getpid() this_procname = tools.processName(this_pid) with open(self.file_name, 'rt') as file_with_pid: self.assertEqual(file_with_pid.read(), '{}\n{}'.format(this_pid, this_procname)) @patch('builtins.open') def test_write_pid_fail(self, mock_open): mock_open.side_effect = OSError() self.inst.startApplication() def test_existing_process_with_correct_procname(self): """ Test the check function with an existing process with correct process name """ pid = self.createProcess() procname = tools.processName(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write(str(pid) + "\n") file_with_pid.write(procname) # Execute test self.assertFalse(self.inst.check()) self.assertTrue(self.inst.busy()) def test_existing_process_with_correct_proc_cmdline(self): """ Test the check function with an existing process with correct process cmdline (for backwards compatibility) """ pid = self.createProcess() procname = tools.processCmdline(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write(str(pid) + "\n") file_with_pid.write(procname) # Execute test self.assertFalse(self.inst.check()) def test_no_pid_file(self): self.assertTrue(self.inst.check()) def test_existing_process_with_wrong_procname(self): """ Test the check function with an existing process with wrong process name """ pid = self.createProcess() procname = tools.processName(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write(str(pid) + "\n") file_with_pid.write(procname + "DELETE") # Execute test self.assertTrue(self.inst.check()) def test_existing_process_with_wrong_pid(self): """ Test the check function with an existing process with wrong pid """ pid = self.createProcess() procname = tools.processName(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write("987654321\n") file_with_pid.write(procname) # Execute test self.assertTrue(self.inst.check()) def test_killing_existing_process(self): """ Test the check function with an existing process with correct process name """ pid = self.createProcess() procname = tools.processName(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write(str(pid) + "\n") file_with_pid.write(procname) self.assertFalse(self.inst.check()) self.killProcess() # Execute test self.assertTrue(self.inst.check()) def test_non_existing_process(self): """ Test the check function with a non existing process """ # GIVE # # create file with fake pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write("987654321\n") file_with_pid.write("FAKE_PROCNAME") # Execute test self.assertTrue(self.inst.check()) def test_leftover_empty_lockfile(self): with open(self.file_name, 'wt')as f: pass self.assertTrue(self.inst.check()) def write_after_flock(self, pid_file): inst = ApplicationInstance(os.path.abspath(pid_file), autoExit = False, flock = True) with open(self.temp_file, 'wt') as f: f.write('foo') inst.flockUnlock() def test_thread_write_without_flock(self): thread = Thread(target = self.write_after_flock, args = (self.file_name,)) thread.start() #wait for the thread to finish thread.join() self.assertExists(self.temp_file) with open(self.temp_file, 'rt') as f: self.assertEqual(f.read(), 'foo') def test_flock_exclusive(self): self.inst.flockExclusiv() thread = Thread(target = self.write_after_flock, args = (self.file_name,)) thread.start() #give the thread some time thread.join(0.01) self.assertNotExists(self.temp_file) self.inst.flockUnlock() #wait for the thread to finish thread.join() self.assertExists(self.temp_file) with open(self.temp_file, 'rt') as f: self.assertEqual(f.read(), 'foo') @patch('builtins.open') def test_flock_exclusive_fail(self, mock_open): mock_open.side_effect = OSError() self.inst.flockExclusiv() def test_auto_flock(self): self.inst = ApplicationInstance(os.path.abspath(self.file_name), autoExit = False, flock = True) thread = Thread(target = self.write_after_flock, args = (self.file_name,)) thread.start() #give the thread some time thread.join(0.01) self.assertNotExists(self.temp_file) self.inst.startApplication() #wait for the thread to finish thread.join() self.assertExists(self.temp_file) with open(self.temp_file, 'rt') as f: self.assertEqual(f.read(), 'foo') def test_autoExit_unique_process(self): self.inst = ApplicationInstance(os.path.abspath(self.file_name), autoExit = True) self.assertExists(self.file_name) this_pid = os.getpid() this_procname = tools.processName(this_pid) with open(self.file_name, 'rt') as file_with_pid: self.assertEqual(file_with_pid.read(), '{}\n{}'.format(this_pid, this_procname)) def test_autoExit_other_running_process(self): pid = self.createProcess() procname = tools.processName(pid) # create file with pid and process name with open(self.file_name, "wt") as file_with_pid: file_with_pid.write(str(pid) + "\n") file_with_pid.write(procname) with self.assertRaises(SystemExit): self.inst = ApplicationInstance(os.path.abspath(self.file_name), autoExit = True) def test_readPidFile(self): with open(self.file_name, "wt") as f: f.write('123\nfoo') self.assertEqual(self.inst.readPidFile(), (123, 'foo')) # ValueError with open(self.file_name, "wt") as f: f.write('foo\nbar') self.assertEqual(self.inst.readPidFile(), (0, 'bar')) @patch('builtins.open') def test_readPidFile_fail(self, mock_open): mock_open.side_effect = OSError() self.assertEqual(self.inst.readPidFile(), (0, '')) # Execute tests if this program is called with python TestApplicationInstance.py if __name__ == '__main__': unittest.main() backintime-1.2.1/common/config-example-local0000644000175000017500000000450513530533316020344 0ustar germargermarprofile1.snapshots.automatic_backup_day=1 profile1.snapshots.automatic_backup_mode=0 profile1.snapshots.automatic_backup_time=0 profile1.snapshots.automatic_backup_weekday=7 profile1.snapshots.backup_on_restore.enabled=true profile1.snapshots.bwlimit.enabled=false profile1.snapshots.bwlimit.value=3000 profile1.snapshots.continue_on_errors=true profile1.snapshots.copy_links=false profile1.snapshots.copy_unsafe_links=false profile1.snapshots.cron.ionice=true profile1.snapshots.cron.nice=true profile1.snapshots.custom_backup_time=8,12,18,23 profile1.snapshots.dont_remove_named_snapshots=true profile1.snapshots.exclude.1.value=.gvfs profile1.snapshots.exclude.10.value=/proc/* profile1.snapshots.exclude.11.value=/sys/* profile1.snapshots.exclude.12.value=/dev/* profile1.snapshots.exclude.13.value=/run/* profile1.snapshots.exclude.2.value=.cache* profile1.snapshots.exclude.3.value=[Cc]ache* profile1.snapshots.exclude.4.value=.thumbnails* profile1.snapshots.exclude.5.value=[Tt]rash* profile1.snapshots.exclude.6.value=*.backup* profile1.snapshots.exclude.7.value=*~ profile1.snapshots.exclude.8.value=/home/USER/Ubuntu One profile1.snapshots.exclude.9.value=.dropbox* profile1.snapshots.exclude.size=13 profile1.snapshots.include.1.type=0 profile1.snapshots.include.1.value=/home/USER profile1.snapshots.include.size=1 profile1.snapshots.local_encfs.path= profile1.snapshots.log_level=3 profile1.snapshots.min_free_space.enabled=true profile1.snapshots.min_free_space.unit=20 profile1.snapshots.min_free_space.value=1 profile1.snapshots.mode=local profile1.snapshots.no_on_battery=false profile1.snapshots.notify.enabled=true profile1.snapshots.path=/mnt/backup profile1.snapshots.path.auto=true profile1.snapshots.path.host=HOST profile1.snapshots.path.profile=1 profile1.snapshots.path.user=USER profile1.snapshots.preserve_acl=false profile1.snapshots.preserve_xattr=false profile1.snapshots.remove_old_snapshots.enabled=true profile1.snapshots.remove_old_snapshots.unit=80 profile1.snapshots.remove_old_snapshots.value=10 profile1.snapshots.smart_remove=false profile1.snapshots.smart_remove.keep_all=2 profile1.snapshots.smart_remove.keep_one_per_day=7 profile1.snapshots.smart_remove.keep_one_per_month=24 profile1.snapshots.smart_remove.keep_one_per_week=4 profile1.snapshots.use_checksum=false profile1.snapshots.user_backup.ionice=false profiles.version=1 backintime-1.2.1/common/dummytools.py0000644000175000017500000000721713530533316017224 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import gettext import config import mount _=gettext.gettext class Dummy(mount.MountControl): """ This is a template for mounting services. For simple mount services all you need to do is: - add your settings in qt/settingsdialog.py - add settings in common/config.p - modify a copy of this file Please use self.currentMountpoint as your local mountpoint. This class inherit from mount.MountControl. All methodes from MountControl can be used exactly like they were in this class. Methodes from MountControl also can be overriden in here if you need something different. """ def __init__(self, *args, **kwargs): #init MountControl super(Dummy, self).__init__(*args, **kwargs) self.all_kwargs = {} #First we need to map the settings. #If is in kwargs (e.g. if this class is called with dummytools.Dummy( = ) #this will map self. to kwargs[]; else self. = from config #e.g. self.setattrKwargs(, , **kwargs) self.setattrKwargs('user', self.config.get_dummy_user(self.profile_id), **kwargs) self.setattrKwargs('host', self.config.get_dummy_host(self.profile_id), **kwargs) self.setattrKwargs('port', self.config.get_dummy_port(self.profile_id), **kwargs) self.setattrKwargs('password', self.config.password(parent, self.profile_id), store = False, **kwargs) self.setDefaultArgs() #if self.currentMountpoint is not the remote snapshot path you can specify #a subfolder of self.currentMountpoint for the symlink self.symlink_subfolder = None self.mountproc = 'dummy' self.log_command = '%s: %s@%s' % (self.mode, self.user, self.host) def _mount(self): """ mount the service """ #implement your mountprocess here pass def _umount(self): """ umount the service """ #implement your unmountprocess here pass def preMountCheck(self, first_run = False): """ check what ever conditions must be given for the mount to be done successful raise MountException(_('Error discription')) if service can not mount return True if everything is okay all pre|post_[u]mount_check can also be used to prepare things or clean up """ return True def postMountCheck(self): """ check if mount was successful raise MountException(_('Error discription')) if not """ return True def preUmountCheck(self): """ check if service is safe to umount raise MountException(_('Error discription')) if not """ return True def postUmountCheck(self): """ check if umount successful raise MountException(_('Error discription')) if not """ return True backintime-1.2.1/common/plugins/0000755000175000017500000000000013530533316016110 5ustar germargermarbackintime-1.2.1/common/plugins/usercallbackplugin.py0000644000175000017500000000623513530533316022342 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import pluginmanager import logger import gettext from subprocess import Popen, PIPE from exceptions import StopException _=gettext.gettext class UserCallbackPlugin(pluginmanager.Plugin): def __init__(self): return def init(self, snapshots): self.config = snapshots.config self.script = self.config.takeSnapshotUserCallback() if not os.path.exists(self.script): return False return True def callback(self, *args, profileID = None): if profileID is None: profileID = self.config.currentProfile() profileName = self.config.profileName(profileID) cmd = [self.script, profileID, profileName] cmd.extend([str(x) for x in args]) logger.debug('Call user-callback: %s' %' '.join(cmd), self) if self.config.userCallbackNoLogging(): stdout, stderr = None, None else: stdout, stderr = PIPE, PIPE try: callback = Popen(cmd, stdout = stdout, stderr = stderr, universal_newlines = True) output = callback.communicate() if output[0]: logger.info('user-callback returned \'%s\'' %output[0].strip('\n'), self) if output[1]: logger.error('user-callback returned \'%s\'' %output[1].strip('\n'), self) if callback.returncode != 0: logger.warning('user-callback returncode: %s' %callback.returncode, self) raise StopException() except OSError as e: logger.error("Exception when trying to run user callback: %s" % e.strerror, self) def processBegin(self): self.callback('1') def processEnd(self): self.callback('2') def error(self, code, message): if not message: self.callback('4', code) else: self.callback('4', code, message) def newSnapshot(self, snapshot_id, snapshot_path): self.callback('3', snapshot_id, snapshot_path) def appStart(self): self.callback('5') def appExit(self): self.callback('6') def mount(self, profileID = None): self.callback('7', profileID = profileID) def unmount(self, profileID = None): self.callback('8', profileID = profileID) backintime-1.2.1/common/encfstools.py0000644000175000017500000006662413530533316017176 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import grp import gettext import subprocess import re import shutil import tempfile from datetime import datetime from distutils.version import StrictVersion import config import password import password_ipc import tools import sshtools import logger from mount import MountControl from exceptions import MountException, EncodeValueError _=gettext.gettext class EncFS_mount(MountControl): """ Mount encrypted paths with encfs. """ def __init__(self, *args, **kwargs): #init MountControl super(EncFS_mount, self).__init__(*args, **kwargs) self.setattrKwargs('path', self.config.localEncfsPath(self.profile_id), **kwargs) self.setattrKwargs('reverse', False, **kwargs) self.setattrKwargs('config_path', None, **kwargs) self.setattrKwargs('password', None, store = False, **kwargs) self.setattrKwargs('hash_id_1', None, **kwargs) self.setattrKwargs('hash_id_2', None, **kwargs) self.setDefaultArgs() self.mountproc = 'encfs' self.log_command = '%s: %s' % (self.mode, self.path) self.symlink_subfolder = None def _mount(self): """ mount the service """ if self.password is None: self.password = self.config.password(self.parent, self.profile_id, self.mode) logger.debug('Provide password through temp FIFO', self) thread = password_ipc.TempPasswordThread(self.password) env = self.env() env['ASKPASS_TEMP'] = thread.temp_file with thread.starter(): encfs = [self.mountproc, '--extpass=backintime-askpass'] if self.reverse: encfs += ['--reverse'] if not self.isConfigured(): encfs += ['--standard'] encfs += [self.path, self.currentMountpoint] logger.debug('Call mount command: %s' %' '.join(encfs), self) proc = subprocess.Popen(encfs, env = env, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = True) output = proc.communicate()[0] self.backupConfig() if proc.returncode: raise MountException(_('Can\'t mount \'%(command)s\':\n\n%(error)s') \ % {'command': ' '.join(encfs), 'error': output}) def preMountCheck(self, first_run = False): """ check what ever conditions must be given for the mount """ self.checkFuse() if first_run: self.checkVersion() return True def env(self): """ return environment with encfs configfile """ env = os.environ.copy() cfg = self.configFile() if os.path.isfile(cfg): env['ENCFS6_CONFIG'] = cfg return env def configFile(self): """ return encfs config file """ f = '.encfs6.xml' if self.config_path is None: cfg = os.path.join(self.path, f) else: cfg = os.path.join(self.config_path, f) return cfg def isConfigured(self): """ check if encfs config file exist. If not and if we are in settingsdialog ask for password confirmation. _mount will then create a new config """ cfg = self.configFile() if os.path.isfile(cfg): logger.debug('Found encfs config in %s' %cfg, self) return True else: logger.debug('No encfs config in %s' %cfg, self) msg = _('Config for encrypted folder not found.') if not self.tmp_mount: raise MountException(msg) else: if not self.config.askQuestion(msg + _('\nCreate a new encrypted folder?')): raise MountException(_('Cancel')) else: pw = password.Password(self.config) password_confirm = pw.passwordFromUser(self.parent, prompt = _('Please confirm password')) if self.password == password_confirm: return False else: raise MountException(_('Password doesn\'t match')) def checkVersion(self): """ check encfs version. 1.7.2 had a bug with --reverse that will create corrupt files """ logger.debug('Check version', self) if self.reverse: proc = subprocess.Popen(['encfs', '--version'], stdout = subprocess.PIPE, stderr = subprocess.STDOUT, universal_newlines = True) output = proc.communicate()[0] m = re.search(r'(\d\.\d\.\d)', output) if m and StrictVersion(m.group(1)) <= StrictVersion('1.7.2'): logger.debug('Wrong encfs version %s' %m.group(1), self) raise MountException(_('encfs version 1.7.2 and before has a bug with option --reverse. Please update encfs')) def backupConfig(self): """ create a backup of encfs config file into local config folder so in cases of the config file get deleted or corrupt user can restore it from there """ cfg = self.configFile() if not os.path.isfile(cfg): logger.warning('No encfs config in %s. Skip backup of config file.' %cfg, self) return backup_folder = self.config.encfsconfigBackupFolder(self.profile_id) tools.makeDirs(backup_folder) old_backups = os.listdir(backup_folder) old_backups.sort(reverse = True) if len(old_backups): last_backup = os.path.join(backup_folder, old_backups[0]) #don't create a new backup if config hasn't changed if tools.md5sum(cfg) == \ tools.md5sum(last_backup): logger.debug('Encfs config did not change. Skip backup', self) return new_backup_file = '.'.join((os.path.basename(cfg), datetime.now().strftime('%Y%m%d%H%M'))) new_backup = os.path.join(backup_folder, new_backup_file) logger.debug('Create backup of encfs config %s to %s' %(cfg, new_backup), self) shutil.copy2(cfg, new_backup) class EncFS_SSH(EncFS_mount): """ Mount encrypted remote path with sshfs and encfs. Mount / with encfs --reverse. rsync will then sync the encrypted view on / to the remote path """ def __init__(self, cfg = None, profile_id = None, mode = None, parent = None,*args, **kwargs): self.config = cfg if self.config is None: self.config = config.Config() self.profile_id = profile_id if self.profile_id is None: self.profile_id = self.config.currentProfile() self.mode = mode if self.mode is None: self.mode = self.config.snapshotsMode(self.profile_id) self.parent = parent self.args = args self.kwargs = kwargs self.ssh = sshtools.SSH(*self.args, symlink = False, **self.splitKwargs('ssh')) self.rev_root = EncFS_mount(*self.args, symlink = False, **self.splitKwargs('encfs_reverse')) super(EncFS_SSH, self).__init__(*self.args, **self.splitKwargs('encfs')) def mount(self, *args, **kwargs): """ call mount for sshfs, encfs --reverse and encfs register 'encfsctl encode' in config.ENCODE """ logger.debug('Mount sshfs', self) self.ssh.mount(*args, **kwargs) #mount fsroot with encfs --reverse first. #If the config does not exist already this will make sure #the new created config works with --reverse if not os.path.isfile(self.configFile()): #encfs >= 1.8.0 changed behavior when ENCFS6_CONFIG environ variable #file does not exist. It will not create a new one anymore but just fail. #As encfs would create the config in /.encfs6.xml (which will most likly fail) #we need to mount a temp folder with reverse first and copy the config when done. logger.debug('Mount temp folder with encfs --reverse to create a new encfs config', self) with tempfile.TemporaryDirectory() as src: tmp_kwargs = self.splitKwargs('encfs_reverse') tmp_kwargs['path'] = src tmp_kwargs['config_path'] = src tmp_mount = EncFS_mount(*self.args, symlink = False, **tmp_kwargs) tmp_mount.mount(*args, **kwargs) tmp_mount.umount() cfg = tmp_mount.configFile() if os.path.isfile(cfg): logger.debug('Copy new encfs config %s to its original place %s' %(cfg, self.ssh.currentMountpoint), self) shutil.copy2(cfg, self.ssh.currentMountpoint) else: logger.error('New encfs config %s not found' %cfg, self) logger.debug('Mount local filesystem root with encfs --reverse', self) self.rev_root.mount(*args, **kwargs) logger.debug('Mount encfs', self) kwargs['check'] = False ret = super(EncFS_SSH, self).mount(*args, **kwargs) self.config.ENCODE = Encode(self) return ret def umount(self, *args, **kwargs): """ close 'encfsctl encode' process and set config.ENCODE back to the dummy class. call umount for encfs, encfs --reverse and sshfs """ self.config.ENCODE.close() self.config.ENCODE = Bounce() logger.debug('Unmount encfs', self) super(EncFS_SSH, self).umount(*args, **kwargs) logger.debug('Unmount local filesystem root mount encfs --reverse', self) self.rev_root.umount(*args, **kwargs) logger.debug('Unmount sshfs', self) self.ssh.umount(*args, **kwargs) def preMountCheck(self, *args, **kwargs): """ call preMountCheck for sshfs, encfs --reverse and encfs """ if self.ssh.preMountCheck(*args, **kwargs) and \ self.rev_root.preMountCheck(*args, **kwargs) and \ super(EncFS_SSH, self).preMountCheck(*args, **kwargs): return True def splitKwargs(self, mode): """ split all given arguments for the desired mount class """ d = self.kwargs.copy() d['cfg'] = self.config d['profile_id'] = self.profile_id d['mode'] = self.mode d['parent'] = self.parent if mode == 'ssh': if 'path' in d: d.pop('path') if 'ssh_path' in d: d['path'] = d.pop('ssh_path') if 'ssh_password' in d: d['password'] = d.pop('ssh_password') else: d['password'] = self.config.password(parent = self.parent, profile_id = self.profile_id, mode = self.mode) if 'hash_id' in d: d.pop('hash_id') if 'hash_id_2' in d: d['hash_id'] = d['hash_id_2'] return d elif mode == 'encfs': d['path'] = self.ssh.currentMountpoint d['hash_id_1'] = self.rev_root.hash_id d['hash_id_2'] = self.ssh.hash_id if 'encfs_password' in d: d['password'] = d.pop('encfs_password') else: d['password'] = self.config.password(parent = self.parent, profile_id = self.profile_id, mode = self.mode, pw_id = 2) return d elif mode == 'encfs_reverse': d['reverse'] = True d['path'] = '/' d['config_path'] = self.ssh.currentMountpoint if 'encfs_password' in d: d['password'] = d.pop('encfs_password') else: d['password'] = self.config.password(parent = self.parent, profile_id = self.profile_id, mode = self.mode, pw_id = 2) if 'hash_id' in d: d.pop('hash_id') if 'hash_id_1' in d: d['hash_id'] = d['hash_id_1'] return d class Encode(object): """ encode path with encfsctl. ENCFS_SSH will replace config.ENCODE whit this """ def __init__(self, encfs): self.encfs = encfs self.password = self.encfs.password self.chroot = self.encfs.rev_root.currentMountpoint if not self.chroot[-1] == os.sep: self.chroot += os.sep self.remote_path = self.encfs.ssh.path if not self.remote_path[-1] == os.sep: self.remote_path += os.sep #precompile some regular expressions self.re_asterisk = re.compile(r'\*') self.re_separate_asterisk = re.compile(r'(.*?)(\*+)(.*)') def __del__(self): self.close() def startProcess(self): """ start 'encfsctl encode' process in pipe mode. """ thread = password_ipc.TempPasswordThread(self.password) env = self.encfs.env() env['ASKPASS_TEMP'] = thread.temp_file with thread.starter(): logger.debug('start \'encfsctl encode\' process', self) encfsctl = ['encfsctl', 'encode', '--extpass=backintime-askpass', '/'] logger.debug('Call command: %s' %' '.join(encfsctl), self) self.p = subprocess.Popen(encfsctl, env = env, bufsize = 0, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines = True) def path(self, path): """ write plain path to encfsctl stdin and read encrypted path from stdout """ if not 'p' in vars(self): self.startProcess() if not self.p.returncode is None: logger.warning('\'encfsctl encode\' process terminated. Restarting.', self) del self.p self.startProcess() self.p.stdin.write(path + '\n') ret = self.p.stdout.readline().strip('\n') if not len(ret) and len(path): logger.debug('Failed to encode %s. Got empty string' %path, self) raise EncodeValueError() return ret def exclude(self, path): """ encrypt paths for snapshots.takeSnapshot exclude list. After encoding the path a wildcard would not match anymore so all paths with wildcards are ignored. Only single and double asterisk that will match a full file or folder name will work. """ if tools.patternHasNotEncryptableWildcard(path): return None enc = '' m = self.re_asterisk.search(path) if not m is None: path_ = path[:] while True: #search for foo/*, foo/*/bar, */bar or **/bar #but not foo* or foo/*bar m = self.re_separate_asterisk.search(path_) if m is None: return None if m.group(1): if not m.group(1).endswith(os.sep): return None enc = os.path.join(enc, self.path(m.group(1))) enc = os.path.join(enc, m.group(2)) if m.group(3): if not m.group(3).startswith(os.sep): return None m1 = self.re_asterisk.search(m.group(3)) if m1 is None: enc = os.path.join(enc, self.path(m.group(3))) break else: path_ = m.group(3) continue else: break else: enc = self.path(path) if os.path.isabs(path): return os.path.join(os.sep, enc) return enc def include(self, path): """ encrypt paths for snapshots.takeSnapshot include list. """ return os.path.join(os.sep, self.path(path)) def remote(self, path): """ encode the path on remote host starting from backintime/host/user/... """ enc_path = self.path(path[len(self.remote_path):]) return os.path.join(self.remote_path, enc_path) def close(self): """ stop encfsctl process """ if 'p' in vars(self) and self.p.returncode is None: logger.debug('stop \'encfsctl encode\' process', self) self.p.communicate() class Bounce(object): """ Dummy class that will simply return all input. This is the standard for config.ENCODE """ def __init__(self): self.chroot = os.sep def path(self, path): return path def exclude(self, path): return path def include(self, path): return path def remote(self, path): return path def close(self): pass class Decode(object): """ decode path with encfsctl. """ def __init__(self, cfg, string = True): self.config = cfg self.mode = cfg.snapshotsMode() if self.mode == 'local_encfs': self.password = cfg.password(pw_id = 1) elif self.mode == 'ssh_encfs': self.password = cfg.password(pw_id = 2) self.encfs = cfg.SNAPSHOT_MODES[self.mode][0](cfg) self.remote_path = cfg.sshSnapshotsPath() if not self.remote_path: self.remote_path = './' if not self.remote_path[-1] == os.sep: self.remote_path += os.sep #german translation changed from Snapshot to Schnappschuss. #catch both variants otherwise old logs wouldn't get decoded. takeSnapshot = _('Take snapshot').replace('Schnappschuss', '(?:Schnappschuss|Snapshot)') #precompile some regular expressions host, port, user, path, cipher = cfg.sshHostUserPortPathCipher() #replace: --exclude"" or --include"" self.re_include_exclude = re.compile(r'(--(?:ex|in)clude=")(.*?)(")') #replace: 'USER@HOST:"PATH"' self.re_remote_path = re.compile(r'(\'%s@%s:"%s)(.*?)("\')' %(user, host, path)) #replace: --link-dest="../../" self.re_link_dest = re.compile(r'(--link-dest="\.\./\.\./)(.*?)(")') #search for: [C] self.re_change = re.compile(r'(^\[C\] .{11} )(.*)') #search for: [I] Take snapshot (rsync: BACKINTIME: ) # [I] Take snapshot (rsync: deleting ) # [I] Take snapshot (rsync: rsync: readlink_stat("...mountpoint/") # [I] Take snapshot (rsync: rsync: send_files failed to open "...mountpoint/": Permission denied (13)) # [I] Take snapshot (rsync: file has vanished: "...mountpoint/") # [I] Take snapshot (rsync: ) pattern = [] pattern.append(r' BACKINTIME: .{11} ') pattern.append(r' deleting ') pattern.append(r' rsync: readlink_stat\(".*?mountpoint/') pattern.append(r' rsync: send_files failed to open ".*?mountpoint/') pattern.append(r' file has vanished: ".*?mountpoint/') pattern.append(r' ') self.re_info = re.compile(r'(^(?:\[I\] )?%s \(rsync:(?:%s))(.*?)(\).*|".*)' % (takeSnapshot, '|'.join(pattern))) #search for: [E] Error: rsync readlink_stat("...mountpoint/") # [E] Error: rsync: send_files failed to open "...mountpoint/": Permission denied (13) # [E] Error: rsync: recv_generator: failed to stat "/": File name too long (36) # [E] Error: rsync: recv_generator: mkdir "/": File name too long (36) pattern = [] pattern.append(r' rsync: readlink_stat\(".*?mountpoint/') pattern.append(r' rsync: send_files failed to open ".*?mountpoint/') if self.remote_path == './': pattern.append(r' rsync: recv_generator: failed to stat "/home/[^/]*/') pattern.append(r' rsync: recv_generator: mkdir "/home/[^/]*/') else: pattern.append(r' rsync: recv_generator: failed to stat ".*?{}'.format(self.remote_path)) pattern.append(r' rsync: recv_generator: mkdir ".*?{}'.format(self.remote_path)) pattern.append(r' rsync: .*?".*?mountpoint/') self.re_error = re.compile(r'(^(?:\[E\] )?Error:(?:%s))(.*?)(".*)' % '|'.join(pattern)) #search for: [I] ssh USER@HOST cp -aRl "PATH"* "PATH" self.re_info_cp= re.compile(r'(^\[I\] .*? cp -aRl "%s/)(.*?)("\* "%s/)(.*?)(")' % (path, path)) #search for all chars except * self.re_all_except_asterisk = re.compile(r'[^\*]+') #search for: -> self.re_all_except_arrow = re.compile(r'(.*?)((?: [-=]> )+)(.*)') #skip: [I] Take snapshot (rsync: sending incremental file list) # [I] Take snapshot (rsync: building file list ... done) # [I] Take snapshot (rsync: sent 26569703 bytes received 239616 bytes 85244.26 bytes/sec) # [I] Take snapshot (rsync: total size is 9130263449 speedup is 340.56) # [I] Take snapshot (rsync: rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]) # [I] Take snapshot (rsync: rsync warning: some files vanished before they could be transferred (code 24) at main.c(1070) [sender=3.0.9]) pattern = [] pattern.append(r'sending incremental file list') pattern.append(r'building file list ... done') pattern.append(r'sent .*? received') pattern.append(r'total size is .*? speedup is') pattern.append(r'rsync error: some files/attrs were not transferred') pattern.append(r'rsync warning: some files vanished before they could be transferred') self.re_skip = re.compile(r'^(?:\[I\] )?%s \(rsync: (%s)' % (takeSnapshot, '|'.join(pattern))) self.string = string if string: self.newline = '\n' else: self.newline = b'\n' def __del__(self): self.close() def startProcess(self): """ start 'encfsctl decode' process in pipe mode. """ thread = password_ipc.TempPasswordThread(self.password) env = os.environ.copy() env['ASKPASS_TEMP'] = thread.temp_file with thread.starter(): logger.debug('start \'encfsctl decode\' process', self) encfsctl = ['encfsctl', 'decode', '--extpass=backintime-askpass', self.encfs.path] logger.debug('Call command: %s' %' '.join(encfsctl), self) self.p = subprocess.Popen(encfsctl, env = env, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines = self.string, #return string (if True) or bytes bufsize = 0) def path(self, path): """ write crypted path to encfsctl stdin and read plain path from stdout if stdout is empty (most likly because there was an error) return crypt path """ if self.string: assert isinstance(path, str), 'path is not str type: %s' % path else: assert isinstance(path, bytes), 'path is not bytes type: %s' % path if not 'p' in vars(self): self.startProcess() if not self.p.returncode is None: logger.warning('\'encfsctl decode\' process terminated. Restarting.', self) del self.p self.startProcess() self.p.stdin.write(path + self.newline) ret = self.p.stdout.readline() ret = ret.strip(self.newline) if ret: return ret return path #TODO: rename this, 'list' is corrupting sphinx doc def list(self, list_): """ decode a list of paths """ output = [] for path in list_: output.append(self.path(path)) return output def log(self, line): """ decode paths in takesnapshot.log """ #rsync cmd if line.startswith('[I] rsync') or line.startswith('[I] nocache rsync'): line = self.re_include_exclude.sub(self.replace, line) line = self.re_remote_path.sub(self.replace, line) line = self.re_link_dest.sub(self.replace, line) return line #[C] Change lines m = self.re_change.match(line) if not m is None: return m.group(1) + self.pathWithArrow(m.group(2)) #[I] Information lines m = self.re_skip.match(line) if not m is None: return line m = self.re_info.match(line) if not m is None: return m.group(1) + self.pathWithArrow(m.group(2)) + m.group(3) #[E] Error lines m = self.re_error.match(line) if not m is None: return m.group(1) + self.path(m.group(2)) + m.group(3) #cp cmd m = self.re_info_cp.match(line) if not m is None: return m.group(1) + self.path(m.group(2)) + m.group(3) + self.path(m.group(4)) + m.group(5) return line def replace(self, m): """ return decoded string for re.sub """ decrypt = self.re_all_except_asterisk.sub(self.pathMatch, m.group(2)) if os.path.isabs(m.group(2)): decrypt = os.path.join(os.sep, decrypt) return m.group(1) + decrypt + m.group(3) def pathMatch(self, m): """ return decoded path of a match object """ return self.path(m.group(0)) def pathWithArrow(self, path): """ rsync print symlinks like 'dest -> src'. This will decode both and also normal paths """ m = self.re_all_except_arrow.match(path) if not m is None: return self.path(m.group(1)) + m.group(2) + self.path(m.group(3)) else: return self.path(path) def remote(self, path): """ decode the path on remote host starting from backintime/host/user/... """ assert isinstance(path, bytes), 'path is not bytes type: %s' % path remote_path = self.remote_path.encode() dec_path = self.path(path[len(remote_path):]) return os.path.join(remote_path, dec_path) def close(self): """ stop encfsctl process """ if 'p' in vars(self) and self.p.returncode is None: logger.debug('stop \'encfsctl decode\' process', self) self.p.communicate() backintime-1.2.1/common/password.py0000644000175000017500000002565713530533316016662 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys import os import time import atexit import signal import subprocess import gettext import re import errno import config import configfile import tools import password_ipc import logger from exceptions import Timeout _=gettext.gettext class Password_Cache(tools.Daemon): """ Password_Cache get started on User login. It provides passwords for BIT cronjobs because keyring is not available when the User is not logged in. Does not start if there is no password to cache (e.g. no profile allows to cache). """ PW_CACHE_VERSION = 3 def __init__(self, cfg = None, *args, **kwargs): self.config = cfg if self.config is None: self.config = config.Config() cachePath = self.config.passwordCacheFolder() if not tools.mkdir(cachePath, 0o700): msg = 'Failed to create secure Password_Cache folder' logger.error(msg, self) raise PermissionError(msg) pid = self.config.passwordCachePid() super(Password_Cache, self).__init__(pid, umask = 0o077, *args, **kwargs) self.dbKeyring = {} self.dbUsr = {} self.fifo = password_ipc.FIFO(self.config.passwordCacheFifo()) self.keyringSupported = tools.keyringSupported() def run(self): """ wait for password request on FIFO and answer with password from self.db through FIFO. """ info = configfile.ConfigFile() info.setIntValue('version', self.PW_CACHE_VERSION) info.save(self.config.passwordCacheInfo()) os.chmod(self.config.passwordCacheInfo(), 0o600) logger.debug('Keyring supported: %s' %self.keyringSupported, self) tools.envSave(self.config.cronEnvFile()) if not self.collectPasswords(): logger.debug('Nothing to cache. Quit.', self) sys.exit(0) self.fifo.create() atexit.register(self.fifo.delfifo) signal.signal(signal.SIGHUP, self.reloadHandler) logger.debug('Start loop', self) while True: try: request = self.fifo.read() request = request.split('\n')[0] task, value = request.split(':', 1) if task == 'get_pw': key = value if key in list(self.dbKeyring.keys()): answer = 'pw:' + self.dbKeyring[key] elif key in list(self.dbUsr.keys()): answer = 'pw:' + self.dbUsr[key] else: answer = 'none:' self.fifo.write(answer, 5) elif task == 'set_pw': key, value = value.split(':', 1) self.dbUsr[key] = value except IOError as e: logger.error('Error in writing answer to FIFO: %s' % str(e), self) except KeyboardInterrupt: logger.debug('Quit.', self) break except Timeout: logger.error('FIFO timeout', self) except Exception as e: logger.error('ERROR: %s' % str(e), self) def reloadHandler(self, signum, frame): """ reload passwords during runtime. """ time.sleep(2) cfgPath = self.config._LOCAL_CONFIG_PATH del(self.config) self.config = config.Config(cfgPath) del(self.dbKeyring) self.dbKeyring = {} self.collectPasswords() def collectPasswords(self): """ search all profiles in config and collect passwords from keyring. """ run_daemon = False profiles = self.config.profiles() for profile_id in profiles: mode = self.config.snapshotsMode(profile_id) for pw_id in (1, 2): if self.config.modeNeedPassword(mode, pw_id): if self.config.passwordUseCache(profile_id): run_daemon = True if self.config.passwordSave(profile_id) and self.keyringSupported: service_name = self.config.keyringServiceName(profile_id, mode, pw_id) user_name = self.config.keyringUserName(profile_id) password = tools.password(service_name, user_name) if password is None: continue self.dbKeyring['%s/%s' %(service_name, user_name)] = password return run_daemon def checkVersion(self): info = configfile.ConfigFile() info.load(self.config.passwordCacheInfo()) if info.intValue('version') < self.PW_CACHE_VERSION: return False return True def cleanupHandler(self, signum, frame): self.fifo.delfifo() super(Password_Cache, self).cleanupHandler(signum, frame) class Password(object): """ provide passwords for BIT either from keyring, Password_Cache or by asking User. """ def __init__(self, cfg = None): self.config = cfg if self.config is None: self.config = config.Config() self.cache = Password_Cache(self.config) self.fifo = password_ipc.FIFO(self.config.passwordCacheFifo()) self.db = {} self.keyringSupported = tools.keyringSupported() def password(self, parent, profile_id, mode, pw_id = 1, only_from_keyring = False): """ based on profile settings return password from keyring, Password_Cache or by asking User. """ if not self.config.modeNeedPassword(mode, pw_id): return '' service_name = self.config.keyringServiceName(profile_id, mode, pw_id) user_name = self.config.keyringUserName(profile_id) try: return self.db['%s/%s' %(service_name, user_name)] except KeyError: pass password = '' if self.config.passwordUseCache(profile_id) and not only_from_keyring: #from cache password = self.passwordFromCache(service_name, user_name) if not password is None: self.setPasswordDb(service_name, user_name, password) return password if self.config.passwordSave(profile_id): #from keyring password = self.passwordFromKeyring(service_name, user_name) if not password is None: self.setPasswordDb(service_name, user_name, password) return password if not only_from_keyring: #ask user and write to cache password = self.passwordFromUser(parent, profile_id, mode, pw_id) if self.config.passwordUseCache(profile_id): self.setPasswordCache(service_name, user_name, password) self.setPasswordDb(service_name, user_name, password) return password return password def passwordFromKeyring(self, service_name, user_name): """ get password from system keyring (seahorse). The keyring is only available if User is logged in. """ if self.keyringSupported: try: return tools.password(service_name, user_name) except Exception: logger.error('get password from Keyring failed', self) return None def passwordFromCache(self, service_name, user_name): """ get password from Password_Cache """ if self.cache.status(): self.cache.checkVersion() self.fifo.write('get_pw:%s/%s' %(service_name, user_name), timeout = 5) answer = self.fifo.read(timeout = 5) mode, pw = answer.split(':', 1) if mode == 'none': return None return pw else: return None def passwordFromUser(self, parent, profile_id = None, mode = None, pw_id = 1, prompt = None): """ ask user for password. This does even work when run as cronjob and user is logged in. """ if prompt is None: prompt = _('Profile \'%(profile)s\': Enter password for %(mode)s: ') % {'profile': self.config.profileName(profile_id), 'mode': self.config.SNAPSHOT_MODES[mode][pw_id + 1]} tools.registerBackintimePath('qt') x_server = tools.checkXServer() import_successful = False if x_server: try: import messagebox import_successful = True except ImportError: pass if not import_successful or not x_server: import getpass alarm = tools.Alarm() alarm.start(300) try: password = getpass.getpass(prompt) alarm.stop() except Timeout: password = '' return password password = messagebox.askPasswordDialog(parent, self.config.APP_NAME, prompt = prompt, timeout = 300) return password def setPasswordDb(self, service_name, user_name, password): """ internal Password cache. Prevent to ask password several times during runtime. """ self.db['%s/%s' %(service_name, user_name)] = password def setPassword(self, password, profile_id, mode, pw_id): """ store password to keyring and Password_Cache """ if self.config.modeNeedPassword(mode, pw_id): service_name = self.config.keyringServiceName(profile_id, mode, pw_id) user_name = self.config.keyringUserName(profile_id) if self.config.passwordSave(profile_id): self.setPasswordKeyring(service_name, user_name, password) if self.config.passwordUseCache(profile_id): self.setPasswordCache(service_name, user_name, password) self.setPasswordDb(service_name, user_name, password) def setPasswordKeyring(self, service_name, user_name, password): return tools.setPassword(service_name, user_name, password) def setPasswordCache(self, service_name, user_name, password): if self.cache.status(): self.cache.checkVersion() self.fifo.write('set_pw:%s/%s:%s' %(service_name, user_name, password), timeout = 5) backintime-1.2.1/common/pluginmanager.py0000644000175000017500000001424313530533316017636 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import tools tools.registerBackintimePath('common') tools.registerBackintimePath('plugins') tools.registerBackintimePath('common', 'plugins') tools.registerBackintimePath('qt', 'plugins') import logger from exceptions import StopException class Plugin: def __init__(self): return def init(self, snapshots): return True def isGui(self): return False def processBegin(self): return def processEnd(self): return def error(self, code, message): return def newSnapshot(self, snapshot_id, snapshot_path): return def message(self, profile_id, profile_name, level, message, timeout): return def appStart(self): return def appExit(self): return def mount(self, profileID = None): return def unmount(self, profileID = None): return class PluginManager: def __init__(self): self.plugins = [] self.hasGuiPlugins = False self.loaded = False def load(self, snapshots = None, cfg = None, force = False): if self.loaded and not force: return if snapshots is None: import snapshots as snapshots_ snapshots = snapshots_.Snapshots(cfg) self.loaded = True self.plugins = [] self.hasGuiPlugins = False loadedPlugins = [] for path in ('plugins', 'common/plugins', 'qt/plugins'): fullPath = tools.backintimePath(path) if os.path.isdir(fullPath): logger.debug('Register plugin path %s' %fullPath, self) tools.registerBackintimePath(path) for f in os.listdir(fullPath): if f not in loadedPlugins and f.endswith('.py') and not f.startswith('__'): try: module = __import__(f[: -3]) module_dict = module.__dict__ for key, value in list(module_dict.items()): if key.startswith('__'): continue if type(value) is type: if issubclass(value, Plugin): plugin = value() if plugin.init(snapshots): logger.debug('Add plugin %s' %f, self) if plugin.isGui(): self.hasGuiPlugins = True self.plugins.insert(0, plugin) else: self.plugins.append(plugin) loadedPlugins.append(f) except BaseException as e: logger.error('Failed to load plugin %s: %s' %(f, str(e)), self) def processBegin(self): ret_val = True for plugin in self.plugins: try: plugin.processBegin() except StopException: ret_val = False except BaseException as e: self.logError(plugin, e) return ret_val def processEnd(self): for plugin in reversed(self.plugins): try: plugin.processEnd() except BaseException as e: self.logError(plugin, e) def error(self, code, message = ''): for plugin in self.plugins: try: plugin.error(code, message) except BaseException as e: self.logError(plugin, e) def newSnapshot(self, snapshot_id, snapshot_path): for plugin in self.plugins: try: plugin.newSnapshot(snapshot_id, snapshot_path) except BaseException as e: self.logError(plugin, e) def message(self, profile_id, profile_name, level, message, timeout = -1): for plugin in self.plugins: try: plugin.message(profile_id, profile_name, level, message, timeout) except BaseException as e: self.logError(plugin, e) def appStart(self): for plugin in reversed(self.plugins): try: plugin.appStart() except BaseException as e: self.logError(plugin, e) def appExit(self): for plugin in reversed(self.plugins): try: plugin.appExit() except BaseException as e: self.logError(plugin, e) def mount(self, profileID = None): for plugin in reversed(self.plugins): try: plugin.mount(profileID) except BaseException as e: self.logError(plugin, e) def unmount(self, profileID = None): for plugin in reversed(self.plugins): try: plugin.unmount(profileID) except BaseException as e: self.logError(plugin, e) def logError(self, plugin, e): logger.error('Plugin %s %s failed: %s' %(plugin.__module__, #plugin name sys._getframe(1).f_code.co_name, #method name str(e)), #exception self, 1) backintime-1.2.1/common/progress.py0000644000175000017500000000254013530533316016646 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import configfile class ProgressFile(configfile.ConfigFile): RSYNC = 50 def __init__(self, cfg, filename = None): super(ProgressFile, self).__init__() self.config = cfg self.filename = filename if self.filename is None: self.filename = self.config.takeSnapshotProgressFile() def save(self): return super(ProgressFile, self).save(self.filename) def load(self): return super(ProgressFile, self).load(self.filename) def fileReadable(self): return os.access(self.filename, os.R_OK) backintime-1.2.1/common/create-manpage-backintime-config.py0000644000175000017500000002072213530533316023224 0ustar germargermar# Back In Time # Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import re import os import sys from time import strftime, gmtime PATH = os.path.join(os.getcwd(), os.path.dirname(sys.argv[0])) CONFIG = os.path.join(PATH, 'config.py') MAN = os.path.join(PATH, 'man/C/backintime-config.1') with open(os.path.join(PATH, '../VERSION'), 'r') as f: VERSION = f.read().strip('\n') SORT = True #True = sort by alphabet; False = sort by line numbering c_list = re.compile(r'.*?self\.(?!set)((?:profile)?)(List)Value ?\( ?[\'"](.*?)[\'"], ?((?:\(.*\)|[^,]*)), ?[\'"]?([^\'",\)]*)[\'"]?') c = re.compile(r'.*?self\.(?!set)((?:profile)?)(.*?)Value ?\( ?[\'"](.*?)[\'"] ?(%?[^,]*?), ?[\'"]?([^\'",\)]*)[\'"]?') c_default = re.compile(r'(^DEFAULT[\w]*|CONFIG_VERSION)[\s]*= (.*)') HEADER = '''.TH backintime-config 1 "%s" "version %s" "USER COMMANDS" .SH NAME config \- BackInTime configuration files. .SH SYNOPSIS ~/.config/backintime/config .br /etc/backintime/config .SH DESCRIPTION Back In Time was developed as pure GUI program and so most functions are only useable with backintime-qt. But it is possible to use Back In Time e.g. on a headless server. You have to create the configuration file (~/.config/backintime/config) manually. Look inside /usr/share/doc/backintime\-common/examples/ for examples. .PP The configuration file has the following format: .br keyword=arguments .PP Arguments don't need to be quoted. All characters are allowed except '='. .PP Run 'backintime check-config' to verify the configfile, create the snapshot folder and crontab entries. .SH POSSIBLE KEYWORDS ''' % (strftime('%b %Y', gmtime()), VERSION) FOOTER = '''.SH SEE ALSO backintime, backintime-qt. .PP Back In Time also has a website: https://github.com/bit-team/backintime .SH AUTHOR This manual page was written by BIT Team(). ''' INSTANCE = 'instance' NAME = 'name' VALUES = 'values' DEFAULT = 'default' COMMENT = 'comment' REFERENCE = 'reference' LINE = 'line' def output(instance = '', name = '', values = '', default = '', comment = '', reference = '', line = 0): if not default: default = "''" ret = '.IP "\\fI%s\\fR" 6\n' % name ret += '.RS\n' ret += 'Type: %-10sAllowed Values: %s\n' %(instance.lower(), values) ret += '.br\n' ret += '%s\n' % comment ret += '.PP\n' if SORT: ret += 'Default: %s\n' % default else: ret += 'Default: %-18s %s line: %d\n' % (default, reference, line) ret += '.RE\n' return ret def select(a, b): if a: return a return b def select_values(instance, values): if values: return values if instance.lower() == 'bool': return 'true|false' if instance.lower() == 'str': return 'text' if instance.lower() == 'int': return '0-99999' def process_line(d, key, profile, instance, name, var, default, commentline, values, force_var, force_default, replace_default, counter): #Ignore commentlines with #?! and 'config.version' comment = None if not commentline.startswith('!') and not key in d: d[key] = {} commentline = commentline.split(';') try: comment = commentline[0] values = commentline[1] force_default = commentline[2] force_var = commentline[3] except IndexError: pass if default.startswith('self.') and default[5:] in replace_default: default = replace_default[default[5:]] if isinstance(force_default, str) and force_default.startswith('self.') and force_default[5:] in replace_default: force_default = replace_default[force_default[5:]] if instance.lower() == 'bool': default = default.lower() d[key][INSTANCE] = instance d[key][NAME] = re.sub(r'%[\S]', '<%s>' % select(force_var, var).upper(), name) d[key][VALUES] = select_values(instance, values) d[key][DEFAULT] = select(force_default, default) d[key][COMMENT] = re.sub(r'\\n', '\n.br\n', comment) d[key][REFERENCE] = 'config.py' d[key][LINE] = counter def main(): replace_default = {} d = {} d['profiles.version'] = {INSTANCE : 'int', NAME : 'profiles.version', VALUES : '1', DEFAULT : '1', COMMENT : 'Internal version of profiles config.', REFERENCE : 'configfile.py', LINE : 419} d['profiles'] = {INSTANCE : 'str', NAME : 'profiles', VALUES : 'int separated by colon (e.g. 1:3:4)', DEFAULT : '1', COMMENT : 'All active Profiles ( in profile.snapshots...).', REFERENCE : 'configfile.py', LINE : 472} d['profile.name'] = {INSTANCE : 'str', NAME : 'profile.name', VALUES : 'text', DEFAULT : 'Main profile', COMMENT : 'Name of this profile.', REFERENCE : 'configfile.py', LINE : 704} with open(CONFIG, 'r') as f: commentline = '' values = force_var = force_default = instance = name = var = default = None for counter, line in enumerate(f, 1): line = line.lstrip() m_default = c_default.match(line) if m_default: replace_default[m_default.group(1)] = m_default.group(2).replace('\\$', '\\\$') continue if line.startswith('#?'): if commentline and not ';' in commentline and not commentline.endswith('\\n'): commentline += ' ' commentline += line.lstrip('#?').rstrip('\n') continue if line.startswith('#'): commentline = '' continue # m = c_list_tuple.match(line) # if not m: m = c_list.match(line) if not m: m = c.match(line) if m: profile, instance, name, var, default = m.groups() if profile == 'profile': name = 'profile.' + name var = var.lstrip('% ') if instance.lower() == 'list': type_key = [x.strip('"\'') for x in re.findall(r'["\'].*?["\']', var)] commentline_split = commentline.split('::') for i, tk in enumerate(type_key): t, k = tk.split(':', maxsplit = 1) process_line(d, key, profile, 'int', '%s.size' %name, var, '\-1', 'Quantity of %s. entries.' %name, values, force_var, force_default, replace_default, counter) key = '%s.%s' %(name, k) key = key.lower() process_line(d, key, profile, t, '%s..%s' %(name, k), var, '', commentline_split[i], values, force_var, force_default, replace_default, counter) else: key = re.sub(r'%[\S]', var, name).lower() process_line(d, key, profile, instance, name, var, default, commentline, values, force_var, force_default, replace_default, counter) values = force_var = force_default = instance = name = var = default = None commentline = '' with open(MAN, 'w') as f: f.write(HEADER) if SORT: s = lambda x: x else: s = lambda x: d[x][LINE] f.write('\n'.join(output(**d[key]) for key in sorted(d, key = s))) f.write(FOOTER) if __name__ == '__main__': main() backintime-1.2.1/common/backintime.py0000644000175000017500000012402213530533316017110 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import gettext import argparse import atexit import subprocess from datetime import datetime from time import sleep import config import logger import snapshots import tools import sshtools import mount import password import encfstools import cli from exceptions import MountException from applicationinstance import ApplicationInstance _=gettext.gettext RETURN_OK = 0 RETURN_ERR = 1 RETURN_NO_CFG = 2 parsers = {} def takeSnapshotAsync(cfg, checksum = False): """ Fork a new backintime process with 'backup' command which will take a new snapshot in background. Args: cfg (config.Config): config that should be used """ cmd = [] if cfg.ioniceOnUser(): cmd.extend(('ionice', '-c2', '-n7')) cmd.append('backintime') if '1' != cfg.currentProfile(): cmd.extend(('--profile-id', str(cfg.currentProfile()))) if cfg._LOCAL_CONFIG_PATH is not cfg._DEFAULT_CONFIG_PATH: cmd.extend(('--config', cfg._LOCAL_CONFIG_PATH)) if cfg._LOCAL_DATA_FOLDER is not cfg._DEFAULT_LOCAL_DATA_FOLDER: cmd.extend(('--share-path', cfg.DATA_FOLDER_ROOT)) if logger.DEBUG: cmd.append('--debug') if checksum: cmd.append('--checksum') cmd.append('backup') # child process need to start its own ssh-agent because otherwise # it would be lost without ssh-agent if parent will close env = os.environ.copy() for i in ('SSH_AUTH_SOCK', 'SSH_AGENT_PID'): try: del env[i] except: pass subprocess.Popen(cmd, env = env) def takeSnapshot(cfg, force = True): """ Take a new snapshot. Args: cfg (config.Config): config that should be used force (bool): take the snapshot even if it wouldn't need to or would be prevented (e.g. running on battery) Returns: bool: ``True`` if there was an error """ tools.envLoad(cfg.cronEnvFile()) ret = snapshots.Snapshots(cfg).backup(force) return ret def _mount(cfg): """ Mount external filesystems. Args: cfg (config.Config): config that should be used """ try: hash_id = mount.Mount(cfg = cfg).mount() except MountException as ex: logger.error(str(ex)) sys.exit(RETURN_ERR) else: cfg.setCurrentHashId(hash_id) def _umount(cfg): """ Unmount external filesystems. Args: cfg (config.Config): config that should be used """ try: mount.Mount(cfg = cfg).umount(cfg.current_hash_id) except MountException as ex: logger.error(str(ex)) def createParsers(app_name = 'backintime'): """ Define parsers for commandline arguments. Args: app_name (str): string representing the current application """ global parsers #define debug debugArgsParser = argparse.ArgumentParser(add_help = False) debugArgsParser.add_argument('--debug', action = 'store_true', help = 'Increase verbosity.') #define config argument configArgsParser = argparse.ArgumentParser(add_help = False) configArgsParser.add_argument('--config', metavar = 'PATH', type = str, action = 'store', help = 'Read config from %(metavar)s. ' + 'Default = ~/.config/backintime/config') configArgsParser.add_argument('--share-path', metavar = 'PATH', type = str, action = 'store', help = 'Write runtime data (locks, messages, log and mountpoints) to %(metavar)s.') #define common arguments which are used for all commands commonArgsParser = argparse.ArgumentParser(add_help = False, parents = [configArgsParser, debugArgsParser]) profileGroup = commonArgsParser.add_mutually_exclusive_group() profileGroup.add_argument ('--profile', metavar = 'NAME', type = str, action = 'store', help = 'Select profile by %(metavar)s.') profileGroup.add_argument ('--profile-id', metavar = 'ID', type = int, action = 'store', help = 'Select profile by %(metavar)s.') commonArgsParser.add_argument('--quiet', action = 'store_true', help = 'Be quiet. Suppress messages on stdout.') #define arguments which are only used by snapshots-path, snapshots-list-path and last-snapshot-path snapshotPathParser = argparse.ArgumentParser(add_help = False) snapshotPathParser.add_argument('--keep-mount', action = 'store_true', help = "Don't unmount on exit.") #define arguments which are used by rsync commands (backup and restore) rsyncArgsParser = argparse.ArgumentParser(add_help = False) rsyncArgsParser.add_argument('--checksum', action = 'store_true', help = 'force to use checksum for checking if files have been changed.') #define arguments for snapshot remove removeArgsParser = argparse.ArgumentParser(add_help = False) removeArgsParser.add_argument('SNAPSHOT_ID', type = str, action = 'store', nargs = '*', help = 'ID of snapshots which should be removed.') #define main argument parser parser = argparse.ArgumentParser(prog = app_name, parents = [commonArgsParser], description = '%(app)s - a simple backup tool for Linux.' % {'app': config.Config.APP_NAME}, epilog = "For backwards compatibility commands can also be used with trailing '--'. " "All listed arguments will work with all commands. Some commands have extra arguments. " "Run '%(app_name)s -h' to see the extra arguments." % {'app_name': app_name}) parsers['main'] = parser parser.add_argument('--version', '-v', action = 'version', version = '%(prog)s ' + str(config.Config.VERSION), help = "show %(prog)s's version number.") parser.add_argument('--license', action = printLicense, nargs = 0, help = "show %(prog)s's license.") ####################### ### define commands ### ####################### epilog = "Run '%(app_name)s -h' to get help for additional arguments. " %{'app_name': app_name} epilogCommon = epilog + 'Additional arguments: --config, --debug, --profile, --profile-id, --quiet' epilogConfig = epilog + 'Additional arguments: --config, --debug' subparsers = parser.add_subparsers(title = 'Commands', dest = 'command') command = 'backup' nargs = 0 aliases = [(command, nargs), ('b', nargs)] description = 'Take a new snapshot. Ignore if the profile ' +\ 'is not scheduled or if the machine runs on battery.' backupCP = subparsers.add_parser(command, parents = [rsyncArgsParser], epilog = epilogCommon, help = description, description = description) backupCP.set_defaults(func = backup) parsers[command] = backupCP command = 'backup-job' nargs = 0 aliases.append((command, nargs)) description = 'Take a new snapshot in background only ' +\ 'if the profile is scheduled and the machine ' +\ 'is not on battery. This is use by cron jobs.' backupJobCP = subparsers.add_parser(command, parents = [rsyncArgsParser], epilog = epilogCommon, help = description, description = description) backupJobCP.set_defaults(func = backupJob) parsers[command] = backupJobCP command = 'benchmark-cipher' nargs = '?' aliases.append((command, nargs)) description = 'Show a benchmark of all ciphers for ssh transfer.' benchmarkCipherCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) benchmarkCipherCP.set_defaults(func = benchmarkCipher) parsers[command] = benchmarkCipherCP benchmarkCipherCP.add_argument ('FILE_SIZE', type = int, action = 'store', default = 40, nargs = '?', help = 'File size used to for benchmark.') command = 'check-config' description = 'Check the profiles configuration and install crontab entries.' checkConfigCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) checkConfigCP.add_argument ('--no-crontab', action = 'store_true', help = 'Do not install crontab entries.') checkConfigCP.set_defaults(func = checkConfig) parsers[command] = checkConfigCP command = 'decode' nargs = '*' aliases.append((command, nargs)) description = "Decode paths with 'encfsctl decode'" decodeCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) decodeCP.set_defaults(func = decode) parsers[command] = decodeCP decodeCP.add_argument ('PATH', type = str, action = 'store', nargs = '*', help = 'Decode PATH. If no PATH is specified on command line ' +\ 'a list of filenames will be read from stdin.') command = 'last-snapshot' nargs = 0 aliases.append((command, nargs)) description = 'Show the ID of the last snapshot.' lastSnapshotCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) lastSnapshotCP.set_defaults(func = lastSnapshot) parsers[command] = lastSnapshotCP command = 'last-snapshot-path' nargs = 0 aliases.append((command, nargs)) description = 'Show the path of the last snapshot.' lastSnapshotsPathCP = subparsers.add_parser(command, parents = [snapshotPathParser], epilog = epilogCommon, help = description, description = description) lastSnapshotsPathCP.set_defaults(func = lastSnapshotPath) parsers[command] = lastSnapshotsPathCP command = 'pw-cache' nargs = '*' aliases.append((command, nargs)) description = 'Control Password Cache for non-interactive cronjobs.' pwCacheCP = subparsers.add_parser(command, epilog = epilogConfig, help = description, description = description) pwCacheCP.set_defaults(func = pwCache) parsers[command] = pwCacheCP pwCacheCP.add_argument ('ACTION', action = 'store', choices = ['start', 'stop', 'restart', 'reload', 'status'], nargs = '?', help = 'Command to send to Password Cache daemon.') command = 'remove' nargs = '*' aliases.append((command, nargs)) description = 'Remove a snapshot.' removeCP = subparsers.add_parser(command, parents = [removeArgsParser], epilog = epilogCommon, help = description, description = description) removeCP.set_defaults(func = remove) parsers[command] = removeCP command = 'remove-and-do-not-ask-again' nargs = '*' aliases.append((command, nargs)) description = "Remove snapshots and don't ask for confirmation before. Be careful!" removeDoNotAskCP = subparsers.add_parser(command, parents = [removeArgsParser], epilog = epilogCommon, help = description, description = description) removeDoNotAskCP.set_defaults(func = removeAndDoNotAskAgain) parsers[command] = removeDoNotAskCP command = 'restore' nargs = '*' aliases.append((command, nargs)) description = 'Restore files.' restoreCP = subparsers.add_parser(command, parents = [rsyncArgsParser], epilog = epilogCommon, help = description, description = description) restoreCP.set_defaults(func = restore) parsers[command] = restoreCP backupGroup = restoreCP.add_mutually_exclusive_group() restoreCP.add_argument ('WHAT', type = str, action = 'store', nargs = '?', help = 'Restore file or folder WHAT.') restoreCP.add_argument ('WHERE', type = str, action = 'store', nargs = '?', help = "Restore to WHERE. An empty argument '' will restore to original destination.") restoreCP.add_argument ('SNAPSHOT_ID', type = str, action = 'store', nargs = '?', help = 'Which SNAPSHOT_ID should be used. This can be a snapshot ID or ' +\ 'an integer starting with 0 for the last snapshot, 1 for the second to last, ... ' +\ 'the very first snapshot is -1') restoreCP.add_argument ('--delete', action = 'store_true', help = 'Restore and delete newer files which are not in the snapshot. ' +\ 'WARNING: deleting files in filesystem root could break your whole system!!!') backupGroup.add_argument ('--local-backup', action = 'store_true', help = 'Create backup files before changing local files.') backupGroup.add_argument ('--no-local-backup', action = 'store_true', help = 'Temporary disable creation of backup files before changing local files. ' +\ 'This can be switched of permanently in Settings, too.') restoreCP.add_argument ('--only-new', action = 'store_true', help = 'Only restore files which does not exist or are newer than ' +\ 'those in destination. Using "rsync --update" option.') command = 'shutdown' nargs = 0 description = 'Shutdown the computer after the snapshot is done.' shutdownCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) shutdownCP.set_defaults(func = shutdown) parsers[command] = shutdownCP command = 'smart-remove' nargs = 0 description = 'Remove snapshots based on "Smart Remove" pattern.' smartRemoveCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) smartRemoveCP.set_defaults(func = smartRemove) parsers[command] = smartRemoveCP command = 'snapshots-list' nargs = 0 aliases.append((command, nargs)) description = 'Show a list of snapshots IDs.' snapshotsListCP = subparsers.add_parser(command, parents = [snapshotPathParser], epilog = epilogCommon, help = description, description = description) snapshotsListCP.set_defaults(func = snapshotsList) parsers[command] = snapshotsListCP command = 'snapshots-list-path' nargs = 0 aliases.append((command, nargs)) description = "Show the path's to snapshots." snapshotsListPathCP = subparsers.add_parser(command, parents = [snapshotPathParser], epilog = epilogCommon, help = description, description = description) snapshotsListPathCP.set_defaults(func = snapshotsListPath) parsers[command] = snapshotsListPathCP command = 'snapshots-path' nargs = 0 aliases.append((command, nargs)) description = 'Show the path where snapshots are stored.' snapshotsPathCP = subparsers.add_parser(command, parents = [snapshotPathParser], epilog = epilogCommon, help = description, description = description) snapshotsPathCP.set_defaults(func = snapshotsPath) parsers[command] = snapshotsPathCP command = 'unmount' nargs = 0 aliases.append((command, nargs)) description = 'Unmount the profile.' unmountCP = subparsers.add_parser(command, epilog = epilogCommon, help = description, description = description) unmountCP.set_defaults(func = unmount) parsers[command] = unmountCP #define aliases for all commands with trailing -- group = parser.add_mutually_exclusive_group() for alias, nargs in aliases: if len(alias) == 1: arg = '-%s' % alias else: arg = '--%s' % alias group.add_argument(arg, nargs = nargs, action = PseudoAliasAction, help = argparse.SUPPRESS) def startApp(app_name = 'backintime'): """ Start the requested command or return config if there was no command in arguments. Args: app_name (str): string representing the current application Returns: config.Config: current config if no command was given in arguments """ createParsers(app_name) #open log logger.APP_NAME = app_name logger.openlog() #parse args args = argParse(None) #add source path to $PATH environ if running from source if tools.runningFromSource(): tools.addSourceToPathEnviron() #warn about sudo if tools.usingSudo() and os.getenv('BIT_SUDO_WARNING_PRINTED', 'false') == 'false': os.putenv('BIT_SUDO_WARNING_PRINTED', 'true') logger.warning("It looks like you're using 'sudo' to start %(app)s. " "This will cause some troubles. Please use either 'sudo -i %(app_name)s' " "or 'pkexec %(app_name)s'." %{'app_name': app_name, 'app': config.Config.APP_NAME}) #call commands if 'func' in dir(args): args.func(args) else: setQuiet(args) printHeader() return getConfig(args, False) def argParse(args): """ Parse arguments given on commandline. Args: args (argparse.Namespace): Namespace that should be enhanced or ``None`` Returns: argparser.Namespace: new parsed Namespace """ def join(args, subArgs): """ Add new arguments to existing Namespace. Args: args (argparse.Namespace): main Namespace that should get new arguments subArgs (argparse.Namespace): second Namespace which have new arguments that should be merged into ``args`` """ for key, value in vars(subArgs).items(): #only add new values if it isn't set already or if there really IS a value if getattr(args, key, None) is None or value: setattr(args, key, value) #first parse the main parser without subparsers #otherwise positional args in subparsers will be to greedy #but only if -h or --help is not involved because otherwise #help will not work for subcommands mainParser = parsers['main'] sub = [] if '-h' not in sys.argv and '--help' not in sys.argv: for i in mainParser._actions: if isinstance(i, argparse._SubParsersAction): #remove subparsers mainParser._remove_action(i) sub.append(i) args, unknownArgs = mainParser.parse_known_args(args) #read subparsers again if sub: [mainParser._add_action(i) for i in sub] #parse it again for unknown args if unknownArgs: subArgs, unknownArgs = mainParser.parse_known_args(unknownArgs) join(args, subArgs) #finally parse only the command parser, otherwise we miss #some arguments from command if unknownArgs and 'command' in args and args.command in parsers: commandParser = parsers[args.command] subArgs, unknownArgs = commandParser.parse_known_args(unknownArgs) join(args, subArgs) if 'debug' in args: logger.DEBUG = args.debug dargs = vars(args) logger.debug('Arguments: %s | unknownArgs: %s' %({arg:dargs[arg] for arg in dargs if dargs[arg]}, unknownArgs)) #report unknown arguments #but not if we run aliasParser next because we will parse again in there if unknownArgs and not ('func' in args and args.func is aliasParser): mainParser.error('Unknown Argument(s): %s' % ', '.join(unknownArgs)) return args def printHeader(): """ Print application name, version and legal notes. """ version = config.Config.VERSION ref, hashid = tools.gitRevisionAndHash() if ref: version += " git branch '{}' hash '{}'".format(ref, hashid) print('') print('Back In Time') print('Version: ' + version) print('') print('Back In Time comes with ABSOLUTELY NO WARRANTY.') print('This is free software, and you are welcome to redistribute it') print("under certain conditions; type `backintime --license' for details.") print('') class PseudoAliasAction(argparse.Action): """ Translate '--COMMAND' into 'COMMAND' for backwards compatibility. """ def __call__(self, parser, namespace, values, option_string=None): """ Translate '--COMMAND' into 'COMMAND' for backwards compatibility. Args: parser (argparse.ArgumentParser): NotImplemented namespace (argparse.Namespace): Namespace that should get modified values: NotImplemented option_string: NotImplemented """ #TODO: find a more elegant way to solve this dest = self.dest.replace('_', '-') if self.dest == 'b': replace = '-b' alias = 'backup' else: replace = '--%s' % dest alias = dest setattr(namespace, 'func', aliasParser) setattr(namespace, 'replace', replace) setattr(namespace, 'alias', alias) def aliasParser(args): """ Call commands which where given with leading -- for backwards compatibility. Args: args (argparse.Namespace): previously parsed arguments """ if not args.quiet: logger.info("Run command '%(alias)s' instead of argument '%(replace)s' due to backwards compatibility." % {'alias': args.alias, 'replace': args.replace}) argv = [w.replace(args.replace, args.alias) for w in sys.argv[1:]] newArgs = argParse(argv) if 'func' in dir(newArgs): newArgs.func(newArgs) def getConfig(args, check = True): """ Load config and change to profile selected on commandline. Args: args (argparse.Namespace): previously parsed arguments check (bool): if ``True`` check if config is valid Returns: config.Config: current config with requested profile selected Raises: SystemExit: 1 if ``profile`` or ``profile_id`` is no valid profile 2 if ``check`` is ``True`` and config is not configured """ cfg = config.Config(config_path = args.config, data_path = args.share_path) logger.debug('config file: %s' % cfg._LOCAL_CONFIG_PATH) logger.debug('share path: %s' % cfg._LOCAL_DATA_FOLDER) logger.debug('profiles: %s' % ', '.join('%s=%s' % (x, cfg.profileName(x)) for x in cfg.profiles())) if 'profile_id' in args and args.profile_id: if not cfg.setCurrentProfile(args.profile_id): logger.error('Profile-ID not found: %s' % args.profile_id) sys.exit(RETURN_ERR) if 'profile' in args and args.profile: if not cfg.setCurrentProfileByName(args.profile): logger.error('Profile not found: %s' % args.profile) sys.exit(RETURN_ERR) if check and not cfg.isConfigured(): logger.error('%(app)s is not configured!' %{'app': cfg.APP_NAME}) sys.exit(RETURN_NO_CFG) if 'checksum' in args: cfg.forceUseChecksum = args.checksum return cfg def setQuiet(args): """ Redirect :py:data:`sys.stdout` to ``/dev/null`` if ``--quiet`` was set on commandline. Return the original :py:data:`sys.stdout` file object which can be used to print absolute necessary information. Args: args (argparse.Namespace): previously parsed arguments Returns: sys.stdout: default sys.stdout """ force_stdout = sys.stdout if args.quiet: # do not replace with subprocess.DEVNULL - will not work sys.stdout = open(os.devnull, 'w') atexit.register(sys.stdout.close) atexit.register(force_stdout.close) return force_stdout class printLicense(argparse.Action): """ Print custom license """ def __init__(self, *args, **kwargs): super(printLicense, self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs): cfg = config.Config() print(cfg.license()) sys.exit(RETURN_OK) def backup(args, force = True): """ Command for force taking a new snapshot. Args: args (argparse.Namespace): previously parsed arguments force (bool): take the snapshot even if it wouldn't need to or would be prevented (e.g. running on battery) Raises: SystemExit: 0 if successful, 1 if not """ setQuiet(args) printHeader() cfg = getConfig(args) ret = takeSnapshot(cfg, force) sys.exit(int(ret)) def backupJob(args): """ Command for taking a new snapshot in background. Mainly used for cronjobs. This will run the snapshot inside a daemon and detach from it. It will return immediately back to commandline. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ cli.BackupJobDaemon(backup, args).start() def shutdown(args): """ Command for shutting down the computer after the current snapshot has finished. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 if successful; 1 if it failed either because there is no active snapshot for this profile or shutdown is not supported. """ setQuiet(args) printHeader() cfg = getConfig(args) sd = tools.ShutDown() if not sd.canShutdown(): logger.warning('Shutdown is not supported.') sys.exit(RETURN_ERR) instance = ApplicationInstance(cfg.takeSnapshotInstanceFile(), False) profile = '='.join((cfg.currentProfile(), cfg.profileName())) if not instance.busy(): logger.info('There is no active snapshot for profile %s. Skip shutdown.' %profile) sys.exit(RETURN_ERR) print('Shutdown is waiting for the snapshot in profile %s to end.\nPress CTRL+C to interrupt shutdown.\n' %profile) sd.activate_shutdown = True try: while instance.busy(): logger.debug('Snapshot is still active. Wait for shutdown.') sleep(5) except KeyboardInterrupt: print('Shutdown interrupted.') else: logger.info('Shutdown now.') sd.shutdown() sys.exit(RETURN_OK) def snapshotsPath(args): """ Command for printing the full snapshot path of current profile. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) if args.keep_mount: _mount(cfg) if args.quiet: msg = '{}' else: msg = 'SnapshotsPath: {}' print(msg.format(cfg.snapshotsFullPath()), file=force_stdout) sys.exit(RETURN_OK) def snapshotsList(args): """ Command for printing a list of all snapshots in current profile. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) _mount(cfg) if args.quiet: msg = '{}' else: msg = 'SnapshotID: {}' no_sids = True #use snapshots.listSnapshots instead of iterSnapshots because of sorting for sid in snapshots.listSnapshots(cfg, reverse = False): print(msg.format(sid), file=force_stdout) no_sids = False if no_sids: logger.error("There are no snapshots in '%s'" % cfg.profileName()) if not args.keep_mount: _umount(cfg) sys.exit(RETURN_OK) def snapshotsListPath(args): """ Command for printing a list of all snapshots pathes in current profile. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) _mount(cfg) if args.quiet: msg = '{}' else: msg = 'SnapshotPath: {}' no_sids = True #use snapshots.listSnapshots instead of iterSnapshots because of sorting for sid in snapshots.listSnapshots(cfg, reverse = False): print(msg.format(sid.path()), file=force_stdout) no_sids = False if no_sids: logger.error("There are no snapshots in '%s'" % cfg.profileName()) if not args.keep_mount: _umount(cfg) sys.exit(RETURN_OK) def lastSnapshot(args): """ Command for printing the very last snapshot in current profile. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) _mount(cfg) sid = snapshots.lastSnapshot(cfg) if sid: if args.quiet: msg = '{}' else: msg = 'SnapshotID: {}' print(msg.format(sid), file=force_stdout) else: logger.error("There are no snapshots in '%s'" % cfg.profileName()) _umount(cfg) sys.exit(RETURN_OK) def lastSnapshotPath(args): """ Command for printing the path of the very last snapshot in current profile. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) _mount(cfg) sid = snapshots.lastSnapshot(cfg) if sid: if args.quiet: msg = '{}' else: msg = 'SnapshotPath: {}' print(msg.format(sid.path()), file=force_stdout) else: logger.error("There are no snapshots in '%s'" % cfg.profileName()) if not args.keep_mount: _umount(cfg) sys.exit(RETURN_OK) def unmount(args): """ Command for unmounting all filesystems. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ setQuiet(args) cfg = getConfig(args) _mount(cfg) _umount(cfg) sys.exit(RETURN_OK) def benchmarkCipher(args): """ Command for transferring a file with scp to remote host with all available ciphers and print its speed and time. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ setQuiet(args) printHeader() cfg = getConfig(args) if cfg.snapshotsMode() in ('ssh', 'ssh_encfs'): ssh = sshtools.SSH(cfg) ssh.benchmarkCipher(args.FILE_SIZE) sys.exit(RETURN_OK) else: logger.error("SSH is not configured for profile '%s'!" % cfg.profileName()) sys.exit(RETURN_ERR) def pwCache(args): """ Command for starting password cache daemon. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 if daemon is running, 1 if not """ force_stdout = setQuiet(args) printHeader() cfg = getConfig(args) ret = RETURN_OK daemon = password.Password_Cache(cfg) if args.ACTION and args.ACTION != 'status': getattr(daemon, args.ACTION)() elif args.ACTION == 'status': print('%(app)s Password Cache: ' % {'app': cfg.APP_NAME}, end=' ', file = force_stdout) if daemon.status(): print(cli.bcolors.OKGREEN + 'running' + cli.bcolors.ENDC, file = force_stdout) ret = RETURN_OK else: print(cli.bcolors.FAIL + 'not running' + cli.bcolors.ENDC, file = force_stdout) ret = RETURN_ERR else: daemon.run() sys.exit(ret) def decode(args): """ Command for decoding paths given paths with 'encfsctl'. Will listen on stdin if no path was given. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ force_stdout = setQuiet(args) cfg = getConfig(args) if cfg.snapshotsMode() not in ('local_encfs', 'ssh_encfs'): logger.error("Profile '%s' is not encrypted." % cfg.profileName()) sys.exit(RETURN_ERR) _mount(cfg) d = encfstools.Decode(cfg) if not args.PATH: while True: try: path = input() except EOFError: break if not path: break print(d.path(path), file = force_stdout) else: print('\n'.join(d.list(args.PATH)), file = force_stdout) d.close() _umount(cfg) sys.exit(RETURN_OK) def remove(args, force = False): """ Command for removing snapshots. Args: args (argparse.Namespace): previously parsed arguments force (bool): don't ask before removing (BE CAREFUL!) Raises: SystemExit: 0 """ setQuiet(args) printHeader() cfg = getConfig(args) _mount(cfg) cli.remove(cfg, args.SNAPSHOT_ID, force) _umount(cfg) sys.exit(RETURN_OK) def removeAndDoNotAskAgain(args): """ Command for removing snapshots without asking before remove (BE CAREFUL!) Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ remove(args, True) def smartRemove(args): """ Command for running Smart-Remove from Terminal. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 if okay 2 if Smart-Remove is not configured """ setQuiet(args) printHeader() cfg = getConfig(args) sn = snapshots.Snapshots(cfg) enabled, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month = cfg.smartRemove() if enabled: _mount(cfg) del_snapshots = sn.smartRemoveList(datetime.today(), keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month) logger.info('Smart Remove will remove {} snapshots'.format(len(del_snapshots))) sn.smartRemove(del_snapshots, log = logger.info) _umount(cfg) sys.exit(RETURN_OK) else: logger.error('Smart Remove is not configured.') sys.exit(RETURN_NO_CFG) def restore(args): """ Command for restoring files from snapshots. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 """ setQuiet(args) printHeader() cfg = getConfig(args) _mount(cfg) if cfg.backupOnRestore() and not args.no_local_backup: backup = True else: backup = args.local_backup cli.restore(cfg, args.SNAPSHOT_ID, args.WHAT, args.WHERE, delete = args.delete, backup = backup, only_new = args.only_new) _umount(cfg) sys.exit(RETURN_OK) def checkConfig(args): """ Command for checking the config file. Args: args (argparse.Namespace): previously parsed arguments Raises: SystemExit: 0 if config is okay, 1 if not """ force_stdout = setQuiet(args) printHeader() cfg = getConfig(args) if cli.checkConfig(cfg, crontab = not args.no_crontab): print("\nConfig %(cfg)s profile '%(profile)s' is fine." % {'cfg': cfg._LOCAL_CONFIG_PATH, 'profile': cfg.profileName()}, file = force_stdout) sys.exit(RETURN_OK) else: print("\nConfig %(cfg)s profile '%(profile)s' has errors." % {'cfg': cfg._LOCAL_CONFIG_PATH, 'profile': cfg.profileName()}, file = force_stdout) sys.exit(RETURN_ERR) if __name__ == '__main__': startApp() backintime-1.2.1/common/configfile.py0000644000175000017500000006005613530533316017115 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import collections import re import gettext import logger _=gettext.gettext class ConfigFile(object): """ Store options in a plain text file in form of: key=value """ def __init__(self): self.dict = {} self.errorHandler = None self.questionHandler = None def setErrorHandler(self, handler): """ Register a function that should be called for notifying errors. handler (method): callable function """ self.errorHandler = handler def setQuestionHandler(self, handler): """ Register a function that should be called for asking questions. handler (method): callable function """ self.questionHandler = handler def clearHandlers(self): """ Reset error and question handlers. """ self.errorHandler = None self.questionHandler = None def notifyError(self, message): """ Call previously registered function to show an error. Args: message (str): error message that should be shown """ if self.errorHandler is None: return self.errorHandler(message) def askQuestion(self, message): """ Call previously registered function to ask a question. Args: message (str): question that should be shown """ if self.questionHandler is None: return False return self.questionHandler(message) def save(self, filename): """ Save all options to file. Args: filename (str): full path Returns: bool: ``True`` if successful """ def numsort(key): """ Sort int in keys in nummeric order instead of alphabetical by adding leading zeros to int's """ return re.sub(r'\d+', lambda m: m.group(0).zfill(6), key) try: with open(filename, 'wt') as f: keys = list(self.dict.keys()) keys.sort(key = numsort) for key in keys: f.write("%s=%s\n" % (key, self.dict[key])) except OSError as e: logger.error('Failed to save config: %s' %str(e), self) self.notifyError(_('Failed to save config: %s') %str(e)) return False return True def load(self, filename, **kwargs): """ Reset current options and load new options from file. Args: filename (str): full path """ self.dict = {} self.append(filename, **kwargs) def append(self, filename, maxsplit = 1): """ Load options from file and append them to current options. Args: filename (str): full path maxsplit (int): split lines only n times on '=' """ lines = [] if not os.path.isfile(filename): return try: with open(filename, 'rt') as f: lines = f.readlines() except OSError as e: logger.error('Failed to load config: %s' %str(e), self) self.notifyError(_('Failed to load config: %s') %str(e)) for line in lines: items = line.strip('\n').split('=', maxsplit) if len(items) == 2: self.dict[items[ 0 ] ] = items[ 1] def remapKey(self, old_key, new_key): """ Remap keys to a new key name. Args: old_key (str): old key name new_key (str): new key name """ if old_key != new_key: if old_key in self.dict: if new_key not in self.dict: self.dict[new_key ] = self.dict[ old_key] del self.dict[old_key] def remapKeyRegex(self, pattern, replace): """ Remap keys to a new key name using :py:func:`re.sub`. Args: pattern (str): part of key name that should be replaced replace (:py:class:`str`, method): string or a callable function which will be used to replace all matches of ``pattern``. """ c = re.compile(pattern) for key in list(self.dict): newKey = c.sub(replace, key) if key != newKey: self.remapKey(key, newKey) def hasKey(self, key): """ ``True`` if key is set. Args: key (str): string used as key Returns: bool: ``True`` if the ``key`` is set """ return key in self.dict def strValue(self, key, default = ''): """ Return a 'str' instance of key's value. Args: key (str): string used as key default (str): return this if ``key`` is not set Returns: str: value of ``key`` or ``default`` if ``key`` is not set. """ if key in self.dict: return self.dict[key] else: return default def setStrValue(self, key, value): """ Set a string value for key. Args: key (str): string used as key value (str): store this value """ self.dict[key] = value def intValue(self, key, default = 0): """ Return a 'int' instance of key's value. Args: key (str): string used as key default (int): return this if ``key`` is not set Returns: int: value of ``key`` or ``default`` if ``key`` is not set. """ try: return int(self.dict[key]) except: return default def setIntValue(self, key, value): """ Set an integer value for key. Args: key (str): string used as key value (int): store this option """ self.setStrValue(key, str(value)) def boolValue(self, key, default = False): """ Return a 'bool' instance of key's value. Args: key (str): string used as key default (bool): return this if key is not set Returns: bool: value of 'key' or 'default' if 'key' is not set. """ try: val = self.dict[key] if "1" == val or "TRUE" == val.upper(): return True return False except: return default def setBoolValue(self, key, value): """ Set a bool value for key. Args: key (str): string used as key value (bool): store this option """ if value: self.setStrValue(key, 'true') else: self.setStrValue(key, 'false') def listValue(self, key, type_key = 'str:value', default = []): """ Return a list of values Size of the list must be stored in key.size Args: key (str): used base-key type_key (str): pattern of 'value-type:value-name'. See examples below. default (list): default value Returns: list: value of ``key`` or ``default`` if ``key`` is not set. ``type_key`` pattern examples:: 'str:value' => return str values from key.value 'int:type' => return int values from key.type 'bool:enabled' => return bool values from key.enabled ('str:value', 'int:type') => return tuple of values """ def typeKeySplit(tk): t, k = '', '' if isinstance(tk, str): t, k = tk.split(':', maxsplit = 1) return (t, k) def value(key, tk): t, k = typeKeySplit(tk) if t in ('str', 'int', 'bool'): func = getattr(self, '%sValue' %t) return func('%s.%s' %(key, k)) raise TypeError('Invalid type_key: %s' %tk) size = self.intValue('%s.size' %key, -1) if size < 0: return default ret = [] for i in range(1, size + 1): if isinstance(type_key, str): if not self.hasKey('%s.%s.%s' %(key, i, typeKeySplit(type_key)[1])): continue ret.append(value('%s.%s' %(key, i), type_key)) elif isinstance(type_key, tuple): if not self.hasKey('%s.%s.%s' %(key, i, typeKeySplit(type_key[0])[1])): continue items = [] for tk in type_key: items.append(value('%s.%s' %(key, i), tk)) ret.append(tuple(items)) else: raise TypeError('Invalid type_key: %s' %type_key) return ret def setListValue(self, key, type_key, value): """ Set a list of values. Size of the list will be stored in key.size Args: key (str): used base-key type_key (str): pattern of 'value-type:value-name'. See examples below. value (list): that should be stored ``type_key`` pattern examples:: 'str:value' => return str values from key.value 'int:type' => return int values from key.type 'bool:enabled' => return bool values from key.enabled ('str:value', 'int:type') => return tuple of values """ def setValue(key, tk, v): t = '' if isinstance(tk, str): t, k = tk.split(':', maxsplit = 1) if t in ('str', 'int', 'bool'): func = getattr(self, 'set%sValue' %t.capitalize()) return func('%s.%s' %(key, k), v) raise TypeError('Invalid type_key: %s' %tk) if not isinstance(value, (list, tuple)): raise TypeError('value has wrong type: %s' %value) old_size = self.intValue('%s.size' %key, -1) self.setIntValue('%s.size' %key, len(value)) for i, v in enumerate(value, start = 1): if isinstance(type_key, str): setValue('%s.%s' %(key, i), type_key, v) elif isinstance(type_key, tuple): for iv, tk in enumerate(type_key): if len(v) > iv: setValue('%s.%s' %(key, i), tk, v[iv]) else: self.removeKey('%s.%s.%s' %(key, i, tk.split(':')[1])) else: raise TypeError('Invalid type_key: %s' %type_key) if len(value) < old_size: for i in range(len(value) + 1, old_size + 1): if isinstance(type_key, str): self.removeKey('%s.%s.%s' %(key, i, type_key.split(':')[1])) elif isinstance(type_key, tuple): for tk in type_key: self.removeKey('%s.%s.%s' %(key, i, tk.split(':')[1])) def removeKey(self, key): """ Remove key from options. Args: key (str): string used as key """ if key in self.dict: del self.dict[key] def removeKeysStartsWith(self, prefix): """ Remove key from options which start with given prefix. Args: prefix (str): prefix for keys (key starts with this string) that should be removed """ removeKeys = [] for key in self.dict.keys(): if key.startswith(prefix): removeKeys.append(key) for key in removeKeys: del self.dict[key] def keys(self): return list(self.dict.keys()) class ConfigFileWithProfiles(ConfigFile): """ Store options in profiles as 'profileX.key=value' Args: default_profile_name (str): default name of the first profile. """ def __init__(self, default_profile_name = ''): ConfigFile.__init__(self) self.default_profile_name = default_profile_name self.current_profile_id = '1' def load(self, filename): """ Reset current options and load new options from file. Args: filename (str): full path """ self.current_profile_id = '1' super(ConfigFileWithProfiles, self).load(filename) def append(self, filename): """ Load options from file and append them to current options. Args: filename (str): full path """ super(ConfigFileWithProfiles, self).append(filename) found = False profiles = self.profiles() for profile_id in profiles: if profile_id == self.current_profile_id: found = True break if not found and profiles: self.current_profile_id = profiles[0] if self.intValue('profiles.version') <= 0: rename_keys = [] for key in self.dict.keys(): if key.startswith('profile.0.'): rename_keys.append(key) for old_key in rename_keys: new_key = 'profile1.' + old_key[10 : ] self.dict[new_key ] = self.dict[ old_key] del self.dict[old_key] if self.intValue('profiles.version') != 1: self.setIntValue('profiles.version', 1) def profiles(self): """ List of all available profile IDs. Profile IDs are strings! Returns: list: all available profile IDs as strings """ return self.strValue('profiles', '1').split(':') def profilesSortedByName(self): """ List of available profile IDs alphabetically sorted by their names. Profile IDs are strings! Returns: list: all available profile IDs as strings """ profiles_unsorted = self.profiles() if len(profiles_unsorted) <= 1: return profiles_unsorted profiles_dict = {} for profile_id in profiles_unsorted: profiles_dict[self.profileName(profile_id).upper()] = profile_id # sort the dictionary by key (the profile name) profiles_sorted = collections.OrderedDict(sorted(profiles_dict.items())) # return the names as a list return list(profiles_sorted.values()) def currentProfile(self): """ Currently selected profile ID. Profile IDs are strings! Returns: str: profile ID """ return self.current_profile_id def setCurrentProfile(self, profile_id): """ Change the current profile. Args: profile_id (str, int): valid profile ID Returns: bool: ``True`` if successful """ if isinstance(profile_id, int): profile_id = str(profile_id) profiles = self.profiles() for i in profiles: if i == profile_id: self.current_profile_id = profile_id logger.debug('change current profile: %s=%s' % (profile_id, self.profileName(profile_id)), self) logger.changeProfile(profile_id) return True return False def setCurrentProfileByName(self, name): """ Change the current profile. Args: name (str): valid profile name Returns: bool: ``True`` if successful """ profiles = self.profiles() for profile_id in profiles: if self.profileName(profile_id) == name: self.current_profile_id = profile_id logger.debug('change current profile: %s' %name, self) logger.changeProfile(profile_id) return True return False def profileExists(self, profile_id): """ ``True`` if the profile exists. Args: profile_id (str, int): profile ID Returns: bool: ``True`` if ``profile_id`` exists. """ if isinstance(profile_id, int): profile_id = str(profile_id) return profile_id in self.profiles() def profileExistsByName(self, name): """ ``True`` if the profile exists. Args: name (str): profile name Returns: bool: ``True`` if ``name`` exists. """ profiles = self.profiles() for profile_id in profiles: if self.profileName(profile_id) == name: return True return False def profileName(self, profile_id = None): """ Name of the profile. Args: profile_id (str, int): valid profile ID Returns: str: name of profile """ if isinstance(profile_id, int): profile_id = str(profile_id) if profile_id is None: profile_id = self.current_profile_id if profile_id == '1': default = self.default_profile_name else: default = 'Profile %s' % profile_id return self.profileStrValue('name', default, profile_id) def addProfile(self, name): """ Add a new profile if the name is not already in use. Args: name (str): new profile name Returns: str: new profile ID """ profiles = self.profiles() for profile_id in profiles: if self.profileName(profile_id) == name: self.notifyError(_('Profile "%s" already exists !') % name) return None new_id = 1 while True: ok = True if str(new_id) in profiles: ok = False if ok: break new_id = new_id + 1 new_id = str(new_id) profiles.append(new_id) self.setStrValue('profiles', ':'.join(profiles)) self.setProfileStrValue('name', name, new_id) return new_id def removeProfile(self, profile_id = None): """ Remove profile and all its keys and values. Args: profile_id (str, int): valid profile ID Returns: bool: ``True`` if successful """ if isinstance(profile_id, int): profile_id = str(profile_id) if profile_id == None: profile_id = self.current_profile_id profiles = self.profiles() if len(profiles) <= 1: self.notifyError(_('You can\'t remove the last profile !')) return False found = False index = 0 for profile in profiles: if profile == profile_id: self.removeKeysStartsWith(self.profileKey('', profile_id)) del profiles[index] self.setStrValue('profiles', ':'.join(profiles)) found = True break index = index + 1 if not found: return False if self.current_profile_id == profile_id: self.current_profile_id = '1' return True def setProfileName(self, name, profile_id = None): """ Change the name of the profile. Args: name (str): new profile name profile_id (str, int): valid profile ID Returns: bool: ``True`` if successful. """ if isinstance(profile_id, int): profile_id = str(profile_id) if profile_id == None: profile_id = self.current_profile_id profiles = self.profiles() for profile in profiles: if self.profileName(profile) == name: if profile[0] != profile_id: self.notifyError(_('Profile "%s" already exists !') % name) return False self.setProfileStrValue('name', name, profile_id) return True def profileKey(self, key, profile_id = None): """ Prefix for keys with profile. e.g. 'profile1.key' Args: key (str): key name profile_id (str, int): valid profile ID Returns: str: key with prefix 'profile1.key' """ if isinstance(profile_id, int): profile_id = str(profile_id) if profile_id is None: profile_id = self.current_profile_id return 'profile' + profile_id + '.' + key def removeProfileKey(self, key, profile_id = None): """ Remove the key from profile. Args: key (str): key name profile_id (str, int): valid profile ID """ self.removeKey(self.profileKey(key, profile_id)) def removeProfileKeysStartsWith(self, prefix, profile_id = None): """ Remove the keys starting with prefix from profile. Args: prefix (str): prefix for keys (key starts with this string) that should be removed. profile_id (str, int): valid profile ID """ self.removeKeysStartsWith(self.profileKey(prefix, profile_id)) def remapProfileKey(self, oldKey, newKey, profileId = None): """ Remap profile keys to a new key name. Args: oldKey (str): old key name newKey (str): new key name profileId (str, int): valid profile ID """ self.remapKey(self.profileKey(oldKey, profileId), self.profileKey(newKey, profileId)) def hasProfileKey(self, key, profile_id = None): """ ``True`` if key is set in profile. Args: key (str): string used as key profile_id (str, int): valid profile ID Returns: bool: ``True`` if ``key`` is set. """ return self.profileKey(key, profile_id) in self.dict def profileStrValue(self, key, default = '', profile_id = None): return self.strValue(self.profileKey(key, profile_id), default) def setProfileStrValue(self, key, value, profile_id = None): self.setStrValue(self.profileKey(key, profile_id), value) def profileIntValue(self, key, default = 0, profile_id = None): return self.intValue(self.profileKey(key, profile_id), default) def setProfileIntValue(self, key, value, profile_id = None): self.setIntValue(self.profileKey(key, profile_id), value) def profileBoolValue(self, key, default = False, profile_id = None): return self.boolValue(self.profileKey(key, profile_id), default) def setProfileBoolValue(self, key, value, profile_id = None): self.setBoolValue(self.profileKey(key, profile_id), value) def profileListValue(self, key, type_key = 'str:value', default = [], profile_id = None): return self.listValue(self.profileKey(key, profile_id), type_key, default) def setProfileListValue(self, key, type_key, value, profile_id = None): self.setListValue(self.profileKey(key, profile_id), type_key, value) backintime-1.2.1/common/tools.py0000644000175000017500000021613313530533316016147 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import subprocess import shlex import signal import re import errno import gzip import tempfile import collections import hashlib import ipaddress import atexit from datetime import datetime from distutils.version import StrictVersion from time import sleep keyring = None keyring_warn = False try: if os.getenv('BIT_USE_KEYRING', 'true') == 'true' and os.geteuid() != 0: import keyring except: keyring = None os.putenv('BIT_USE_KEYRING', 'false') keyring_warn = True # getting dbus imports to work in Travis CI is a huge pain # use conditional dbus import ON_TRAVIS = os.environ.get('TRAVIS', 'None').lower() == 'true' ON_RTD = os.environ.get('READTHEDOCS', 'None').lower() == 'true' try: import dbus except ImportError: if ON_TRAVIS or ON_RTD: #python-dbus doesn't work on Travis yet. dbus = None else: raise import configfile import logger import bcolors from applicationinstance import ApplicationInstance from exceptions import Timeout, InvalidChar, InvalidCmd, LimitExceeded, PermissionDeniedByPolicy DISK_BY_UUID = '/dev/disk/by-uuid' def sharePath(): """ Get BackInTimes installation base path. If running from source return default '/usr/share' Returns: str: share path like:: /usr/share /usr/local/share /opt/usr/share """ share = os.path.abspath(os.path.join(__file__, os.pardir, os.pardir, os.pardir)) if os.path.basename(share) == 'share': return share else: return '/usr/share' def backintimePath(*path): """ Get path inside 'backintime' install folder. Args: *path (str): paths that should be joind to 'backintime' Returns: str: 'backintime' child path like:: /usr/share/backintime/common /usr/share/backintime/qt """ return os.path.abspath(os.path.join(__file__, os.pardir, os.pardir, *path)) def registerBackintimePath(*path): """ Add BackInTime path ``path`` to :py:data:`sys.path` so subsequent imports can discover them. Args: *path (str): paths that should be joind to 'backintime' Note: Duplicate in :py:func:`qt/qttools.py` because modules in qt folder would need this to actually import :py:mod:`tools`. """ path = backintimePath(*path) if not path in sys.path: sys.path.insert(0, path) def runningFromSource(): """ Check if BackInTime is running from source (without installing). Returns: bool: ``True`` if BackInTime is running from source """ return os.path.isfile(backintimePath('common', 'backintime')) def addSourceToPathEnviron(): """ Add 'backintime/common' path to 'PATH' environ variable. """ source = backintimePath('common') path = os.getenv('PATH') if path and source not in path.split(':'): os.environ['PATH'] = '%s:%s' %(source, path) def gitRevisionAndHash(): """ Get the current Git Branch and the last HashID (shot form) if running from source. Returns: tuple: two items of either :py:class:`str` instance if running from source or ``None`` """ ref, hashid = None, None gitPath = os.path.abspath(os.path.join(__file__, os.pardir, os.pardir, '.git')) headPath = os.path.join(gitPath, 'HEAD') refPath = '' if not os.path.isdir(gitPath): return (ref, hashid) try: with open(headPath, 'rt') as f: refPath = f.read().strip('\n') if refPath.startswith('ref: '): refPath = refPath[5:] if refPath: refPath = os.path.join(gitPath, refPath) ref = os.path.basename(refPath) except Exception as e: pass if os.path.isfile(refPath): try: with open(refPath, 'rt') as f: hashid = f.read().strip('\n')[:7] except: pass return (ref, hashid) def readFile(path, default = None): """ Read the file in ``path`` or its '.gz' compressed variant and return its content or ``default`` if ``path`` does not exist. Args: path (str): full path to file that should be read. '.gz' will be added automatically if the file is compressed default (str): default if ``path`` does not exist Returns: str: content of file in ``path`` """ ret_val = default try: if os.path.exists(path): with open(path) as f: ret_val = f.read() elif os.path.exists(path + '.gz'): with gzip.open(path + '.gz', 'rt') as f: ret_val = f.read() except: pass return ret_val def readFileLines(path, default = None): """ Read the file in ``path`` or its '.gz' compressed variant and return its content as a list of lines or ``default`` if ``path`` does not exist. Args: path (str): full path to file that should be read. '.gz' will be added automatically if the file is compressed default (list): default if ``path`` does not exist Returns: list: content of file in ``path`` splitted by lines. """ ret_val = default try: if os.path.exists(path): with open(path) as f: ret_val = [x.rstrip('\n') for x in f.readlines()] elif os.path.exists(path + '.gz'): with gzip.open(path + '.gz', 'rt') as f: ret_val = [x.rstrip('\n') for x in f.readlines()] except: pass return ret_val def checkCommand(cmd): """ Check if command ``cmd`` is a file in 'PATH' environ. Args: cmd (str): command Returns: bool: ``True`` if command ``cmd`` is in 'PATH' environ """ cmd = cmd.strip() if not cmd: return False if os.path.isfile(cmd): return True return not which(cmd) is None def which(cmd): """ Get the fullpath of executable command ``cmd``. Works like command-line 'which' command. Args: cmd (str): command Returns: str: fullpath of command ``cmd`` or ``None`` if command is not available """ pathenv = os.getenv('PATH', '') path = pathenv.split(":") common = backintimePath('common') if runningFromSource() and common not in path: path.insert(0, common) for directory in path: fullpath = os.path.join(directory, cmd) if os.path.isfile(fullpath) and os.access(fullpath, os.X_OK): return fullpath return None def makeDirs(path): """ Create directories ``path`` recursive and return success. Args: path (str): fullpath to directories that should be created Returns: bool: ``True`` if successful """ path = path.rstrip(os.sep) if not path: return False if os.path.isdir(path): return True else: try: os.makedirs(path) except Exception as e: logger.error("Failed to make dirs '%s': %s" %(path, str(e)), traceDepth = 1) return os.path.isdir(path) def mkdir(path, mode = 0o755): """ Create directory ``path``. Args: path (str): full path to directory that should be created mode (int): numeric permission mode Returns: bool: ``True`` if successful """ if os.path.isdir(path): try: os.chmod(path, mode) except: return False return True else: os.mkdir(path, mode) if mode & 0o002 == 0o002: #make file world (other) writable was requested #debian and ubuntu won't set o+w with os.mkdir #this will fix it os.chmod(path, mode) return os.path.isdir(path) def pids(): """ List all PIDs currently running on the system. Returns: list: PIDs as int """ return [int(x) for x in os.listdir('/proc') if x.isdigit()] def processStat(pid): """ Get the stat's of the process with ``pid``. Args: pid (int): Process Indicator Returns: str: stat from /proc/PID/stat """ try: with open('/proc/{}/stat'.format(pid), 'rt') as f: return f.read() except OSError as e: logger.warning('Failed to read process stat from {}: [{}] {}'.format(e.filename, e.errno, e.strerror)) return '' def processPaused(pid): """ Check if process ``pid`` is paused (got signal SIGSTOP). Args: pid (int): Process Indicator Returns: bool: True if process is paused """ m = re.match(r'\d+ \(.+\) T', processStat(pid)) return bool(m) def processName(pid): """ Get the name of the process with ``pid``. Args: pid (int): Process Indicator Returns: str: name of the process """ m = re.match(r'.*\((.+)\).*', processStat(pid)) if m: return m.group(1) def processCmdline(pid): """ Get the cmdline (command that spawnd this process) of the process with ``pid``. Args: pid (int): Process Indicator Returns: str: cmdline of the process """ try: with open('/proc/{}/cmdline'.format(pid), 'rt') as f: return f.read().strip('\n') except OSError as e: logger.warning('Failed to read process cmdline from {}: [{}] {}'.format(e.filename, e.errno, e.strerror)) return '' def pidsWithName(name): """ Get all processes currently running with name ``name``. Args: name (str): name of a process like 'python3' or 'backintime' Returns: list: PIDs as int """ # /proc/###/stat stores just the first 16 chars of the process name return [x for x in pids() if processName(x) == name[:15]] def processExists(name): """ Check if process ``name`` is currently running. Args: name (str): name of a process like 'python3' or 'backintime' Returns: bool: ``True`` if there is a process running with ``name`` """ return len(pidsWithName(name)) > 0 def processAlive(pid): """ Check if the process with PID ``pid`` is alive. Args: pid (int): Process Indicator Returns: bool: ``True`` if the process with PID ``pid`` is alive Raises: ValueError: If ``pid`` is 0 because 'kill(0, SIG)' would send SIG to all processes """ if pid < 0: return False elif pid == 0: raise ValueError('invalid PID 0') else: try: os.kill(pid, 0) #this will raise an exception if the pid is not valid except OSError as err: if err.errno == errno.ESRCH: # ESRCH == No such process return False elif err.errno == errno.EPERM: # EPERM clearly means there's a process to deny access to return True else: raise else: return True def checkXServer(): """ Check if there is a X11 server running on this system. Returns: bool: ``True`` if X11 server is running """ if checkCommand('xdpyinfo'): proc = subprocess.Popen(['xdpyinfo'], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL) proc.communicate() return proc.returncode == 0 else: return False def preparePath(path): """ Removes trailing slash '/' from ``path``. Args: path (str): absolut path Returns: str: path ``path`` without trailing but with leading slash """ path = path.strip("/") path = os.sep + path return path def powerStatusAvailable(): """ Check if org.freedesktop.UPower is available so that :py:func:`tools.onBattery` would return the correct power status. Returns: bool: ``True`` if :py:func:`tools.onBattery` can report power status """ if dbus: try: bus = dbus.SystemBus() proxy = bus.get_object('org.freedesktop.UPower', '/org/freedesktop/UPower') return 'OnBattery' in proxy.GetAll('org.freedesktop.UPower', dbus_interface = 'org.freedesktop.DBus.Properties') except dbus.exceptions.DBusException: pass return False def onBattery(): """ Checks if the system is on battery power. Returns: bool: ``True`` if system is running on battery """ if dbus: try: bus = dbus.SystemBus() proxy = bus.get_object('org.freedesktop.UPower', '/org/freedesktop/UPower') return bool(proxy.Get('org.freedesktop.UPower', 'OnBattery', dbus_interface = 'org.freedesktop.DBus.Properties')) except dbus.exceptions.DBusException: pass return False def rsyncCaps(data = None): """ Get capabilities of the installed rsync binary. This can be different from version to version and also on build arguments used when building rsync. Args: data (str): 'rsync --version' output. This is just for unittests. Returns: list: List of str with rsyncs capabilities """ if not data: proc = subprocess.Popen(['rsync', '--version'], stdout = subprocess.PIPE, universal_newlines = True) data = proc.communicate()[0] caps = [] #rsync >= 3.1 does provide --info=progress2 m = re.match(r'rsync\s*version\s*(\d\.\d)', data) if m and StrictVersion(m.group(1)) >= StrictVersion('3.1'): caps.append('progress2') #all other capabilities are separated by ',' between #'Capabilities:' and '\n\n' m = re.match(r'.*Capabilities:(.+)\n\n.*', data, re.DOTALL) if not m: return caps for line in m.group(1).split('\n'): caps.extend([i.strip(' \n') for i in line.split(',') if i.strip(' \n')]) return caps def rsyncPrefix(config, no_perms = True, use_mode = ['ssh', 'ssh_encfs'], progress = True): """ Get rsync command and all args for creating a new snapshot. Args are based on current profile in ``config``. Args: config (config.Config): current config no_perms (bool): don't sync permissions (--no-p --no-g --no-o) if ``True``. :py:func:`config.Config.preserveAcl` == ``True`` or :py:func:`config.Config.preserveXattr` == ``True`` will overwrite this to ``False`` use_mode (list): if current mode is in this list add additional args for that mode progress (bool): add '--info=progress2' to show progress Returns: list: rsync command with all args but without --include, --exclude, source and destination """ caps = rsyncCaps() cmd = [] if config.nocacheOnLocal(): cmd.append('nocache') cmd.append('rsync') cmd.extend(('--recursive', # recurse into directories '--times', # preserve modification times '--devices', # preserve device files (super-user only) '--specials', # preserve special files '--hard-links', # preserve hard links '--human-readable'))# numbers in a human-readable format if config.useChecksum() or config.forceUseChecksum: cmd.append('--checksum') if config.copyUnsafeLinks(): cmd.append('--copy-unsafe-links') if config.copyLinks(): cmd.append('--copy-links') else: cmd.append('--links') if config.preserveAcl() and "ACLs" in caps: cmd.append('--acls') # preserve ACLs (implies --perms) no_perms = False if config.preserveXattr() and "xattrs" in caps: cmd.append('--xattrs') # preserve extended attributes no_perms = False if no_perms: cmd.extend(('--no-perms', '--no-group', '--no-owner')) else: cmd.extend(('--perms', # preserve permissions '--executability', # preserve executability '--group', # preserve group '--owner')) # preserve owner (super-user only) if progress and 'progress2' in caps: cmd.extend(('--info=progress2', '--no-inc-recursive')) if config.bwlimitEnabled(): cmd.append('--bwlimit=%d' %config.bwlimit()) if config.rsyncOptionsEnabled(): cmd.extend(shlex.split(config.rsyncOptions())) cmd.extend(rsyncSshArgs(config, use_mode)) return cmd def rsyncSshArgs(config, use_mode = ['ssh', 'ssh_encfs']): """ Get SSH args for rsync based on current profile in ``config``. Args: config (config.Config): current config use_mode (list): if current mode is in this list add additional args for that mode Returns: list: SSH args for rsync """ cmd = [] mode = config.snapshotsMode() if mode in ['ssh', 'ssh_encfs'] and mode in use_mode: ssh = config.sshCommand(user_host = False, ionice = False, nice = False) cmd.append('--rsh=' + ' '.join(ssh)) if config.niceOnRemote() \ or config.ioniceOnRemote() \ or config.nocacheOnRemote(): rsync_path = '--rsync-path=' if config.niceOnRemote(): rsync_path += 'nice -n 19 ' if config.ioniceOnRemote(): rsync_path += 'ionice -c2 -n7 ' if config.nocacheOnRemote(): rsync_path += 'nocache ' rsync_path += 'rsync' cmd.append(rsync_path) return cmd def rsyncRemove(config, run_local = True): """ Get rsync command and all args for removing snapshots with rsync. Args: config (config.Config): current config run_local (bool): if True and current mode is ``ssh`` or ``ssh_encfs`` this will add SSH options Returns: list: rsync command with all args """ cmd = ['rsync', '-a', '--delete'] if run_local: cmd.extend(rsyncSshArgs(config)) return cmd #TODO: check if we really need this def tempFailureRetry(func, *args, **kwargs): while True: try: return func(*args, **kwargs) except (os.error, IOError) as ex: if ex.errno == errno.EINTR: continue else: raise def md5sum(path): """ Calculate md5sum for file in ``path``. Args: path (str): full path to file Returns: str: md5sum of file """ md5 = hashlib.md5() with open(path, 'rb') as f: while True: data = f.read(4096) if not data: break md5.update(data) return md5.hexdigest() def checkCronPattern(s): """ Check if ``s`` is a valid cron pattern. Examples:: 0,10,13,15,17,20,23 */6 Args: s (str): pattern to check Returns: bool: ``True`` if ``s`` is a valid cron pattern """ if s.find(' ') >= 0: return False try: if s.startswith('*/'): if s[2:].isdigit() and int(s[2:]) <= 24: return True else: return False for i in s.split(','): if i.isdigit() and int(i) <= 24: continue else: return False return True except ValueError: return False #TODO: check if this is still necessary def checkHomeEncrypt(): """ Return ``True`` if users home is encrypted """ home = os.path.expanduser('~') if not os.path.ismount(home): return False if checkCommand('ecryptfs-verify'): try: subprocess.check_call(['ecryptfs-verify', '--home'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) except subprocess.CalledProcessError: pass else: return True if checkCommand('encfs'): proc = subprocess.Popen(['mount'], stdout=subprocess.PIPE, universal_newlines = True) mount = proc.communicate()[0] r = re.compile('^encfs on %s type fuse' % home) for line in mount.split('\n'): if r.match(line): return True return False def envLoad(f): """ Load environ variables from file ``f`` into current environ. Do not overwrite existing environ variables. Args: f (str): full path to file with environ variables """ env = os.environ.copy() env_file = configfile.ConfigFile() env_file.load(f, maxsplit = 1) for key in env_file.keys(): value = env_file.strValue(key) if not value: continue if not key in list(env.keys()): os.environ[key] = value del(env_file) def envSave(f): """ Save environ variables to file that are needed by cron to connect to keyring. This will only work if the user is logged in. Args: f (str): full path to file for environ variables """ env = os.environ.copy() env_file = configfile.ConfigFile() for key in ('GNOME_KEYRING_CONTROL', 'DBUS_SESSION_BUS_ADDRESS', \ 'DBUS_SESSION_BUS_PID', 'DBUS_SESSION_BUS_WINDOWID', \ 'DISPLAY', 'XAUTHORITY', 'GNOME_DESKTOP_SESSION_ID', \ 'KDE_FULL_SESSION'): if key in env: env_file.setStrValue(key, env[key]) env_file.save(f) def keyringSupported(): if keyring is None: logger.debug('No keyring due to import error.') return False backends = [] try: backends.append(keyring.backends.SecretService.Keyring) except: pass try: backends.append(keyring.backends.Gnome.Keyring) except: pass try: backends.append(keyring.backends.kwallet.Keyring) except: pass try: backends.append(keyring.backends.kwallet.DBusKeyring) except: pass try: backends.append(keyring.backend.SecretServiceKeyring) except: pass try: backends.append(keyring.backend.GnomeKeyring) except: pass try: backends.append(keyring.backend.KDEKWallet) except: pass try: displayName = keyring.get_keyring().__module__ except: displayName = str(keyring.get_keyring()) if backends and isinstance(keyring.get_keyring(), tuple(backends)): logger.debug("Found appropriate keyring '{}'".format(displayName)) return True logger.debug("No appropriate keyring found. '{}' can't be used with BackInTime".format(displayName)) return False def password(*args): if not keyring is None: return keyring.get_password(*args) return None def setPassword(*args): if not keyring is None: return keyring.set_password(*args) return False def mountpoint(path): """ Get the mountpoint of ``path``. If your HOME is on a separate partition mountpoint('/home/user/foo') would return '/home'. Args: path (str): full path Returns: str: mountpoint of the filesystem """ path = os.path.realpath(os.path.abspath(path)) while path != os.path.sep: if os.path.ismount(path): return path path = os.path.abspath(os.path.join(path, os.pardir)) return path def decodeOctalEscape(s): """ Decode octal-escaped characters with its ASCII dependance. For example '\040' will be a space ' ' Args: s (str): string with or without octal-escaped characters Returns: str: human readable string """ def repl(m): return chr(int(m.group(1), 8)) return re.sub(r'\\(\d{3})', repl, s) def mountArgs(path): """ Get all /etc/mtab args for the filesystem of ``path`` as a list. Example:: [DEVICE, MOUNTPOINT, FILESYSTEM_TYPE, OPTIONS, DUMP, PASS] ['/dev/sda3', '/', 'ext4', 'defaults', '0', '0'] ['/dev/sda1', '/boot', 'ext4', 'defaults', '0', '0'] Args: path (str): full path Returns: list: mount args """ mp = mountpoint(path) with open('/etc/mtab', 'r') as mounts: for line in mounts: args = line.strip('\n').split(' ') if len(args) >= 2: args[1] = decodeOctalEscape(args[1]) if args[1] == mp: return args return None def device(path): """ Get the device for the filesystem of ``path``. Example:: /dev/sda1 /dev/mapper/vglinux proc Args: path (str): full path Returns: str: device """ args = mountArgs(path) if args: return args[0] return None def filesystem(path): """ Get the filesystem type for the filesystem of ``path``. Args: path (str): full path Returns: str: filesystem """ args = mountArgs(path) if args and len(args) >= 3: return args[2] return None def uuidFromDev(dev): """ Get the UUID for the block device ``dev``. Args: dev (str): block device path Returns: str: UUID """ if dev and os.path.exists(dev): dev = os.path.realpath(dev) if os.path.exists(DISK_BY_UUID): for uuid in os.listdir(DISK_BY_UUID): if dev == os.path.realpath(os.path.join(DISK_BY_UUID, uuid)): return uuid else: c = re.compile(b'.*\sUUID="([^"]*)".*') try: # If device does not exist, blkid will exit with a non-zero code blkid = subprocess.check_output(['blkid', dev], stderr = subprocess.DEVNULL) uuid = c.findall(blkid) if uuid: return uuid[0].decode('UTF-8') except: pass c = re.compile(b'.*?ID_FS_UUID=(\S+)') try: udevadm = subprocess.check_output(['udevadm', 'info', '--name=%s' % dev], stderr = subprocess.DEVNULL) for line in udevadm.split(): m = c.match(line) if m: return m.group(1).decode('UTF-8') except: pass return None def uuidFromPath(path): """ Get the UUID for the for the filesystem of ``path``. Args: path (str): full path Returns: str: UUID """ return uuidFromDev(device(path)) def filesystemMountInfo(): """ Get a dict of mount point string -> dict of filesystem info for entire system. Returns: dict: {MOUNTPOINT: {'original_uuid': UUID}} """ # There may be multiple mount points inside of the root (/) mount, so # iterate over mtab to find all non-special mounts. with open('/etc/mtab', 'r') as mounts: return {items[1]: {'original_uuid': uuidFromDev(items[0])} for items in [mount_line.strip('\n').split(' ')[:2] for mount_line in mounts] if uuidFromDev(items[0]) != None} def wrapLine(msg, size=950, delimiters='\t ', new_line_indicator = 'CONTINUE: '): """ Wrap line ``msg`` into multiple lines with each shorter than ``size``. Try to break the line on ``delimiters``. New lines will start with ``new_line_indicator``. Args: msg (str): string that should get wrapped size (int): maximum lenght of returned strings delimiters (str): try to break ``msg`` on these characters new_line_indicator (str): start new lines with this string Yields: str: lines with max ``size`` lenght """ if len(new_line_indicator) >= size - 1: new_line_indicator = '' while msg: if len(msg) <= size: yield(msg) break else: line = '' for look in range(size-1, size//2, -1): if msg[look] in delimiters: line, msg = msg[:look+1], new_line_indicator + msg[look+1:] break if not line: line, msg = msg[:size], new_line_indicator + msg[size:] yield(line) def syncfs(): """ Sync any data buffered in memory to disk. Returns: bool: ``True`` if successful """ if checkCommand('sync'): return(Execute(['sync']).run() == 0) def isRoot(): """ Check if we are root. Returns: bool: ``True`` if we are root """ return os.geteuid() == 0 def usingSudo(): """ Check if 'sudo' was used to start this process. Returns: bool: ``True`` if process was started with sudo """ return isRoot() and os.getenv('HOME', '/root') != '/root' re_wildcard = re.compile(r'(?:\[|\]|\?)') re_asterisk = re.compile(r'\*') re_separate_asterisk = re.compile(r'(?:^\*+[^/\*]|[^/\*]\*+[^/\*]|[^/\*]\*+|\*+[^/\*]|[^/\*]\*+$)') def patternHasNotEncryptableWildcard(pattern): """ Check if ``pattern`` has wildcards ``[ ] ? *``. but return ``False`` for ``foo/*``, ``foo/*/bar``, ``*/bar`` or ``**/bar`` Args: pattern (str): path or pattern to check Returns: bool: ``True`` if ``pattern`` has wildcards ``[ ] ? *`` but ``False`` if wildcard look like ``foo/*``, ``foo/*/bar``, ``*/bar`` or ``**/bar`` """ if not re_wildcard.search(pattern) is None: return True if not re_asterisk is None and not re_separate_asterisk.search(pattern) is None: return True return False BIT_TIME_FORMAT = '%Y%m%d %H%M' ANACRON_TIME_FORMAT = '%Y%m%d' def readTimeStamp(fname): """ Read date string from file ``fname`` and try to return datetime. Args: fname (str): full path to timestamp file Returns: datetime.datetime: date from timestamp file """ if not os.path.exists(fname): logger.debug("no timestamp in '%(file)s'" % {'file': fname}) return with open(fname, 'r') as f: s = f.read().strip('\n') for i in (ANACRON_TIME_FORMAT, BIT_TIME_FORMAT): try: stamp = datetime.strptime(s, i) logger.debug("read timestamp '%(time)s' from file '%(file)s'" % {'time': stamp, 'file': fname}) return stamp except ValueError: pass def writeTimeStamp(fname): """ Write current date and time into file ``fname``. Args: fname (str): full path to timestamp file """ now = datetime.now().strftime(BIT_TIME_FORMAT) logger.debug("write timestamp '%(time)s' into file '%(file)s'" % {'time': now, 'file': fname}) makeDirs(os.path.dirname(fname)) with open(fname, 'w') as f: f.write(now) INHIBIT_LOGGING_OUT = 1 INHIBIT_USER_SWITCHING = 2 INHIBIT_SUSPENDING = 4 INHIBIT_IDLE = 8 INHIBIT_DBUS = ( {'service': 'org.gnome.SessionManager', 'objectPath': '/org/gnome/SessionManager', 'methodSet': 'Inhibit', 'methodUnSet': 'Uninhibit', 'interface': 'org.gnome.SessionManager', 'arguments': (0, 1, 2, 3) }, {'service': 'org.mate.SessionManager', 'objectPath': '/org/mate/SessionManager', 'methodSet': 'Inhibit', 'methodUnSet': 'Uninhibit', 'interface': 'org.mate.SessionManager', 'arguments': (0, 1, 2, 3) }, {'service': 'org.freedesktop.PowerManagement', 'objectPath': '/org/freedesktop/PowerManagement/Inhibit', 'methodSet': 'Inhibit', 'methodUnSet': 'UnInhibit', 'interface': 'org.freedesktop.PowerManagement.Inhibit', 'arguments': (0, 2) }) def inhibitSuspend(app_id = sys.argv[0], toplevel_xid = None, reason = 'take snapshot', flags = INHIBIT_SUSPENDING | INHIBIT_IDLE): """ Prevent machine to go to suspend or hibernate. Returns the inhibit cookie which is used to end the inhibitor. """ if ON_TRAVIS or dbus is None: # no suspend on travis (no dbus either) return if not app_id: app_id = 'backintime' try: if not toplevel_xid: toplevel_xid = 0 except IndexError: toplevel_xid = 0 for dbus_props in INHIBIT_DBUS: try: #connect directly to the socket instead of dbus.SessionBus because #the dbus.SessionBus was initiated before we loaded the environ #variables and might not work if 'DBUS_SESSION_BUS_ADDRESS' in os.environ: bus = dbus.bus.BusConnection(os.environ['DBUS_SESSION_BUS_ADDRESS']) else: bus = dbus.SessionBus() interface = bus.get_object(dbus_props['service'], dbus_props['objectPath']) proxy = interface.get_dbus_method(dbus_props['methodSet'], dbus_props['interface']) cookie = proxy(*[(app_id, dbus.UInt32(toplevel_xid), reason, dbus.UInt32(flags))[i] for i in dbus_props['arguments']]) logger.debug('Inhibit Suspend started. Reason: {}'.format(reason)) return (cookie, bus, dbus_props) except dbus.exceptions.DBusException: pass if isRoot(): logger.debug("Inhibit Suspend failed because BIT was started as root.") return logger.warning('Inhibit Suspend failed.') def unInhibitSuspend(cookie, bus, dbus_props): """ Release inhibit. """ assert isinstance(cookie, int), 'cookie is not int type: %s' % cookie assert isinstance(bus, dbus.bus.BusConnection), 'bus is not dbus.bus.BusConnection type: %s' % bus assert isinstance(dbus_props, dict), 'dbus_props is not dict type: %s' % dbus_props try: interface = bus.get_object(dbus_props['service'], dbus_props['objectPath']) proxy = interface.get_dbus_method(dbus_props['methodUnSet'], dbus_props['interface']) proxy(cookie) logger.debug('Release inhibit Suspend') return None except dbus.exceptions.DBusException: logger.warning('Release inhibit Suspend failed.') return (cookie, bus, dbus_props) def readCrontab(): """ Read users crontab. Returns: list: crontab lines """ cmd = ['crontab', '-l'] if not checkCommand(cmd[0]): logger.debug('crontab not found.') return [] else: proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True) out, err = proc.communicate() if proc.returncode or err: logger.error('Failed to get crontab lines: %s, %s' %(proc.returncode, err)) return [] else: crontab = [x.strip() for x in out.strip('\n').split('\n')] logger.debug('Read %s lines from users crontab' %len(crontab)) return crontab def writeCrontab(lines): """ Write to users crontab. Note: This will overwrite the whole crontab. So to keep the old crontab and only add new entries you need to read it first with :py:func:`tools.readCrontab`, append new entries to the list and write it back. Args: lines (:py:class:`list`, :py:class:`tuple`): lines that should be written to crontab Returns: bool: ``True`` if successful """ assert isinstance(lines, (list, tuple)), 'lines is not list or tuple type: %s' % lines with tempfile.NamedTemporaryFile(mode = 'wt') as f: f.write('\n'.join(lines)) f.write('\n\n') f.flush() cmd = ['crontab', f.name] proc = subprocess.Popen(cmd, stdout = subprocess.DEVNULL, stderr = subprocess.PIPE, universal_newlines = True) out, err = proc.communicate() if proc.returncode or err: logger.error('Failed to write lines to crontab: %s, %s' %(proc.returncode, err)) return False else: logger.debug('Wrote %s lines to users crontab' %len(lines)) return True def splitCommands(cmds, head = '', tail = '', maxLength = 0): """ Split a list of commands ``cmds`` into multiple commands with each length lower than ``maxLength``. Args: cmds (list): commands head (str): command that need to run first on every iteration of ``cmds`` tail (str): command that need to run after every iteration of ``cmds`` maxLength (int): maximum length a command could be. Don't split if <= 0 Yields: str: new command with length < ``maxLength`` Example:: head cmds[0] cmds[n] tail """ while cmds: s = head while cmds and ((len(s + cmds[0] + tail) <= maxLength) or maxLength <= 0): s += cmds.pop(0) s += tail yield s def isIPv6Address(address): """ Check if ``address`` is a valid IPv6 address. Args: address (str): address that should get tested Returns: bool: True if ``address`` is a valid IPv6 address """ try: return isinstance(ipaddress.IPv6Address(address), ipaddress.IPv6Address) except: return False def escapeIPv6Address(address): """ Escape IPv6 Addresses with square brackets ``[]``. Args: address (str): address that should be escaped Returns: str: ``address`` in square brackets """ if isIPv6Address(address): return '[{}]'.format(address) else: return address def camelCase(s): """ Remove underlines and make every first char uppercase. Args: s (str): string separated by underlines (foo_bar) Returns: str: string without underlines but uppercase chars (FooBar) """ return ''.join([x.capitalize() for x in s.split('_')]) def fdDup(old, new_fd, mode = 'w'): """ Duplicate file descriptor `old` to `new_fd` and closing the latter first. Used to redirect stdin, stdout and stderr from daemonized threads. Args: old (str): Path to the old file (e.g. /dev/stdout) new_fd (_io.TextIOWrapper): file object for the new file mode (str): mode in which the old file should be opened """ try: fd = open(old, mode) os.dup2(fd.fileno(), new_fd.fileno()) except OSError as e: logger.debug('Failed to redirect {}: {}'.format(old, str(e))) class UniquenessSet: """ Check for uniqueness or equality of files. Args: dc (bool): if ``True`` use deep check which will compare files md5sums if they are of same size but no hardlinks (don't have the same inode). If ``False`` use files size and mtime follow_symlink (bool): if ``True`` check symlinks target instead of the link list_equal_to (str): full path to file. If not empty only return equal files to the given path instead of unique files. """ def __init__(self, dc = False, follow_symlink = False, list_equal_to = ''): self.deep_check = dc self.follow_sym = follow_symlink self._uniq_dict = {} # if not self._uniq_dict[size] -> size already checked with md5sum self._size_inode = set() # if (size,inode) in self._size_inode -> path is a hlink self.list_equal_to = list_equal_to if list_equal_to: st = os.stat(list_equal_to) if self.deep_check: self.reference = (st.st_size, md5sum(list_equal_to)) else: self.reference = (st.st_size, int(st.st_mtime)) def check(self, input_path): """ Check file ``input_path`` for either uniqueness or equality (depending on ``list_equal_to`` from constructor). Args: input_path (str): full path to file Returns: bool: ``True`` if file is unique and ``list_equal_to`` is empty. Or ``True`` if file is equal to file in ``list_equal_to`` """ # follow symlinks ? path = input_path if self.follow_sym and os.path.islink(input_path): path = os.readlink(input_path) if self.list_equal_to: return self.checkEqual(path) else: return self.checkUnique(path) def checkUnique(self, path): """ Check file ``path`` for uniqueness and store a unique key for ``path``. Args: path (str): full path to file Returns: bool: ``True`` if file is unique """ # check if self.deep_check: dum = os.stat(path) size,inode = dum.st_size, dum.st_ino # is it a hlink ? if (size, inode) in self._size_inode: logger.debug("[deep test] : skip, it's a duplicate (size, inode)", self) return False self._size_inode.add((size,inode)) if size not in self._uniq_dict: # first item of that size unique_key = size logger.debug("[deep test] : store current size ?", self) else: prev = self._uniq_dict[size] if prev: # store md5sum instead of previously stored size md5sum_prev = md5sum(prev) self._uniq_dict[size] = None self._uniq_dict[md5sum_prev] = prev logger.debug("[deep test] : size duplicate, remove the size, store prev md5sum", self) unique_key = md5sum(path) logger.debug("[deep test] : store current md5sum ?", self) else: # store a tuple of (size, modification time) obj = os.stat(path) unique_key = (obj.st_size, int(obj.st_mtime)) # store if not already present, then return True if unique_key not in self._uniq_dict: logger.debug(" >> ok, store !", self) self._uniq_dict[unique_key] = path return True logger.debug(" >> skip (it's a duplicate)", self) return False def checkEqual(self, path): """ Check if ``path`` is equal to the file in ``list_equal_to`` from constructor. Args: path (str): full path to file Returns: bool: ``True`` if file is equal """ st = os.stat(path) if self.deep_check: if self.reference[0] == st.st_size: return self.reference[1] == md5sum(path) return False else: return self.reference == (st.st_size, int(st.st_mtime)) class Alarm(object): """ Timeout for FIFO. This does not work with threading. """ def __init__(self, callback = None, overwrite = True): self.callback = callback self.ticking = False self.overwrite = overwrite def start(self, timeout): """ Start timer """ if self.ticking and not self.overwrite: return try: signal.signal(signal.SIGALRM, self.handler) signal.alarm(timeout) except ValueError: pass self.ticking = True def stop(self): """ Stop timer before it come to an end """ try: signal.alarm(0) self.ticking = False except: pass def handler(self, signum, frame): """ Timeout occur. """ self.ticking = False if self.callback is None: raise Timeout() else: self.callback() class ShutDown(object): """ Shutdown the system after the current snapshot has finished. This should work for KDE, Gnome, Unity, Cinnamon, XFCE, Mate and E17. """ DBUS_SHUTDOWN ={'gnome': {'bus': 'sessionbus', 'service': 'org.gnome.SessionManager', 'objectPath': '/org/gnome/SessionManager', 'method': 'Shutdown', #methods Shutdown # Reboot # Logout 'interface': 'org.gnome.SessionManager', 'arguments': () #arg (only with Logout) # 0 normal # 1 no confirm # 2 force }, 'kde': {'bus': 'sessionbus', 'service': 'org.kde.ksmserver', 'objectPath': '/KSMServer', 'method': 'logout', 'interface': 'org.kde.KSMServerInterface', 'arguments': (-1, 2, -1) #1st arg -1 confirm # 0 no confirm #2nd arg -1 full dialog with default logout # 0 logout # 1 restart # 2 shutdown #3rd arg -1 wait 30sec # 2 immediately }, 'xfce': {'bus': 'sessionbus', 'service': 'org.xfce.SessionManager', 'objectPath': '/org/xfce/SessionManager', 'method': 'Shutdown', #methods Shutdown # Restart # Suspend (no args) # Hibernate (no args) # Logout (two args) 'interface': 'org.xfce.Session.Manager', 'arguments': (True,) #arg True allow saving # False don't allow saving #1nd arg (only with Logout) # True show dialog # False don't show dialog #2nd arg (only with Logout) # True allow saving # False don't allow saving }, 'mate': {'bus': 'sessionbus', 'service': 'org.mate.SessionManager', 'objectPath': '/org/mate/SessionManager', 'method': 'Shutdown', #methods Shutdown # Logout 'interface': 'org.mate.SessionManager', 'arguments': () #arg (only with Logout) # 0 normal # 1 no confirm # 2 force }, 'e17': {'bus': 'sessionbus', 'service': 'org.enlightenment.Remote.service', 'objectPath': '/org/enlightenment/Remote/RemoteObject', 'method': 'Halt', #methods Halt -> Shutdown # Reboot # Logout # Suspend # Hibernate 'interface': 'org.enlightenment.Remote.Core', 'arguments': () }, 'e19': {'bus': 'sessionbus', 'service': 'org.enlightenment.wm.service', 'objectPath': '/org/enlightenment/wm/RemoteObject', 'method': 'Shutdown', #methods Shutdown # Restart 'interface': 'org.enlightenment.wm.Core', 'arguments': () }, 'z_freed': {'bus': 'systembus', 'service': 'org.freedesktop.login1', 'objectPath': '/org/freedesktop/login1', 'method': 'PowerOff', 'interface': 'org.freedesktop.login1.Manager', 'arguments': (True,) } } def __init__(self): self.is_root = isRoot() if self.is_root: self.proxy, self.args = None, None else: self.proxy, self.args = self._prepair() self.activate_shutdown = False self.started = False def _prepair(self): """ Try to connect to the given dbus services. If successful it will return a callable dbus proxy and those arguments. """ try: if 'DBUS_SESSION_BUS_ADDRESS' in os.environ: sessionbus = dbus.bus.BusConnection(os.environ['DBUS_SESSION_BUS_ADDRESS']) else: sessionbus = dbus.SessionBus() systembus = dbus.SystemBus() except: return((None, None)) des = list(self.DBUS_SHUTDOWN.keys()) des.sort() for de in des: if de == 'gnome' and self.unity7(): continue dbus_props = self.DBUS_SHUTDOWN[de] try: if dbus_props['bus'] == 'sessionbus': bus = sessionbus else: bus = systembus interface = bus.get_object(dbus_props['service'], dbus_props['objectPath']) proxy = interface.get_dbus_method(dbus_props['method'], dbus_props['interface']) return((proxy, dbus_props['arguments'])) except dbus.exceptions.DBusException: continue return((None, None)) def canShutdown(self): """ Indicate if a valid dbus service is available to shutdown system. """ return(not self.proxy is None or self.is_root) def askBeforeQuit(self): """ Indicate if ShutDown is ready to fire and so the application shouldn't be closed. """ return(self.activate_shutdown and not self.started) def shutdown(self): """ Run 'shutdown -h now' if we are root or call the dbus proxy to start the shutdown. """ if not self.activate_shutdown: return(False) if self.is_root: syncfs() self.started = True proc = subprocess.Popen(['shutdown', '-h', 'now']) proc.communicate() return proc.returncode if self.proxy is None: return(False) else: syncfs() self.started = True return(self.proxy(*self.args)) def unity7(self): """ Unity >= 7.0 doesn't shutdown automatically. It will only show shutdown dialog and wait for user input. """ if not checkCommand('unity'): return False proc = subprocess.Popen(['unity', '--version'], stdout = subprocess.PIPE, universal_newlines = True) unity_version = proc.communicate()[0] m = re.match(r'unity ([\d\.]+)', unity_version) return m and StrictVersion(m.group(1)) >= StrictVersion('7.0') and processExists('unity-panel-service') class SetupUdev(object): """ Setup Udev rules for starting BackInTime when a drive get connected. This is done by serviceHelper.py script (included in backintime-qt) running as root though DBus. """ CONNECTION = 'net.launchpad.backintime.serviceHelper' OBJECT = '/UdevRules' INTERFACE = 'net.launchpad.backintime.serviceHelper.UdevRules' MEMBERS = ('addRule', 'save', 'delete') def __init__(self): if dbus is None: self.isReady = False return try: bus = dbus.SystemBus() conn = bus.get_object(SetupUdev.CONNECTION, SetupUdev.OBJECT) self.iface = dbus.Interface(conn, SetupUdev.INTERFACE) except dbus.exceptions.DBusException as e: if e._dbus_error_name in ('org.freedesktop.DBus.Error.NameHasNoOwner', 'org.freedesktop.DBus.Error.ServiceUnknown', 'org.freedesktop.DBus.Error.FileNotFound'): conn = None else: raise self.isReady = bool(conn) def addRule(self, cmd, uuid): """ Prepair rules in serviceHelper.py """ if not self.isReady: return try: return self.iface.addRule(cmd, uuid) except dbus.exceptions.DBusException as e: if e._dbus_error_name == 'net.launchpad.backintime.InvalidChar': raise InvalidChar(str(e)) elif e._dbus_error_name == 'net.launchpad.backintime.InvalidCmd': raise InvalidCmd(str(e)) elif e._dbus_error_name == 'net.launchpad.backintime.LimitExceeded': raise LimitExceeded(str(e)) else: raise def save(self): """ Save rules with serviceHelper.py after authentication If no rules where added before this will delete current rule. """ if not self.isReady: return try: return self.iface.save() except dbus.exceptions.DBusException as e: if e._dbus_error_name == 'com.ubuntu.DeviceDriver.PermissionDeniedByPolicy': raise PermissionDeniedByPolicy(str(e)) else: raise def clean(self): """ Clean up remote cache """ if not self.isReady: return self.iface.clean() class PathHistory(object): def __init__(self, path): self.history = [path,] self.index = 0 def append(self, path): #append path after the current index self.history = self.history[:self.index + 1] + [path,] self.index = len(self.history) - 1 def previous(self): if self.index == 0: return self.history[0] try: path = self.history[self.index - 1] except IndexError: return self.history[self.index] self.index -= 1 return path def next(self): if self.index == len(self.history) - 1: return self.history[-1] try: path = self.history[self.index + 1] except IndexError: return self.history[self.index] self.index += 1 return path def reset(self, path): self.history = [path,] self.index = 0 class OrderedSet(collections.MutableSet): """ OrderedSet from Python recipe http://code.activestate.com/recipes/576694/ """ def __init__(self, iterable=None): self.end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.map = {} # key --> [key, prev, next] if iterable is not None: self |= iterable def __len__(self): return len(self.map) def __contains__(self, key): return key in self.map def add(self, key): if key not in self.map: end = self.end curr = end[1] curr[2] = end[1] = self.map[key] = [key, curr, end] def discard(self, key): if key in self.map: key, prev, next = self.map.pop(key) prev[2] = next next[1] = prev def __iter__(self): end = self.end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def pop(self, last=True): if not self: raise KeyError('set is empty') key = self.end[1][0] if last else self.end[2][0] self.discard(key) return key def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, list(self)) def __eq__(self, other): if isinstance(other, OrderedSet): return len(self) == len(other) and list(self) == list(other) return set(self) == set(other) class Execute(object): """ Execute external commands and handle its output. Args: cmd (:py:class:`str` or :py:class:`list`): command with arguments that should be called. Depending on if this is :py:class:`str` or :py:class:`list` instance the command will be called by either :py:func:`os.system` (deprecated) or :py:class:`subprocess.Popen` callback (method): function which will handle output returned by command user_data: extra arguments which will be forwarded to ``callback`` function filters (tuple): Tuple of functions used to filter messages before sending them to ``callback`` parent (instance): instance of the calling method used only to proper format log messages conv_str (bool): convert output to :py:class:`str` if True or keep it as :py:class:`bytes` if False join_stderr (bool): join stderr to stdout Note: Signals SIGTSTP and SIGCONT send to Python main process will be forwarded to the command. SIGHUP will kill the process. """ def __init__(self, cmd, callback = None, user_data = None, filters = (), parent = None, conv_str = True, join_stderr = True): self.cmd = cmd self.callback = callback self.user_data = user_data self.filters = filters self.currentProc = None self.conv_str = conv_str self.join_stderr = join_stderr #we need to forward parent to have the correct class name in debug log if parent: self.parent = parent else: self.parent = self if isinstance(self.cmd, list): self.pausable = True self.printable_cmd = ' '.join(self.cmd) logger.debug('Call command "%s"' %self.printable_cmd, self.parent, 2) else: self.pausable = False self.printable_cmd = self.cmd logger.warning('Call command with old os.system method "%s"' %self.printable_cmd, self.parent, 2) def run(self): """ Start the command. Returns: int: returncode from command """ ret_val = 0 out = '' #backwards compatibility with old os.system and os.popen calls if isinstance(self.cmd, str): logger.deprecated(self) if self.callback is None: ret_val = os.system(self.cmd) else: pipe = os.popen(self.cmd, 'r') while True: line = tempFailureRetry(pipe.readline) if not line: break line = line.strip() for f in self.filters: line = f(line) if not line: continue self.callback(line, self.user_data) ret_val = pipe.close() if ret_val is None: ret_val = 0 #new and preferred method using subprocess.Popen elif isinstance(self.cmd, (list, tuple)): try: #register signals for pause, resume and kill signal.signal(signal.SIGTSTP, self.pause) signal.signal(signal.SIGCONT, self.resume) signal.signal(signal.SIGHUP, self.kill) except ValueError: #signal only work in qt main thread pass if self.join_stderr: stderr = subprocess.STDOUT else: stderr = subprocess.DEVNULL self.currentProc = subprocess.Popen(self.cmd, stdout = subprocess.PIPE, stderr = stderr) if self.callback: for line in self.currentProc.stdout: if self.conv_str: line = line.decode().rstrip('\n') else: line = line.rstrip(b'\n') for f in self.filters: line = f(line) if not line: continue self.callback(line, self.user_data) out = self.currentProc.communicate()[0] ret_val = self.currentProc.returncode try: #reset signals to their default signal.signal(signal.SIGTSTP, signal.SIG_DFL) signal.signal(signal.SIGCONT, signal.SIG_DFL) signal.signal(signal.SIGHUP, signal.SIG_DFL) except ValueError: #signal only work in qt main thread pass if ret_val != 0: msg = 'Command "%s" returns %s%s%s' %(self.printable_cmd, bcolors.WARNING, ret_val, bcolors.ENDC) if out: msg += ' | %s' %out.decode().strip('\n') logger.warning(msg, self.parent, 2) else: msg = 'Command "%s..." returns %s' %(self.printable_cmd[:min(16, len(self.printable_cmd))], ret_val) if out: msg += ': %s' %out.decode().strip('\n') logger.debug(msg, self.parent, 2) return ret_val def pause(self, signum, frame): """ Slot which will send ``SIGSTOP`` to the command. Is connected to signal ``SIGTSTP``. """ if self.pausable and self.currentProc: logger.info('Pause process "%s"' %self.printable_cmd, self.parent, 2) return self.currentProc.send_signal(signal.SIGSTOP) def resume(self, signum, frame): """ Slot which will send ``SIGCONT`` to the command. Is connected to signal ``SIGCONT``. """ if self.pausable and self.currentProc: logger.info('Resume process "%s"' %self.printable_cmd, self.parent, 2) return self.currentProc.send_signal(signal.SIGCONT) def kill(self, signum, frame): """ Slot which will kill the command. Is connected to signal ``SIGHUP``. """ if self.pausable and self.currentProc: logger.info('Kill process "%s"' %self.printable_cmd, self.parent, 2) return self.currentProc.kill() class Daemon: """ A generic daemon class. Usage: subclass the Daemon class and override the run() method Daemon Copyright by Sander Marechal License CC BY-SA 3.0 http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ """ def __init__(self, pidfile = None, stdin='/dev/null', stdout='/dev/stdout', stderr='/dev/null', umask = 0o022): self.stdin = stdin self.stdout = stdout self.stderr = stderr self.pidfile = pidfile self.umask = umask if pidfile: self.appInstance = ApplicationInstance(pidfile, autoExit = False, flock = False) def daemonize(self): """ do the UNIX double-fork magic, see Stevens' "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177) http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 """ try: pid = os.fork() logger.debug('first fork pid: {}'.format(pid), self) if pid > 0: # exit first parent sys.exit(0) except OSError as e: logger.error("fork #1 failed: %d (%s)" % (e.errno, str(e)), self) sys.exit(1) # decouple from parent environment logger.debug('decouple from parent environment', self) os.chdir("/") os.setsid() os.umask(self.umask) # do second fork try: pid = os.fork() logger.debug('second fork pid: {}'.format(pid), self) if pid > 0: # exit from second parent sys.exit(0) except OSError as e: logger.error("fork #2 failed: %d (%s)" % (e.errno, str(e)), self) sys.exit(1) # redirect standard file descriptors logger.debug('redirect standard file descriptors', self) sys.stdout.flush() sys.stderr.flush() fdDup(self.stdin, sys.stdin, 'r') fdDup(self.stdout, sys.stdout, 'w') fdDup(self.stderr, sys.stderr, 'w') signal.signal(signal.SIGTERM, self.cleanupHandler) if self.pidfile: atexit.register(self.appInstance.exitApplication) # write pidfile logger.debug('write pidfile', self) self.appInstance.startApplication() def cleanupHandler(self, signum, frame): if self.pidfile: self.appInstance.exitApplication() sys.exit(0) def start(self): """ Start the daemon """ # Check for a pidfile to see if the daemon already runs if self.pidfile and not self.appInstance.check(): message = "pidfile %s already exist. Daemon already running?\n" logger.error(message % self.pidfile, self) sys.exit(1) # Start the daemon self.daemonize() self.run() def stop(self): """ Stop the daemon """ if not self.pidfile: logger.debug("Unattended daemon can't be stopped. No PID file", self) return # Get the pid from the pidfile pid, procname = self.appInstance.readPidFile() if not pid: message = "pidfile %s does not exist. Daemon not running?\n" logger.error(message % self.pidfile, self) return # not an error in a restart # Try killing the daemon process try: while True: os.kill(pid, signal.SIGTERM) sleep(0.1) except OSError as err: if err.errno == errno.ESRCH: #no such process self.appInstance.exitApplication() else: logger.error(str(err), self) sys.exit(1) def restart(self): """ Restart the daemon """ self.stop() self.start() def reload(self): """ send SIGHUP signal to process """ if not self.pidfile: logger.debug("Unattended daemon can't be reloaded. No PID file", self) return # Get the pid from the pidfile pid, procname = self.appInstance.readPidFile() if not pid: message = "pidfile %s does not exist. Daemon not running?\n" logger.error(message % self.pidfile, self) return # Try killing the daemon process try: os.kill(pid, signal.SIGHUP) except OSError as err: if err.errno == errno.ESRCH: #no such process self.appInstance.exitApplication() else: sys.stderr.write(str(err)) sys.exit(1) def status(self): """ return status """ if not self.pidfile: logger.debug("Unattended daemon can't be checked. No PID file", self) return return not self.appInstance.check() def run(self): """ You should override this method when you subclass Daemon. It will be called after the process has been daemonized by start() or restart(). """ pass def __logKeyringWarning(): from time import sleep sleep(0.1) logger.warning('import keyring failed') if keyring is None and keyring_warn: #delay warning to give logger some time to import from threading import Thread thread = Thread(target = __logKeyringWarning, args = ()) thread.start() backintime-1.2.1/common/exceptions.py0000644000175000017500000000342613530533316017167 0ustar germargermar# Copyright (C) 2015-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. class BackInTimeException(Exception): pass class MountException(BackInTimeException): pass class NoPubKeyLogin(MountException): pass class KnownHost(MountException): pass class HashCollision(BackInTimeException): pass class EncodeValueError(BackInTimeException): pass class StopException(BackInTimeException): pass class Timeout(BackInTimeException): pass class LastSnapshotSymlink(BackInTimeException): pass class InvalidChar(BackInTimeException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg class InvalidCmd(BackInTimeException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg class LimitExceeded(BackInTimeException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg class PermissionDeniedByPolicy(BackInTimeException): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg backintime-1.2.1/common/mount.py0000644000175000017500000011123013530533316016141 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import subprocess import json import gettext from zlib import crc32 from time import sleep import config import logger import tools import password from exceptions import MountException, HashCollision _=gettext.gettext class Mount(object): """ This is the high-level mount API. This will handle mount, umount, remount and checks on the low-level :py:class:`MountControl` subclass backends for BackInTime. If ``cfg`` is ``None`` this will load the default config. If ``profile_id`` is ``None`` it will use :py:func:`configfile.ConfigFileWithProfiles.currentProfile`. If the current profile uses Password-Cache and the Password-Cache is not running this will try to start it. Args: cfg (config.Config): current config profile_id (str): profile ID that should be used tmp_mount (bool): if ``True`` mount to a temporary destination parent (QWidget): parent widget for QDialogs or ``None`` if there is no parent """ def __init__(self, cfg = None, profile_id = None, tmp_mount = False, parent = None): self.config = cfg if self.config is None: self.config = config.Config() self.profile_id = profile_id if self.profile_id is None: self.profile_id = self.config.currentProfile() self.tmp_mount = tmp_mount self.parent = parent if self.config.passwordUseCache(self.profile_id): cache = password.Password_Cache(self.config) action = None running = cache.status() if not running: logger.debug('pw-cache is not running', self) action = 'start' if running and not cache.checkVersion(): logger.debug('pw-cache is running but is an old version', self) action = 'restart' bit = tools.which('backintime') if not action is None and not bit is None and len(bit): cmd = [bit, 'pw-cache', action] logger.debug('Call command: %s' %' '.join(cmd), self) proc = subprocess.Popen(cmd, stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL) if proc.returncode: logger.error('Failed to %s pw-cache: %s' %(action, proc.returncode), self) pass def mount(self, mode = None, check = True, **kwargs): """ High-level `mount`. Check if the selected ``mode`` need to be mounted, select the low-level backend and mount it. Args: mode (str): mode to use. One of 'local', 'ssh', 'local_encfs' or 'ssh_encfs' check (bool): if ``True`` run :py:func:`MountControl.preMountCheck` before mounting **kwargs: keyword arguments paste to low-level :py:class:`MountControl` subclass backend Returns: str: Hash ID used as mountpoint Raises: exceptions.MountException: if a check failed exceptions.HashCollision: if Hash ID was used before but umount info wasn't identical """ self.config.PLUGIN_MANAGER.load(cfg = self.config) self.config.PLUGIN_MANAGER.mount(self.profile_id) if mode is None: mode = self.config.snapshotsMode(self.profile_id) if self.config.SNAPSHOT_MODES[mode][0] is None: #mode doesn't need to mount return 'local' else: while True: try: mounttools = self.config.SNAPSHOT_MODES[mode][0] backend = mounttools(cfg = self.config, profile_id = self.profile_id, tmp_mount = self.tmp_mount, mode = mode, parent = self.parent, **kwargs) return backend.mount(check = check) except HashCollision as ex: logger.warning(str(ex), self) del backend check = False continue break def umount(self, hash_id = None): """ High-level `unmount`. Unmount the low-level backend. This will read unmount infos written next to the mountpoint identified by ``hash_id`` and unmount it. Args: hash_id (bool): Hash ID used as mountpoint before that should get unmounted Raises: exceptions.MountException: if a check failed """ self.config.PLUGIN_MANAGER.load(cfg = self.config) self.config.PLUGIN_MANAGER.unmount(self.profile_id) if hash_id is None: hash_id = self.config.current_hash_id if hash_id == 'local': #mode doesn't need to umount return else: umount_info = os.path.join(self.config._LOCAL_MOUNT_ROOT, hash_id, 'umount') with open(umount_info, 'r') as f: data_string = f.read() f.close() kwargs = json.loads(data_string) mode = kwargs.pop('mode') mounttools = self.config.SNAPSHOT_MODES[mode][0] backend = mounttools(cfg = self.config, profile_id = self.profile_id, tmp_mount = self.tmp_mount, mode = mode, hash_id = hash_id, parent = self.parent, **kwargs) backend.umount() def preMountCheck(self, mode = None, first_run = False, **kwargs): """ High-level check. Run :py:func:`MountControl.preMountCheck` to check if all conditions for :py:func:`Mount.mount` are set. Should be called with ``first_run = True`` to check if new settings are correct before saving them. Args: mode (str): mode to use. One of 'local', 'ssh', 'local_encfs' or 'ssh_encfs' first_run (bool): run intense checks that only need to run after changing settings but not every time before mounting **kwargs: keyword arguments paste to low-level :py:class:`MountControl` subclass backend Returns: bool: ``True`` if all checks where okay Raises: exceptions.MountException: if a check failed """ if mode is None: mode = self.config.snapshotsMode(self.profile_id) if self.config.SNAPSHOT_MODES[mode][0] is None: #mode doesn't need to mount return True else: mounttools = self.config.SNAPSHOT_MODES[mode][0] backend = mounttools(cfg = self.config, profile_id = self.profile_id, tmp_mount = self.tmp_mount, mode = mode, parent = self.parent, **kwargs) return backend.preMountCheck(first_run) def remount(self, new_profile_id, mode = None, hash_id = None, **kwargs): """ High-level `remount`. Unmount the old profile presented by ``hash_id`` and mount new profile ``new_profile_id`` with mode ``mode``. If old and new mounts are the same just add new symlinks and keep the mount. Args map to profiles:: new_profile_id <= new profile mode <= new profile kwargs <= new profile hash_id <= old profile self.profile_id <= old profile Args: new_profile_id (str): Profile ID that should get mounted mode (str): mode to use for new mount. One of 'local', 'ssh', 'local_encfs' or 'ssh_encfs' hash_id (str): Hash ID used as mountpoint on the old mount, that should get unmounted **kwargs: keyword arguments paste to low-level :py:class:`MountControl` subclass backend for the new mount Returns: str: Hash ID used as mountpoint Raises: exceptions.MountException: if a check failed exceptions.HashCollision: if Hash ID was used before but umount info wasn't identical """ if mode is None: mode = self.config.snapshotsMode(new_profile_id) if hash_id is None: hash_id = self.config.current_hash_id if self.config.SNAPSHOT_MODES[mode][0] is None: #new profile don't need to mount. self.umount(hash_id = hash_id) return 'local' if hash_id == 'local': #old profile don't need to umount. self.profile_id = new_profile_id return self.mount(mode = mode, **kwargs) mounttools = self.config.SNAPSHOT_MODES[mode][0] backend = mounttools(cfg = self.config, profile_id = new_profile_id, tmp_mount = self.tmp_mount, mode = mode, parent = self.parent, **kwargs) if backend.compareRemount(hash_id): #profiles uses the same settings. just swap the symlinks backend.removeSymlink(profile_id = self.profile_id) backend.setSymlink(profile_id = new_profile_id, hash_id = hash_id) return hash_id else: #profiles are different. we need to umount and mount again self.umount(hash_id = hash_id) self.profile_id = new_profile_id return self.mount(mode = mode, **kwargs) class MountControl(object): """ This is the low-level mount API. This should be subclassed by backends. Subclasses should have its own ``__init__`` but **must** also call the inherited ``__init__``. You **must** overwrite methods:\n :py:func:`MountControl._mount` You **can** overwrite methods:\n :py:func:`MountControl._umount`\n :py:func:`MountControl.preMountCheck`\n :py:func:`MountControl.postMountCheck`\n :py:func:`MountControl.preUmountCheck`\n :py:func:`MountControl.postUmountCheck` These arguments **must** be defined in ``self`` namespace by subclassing ``__init__`` method:\n mountproc (str): process used to mount\n log_command (str): shortened form of mount command used in logs\n symlink_subfolder (str):mountpoint-subfolder which should be linked\n Args: cfg (config.Config): current config profile_id (str): profile ID that should be used hash_id (str): crc32 hash used to identify identical mountpoints tmp_mount (bool): if ``True`` mount to a temporary destination parent (QWidget): parent widget for QDialogs or ``None`` if there is no parent symlink (bool): if ``True`` set symlink to mountpoint mode (str): one of ``local``, ``local_encfs``, ``ssh`` or ``ssh_encfs`` hash_collision (int): global value used to prevent hash collisions on mountpoints """ CHECK_FUSE_GROUP = False def __init__(self, cfg = None, profile_id = None, hash_id = None, tmp_mount = False, parent = None, symlink = True, *args, **kwargs): self.config = cfg if self.config is None: self.config = config.Config() self.profile_id = profile_id if self.profile_id is None: self.profile_id = self.config.currentProfile() self.tmp_mount = tmp_mount self.hash_id = hash_id self.parent = parent self.symlink = symlink self.local_host = self.config.host() self.local_user = self.config.user() self.pid = self.config.pid() self.all_kwargs = {} self.setattrKwargs('mode', self.config.snapshotsMode(self.profile_id), **kwargs) self.setattrKwargs('hash_collision', self.config.hashCollision(), **kwargs) def setDefaultArgs(self): """ Set some arguments which are necessary for all backends. ``self.all_kwargs`` need to be filled through :py:func:`setattrKwargs` before calling this. """ #self.destination should contain all arguments that are nessesary for #mount. args = list(self.all_kwargs.keys()) self.destination = '%s:' % self.all_kwargs['mode'] args.remove('mode') args.sort() for arg in args: self.destination += ' %s' % self.all_kwargs[arg] #unique id for every different mount settings. Similar settings even in #different profiles will generate the same hash_id and so share the same #mountpoint if self.hash_id is None: self.hash_id = self.hash(self.destination) self.mount_root = self.config._LOCAL_MOUNT_ROOT self.snapshots_path = self.config.snapshotsPath(profile_id = self.profile_id, mode = self.mode, tmp_mount = self.tmp_mount) self.hash_id_path = self.hashIdPath() self.currentMountpoint = self.mountpoint() self.lock_path = self.lockPath() self.umount_info = self.umountInfoPath() def mount(self, check = True): """ Low-level `mount`. Set mountprocess lock and prepair mount, run checks and than call :py:func:`_mount` for the subclassed backend. Finally set mount lock and symlink and release mountprocess lock. Args: check (bool): if ``True`` run :py:func:`preMountCheck` before mounting Returns: str: Hash ID used as mountpoint Raises: exceptions.MountException: if a check failed exceptions.HashCollision: if Hash ID was used before but umount info wasn't identical """ self.createMountStructure() self.mountProcessLockAcquire() try: if self.mounted(): if not self.compareUmountInfo(): #We probably have a hash collision self.config.incrementHashCollision() raise HashCollision(_('Hash collision occurred in hash_id %s. Incrementing global value hash_collision and try again.') % self.hash_id) logger.info('Mountpoint %s is already mounted' %self.currentMountpoint, self) else: if check: self.preMountCheck() self._mount() self.postMountCheck() logger.info('mount %s on %s' %(self.log_command, self.currentMountpoint), self) self.writeUmountInfo() except Exception: raise else: self.mountLockAquire() self.setSymlink() finally: self.mountProcessLockRelease() return self.hash_id def umount(self): """ Low-level `umount`. Set mountprocess lock, run umount checks and call :py:func:`_umount` for the subclassed backend. Finally release mount lock, remove symlink and release mountprocess lock. Raises: exceptions.MountException: if a check failed """ self.mountProcessLockAcquire() try: if not os.path.isdir(self.hash_id_path): logger.info('Mountpoint %s does not exist.' % self.currentMountpoint, self) else: if not self.mounted(): logger.info('Mountpoint %s is not mounted' % self.currentMountpoint, self) else: if self.mountLockCheck(): logger.info('Mountpoint %s still in use. Keep mounted' % self.currentMountpoint, self) else: self.preUmountCheck() self._umount() self.postUmountCheck() if os.listdir(self.currentMountpoint): logger.warning('Mountpoint %s not empty after unmount' %self.currentMountpoint, self) else: logger.info('unmount %s from %s' %(self.log_command, self.currentMountpoint), self) except Exception: raise else: self.mountLockRelease() self.removeSymlink() finally: self.mountProcessLockRelease() def _mount(self): """ Backend mount method. This **must** be overwritten in the backend which subclasses :py:class:`MountControl`. """ raise NotImplementedError('_mount need to be overwritten in backend') def _umount(self): """ Unmount with ``fusermount -u`` for fuse based backends. This **can** be overwritten by backends which subclasses :py:class:`MountControl`. Raises: exceptions.MountException: if unmount failed """ try: subprocess.check_call(['fusermount', '-u', self.currentMountpoint]) except subprocess.CalledProcessError: raise MountException(_('Can\'t unmount %(proc)s from %(mountpoint)s') %{'proc': self.mountproc, 'mountpoint': self.currentMountpoint}) def preMountCheck(self, first_run = False): """ Check what ever conditions must be given for the mount to be done successful. This **can** be overwritten in backends which subclasses :py:class:`MountControl`. Returns: bool: ``True`` if all checks where okay Raises: exceptions.MountException: if backend can not mount Note: This can also be used to prepare things before running :py:func:`_mount` """ return True def postMountCheck(self): """ Check if the mount was successful. This **can** be overwritten in backends which subclasses :py:class:`MountControl`. Returns: bool: ``True`` if all checks where okay Raises: exceptions.MountException: if backend wasn't mount successful Note: This can also be used to clean up after running :py:func:`_mount` """ return True def preUmountCheck(self): """ Check if backend is safe to umount. This **can** be overwritten in backends which subclasses :py:class:`MountControl`. Returns: bool: ``True`` if all checks where okay Raises: exceptions.MountException: if backend can not umount Note: This can also be used to prepare things before running :py:func:`_umount` """ return True def postUmountCheck(self): """ Check if unmount was successful. This **can** be overwritten in backends which subclasses :py:class:`MountControl`. Returns: bool: ``True`` if all checks where okay Raises: exceptions.MountException: if backend wasn't unmounted successful Note: This can also be used to clean up after running :py:func:`_umount` """ return True def checkFuse(self): """ Check if command in self.mountproc is installed and user is part of group ``fuse``. Raises: exceptions.MountException: if either command is not available or user is not in group fuse """ logger.debug('Check fuse', self) if not tools.checkCommand(self.mountproc): logger.debug('%s is missing' %self.mountproc, self) raise MountException(_('%(proc)s not found. Please install e.g. %(install_command)s') %{'proc': self.mountproc, 'install_command': "'apt-get install %s'" %self.mountproc}) if self.CHECK_FUSE_GROUP: user = self.config.user() try: fuse_grp_members = grp.getgrnam('fuse')[3] except KeyError: #group fuse doesn't exist. So most likely it isn't used by this distribution logger.debug("Group fuse doesn't exist. Skip test", self) return if not user in fuse_grp_members: logger.debug('User %s is not in group fuse' %user, self) raise MountException(_('%(user)s is not member of group \'fuse\'.\n ' 'Run \'sudo adduser %(user)s fuse\'. To apply ' 'changes logout and login again.\nLook at ' '\'man backintime\' for further instructions.') % {'user': user}) def mounted(self): """ Check if the mountpoint is already mounted. Returns: bool: ``True`` if mountpoint is mounted Raises: exceptions.MountException: if mountpoint is not mounted but also not empty """ if os.path.ismount(self.currentMountpoint): return True else: if os.listdir(self.currentMountpoint): raise MountException(_('mountpoint %s not empty.') % self.currentMountpoint) return False def createMountStructure(self): """ Create folders that are necessary for mounting. Folder structure in ~/.local/share/backintime/mnt/ (self.mount_root):: |\ .lock <= mountprocess lock that will prevent | different processes modifying | mountpoints at one time | |\ / <= ``self.hash_id_path`` | \ will be shared by all profiles with | | the same mount settings | | | |\ mountpoint/<= ``self.currentMountpoint`` | | real mountpoint | | | |\ umount <= ``self.umount_info`` | | json file with all nessesary args | | for unmount | | | \ locks/ <= ``self.lock_path`` | for each process you have a | ``.lock`` file | |\ _/ <= sym-link to the right path. return by | config.snapshotsPath | (can be ../mnt//mount_point | for ssh or | ../mnt/// for | fusesmb ...) | \ tmp__/ <= sym-link for testing mountpoints in settingsdialog """ tools.mkdir(self.mount_root, 0o700) tools.mkdir(self.hash_id_path, 0o700) tools.mkdir(self.currentMountpoint, 0o700) tools.mkdir(self.lock_path, 0o700) def mountProcessLockAcquire(self, timeout = 60): """ Create a short term lock only for blocking other processes changing mounts at the same time. Args: timeout (int): wait ``timeout`` seconds before fail acquiring the lock Raises: exceptions.MountException: if timed out """ lock_path = self.mount_root lockSuffix = '.lock' lock = os.path.join(lock_path, self.pid + lockSuffix) count = 0 while self.checkLocks(lock_path, lockSuffix): count += 1 if count == timeout: raise MountException(_('Mountprocess lock timeout')) sleep(1) logger.debug('Acquire mountprocess lock %s' %lock, self) with open(lock, 'w') as f: f.write(self.pid) def mountProcessLockRelease(self): """ Remove mountprocess lock. """ lock_path = self.mount_root lockSuffix = '.lock' lock = os.path.join(lock_path, self.pid + lockSuffix) logger.debug('Release mountprocess lock %s' %lock, self) if os.path.exists(lock): os.remove(lock) def mountLockAquire(self): """ Create a lock for a mountpoint to prevent unmounting as long as this process is still running. """ if self.tmp_mount: lockSuffix = '.tmp.lock' else: lockSuffix = '.lock' lock = os.path.join(self.lock_path, self.pid + lockSuffix) logger.debug('Set mount lock %s' %lock, self) with open(lock, 'w') as f: f.write(self.pid) def mountLockCheck(self): """ Check for locks on the current mountpoint. Returns: bool: ``True`` if there are any locks """ lockSuffix = '.lock' return self.checkLocks(self.lock_path, lockSuffix) def mountLockRelease(self): """ Remove mountpoint lock for this process. """ if self.tmp_mount: lockSuffix = '.tmp.lock' else: lockSuffix = '.lock' lock = os.path.join(self.lock_path, self.pid + lockSuffix) if os.path.exists(lock): logger.debug('Remove mount lock %s' %lock, self) os.remove(lock) def checkLocks(self, path, lockSuffix): """ Check if there are active locks ending with ``lockSuffix`` in ``path``. If the process owning the lock doesn't exist anymore this will remove the lock. Args: path (str): full path to lock directory lockSuffix (str): last part of locks name Returns: bool: ``True`` if there are active locks in ``path`` """ for f in os.listdir(path): if not f[-len(lockSuffix):] == lockSuffix: continue is_tmp = os.path.basename(f)[-len(lockSuffix)-len('.tmp'):-len(lockSuffix)] == '.tmp' if is_tmp: lock_pid = os.path.basename(f)[:-len('.tmp')-len(lockSuffix)] else: lock_pid = os.path.basename(f)[:-len(lockSuffix)] if lock_pid == self.pid: if is_tmp == self.tmp_mount: continue if tools.processAlive(int(lock_pid)): return True else: logger.debug('Remove old and invalid lock %s' %f, self) #clean up os.remove(os.path.join(path, f)) for symlink in os.listdir(self.mount_root): if symlink.endswith('_%s' % lock_pid): os.remove(os.path.join(self.mount_root, symlink)) return False def setattrKwargs(self, arg, default, store = True, **kwargs): """ Set attribute ``arg`` in local namespace (self.arg). Also collect all args in ``self.all_kwargs`` which will be hashed later and used as mountpoint name and also be written as unmount_info. Args: arg (str): argument name default: default value used if ``arg`` is not in ``kwargs`` store (bool): if ``True`` add ``arg`` to ``self.all_kwargs`` **kwargs: arguments given on backend constructor """ if arg in kwargs: value = kwargs[arg] else: value = default setattr(self, arg, value) if store: #make dictionary with all used args for umount self.all_kwargs[arg] = value def writeUmountInfo(self): """ Write content of ``self.all_kwargs`` to file ``~/.local/share/backintime/mnt//umount``. This will be used to unmount the filesystem later. """ data_string = json.dumps(self.all_kwargs) with open(self.umount_info, 'w') as f: f.write(data_string) f.close def readUmountInfo(self, umount_info = None): """ Read keyword arguments from file ``umount_info``. Args: umount_info (str): full path to /umount file. If ``None`` current ``/umount`` file will be used Returns: dict: previously written ``self.all_kwargs`` """ if umount_info is None: umount_info = self.umount_info with open(umount_info, 'r') as f: data_string = f.read() f.close() return json.loads(data_string) def compareUmountInfo(self, umount_info = None): """ Compare current ``self.all_kwargs`` with those from file ``umount_info``. This should prevent hash collisions of two different mounts. Args: umount_info (str): full path to /umount file Returns: bool: ``True`` if ``self.all_kwargs`` and ``kwargs`` read from ``umount_info`` file are identiacal """ #run self.all_kwargs through json first current_kwargs = json.loads(json.dumps(self.all_kwargs)) saved_kwargs = self.readUmountInfo(umount_info) if not len(current_kwargs) == len(saved_kwargs): return False for arg in list(current_kwargs.keys()): if not arg in list(saved_kwargs.keys()): return False if not current_kwargs[arg] == saved_kwargs[arg]: return False return True def compareRemount(self, old_hash_id): """ Compare mount arguments between current and ``old_hash_id``. If they are identical we could reuse the mount and don't need to remount. Args: old_hash_id (str): Hash ID of the old mountpoint Returns: bool: True if the old mountpoint and current are identiacal """ if old_hash_id == self.hash_id: return self.compareUmountInfo(self.umountInfoPath(old_hash_id)) return False def setSymlink(self, profile_id = None, hash_id = None, tmp_mount = None): """ If ``self.symlink`` is ``True`` set symlink ``~/.local/share/backintime/mnt/_``. Target will be either the mountpoint or a subfolder of the mountpoint if ``self.symlink_subfolder`` is set. Args: profile_id (str): Profile ID that should be linked. If ``None`` use ``self.profile_id`` hash_id (str): Hash ID of mountpoint where this sysmlink should point to. If ``None`` use ``self.hash_id`` tmp_mount (bool): Set a temporary symlink just for testing new settings """ if not self.symlink: return if profile_id is None: profile_id = self.profile_id if hash_id is None: hash_id = self.hash_id if tmp_mount is None: tmp_mount = self.tmp_mount dst = self.config.snapshotsPath(profile_id = profile_id, mode = self.mode, tmp_mount = tmp_mount) mountpoint = self.mountpoint(hash_id) if self.symlink_subfolder is None: src = mountpoint else: src = os.path.join(mountpoint, self.symlink_subfolder) if os.path.exists(dst): os.remove(dst) os.symlink(src, dst) def removeSymlink(self, profile_id = None, tmp_mount = None): """ Remove symlink ``~/.local/share/backintime/mnt/_`` Args: profile_id (str): Profile ID for the symlink tmp_mount (bool): Symlink is a temporary link for testing new settings """ if not self.symlink: return if profile_id is None: profile_id = self.profile_id if tmp_mount is None: tmp_mount = self.tmp_mount os.remove(self.config.snapshotsPath(profile_id = profile_id, mode = self.mode, tmp_mount = tmp_mount)) def hash(self, s): """ Create a CRC32 hash of string ``s``. Args: s (str): string that should be hashed Returns: str: hash of string ``s`` """ return('%X' % (crc32(s.encode()) & 0xFFFFFFFF)) def hashIdPath(self, hash_id = None): """ Get path ``~/.local/share/backintime/mnt/``. Args: hash_id (str): Unique identifier for a mountpoint. If ``None`` use ``self.hash_id`` Returns: str: full path to ```` """ if hash_id is None: hash_id = self.hash_id return os.path.join(self.mount_root, self.hash_id) def mountpoint(self, hash_id = None): """ Get path ``~/.local/share/backintime/mnt//mountpoint``. Args: hash_id (str): Unique identifier for a mountpoint Returns: str: full path to ``/mountpoint`` """ return os.path.join(self.hashIdPath(hash_id), 'mountpoint') def lockPath(self, hash_id = None): """ Get path ``~/.local/share/backintime/mnt//locks``. Args: hash_id (str): Unique identifier for a mountpoint Returns: str: full path to ``/locks``` """ return os.path.join(self.hashIdPath(hash_id), 'locks') def umountInfoPath(self, hash_id = None): """ Get path ``~/.local/share/backintime/mnt//umount``. Args: hash_id (str): Unique identifier for a mountpoint Returns: str: full path to ``/umount``` """ return os.path.join(self.hashIdPath(hash_id), 'umount') backintime-1.2.1/common/.coveragerc0000644000175000017500000000025313530533316016550 0ustar germargermar# default options for coverage from coveralls-python [run] omit = */virtualenv/python3* [report] exclude_lines = pragma: no cover if __name__ == '__main__': backintime-1.2.1/common/snapshots.py0000644000175000017500000030322613530533316017031 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import json import os import stat import datetime import gettext import bz2 import pwd import grp import subprocess import shutil import time import re import fcntl from tempfile import TemporaryDirectory import config import configfile import logger import tools import encfstools import mount import progress import bcolors import snapshotlog from applicationinstance import ApplicationInstance from exceptions import MountException, LastSnapshotSymlink _=gettext.gettext class Snapshots: """ Collection of take-snapshot and restore commands. Args: cfg (config.Config): current config """ SNAPSHOT_VERSION = 3 GLOBAL_FLOCK = '/tmp/backintime.lock' def __init__(self, cfg = None): self.config = cfg if self.config is None: self.config = config.Config() self.snapshotLog = snapshotlog.SnapshotLog(self.config) self.clearIdCache() self.clearNameCache() #rsync --info=progress2 output #search for: 517.38K 26% 14.46MB/s 0:02:36 #or: 497.84M 4% -449.39kB/s ??:??:?? #but filter out: 517.38K 26% 14.46MB/s 0:00:53 (xfr#53, to-chk=169/452) # because this shows current run time self.reRsyncProgress = re.compile(r'.*?' #trash at start r'(\d*[,\.]?\d+[KkMGT]?)\s+' #bytes sent r'(\d*)%\s+' #percent done r'(-?\d*[,\.]?\d*[KkMGT]?B/s)\s+' #speed r'([\d\?]+:[\d\?]{2}:[\d\?]{2})' #estimated time of arrival r'(.*$)') #trash at the end self.lastBusyCheck = datetime.datetime(1,1,1) self.flock = None self.restorePermissionFailed = False #TODO: make own class for takeSnapshotMessage def clearTakeSnapshotMessage(self): files = (self.config.takeSnapshotMessageFile(), \ self.config.takeSnapshotProgressFile()) for f in files: if os.path.exists(f): os.remove(f) #TODO: make own class for takeSnapshotMessage def takeSnapshotMessage(self): wait = datetime.datetime.now() - datetime.timedelta(seconds = 5) if self.lastBusyCheck < wait: self.lastBusyCheck = datetime.datetime.now() if not self.busy(): self.clearTakeSnapshotMessage() return None if not os.path.exists(self.config.takeSnapshotMessageFile()): return None try: with open(self.config.takeSnapshotMessageFile(), 'rt') as f: items = f.read().split('\n') except Exception as e: logger.debug('Failed to get takeSnapshot message from %s: %s' %(self.config.takeSnapshotMessageFile(), str(e)), self) return None if len(items) < 2: return None mid = 0 try: mid = int(items[0]) except Exception as e: logger.debug('Failed extract message ID from %s: %s' %(items[0], str(e)), self) del items[0] message = '\n'.join(items) return(mid, message) #TODO: make own class for takeSnapshotMessage def setTakeSnapshotMessage(self, type_id, message, timeout = -1): data = str(type_id) + '\n' + message try: with open(self.config.takeSnapshotMessageFile(), 'wt') as f: f.write(data) except Exception as e: logger.debug('Failed to set takeSnapshot message to %s: %s' %(self.config.takeSnapshotMessageFile(), str(e)), self) if 1 == type_id: self.snapshotLog.append('[E] ' + message, 1) else: self.snapshotLog.append('[I] ' + message, 3) try: profile_id =self.config.currentProfile() profile_name = self.config.profileName(profile_id) self.config.PLUGIN_MANAGER.message(profile_id, profile_name, type_id, message, timeout) except Exception as e: logger.debug('Failed to send message to plugins: %s' %str(e), self) def busy(self): instance = ApplicationInstance(self.config.takeSnapshotInstanceFile(), False) return instance.busy() def pid(self): instance = ApplicationInstance(self.config.takeSnapshotInstanceFile(), False) return instance.readPidFile()[0] def clearNameCache(self): """ Reset the cache for user and group names. """ self.userCache = {} self.groupCache = {} def clearIdCache(self): """ Reset the cache for UIDs and GIDs. """ self.uidCache = {} self.gidCache = {} def uid(self, name, callback = None, backup = None): """ Get the User identifier (UID) for the user in ``name``. name->uid will be cached to speed up subsequent requests. Args: name (:py:class:`str`, :py:class:`bytes`): username to search for callback (method): callable which will handle a given message backup (int): UID wich will be used if the username is unknown on this machine Returns: int: UID of the user in name or -1 if not found """ if isinstance(name, bytes): name = name.decode() if name in self.uidCache: return self.uidCache[name] else: uid = -1 try: uid = pwd.getpwnam(name).pw_uid except Exception as e: if backup: uid = backup msg = "UID for '%s' is not available on this system. Using UID %s from snapshot." %(name, backup) logger.info(msg, self) if callback is not None: callback(msg) else: self.restorePermissionFailed = True msg = 'Failed to get UID for %s: %s' %(name, str(e)) logger.error(msg, self) if callback: callback(msg) self.uidCache[name] = uid return uid def gid(self, name, callback = None, backup = None): """ Get the Group identifier (GID) for the group in ``name``. name->gid will be cached to speed up subsequent requests. Args: name (:py:class:`str`, :py:class:`bytes`): groupname to search for callback (method): callable which will handle a given message backup (int): GID wich will be used if the groupname is unknown on this machine Returns: int: GID of the group in name or -1 if not found """ if isinstance(name, bytes): name = name.decode() if name in self.gidCache: return self.gidCache[name] else: gid = -1 try: gid = grp.getgrnam(name).gr_gid except Exception as e: if backup is not None: gid = backup msg = "GID for '%s' is not available on this system. Using GID %s from snapshot." %(name, backup) logger.info(msg, self) if callback: callback(msg) else: self.restorePermissionFailed = True msg = 'Failed to get GID for %s: %s' %(name, str(e)) logger.error(msg, self) if callback: callback(msg) self.gidCache[name] = gid return gid def userName(self, uid): """ Get the username for the given uid. uid->name will be cached to speed up subsequent requests. Args: uid (int): User identifier (UID) to search for Returns: str: name of the user with UID uid or '-' if not found """ if uid in self.userCache: return self.userCache[uid] else: name = '-' try: name = pwd.getpwuid(uid).pw_name except Exception as e: logger.debug('Failed to get user name for UID %s: %s' %(uid, str(e)), self) self.userCache[uid] = name return name def groupName(self, gid): """ Get the groupname for the given gid. gid->name will be cached to speed up subsequent requests. Args: gid (int): Group identifier (GID) to search for Returns: str: name of the Group with GID gid or '.' if not found """ if gid in self.groupCache: return self.groupCache[gid] else: name = '-' try: name = grp.getgrgid(gid).gr_name except Exception as e: logger.debug('Failed to get group name for GID %s: %s' %(gid, str(e)), self) self.groupCache[gid] = name return name def restoreCallback(self, callback, ok, msg): """ Format messages thrown by restore depending on whether they where successful or failed. Args: callback (method): callable instance which will handle the message ok (bool): ``True`` if the logged action was successful or ``False`` if it failed msg (str): message that should be send to callback """ if not callback is None: if not ok: msg = msg + " : " + _("FAILED") self.restorePermissionFailed = True callback(msg) def restorePermission(self, key_path, path, fileInfoDict, callback = None): """ Restore permissions (owner, group and mode). If permissions are already identical with the new ones just skip. Otherwise try to 'chown' to new owner and new group. If that fails (most probably because we are not running as root and normal user has no rights to change ownership of files) try to at least 'chgrp' to the new group. Finally 'chmod' the new mode. Args: key_path (bytes): original path during backup. Same as in fileInfoDict. path (bytes): current path of file that should be changed. fileInfoDict (FileInfoDict): FileInfoDict """ assert isinstance(key_path, bytes), 'key_path is not bytes type: %s' % key_path assert isinstance(path, bytes), 'path is not bytes type: %s' % path assert isinstance(fileInfoDict, FileInfoDict), 'fileInfoDict is not FileInfoDict type: %s' % fileInfoDict if key_path not in fileInfoDict or not os.path.exists(path): return info = fileInfoDict[key_path] #restore uid/gid uid = self.uid(info[1], callback) gid = self.gid(info[2], callback) #current file stats st = os.stat(path) # logger.debug('%(path)s: uid %(target_uid)s/%(cur_uid)s, gid %(target_gid)s/%(cur_gid)s, mod %(target_mod)s/%(cur_mod)s' # %{'path': path.decode(), # 'target_uid': uid, # 'cur_uid': st.st_uid, # 'target_gid': gid, # 'cur_gid': st.st_gid, # 'target_mod': info[0], # 'cur_mod': st.st_mode # }) if uid != -1 or gid != -1: ok = False if uid != st.st_uid: try: os.chown(path, uid, gid) ok = True except: pass self.restoreCallback(callback, ok, "chown %s %s : %s" % (path.decode(errors = 'ignore'), uid, gid)) st = os.stat(path) #if restore uid/gid failed try to restore at least gid if not ok and gid != st.st_gid: try: os.chown(path, -1, gid) ok = True except: pass self.restoreCallback(callback, ok, "chgrp %s %s" % (path.decode(errors = 'ignore'), gid)) st = os.stat(path) #restore perms ok = False if info[0] != st.st_mode: try: os.chmod(path, info[0]) ok = True except: pass self.restoreCallback(callback, ok, "chmod %s %04o" % (path.decode(errors = 'ignore'), info[0])) def restore(self, sid, paths, callback = None, restore_to = '', delete = False, backup = True, only_new = False): """ Restore one or more files from snapshot ``sid`` to either original or a different destination. Restore is done with rsync. If available permissions will be restored from ``fileinfo.bz2``. Args: sid (SID): snapshot from whom to restore paths (:py:class:`list`, :py:class:`tuple` or :py:class:`str`): single path (str) or multiple paths (list, tuple) that should be restored. For every path this will run a new rsync process. Permissions will be restored for all paths in one run callback (method): callable instance which will handle messages restore_to (str): full path to restore to. If empty restore to original destiantion delete (bool): delete newer files which are not in the snapshot backup (bool): create backup files (\*.backup.YYYYMMDD) before changing or deleting local files. only_new (bool): Only restore files which does not exist or are newer than those in destination. Using "rsync --update" option. """ instance = ApplicationInstance(self.config.restoreInstanceFile(), False, flock = True) if instance.check(): instance.startApplication() else: logger.warning('Restore is already running', self) return if restore_to.endswith('/'): restore_to = restore_to[: -1] if not isinstance(paths, (list, tuple)): paths = (paths,) logger.info("Restore: %s to: %s" %(', '.join(paths), restore_to), self) info = sid.info cmd_prefix = tools.rsyncPrefix(self.config, no_perms = False, use_mode = ['ssh']) cmd_prefix.extend(('-R', '-v')) if backup: cmd_prefix.extend(('--backup', '--suffix=%s' %self.backupSuffix())) if delete: cmd_prefix.append('--delete') cmd_prefix.append('--filter=protect %s' % self.config.snapshotsPath()) cmd_prefix.append('--filter=protect %s' % self.config._LOCAL_DATA_FOLDER) cmd_prefix.append('--filter=protect %s' % self.config._MOUNT_ROOT) if only_new: cmd_prefix.append('--update') restored_paths = [] for path in paths: tools.makeDirs(os.path.dirname(path)) src_path = path src_delta = 0 src_base = sid.pathBackup(use_mode = ['ssh']) if not src_base.endswith(os.sep): src_base += os.sep cmd = cmd_prefix[:] if restore_to: items = os.path.split(src_path) aux = items[0].lstrip(os.sep) #bugfix: restore system root ended in //. if aux: src_base = os.path.join(src_base, aux) + '/' src_path = '/' + items[1] if items[0] == '/': src_delta = 0 else: src_delta = len(items[0]) cmd.append(self.rsyncRemotePath('%s.%s' %(src_base, src_path), use_mode = ['ssh'])) cmd.append('%s/' %restore_to) proc = tools.Execute(cmd, callback = callback, filters = (self.filterRsyncProgress,), parent = self) self.restoreCallback(callback, True, proc.printable_cmd) proc.run() self.restoreCallback(callback, True, ' ') restored_paths.append((path, src_delta)) try: os.remove(self.config.takeSnapshotProgressFile()) except Exception as e: logger.debug('Failed to remove snapshot progress file %s: %s' %(self.config.takeSnapshotProgressFile(), str(e)), self) #restore permissions logger.info('Restore permissions', self) self.restoreCallback(callback, True, ' ') self.restoreCallback(callback, True, _("Restore permissions:")) self.restorePermissionFailed = False fileInfoDict = sid.fileInfo #cache uids/gids for uid, name in info.listValue('user', ('int:uid', 'str:name')): self.uid(name.encode(), callback = callback, backup = uid) for gid, name in info.listValue('group', ('int:gid', 'str:name')): self.gid(name.encode(), callback = callback, backup = gid) if fileInfoDict: all_dirs = [] #restore dir permissions after all files are done for path, src_delta in restored_paths: #explore items snapshot_path_to = sid.pathBackup(path).rstrip('/') root_snapshot_path_to = sid.pathBackup().rstrip('/') #use bytes instead of string from here if isinstance(path, str): path = path.encode() if isinstance(restore_to, str): restore_to = restore_to.encode() if not restore_to: path_items = path.strip(b'/').split(b'/') curr_path = b'/' for path_item in path_items: curr_path = os.path.join(curr_path, path_item) if curr_path not in all_dirs: all_dirs.append(curr_path) else: if path not in all_dirs: all_dirs.append(path) if os.path.isdir(snapshot_path_to) and not os.path.islink(snapshot_path_to): head = len(root_snapshot_path_to.encode()) for explore_path, dirs, files in os.walk(snapshot_path_to.encode()): for item in dirs: item_path = os.path.join(explore_path, item)[head:] if item_path not in all_dirs: all_dirs.append(item_path) for item in files: item_path = os.path.join(explore_path, item)[head:] real_path = restore_to + item_path[src_delta:] self.restorePermission(item_path, real_path, fileInfoDict, callback) all_dirs.reverse() for item_path in all_dirs: real_path = restore_to + item_path[src_delta:] self.restorePermission(item_path, real_path, fileInfoDict, callback) self.restoreCallback(callback, True, '') if self.restorePermissionFailed: status = _('FAILED') else: status = _('Done') self.restoreCallback(callback, True, _("Restore permissions:") + ' ' + status) instance.exitApplication() def backupSuffix(self): """ Get suffix for backup files. Returns: str: backup suffix in form of '.backup.YYYYMMDD' """ return '.backup.' + datetime.date.today().strftime('%Y%m%d') def remove(self, sid): """ Remove snapshot ``sid``. Args: sid (SID): snapshot to remove """ if isinstance(sid, RootSnapshot): return rsync = tools.rsyncRemove(self.config) with TemporaryDirectory() as d: rsync.append(d + os.sep) rsync.append(self.rsyncRemotePath(sid.path(use_mode = ['ssh', 'ssh_encfs']))) tools.Execute(rsync).run() shutil.rmtree(sid.path()) def backup(self, force = False): """ Wrapper for :py:func:`takeSnapshot` which will prepair and clean up things for the main :py:func:`takeSnapshot` method. This will check that no other snapshots are running at the same time, there is nothing prohibing a new snapshot (e.g. on battery) and the profile is configured correctly. This will also mount and unmount remote destinations. Args: force (bool): force taking a new snapshot even if the profile is not scheduled or the machine is running on battery Returns: bool: ``True`` if there was an error """ ret_val, ret_error = False, True sleep = True self.config.PLUGIN_MANAGER.load(self) if not self.config.isConfigured(): logger.warning('Not configured', self) self.config.PLUGIN_MANAGER.error(1) #not configured elif not force and self.config.noSnapshotOnBattery() and tools.onBattery(): self.setTakeSnapshotMessage(0, _('Deferring backup while on battery')) logger.info('Deferring backup while on battery', self) logger.warning('Backup not performed', self) ret_error = False elif not force and not self.config.backupScheduled(): logger.info('Profile "%s" is not scheduled to run now.' %self.config.profileName(), self) ret_error = False else: instance = ApplicationInstance(self.config.takeSnapshotInstanceFile(), False, flock = True) restore_instance = ApplicationInstance(self.config.restoreInstanceFile(), False) if not instance.check(): logger.warning('A backup is already running. The pid of the \ already running backup is in file %s. Maybe delete it' % instance.pidFile , self ) self.config.PLUGIN_MANAGER.error(2) #a backup is already running elif not restore_instance.check(): logger.warning('Restore is still running. Stop backup until \ restore is done. The pid of the already running restore is in %s. Maybe delete it'\ % restore_instance.pidFile, self) else: if self.config.noSnapshotOnBattery () and not tools.powerStatusAvailable(): logger.warning('Backups disabled on battery but power status is not available', self) instance.startApplication() self.flockExclusive() logger.info('Lock', self) now = datetime.datetime.today() #inhibit suspend/hibernate during snapshot is running self.config.inhibitCookie = tools.inhibitSuspend(toplevel_xid = self.config.xWindowId) #mount try: hash_id = mount.Mount(cfg = self.config).mount() except MountException as ex: logger.error(str(ex), self) instance.exitApplication() logger.info('Unlock', self) time.sleep(2) return True else: self.config.setCurrentHashId(hash_id) include_folders = self.config.include() if not include_folders: logger.info('Nothing to do', self) elif not self.config.PLUGIN_MANAGER.processBegin(): logger.info('A plugin prevented the backup', self) else: #take snapshot process begin self.setTakeSnapshotMessage(0, '...') self.snapshotLog.new(now) profile_id = self.config.currentProfile() profile_name = self.config.profileName() logger.info("Take a new snapshot. Profile: %s %s" %(profile_id, profile_name), self) if not self.config.canBackup(profile_id): if self.config.PLUGIN_MANAGER.hasGuiPlugins and self.config.notify(): self.setTakeSnapshotMessage(1, _('Can\'t find snapshots folder.\nIf it is on a removable drive please plug it.') + '\n' + gettext.ngettext('Waiting %s second.', 'Waiting %s seconds.', 30) % 30, 30) for counter in range(30, 0, -1): time.sleep(1) if self.config.canBackup(): break if not self.config.canBackup(profile_id): logger.warning('Can\'t find snapshots folder!', self) self.config.PLUGIN_MANAGER.error(3) #Can't find snapshots directory (is it on a removable drive ?) else: ret_error = False sid = SID(now, self.config) if sid.exists(): logger.warning("Snapshot path \"%s\" already exists" %sid.path(), self) self.config.PLUGIN_MANAGER.error(4, sid) #This snapshots already exists else: try: ret_val, ret_error = self.takeSnapshot(sid, now, include_folders) except: new = NewSnapshot(self.config) if new.exists(): new.saveToContinue = False new.failed = True raise if not ret_val: self.remove(sid) if ret_error: logger.error('Failed to take snapshot !!!', self) self.setTakeSnapshotMessage(1, _('Failed to take snapshot %s !!!') % sid.displayID) time.sleep(2) else: logger.warning("No new snapshot", self) else: ret_error = False if not ret_error: self.freeSpace(now) self.setTakeSnapshotMessage(0, _('Finalizing')) time.sleep(2) sleep = False if ret_val: self.config.PLUGIN_MANAGER.newSnapshot(sid, sid.path()) #new snapshot self.config.PLUGIN_MANAGER.processEnd() #take snapshot process end if sleep: time.sleep(2) sleep = False if not ret_error: self.clearTakeSnapshotMessage() #unmount try: mount.Mount(cfg = self.config).umount(self.config.current_hash_id) except MountException as ex: logger.error(str(ex), self) instance.exitApplication() self.flockRelease() logger.info('Unlock', self) if sleep: time.sleep(2) #max 1 backup / second #release inhibit suspend if self.config.inhibitCookie: self.config.inhibitCookie = tools.unInhibitSuspend(*self.config.inhibitCookie) return ret_error def filterRsyncProgress(self, line): """ Filter rsync's stdout for progress informations and store them in '~/.local/share/backintime/worker.progress' file. Args: line (str): stdout line from rsync Returns: str: ``line`` if it had no progress infos. ``None`` if ``line`` was a progress """ ret = [] for l in line.split('\n'): m = self.reRsyncProgress.match(l) if m: # if m.group(5).strip(): # return pg = progress.ProgressFile(self.config) pg.setIntValue('status', pg.RSYNC) pg.setStrValue('sent', m.group(1)) pg.setIntValue('percent', int(m.group(2))) pg.setStrValue('speed', m.group(3)) #pg.setStrValue('eta', m.group(4)) pg.save() del(pg) else: ret.append(l) return '\n'.join(ret) def rsyncCallback(self, line, params): """ Parse rsync's stdout, send it to takeSnapshotMessage and takeSnapshotLog. Also check if there has been changes or errors in current rsync. Args: line (str): stdout line from rsync params (list): list of two bool '[error, changes]'. Using siteefect on changing list items will change original list, too. If rsync reported an error ``params[0]`` will be set to ``True``. If rsync reported a changed file ``params[1]`` will be set to ``True`` """ if not line: return self.setTakeSnapshotMessage(0, _('Take snapshot') + " (rsync: %s)" % line) if line.endswith(')'): if line.startswith('rsync:'): if not line.startswith('rsync: chgrp ') and not line.startswith('rsync: chown '): params[0] = True self.setTakeSnapshotMessage(1, 'Error: ' + line) if len(line) >= 13: if line.startswith('BACKINTIME: '): if line[12] != '.' and line[12:14] != 'cd': params[1] = True self.snapshotLog.append('[C] ' + line[12:], 2) def makeDirs(self, path): """ Wrapper for :py:func:`tools.makeDirs()`. Create directories ``path`` recursive and return success. If not successful send error-message to log. Args: path (str): fullpath to directories that should be created Returns: bool: ``True`` if successful """ if not tools.makeDirs(path): logger.error("Can't create folder: %s" % path, self) self.setTakeSnapshotMessage(1, _('Can\'t create folder: %s') % path) time.sleep(2) #max 1 backup / second return False return True def backupConfig(self, sid): """ Backup the config file to the snapshot and to the backup root if backup is encrypted. Args: sid (SID): snapshot in which the config should be stored """ logger.info('Save config file', self) self.setTakeSnapshotMessage(0, _('Saving config file...')) with open(self.config._LOCAL_CONFIG_PATH, 'rb') as src: with open(sid.path('config'), 'wb') as dst1: dst1.write(src.read()) if self.config.snapshotsMode() == 'local_encfs': src.seek(0) with open(os.path.join(self.config.localEncfsPath(), 'config'), 'wb') as dst2: dst2.write(src.read()) elif self.config.snapshotsMode() == 'ssh_encfs': cmd = tools.rsyncPrefix(self.config, no_perms = False) cmd.append(self.config._LOCAL_CONFIG_PATH) cmd.append(self.rsyncRemotePath(self.config.sshSnapshotsPath())) tools.Execute(cmd, parent = self).run() def backupInfo(self, sid): """ Save infos about the snapshot into the 'info' file. Args: sid (SID): snapshot that should get an info file """ logger.info("Create info file", self) machine = self.config.host() user = self.config.user() profile_id = self.config.currentProfile() i = configfile.ConfigFile() i.setIntValue('snapshot_version', self.SNAPSHOT_VERSION) i.setStrValue('snapshot_date', sid.withoutTag) i.setStrValue('snapshot_machine', machine) i.setStrValue('snapshot_user', user) i.setIntValue('snapshot_profile_id', profile_id) i.setIntValue('snapshot_tag', sid.tag) i.setListValue('user', ('int:uid', 'str:name'), list(self.userCache.items())) i.setListValue('group', ('int:gid', 'str:name'), list(self.groupCache.items())) i.setStrValue('filesystem_mounts', json.dumps(tools.filesystemMountInfo())) sid.info = i def backupPermissions(self, sid): """ Save permissions (owner, group, read-, write- and executable) for all files in Snapshot ``sid`` into snapshots fileInfoDict. Args: sid (SID): snapshot that should be scanned """ logger.info('Save permissions', self) self.setTakeSnapshotMessage(0, _('Saving permissions...')) fileInfoDict = FileInfoDict() if self.config.snapshotsMode() == 'ssh_encfs': decode = encfstools.Decode(self.config, False) else: decode = encfstools.Bounce() # backup permissions of / # bugfix for https://github.com/bit-team/backintime/issues/708 self.backupPermissionsCallback(b'/', (fileInfoDict, decode)) rsync = ['rsync', '--dry-run', '-r', '--out-format=%n'] rsync.extend(tools.rsyncSshArgs(self.config)) rsync.append(self.rsyncRemotePath(sid.pathBackup(use_mode = ['ssh', 'ssh_encfs'])) + os.sep) with TemporaryDirectory() as d: rsync.append(d + os.sep) proc = tools.Execute(rsync, callback = self.backupPermissionsCallback, user_data = (fileInfoDict, decode), parent = self, conv_str = False, join_stderr = False) proc.run() sid.fileInfo = fileInfoDict def backupPermissionsCallback(self, line, user_data): """ Rsync callback for :py:func:`Snapshots.backupPermissions`. Args: line(bytes): output from rsync command user_data (tuple): two item tuple of (:py:class:`FileInfoDict`, :py:class:`encfstools.Decode`) """ fileInfoDict, decode = user_data self.collectPermission(fileInfoDict, b'/' + decode.path(line).rstrip(b'/')) def collectPermission(self, fileinfo, path): """ Collect permission infos about ``path`` and store them into ``fileinfo``. Args: fileinfo (FileInfoDict): dict of: {path: (permission, user, group)} Using sideefect on changing dict item will change original dict, too. path (bytes): full path to file or folder """ assert isinstance(path, bytes), 'path is not bytes type: %s' % path if path and os.path.exists(path): info = os.stat(path) mode = info.st_mode user = self.userName(info.st_uid).encode('utf-8', 'replace') group = self.groupName(info.st_gid).encode('utf-8', 'replace') fileinfo[path] = (mode, user, group) def takeSnapshot(self, sid, now, include_folders): """ This is the main backup routine. It will take a new snapshot and store permissions of included files and folders into ``fileinfo.bz2``. Args: sid (SID): snapshot ID which the new snapshot should get now (datetime.datetime): date and time when this snapshot was started include_folders (list): folders to include. list of tuples (item, int) where ``int`` is 0 if ``item`` is a folder or 1 if ``item`` is a file Returns: list: list of two bool (``ret_val``, ``ret_error``) where ``ret_val`` is ``True`` if a new snapshot has been created and ``ret_error`` is ``True`` if there was an error during taking the snapshot """ self.setTakeSnapshotMessage(0, _('...')) new_snapshot = NewSnapshot(self.config) encode = self.config.ENCODE params = [False, False] # [error, changes] if new_snapshot.exists() and new_snapshot.saveToContinue: logger.info("Found leftover '%s' which can be continued." %new_snapshot.displayID, self) self.setTakeSnapshotMessage(0, _("Found leftover '%s' which can be continued.") %new_snapshot.displayID) #fix permissions for file in os.listdir(new_snapshot.path()): file = os.path.join(new_snapshot.path(), file) mode = os.stat(file).st_mode try: os.chmod(file, mode | stat.S_IWUSR) except PermissionError: pass # search previous log for changes and set params params[1] = new_snapshot.hasChanges elif new_snapshot.exists() and not new_snapshot.saveToContinue: logger.info("Remove leftover '%s' folder from last run" %new_snapshot.displayID) self.setTakeSnapshotMessage(0, _("Removing leftover '%s' folder from last run") %new_snapshot.displayID) self.remove(new_snapshot) if os.path.exists(new_snapshot.path()): logger.error("Can't remove folder: %s" % new_snapshot.path(), self) self.setTakeSnapshotMessage(1, _('Can\'t remove folder: %s') % new_snapshot.path()) time.sleep(2) #max 1 backup / second return [False, True] if not new_snapshot.saveToContinue and not new_snapshot.makeDirs(): return [False, True] prev_sid = None snapshots = listSnapshots(self.config) if snapshots: prev_sid = snapshots[0] #rsync prefix & suffix rsync_prefix = tools.rsyncPrefix(self.config, no_perms = False) if self.config.excludeBySizeEnabled(): rsync_prefix.append('--max-size=%sM' %self.config.excludeBySize()) rsync_suffix = self.rsyncSuffix(include_folders) # When there is no snapshots it takes the last snapshot from the other folders # It should delete the excluded folders then rsync_prefix.extend(('--delete', '--delete-excluded')) rsync_prefix.append('-v') rsync_prefix.extend(('-i', '--out-format=BACKINTIME: %i %n%L')) if prev_sid: link_dest = encode.path(os.path.join(prev_sid.sid, 'backup')) link_dest = os.path.join(os.pardir, os.pardir, link_dest) rsync_prefix.append('--link-dest=%s' %link_dest) #sync changed folders logger.info("Call rsync to take the snapshot", self) new_snapshot.saveToContinue = True cmd = rsync_prefix + rsync_suffix cmd.append(self.rsyncRemotePath(new_snapshot.pathBackup(use_mode = ['ssh', 'ssh_encfs']))) self.setTakeSnapshotMessage(0, _('Taking snapshot')) #run rsync proc = tools.Execute(cmd, callback = self.rsyncCallback, user_data = params, filters = (self.filterRsyncProgress,), parent = self) self.snapshotLog.append('[I] ' + proc.printable_cmd, 3) proc.run() #cleanup try: os.remove(self.config.takeSnapshotProgressFile()) except Exception as e: logger.debug('Failed to remove snapshot progress file %s: %s' %(self.config.takeSnapshotProgressFile(), str(e)), self) #handle errors has_errors = False # params[0] -> error if params[0]: if not self.config.continueOnErrors(): self.remove(new_snapshot) return [False, True] has_errors = True new_snapshot.failed = True # params[1] -> changes if not params[1] and not self.config.takeSnapshotRegardlessOfChanges(): self.remove(new_snapshot) logger.info("Nothing changed, no new snapshot necessary", self) self.snapshotLog.append('[I] ' + _('Nothing changed, no new snapshot necessary'), 3) if prev_sid: prev_sid.setLastChecked() if not has_errors and not list(self.config.anacrontabFiles()): tools.writeTimeStamp(self.config.anacronSpoolFile()) return [False, False] self.backupConfig(new_snapshot) self.backupPermissions(new_snapshot) #copy snapshot log try: self.snapshotLog.flush() with open(self.snapshotLog.logFileName, 'rb') as logfile: new_snapshot.setLog(logfile.read()) except Exception as e: logger.debug('Failed to write takeSnapshot log %s into compressed file %s: %s' %(self.config.takeSnapshotLogFile(), new_snapshot.path(SID.LOG), str(e)), self) new_snapshot.saveToContinue = False #rename snapshot os.rename(new_snapshot.path(), sid.path()) if not sid.exists(): logger.error("Can't rename %s to %s" % (new_snapshot.path(), sid.path()), self) self.setTakeSnapshotMessage(1, _('Can\'t rename %(new_path)s to %(path)s') %{'new_path': new_snapshot.path(), 'path': sid.path()}) time.sleep(2) #max 1 backup / second return [False, True] self.backupInfo(sid) if not has_errors and not list(self.config.anacrontabFiles()): tools.writeTimeStamp(self.config.anacronSpoolFile()) #create last_snapshot symlink self.createLastSnapshotSymlink(sid) return [True, has_errors] def smartRemoveKeepAll(self, snapshots, min_date, max_date): """ Return all snapshots between ``min_date`` and ``max_date``. Args: snapshots (list): full list of :py:class:`SID` objects min_date (datetime.date): minimum date for snapshots to keep max_date (datetime.date): maximum date for snapshots to keep Returns: set: set of snapshots that should be keept """ min_id = SID(min_date, self.config) max_id = SID(max_date, self.config) logger.debug("Keep all >= %s and < %s" %(min_id, max_id), self) return set([sid for sid in snapshots if sid >= min_id and sid < max_id]) def smartRemoveKeepFirst(self, snapshots, min_date, max_date, keep_healthy = False): """ Return only the first snapshot between ``min_date`` and ``max_date``. Args: snapshots (list): full list of :py:class:`SID` objects min_date (datetime.date): minimum date for snapshots to keep max_date (datetime.date): maximum date for snapshots to keep keep_healthy (bool): return the first healthy snapshot (not marked as failed) instead of the first at all. If all snapshots failed this will again return the very first snapshot Returns: set: set of snapshots that should be keept """ min_id = SID(min_date, self.config) max_id = SID(max_date, self.config) logger.debug("Keep first >= %s and < %s" %(min_id, max_id), self) for sid in snapshots: # try to keep the first healty snapshot if keep_healthy and sid.failed: logger.debug("Do not keep failed snapshot %s" %sid, self) continue if sid >= min_id and sid < max_id: return set([sid]) # if all snapshots failed return the first snapshot # no matter if it has errors if keep_healthy: return self.smartRemoveKeepFirst(snapshots, min_date, max_date, keep_healthy = False) return set() def incMonth(self, date): """ First day of next month of ``date`` with respect on new years. So if ``date`` is December this will return 1st of January next year. Args: date (datetime.date): old date that should be increased Returns: datetime.date: 1st day of next month """ y = date.year m = date.month + 1 if m > 12: m = 1 y = y + 1 return datetime.date(y, m, 1) def decMonth(self, date): """ First day of previous month of ``date`` with respect on previous years. So if ``date`` is January this will return 1st of December previous year. Args: date (datetime.date): old date that should be decreased Returns: datetime.date: 1st day of previous month """ y = date.year m = date.month - 1 if m < 1: m = 12 y = y - 1 return datetime.date(y, m, 1) def smartRemoveList(self, now_full, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month): """ Get a list of old snapshots that should be removed based on configurable intervals. Args: now_full (datetime.datetime): date and time when takeSnapshot was started keep_all (int): keep all snapshots for the last ``keep_all`` days keep_one_per_day (int): keep one snapshot per day for the last ``keep_one_per_day`` days keep_one_per_week (int): keep one snapshot per week for the last ``keep_one_per_week`` weeks keep_one_per_month (int): keep one snapshot per month for the last ``keep_one_per_month`` months Returns: list: snapshots that should be removed """ snapshots = listSnapshots(self.config) logger.debug("Considered: %s" %snapshots, self) if len(snapshots) <= 1: logger.debug("There is only one snapshots, so keep it", self) return if now_full is None: now_full = datetime.datetime.today() now = now_full.date() #keep the last snapshot keep = set([snapshots[0]]) #keep all for the last keep_all days if keep_all > 0: keep |= self.smartRemoveKeepAll(snapshots, now - datetime.timedelta(days=keep_all-1), now + datetime.timedelta(days=1)) #keep one per day for the last keep_one_per_day days if keep_one_per_day > 0: d = now for i in range(0, keep_one_per_day): keep |= self.smartRemoveKeepFirst(snapshots, d, d + datetime.timedelta(days=1), keep_healthy = True) d -= datetime.timedelta(days=1) #keep one per week for the last keep_one_per_week weeks if keep_one_per_week > 0: d = now - datetime.timedelta(days = now.weekday() + 1) for i in range(0, keep_one_per_week): keep |= self.smartRemoveKeepFirst(snapshots, d, d + datetime.timedelta(days=8), keep_healthy = True) d -= datetime.timedelta(days=7) #keep one per month for the last keep_one_per_month months if keep_one_per_month > 0: d1 = datetime.date(now.year, now.month, 1) d2 = self.incMonth(d1) for i in range(0, keep_one_per_month): keep |= self.smartRemoveKeepFirst(snapshots, d1, d2, keep_healthy = True) d2 = d1 d1 = self.decMonth(d1) #keep one per year for all years first_year = int(snapshots[-1].sid[ : 4]) for i in range(first_year, now.year+1): keep |= self.smartRemoveKeepFirst(snapshots, datetime.date(i,1,1), datetime.date(i+1,1,1), keep_healthy = True) logger.debug("Keep snapshots: %s" %keep, self) del_snapshots = [] for sid in snapshots: if sid in keep: continue if self.config.dontRemoveNamedSnapshots(): if sid.name: logger.debug("Keep snapshot: %s, it has a name" %sid, self) continue del_snapshots.append(sid) return del_snapshots def smartRemove(self, del_snapshots, log = None): """ Remove multiple snapshots either with :py:func:`Snapshots.remove` or in background on the remote host if mode is `ssh` or `ssh_encfs` and smart-remove in background is activated. Args: del_snapshots (list): list of :py:class:`SID` that should be removed log (method): callable method that will handle progress log """ if not del_snapshots: return if not log: log = lambda x: self.setTakeSnapshotMessage(0, x) if self.config.snapshotsMode() in ['ssh', 'ssh_encfs'] and self.config.smartRemoveRunRemoteInBackground(): logger.info('[smart remove] remove snapshots in background: %s' %del_snapshots, self) lckFile = os.path.normpath(os.path.join(del_snapshots[0].path(use_mode = ['ssh', 'ssh_encfs']), os.pardir, 'smartremove.lck')) maxLength = self.config.sshMaxArgLength() if not maxLength: import sshMaxArg user_host = '%s@%s' %(self.config.sshUser(), self.config.sshHost()) maxLength = sshMaxArg.maxArgLength(self.config) self.config.setSshMaxArgLength(maxLength) self.config.save() sshMaxArg.reportResult(user_host, maxLength) additionalChars = len(self.config.sshPrefixCmd(cmd_type = str)) head = 'screen -d -m bash -c "(' head += 'TMP=\$(mktemp -d); ' #create temp dir used for delete files with rsync head += 'test -z \\\"\$TMP\\\" && exit 1; ' #make sure $TMP dir was created head += 'test -n \\\"\$(ls \$TMP)\\\" && exit 1; ' #make sure $TMP is empty if logger.DEBUG: head += 'logger -t \\\"backintime smart-remove [$BASHPID]\\\" \\\"start\\\"; ' head += 'flock -x 9; ' if logger.DEBUG: head += 'logger -t \\\"backintime smart-remove [$BASHPID]\\\" \\\"got exclusive flock\\\"; ' tail = 'rmdir \$TMP) 9>\\\"%s\\\""' %lckFile cmds = [] for sid in del_snapshots: remote = self.rsyncRemotePath(sid.path(use_mode = ['ssh', 'ssh_encfs']), use_mode = [], quote = '\\\"') rsync = ' '.join(tools.rsyncRemove(self.config, run_local = False)) rsync += ' \\\"\$TMP/\\\" {}; '.format(remote) s = 'test -e \\\"%s\\\" && (' %sid.path(use_mode = ['ssh', 'ssh_encfs']) if logger.DEBUG: s += 'logger -t \\\"backintime smart-remove [$BASHPID]\\\" ' s += '\\\"snapshot %s still exist\\\"; ' %sid s += 'sleep 1; ' #add one second delay because otherwise you might not see serialized process with small snapshots s += rsync s += 'rmdir \\\"%s\\\"; ' %sid.path(use_mode = ['ssh', 'ssh_encfs']) if logger.DEBUG: s += 'logger -t \\\"backintime smart-remove [$BASHPID]\\\" ' s += '\\\"snapshot %s remove done\\\"' %sid s += '); ' cmds.append(s) for cmd in tools.splitCommands(cmds, head = head, tail = tail, maxLength = maxLength - additionalChars): tools.Execute(self.config.sshCommand([cmd,], quote = False, nice = False, ionice = False)).run() else: logger.info("[smart remove] remove snapshots: %s" %del_snapshots, self) for i, sid in enumerate(del_snapshots, 1): log(_('Smart remove') + ' %s/%s' %(i, len(del_snapshots))) self.remove(sid) def freeSpace(self, now): """ Remove old snapshots on based on different rules (only if enabled). First rule is to remove snapshots older than X years. Next will call :py:func:`smartRemove` to remove snapshots based on configurable intervals. Third rule is to remove the oldest snapshot until there is enough free space. Last rule will remove the oldest snapshot until there are enough free inodes. 'last_snapshot' symlink will be fixed when done. Args: now (datetime.datetime): date and time when takeSnapshot was started """ snapshots = listSnapshots(self.config, reverse = False) if not snapshots: logger.debug('No snapshots. Skip freeSpace', self) return last_snapshot = snapshots[-1] #remove old backups if self.config.removeOldSnapshotsEnabled(): self.setTakeSnapshotMessage(0, _('Removing old snapshots')) oldBackupId = SID(self.config.removeOldSnapshotsDate(), self.config) logger.debug("Remove snapshots older than: {}".format(oldBackupId.withoutTag), self) while True: if len(snapshots) <= 1: break if snapshots[0] >= oldBackupId: break if self.config.dontRemoveNamedSnapshots(): if snapshots[0].name: del snapshots[0] continue msg = 'Remove snapshot {} because it is older than {}' logger.debug(msg.format(snapshots[0].withoutTag, oldBackupId.withoutTag), self) self.remove(snapshots[0]) del snapshots[0] #smart remove enabled, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month = self.config.smartRemove() if enabled: self.setTakeSnapshotMessage(0, _('Smart remove')) del_snapshots = self.smartRemoveList(now, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month) self.smartRemove(del_snapshots) #try to keep min free space if self.config.minFreeSpaceEnabled(): self.setTakeSnapshotMessage(0, _('Trying to keep min free space')) minFreeSpace = self.config.minFreeSpaceMib() logger.debug("Keep min free disk space: {} MiB".format(minFreeSpace), self) snapshots = listSnapshots(self.config, reverse = False) while True: if len(snapshots) <= 1: break free_space = self.statFreeSpaceLocal(self.config.snapshotsFullPath()) if free_space is None: free_space = self.statFreeSpaceSsh() if free_space is None: logger.warning('Failed to get free space. Skipping', self) break if free_space >= minFreeSpace: break if self.config.dontRemoveNamedSnapshots(): if snapshots[0].name: del snapshots[0] continue msg = "free disk space: {} MiB. Remove snapshot {}" logger.debug(msg.format(free_space, snapshots[0].withoutTag), self) self.remove(snapshots[0]) del snapshots[0] #try to keep free inodes if self.config.minFreeInodesEnabled(): minFreeInodes = self.config.minFreeInodes() self.setTakeSnapshotMessage(0, _('Trying to keep min %d%% free inodes') % minFreeInodes) logger.debug("Keep min {}%% free inodes".format(minFreeInodes), self) snapshots = listSnapshots(self.config, reverse = False) while True: if len(snapshots) <= 1: break try: info = os.statvfs(self.config.snapshotsPath()) free_inodes = info.f_favail max_inodes = info.f_files except Exception as e: logger.debug('Failed to get free inodes for snapshot path %s: %s' %(self.config.snapshotsPath(), str(e)), self) break if free_inodes >= max_inodes * (minFreeInodes / 100.0): break if self.config.dontRemoveNamedSnapshots(): if snapshots[0].name: del snapshots[0] continue logger.debug("free inodes: %.2f%%. Remove snapshot %s" %((100.0 / max_inodes * free_inodes), snapshots[0].withoutTag), self) self.remove(snapshots[0]) del snapshots[0] #set correct last snapshot again if last_snapshot is not snapshots[-1]: self.createLastSnapshotSymlink(snapshots[-1]) def statFreeSpaceLocal(self, path): """ Get free space on filsystem containing ``path`` in MiB using :py:func:`os.statvfs()`. Depending on remote SFTP server this might fail on sshfs mounted shares. Args: path (str): full path Returns: int free space in MiB """ try: info = os.statvfs(path) if info.f_blocks != info.f_bavail: return info.f_frsize * info.f_bavail // (1024 * 1024) except Exception as e: logger.debug('Failed to get free space for %s: %s' %(path, str(e)), self) logger.warning('Failed to stat snapshot path', self) def statFreeSpaceSsh(self): """ Get free space on remote filsystem in MiB. This will call ``df`` on remote host and parse its output. Returns: int free space in MiB """ if self.config.snapshotsMode() not in ('ssh', 'ssh_encfs'): return None snapshots_path_ssh = self.config.sshSnapshotsFullPath() if not len(snapshots_path_ssh): snapshots_path_ssh = './' cmd = self.config.sshCommand(['df', snapshots_path_ssh], nice = False, ionice = False) df = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE) output = df.communicate()[0] #Filesystem 1K-blocks Used Available Use% Mounted on #/tmp 127266564 115596412 5182296 96% / # ^^^^^^^ for line in output.split(b'\n'): m = re.match(b'^.*?\s+\d+\s+\d+\s+(\d+)\s+\d+%', line, re.M) if m: return int(int(m.group(1)) / 1024) logger.warning('Failed to get free space on remote', self) def filter(self, base_sid, base_path, snapshotsList, list_diff_only = False, flag_deep_check = False, list_equal_to = ''): """ Filter snapshots from ``snapshotsList`` based on whether ``base_path`` file is included and optional if the snapshot is unique or equal to ``list_equal_to``. Args: base_sid (SID): snapshot ID that contained the original file ``base_path`` base_path (str): path to file on root filesystem. snapshotsList (list): List of :py:class:`SID` objects that should be filtered list_diff_only (bool): if ``True`` only return unique snapshots. Which means if a file is exactly the same in different snapshots only the first snapshot will be listed flag_deep_check (bool): use md5sum to check uniqueness of files. More acurate but slow list_equal_to (str): full path to file. If not empty only return snapshots which have exactly the same file as this file Returns: list: filtered list of :py:class:`SID` objects """ snapshotsFiltered = [] base_full_path = base_sid.pathBackup(base_path) if not os.path.lexists(base_full_path): return [] allSnapshotsList = [RootSnapshot(self.config)] allSnapshotsList.extend(snapshotsList) #links if os.path.islink(base_full_path): targets = [] for sid in allSnapshotsList: path = sid.pathBackup(base_path) if os.path.lexists(path) and os.path.islink(path): if list_diff_only: target = os.readlink(path) if target in targets: continue targets.append(target) snapshotsFiltered.append(sid) return snapshotsFiltered #directories if os.path.isdir(base_full_path): for sid in allSnapshotsList: path = sid.pathBackup(base_path) if os.path.exists(path) and not os.path.islink(path) and os.path.isdir(path): snapshotsFiltered.append(sid) return snapshotsFiltered #files if not list_diff_only and not list_equal_to: for sid in allSnapshotsList: path = sid.pathBackup(base_path) if os.path.exists(path) and not os.path.islink(path) and os.path.isfile(path): snapshotsFiltered.append(sid) return snapshotsFiltered # check for duplicates uniqueness = tools.UniquenessSet(flag_deep_check, follow_symlink = False, list_equal_to = list_equal_to) for sid in allSnapshotsList: path = sid.pathBackup(base_path) if os.path.exists(path) and not os.path.islink(path) and os.path.isfile(path) and uniqueness.check(path): snapshotsFiltered.append(sid) return snapshotsFiltered #TODO: move this to config.Config def rsyncRemotePath(self, path, use_mode = ['ssh', 'ssh_encfs'], quote = '"'): """ Format the destination string for rsync depending on which profile is used. Args: path (str): destination path use_mode (list): list of modes in which the result should change to ``user@host:path`` instead of just ``path`` quote (str): use this to quote the path Returns: str: quoted ``path`` like '"/foo"' or if the current mode is using ssh and current mode is in ``use_mode`` a combination of user, host and ``path`` like ''user@host:"/foo"'' """ mode = self.config.snapshotsMode() if mode in ['ssh', 'ssh_encfs'] and mode in use_mode: user = self.config.sshUser() host = tools.escapeIPv6Address(self.config.sshHost()) return '%(u)s@%(h)s:%(q)s%(p)s%(q)s' %{'u': user, 'h': host, 'q': quote, 'p': path} else: return path def deletePath(self, sid, path): """ Delete ``path`` and all files and folder inside in snapshot ``sid``. Args: sid (SID): snapshot ID in which ``path`` should be deleted path (str): path to delete """ def errorHandler(fn, path, excinfo): """ Error handler for :py:func:`deletePath`. This will fix permissions and try again to remove the file. Args: fn (method): callable which failed before path (str): file to delete excinfo: NotImplemented """ dirname = os.path.dirname(path) st = os.stat(dirname) os.chmod(dirname, st.st_mode | stat.S_IWUSR) st = os.stat(path) os.chmod(path, st.st_mode | stat.S_IWUSR) fn(path) full_path = sid.pathBackup(path) dirname = os.path.dirname(full_path) dir_st = os.stat(dirname) os.chmod(dirname, dir_st.st_mode | stat.S_IWUSR) if os.path.isdir(full_path) and not os.path.islink(full_path): shutil.rmtree(full_path, onerror = errorHandler) else: st = os.stat(full_path) os.chmod(full_path, st.st_mode | stat.S_IWUSR) os.remove(full_path) os.chmod(dirname, dir_st.st_mode) def createLastSnapshotSymlink(self, sid): """ Create symlink 'last_snapshot' to snapshot ``sid`` Args: sid (SID): snapshot that should be linked. Returns: bool: ``True`` if successful """ if sid is None: return symlink = self.config.lastSnapshotSymlink() try: if os.path.islink(symlink): if os.path.basename(os.path.realpath(symlink)) == sid.sid: return True os.remove(symlink) if os.path.exists(symlink): logger.error('Could not remove symlink %s' %symlink, self) return False logger.debug('Create symlink %s => %s' %(symlink, sid), self) os.symlink(sid.sid, symlink) return True except Exception as e: logger.error('Failed to create symlink %s: %s' %(symlink, str(e)), self) return False def flockExclusive(self): """ Block :py:func:`backup` from other profiles or users and run them serialized """ if self.config.globalFlock(): logger.debug('Set flock %s' %self.GLOBAL_FLOCK, self) self.flock = open(self.GLOBAL_FLOCK, 'w') fcntl.flock(self.flock, fcntl.LOCK_EX) #make it rw by all if that's not already done. perms = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | \ stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH s = os.fstat(self.flock.fileno()) if not s.st_mode & perms == perms: logger.debug('Set flock permissions %s' %self.GLOBAL_FLOCK, self) os.fchmod(self.flock.fileno(), perms) def flockRelease(self): """ Release lock so other snapshots can continue """ if self.flock: logger.debug('Release flock %s' %self.GLOBAL_FLOCK, self) fcntl.fcntl(self.flock, fcntl.LOCK_UN) self.flock.close() self.flock = None def rsyncSuffix(self, includeFolders = None, excludeFolders = None): """ Create suffixes for rsync. Args: includeFolders (list): folders to include. list of tuples (item, int) Where ``int`` is ``0`` if ``item`` is a folder or ``1`` if ``item`` is a file excludeFolders (list): list of folders to exclude Returns: list: rsync include and exclude options """ #create exclude patterns string rsync_exclude = self.rsyncExclude(excludeFolders) #create include patterns list rsync_include, rsync_include2 = self.rsyncInclude(includeFolders) encode = self.config.ENCODE ret = ['--chmod=Du+wx'] ret.extend(['--exclude=' + i for i in (encode.exclude(self.config.snapshotsPath()), encode.exclude(self.config._LOCAL_DATA_FOLDER), encode.exclude(self.config._MOUNT_ROOT) )]) # TODO: fix bug #561: # after rsync_exclude we need to explicite include files inside excluded # folders, recursive exclude folder-content again and finally add the # rest from rsync_include2 ret.extend(rsync_include) ret.extend(rsync_exclude) ret.extend(rsync_include2) ret.append('--exclude=*') ret.append(encode.chroot) return ret def rsyncExclude(self, excludeFolders = None): """ Format exclude list for rsync Args: excludeFolders (list): list of folders to exclude Returns: OrderedSet: rsync exclude options """ items = tools.OrderedSet() encode = self.config.ENCODE if excludeFolders is None: excludeFolders = self.config.exclude() for exclude in excludeFolders: exclude = encode.exclude(exclude) if exclude is None: continue items.add('--exclude=' + exclude) return items def rsyncInclude(self, includeFolders = None): """ Format include list for rsync. Returns a tuple of two include strings. First string need to come before exclude, second after exclude. Args: includeFolders (list): folders to include. list of tuples (item, int) where ``int`` is ``0`` if ``item`` is a folder or ``1`` if ``item`` is a file Returns: tuple: two item tuple of ``(OrderedSet('include1 opions'), OrderedSet('include2 options'))`` """ items1 = tools.OrderedSet() items2 = tools.OrderedSet() encode = self.config.ENCODE if includeFolders is None: includeFolders = self.config.include() for include_folder in includeFolders: folder = include_folder[0] if folder == "/": # If / is selected as included folder it should be changed to "" #folder = "" # because an extra / is added below. Patch thanks to Martin Hoefling items2.add('--include=/') items2.add('--include=/**') continue folder = encode.include(folder) if include_folder[1] == 0: items2.add('--include={}/**'.format(folder)) else: items2.add('--include={}'.format(folder)) folder = os.path.split(folder)[0] while True: if len(folder) <= 1: break items1.add('--include={}/'.format(folder)) folder = os.path.split(folder)[0] return (items1, items2) class FileInfoDict(dict): """ A :py:class:`dict` that maps a path (as :py:class:`bytes`) to a tuple (:py:class:`int`, :py:class:`bytes`, :py:class:`bytes`). """ def __init__(self): # default permissions for / # only used if fileinfo.bz2 does not contain a value for / # when it was created with version <= 1.1.12 # bugfix for https://github.com/bit-team/backintime/issues/708 self[b'/'] = (16877, b'root', b'root') def __setitem__(self, key, value): assert isinstance(key, bytes), "key '{}' is not bytes instance".format(key) assert isinstance(value, tuple), "value '{}' is not tuple instance".format(value) assert len(value) == 3, "value '{}' does not have 3 items".format(value) assert isinstance(value[0], int), "first value '{}' is not int instance".format(value[0]) assert isinstance(value[1], bytes), "second value '{}' is not bytes instance".format(value[1]) assert isinstance(value[2], bytes), "third value '{}' is not bytes instance".format(value[2]) super(FileInfoDict, self).__setitem__(key, value) class SID(object): """ Snapshot ID object used to gather all information for a snapshot Args: date (:py:class:`str`, :py:class:`datetime.date` or :py:class:`datetime.datetime`): used for creating this snapshot. str must be in snapshot ID format (e.g 20151218-173512-123) cfg (config.Config): current config Raises: ValueError: if ``date`` is :py:class:`str` instance and doesn't match the snapshot ID format (20151218-173512-123 or 20151218-173512) TypeError: if ``date`` is not :py:class:`str`, :py:class:`datetime.date` or :py:class:`datetime.datetime` type """ __cValidSID = re.compile(r'^\d{8}-\d{6}(?:-\d{3})?$') INFO = 'info' NAME = 'name' FAILED = 'failed' FILEINFO = 'fileinfo.bz2' LOG = 'takesnapshot.log.bz2' def __init__(self, date, cfg): self.config = cfg self.profileID = cfg.currentProfile() self.isRoot = False if isinstance(date, datetime.datetime): self.sid = '-'.join((date.strftime('%Y%m%d-%H%M%S'), self.config.tag(self.profileID))) self.date = date elif isinstance(date, datetime.date): self.sid = '-'.join((date.strftime('%Y%m%d-000000'), self.config.tag(self.profileID))) self.date = datetime.datetime.combine(date, datetime.datetime.min.time()) elif isinstance(date, str): if self.__cValidSID.match(date): self.sid = date self.date = datetime.datetime(*self.split()) elif date == 'last_snapshot': raise LastSnapshotSymlink() else: raise ValueError("'date' must be in snapshot ID format (e.g 20151218-173512-123)") else: raise TypeError("'date' must be an instance of str, datetime.date or datetime.datetime") def __repr__(self): return self.sid def __eq__(self, other): """ Compare snapshots based on self.sid Args: other (:py:class:`SID`, :py:class:`str`): an other :py:class:`SID` or str instance Returns: bool: ``True`` if other is equal """ if isinstance(other, SID): return self.sid == other.sid and self.profileID == other.profileID elif isinstance(other, str): return self.sid == other else: return NotImplemented def __ne__(self, other): return not self.__eq__(other) def __lt__(self, other): """ Sort snapshots (alphabetical order) based on self.sid Args: other (:py:class:`SID`, :py:class:`str`): an other :py:class:`SID` or str instance Returns: bool: ``True`` if other is lower """ if isinstance(other, SID): return self.sid < other.sid elif isinstance(other, str) and self.__cValidSID.match(other): return self.sid < other else: return NotImplemented def __le__(self, other): if isinstance(other, SID): return self.sid <= other.sid elif isinstance(other, str) and self.__cValidSID.match(other): return self.sid <= other else: return NotImplemented def __gt__(self, other): if isinstance(other, SID): return self.sid > other.sid elif isinstance(other, str) and self.__cValidSID.match(other): return self.sid > other else: return NotImplemented def __ge__(self, other): if isinstance(other, SID): return self.sid >= other.sid elif isinstance(other, str) and self.__cValidSID.match(other): return self.sid >= other else: return NotImplemented def __hash__(self): return hash(self.sid + self.profileID) def split(self): """ Split self.sid into a tuple of int's with Year, Month, Day, Hour, Minute, Second Returns: tuple: tuple of 6 int """ def split(s, e): return int(self.sid[s:e]) return (split(0, 4), split(4, 6), split(6, 8), split(9, 11), split(11, 13), split(13, 15)) @property def displayID(self): """ Snapshot ID in a user-readable format: YYYY-MM-DD HH:MM:SS Returns: str: formated sID """ return "{:04}-{:02}-{:02} {:02}:{:02}:{:02}".format(*self.split()) @property def displayName(self): """ Combination of displayID, name and error indicator (if any) Returns: str: name """ ret = self.displayID name = self.name if name: ret += ' - {}'.format(name) if self.failed: ret += ' ({})'.format(_('WITH ERRORS !')) return ret @property def tag(self): """ Snapshot ID's tag Returns: str: tag (last three digits) """ return self.sid[16:] @property def withoutTag(self): """ Snapshot ID without tag Returns: str: YYYYMMDD-HHMMSS """ return self.sid[0:15] def path(self, *path, use_mode = []): """ Current path of this snapshot automatically altered for remote/encrypted version of this path Args: *path (str): one or more folder/files to join at the end of the path. use_mode (list): list of modes that should alter this path. If the current mode is in this list, the path will automatically altered for the remote/encrypted version of this path. Returns: str: full snapshot path """ path = [i.strip(os.sep) for i in path] current_mode = self.config.snapshotsMode(self.profileID) if 'ssh' in use_mode and current_mode == 'ssh': return os.path.join(self.config.sshSnapshotsFullPath(self.profileID), self.sid, *path) if 'ssh_encfs' in use_mode and current_mode == 'ssh_encfs': ret = os.path.join(self.config.sshSnapshotsFullPath(self.profileID), self.sid, *path) return self.config.ENCODE.remote(ret) return os.path.join(self.config.snapshotsFullPath(self.profileID), self.sid, *path) def pathBackup(self, *path, **kwargs): """ 'backup' folder inside snapshots path Args: *path (str): one or more folder/files to join at the end of the path. use_mode (list): list of modes that should alter this path. If the current mode is in this list, the path will automatically altered for the remote/encrypted version of this path. Returns: str: full snapshot path """ return self.path('backup', *path, **kwargs) def makeDirs(self, *path): """ Create snapshot directory Args: *path (str): one or more folder/files to join at the end of the path Returns: bool: ``True`` if successful """ if not os.path.isdir(self.config.snapshotsFullPath(self.profileID)): logger.error('Snapshots path {} doesn\'t exist. Unable to make dirs for snapshot ID {}'.format( self.config.snapshotsFullPath(self.profileID), self.sid), self) return False return tools.makeDirs(self.pathBackup(*path)) def exists(self): """ ``True`` if the snapshot folder and the "backup" folder inside exist Returns: bool: ``True`` if exists """ return os.path.isdir(self.path()) and os.path.isdir(self.pathBackup()) def canOpenPath(self, path): """ ``True`` if path is a file inside this snapshot Args: path (str): path from local filesystem (no snapshot path) Returns: bool: ``True`` if file exists """ fullPath = self.pathBackup(path) if not os.path.exists(fullPath): return False if not os.path.islink(fullPath): return True basePath = self.pathBackup() target = os.readlink(fullPath) target = os.path.join(os.path.abspath(os.path.dirname(fullPath)), target) return target.startswith(basePath) @property def name(self): """ Name of this snapshot Args: name (str): new name of the snapshot Returns: str: name of this snapshot """ nameFile = self.path(self.NAME) if not os.path.isfile(nameFile): return '' try: with open(nameFile, 'rt') as f: return f.read() except Exception as e: logger.debug('Failed to get snapshot {} name: {}'.format( self.sid, str(e)), self) @name.setter def name(self, name): nameFile = self.path(self.NAME) self.makeWritable() try: with open(nameFile, 'wt') as f: f.write(name) except Exception as e: logger.debug('Failed to set snapshot {} name: {}'.format( self.sid, str(e)), self) @property def lastChecked(self): """ Date when snapshot has finished last time. This can be the end of creation of this snapshot or the last time when this snapshot was checked against source without changes. Returns: str: date and time of last check (YYYY-MM-DD HH:MM:SS) """ info = self.path(self.INFO) if os.path.exists(info): return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getatime(info))) return self.displayID #using @property.setter would be confusing here as there is no value to give def setLastChecked(self): """ Set info files atime to current time to indicate this snapshot was checked against source without changes right now. """ info = self.path(self.INFO) if os.path.exists(info): os.utime(info, None) @property def failed(self): """ This snapshot has failed Args: enable (bool): set or remove flag Returns: bool: ``True`` if flag is set """ failedFile = self.path(self.FAILED) return os.path.isfile(failedFile) @failed.setter def failed(self, enable): failedFile = self.path(self.FAILED) if enable: self.makeWritable() try: with open(failedFile, 'wt') as f: f.write('') except Exception as e: logger.debug('Failed to mark snapshot {} failed: {}'.format( self.sid, str(e)), self) elif os.path.exists(failedFile): os.remove(failedFile) @property def info(self): """ Load/save "info" file which contains additional information about this snapshot (using configfile.ConfigFile) Args: i (configfile.ConfigFile): info that should be saved. Returns: configfile.ConfigFile: snapshots information """ i = configfile.ConfigFile() i.load(self.path(self.INFO)) return i @info.setter def info(self, i): assert isinstance(i, configfile.ConfigFile), 'i is not configfile.ConfigFile type: {}'.format(i) i.save(self.path(self.INFO)) @property def fileInfo(self): """ Load/save "fileinfo.bz2" Args: d (FileInfoDict): dict of: {path: (permission, user, group)} Returns: FileInfoDict: dict of: {path: (permission, user, group)} """ d = FileInfoDict() infoFile = self.path(self.FILEINFO) if not os.path.isfile(infoFile): return d try: with bz2.BZ2File(infoFile, 'rb') as fileinfo: for line in fileinfo: line = line.strip(b'\n') if not line: continue index = line.find(b'/') if index < 0: continue f = line[index:] if not f: continue info = line[:index].strip().split(b' ') if len(info) == 3: d[f] = (int(info[0]), info[1], info[2]) #perms, user, group except (FileNotFoundError, PermissionError) as e: logger.error('Failed to load {} from snapshot {}: {}'.format( self.FILEINFO, self.sid, str(e)), self) return d @fileInfo.setter def fileInfo(self, d): assert isinstance(d, FileInfoDict), 'd is not FileInfoDict type: {}'.format(d) try: with bz2.BZ2File(self.path(self.FILEINFO), 'wb') as f: for path, info in d.items(): f.write(b' '.join((str(info[0]).encode('utf-8', 'replace'), info[1], info[2], path)) + b'\n') except PermissionError as e: logger.error('Failed to write {}: {}'.format(self.FILEINFO, str(e))) #TODO: use @property decorator def log(self, mode = None, decode = None): """ Load log from "takesnapshot.log.bz2" Args: mode (int): Mode used for filtering. Take a look at :py:class:`snapshotlog.LogFilter` decode (encfstools.Decode): instance used for decoding lines or ``None`` Yields: str: filtered and decoded log lines """ logFile = self.path(self.LOG) logFilter = snapshotlog.LogFilter(mode, decode) try: with bz2.BZ2File(logFile, 'rb') as f: if logFilter.header: yield logFilter.header for line in f.readlines(): line = logFilter.filter(line.decode('utf-8').rstrip('\n')) if not line is None: yield line except Exception as e: msg = ('Failed to get snapshot log from {}:'.format(logFile), str(e)) logger.debug(' '.join(msg), self) for line in msg: yield line def setLog(self, log): """ Write log to "takesnapshot.log.bz2" Args: log: full snapshot log """ if isinstance(log, str): log = log.encode('utf-8', 'replace') logFile = self.path(self.LOG) try: with bz2.BZ2File(logFile, 'wb') as f: f.write(log) except Exception as e: logger.error('Failed to write log into compressed file {}: {}'.format( logFile, str(e)), self) def makeWritable(self): """ Make the snapshot path writable so we can change files inside Returns: bool: ``True`` if successful """ path = self.path() rw = os.stat(path).st_mode | stat.S_IWUSR return os.chmod(path, rw) class GenericNonSnapshot(SID): @property def displayID(self): return self.name @property def displayName(self): return self.name @property def tag(self): return self.name @property def withoutTag(self): return self.name class NewSnapshot(GenericNonSnapshot): """ Snapshot ID object for 'new_snapshot' folder Args: cfg (config.Config): current config """ NEWSNAPSHOT = 'new_snapshot' SAVETOCONTINUE = 'save_to_continue' def __init__(self, cfg): self.config = cfg self.profileID = cfg.currentProfile() self.isRoot = False self.sid = self.NEWSNAPSHOT self.date = datetime.datetime(1, 1, 1) self.__le__ = self.__lt__ self.__ge__ = self.__gt__ def __lt__(self, other): return False def __gt__(self, other): return True @property def name(self): """ Name of this snapshot Returns: str: name of this snapshot """ return self.sid @property def saveToContinue(self): """ Check if 'save_to_continue' flag is set Args: enable (bool): set or remove flag Returns: bool: ``True`` if flag is set """ return os.path.exists(self.path(self.SAVETOCONTINUE)) @saveToContinue.setter def saveToContinue(self, enable): flag = self.path(self.SAVETOCONTINUE) if enable: try: with open(flag, 'wt') as f: pass except Exception as e: logger.error("Failed to set 'save_to_continue' flag: %s" %str(e)) elif os.path.exists(flag): try: os.remove(flag) except Exception as e: logger.error("Failed to remove 'save_to_continue' flag: %s" %str(e)) @property def hasChanges(self): """ Check if there where changes in previous sessions. Returns: bool: ``True`` if there where changes """ log = snapshotlog.SnapshotLog(self.config, self.profileID) c = re.compile(r'^\[C\] ') for line in log.get(mode = snapshotlog.LogFilter.CHANGES): if c.match(line): return True return False class RootSnapshot(GenericNonSnapshot): """ Snapshot ID for the filesystem root folder ('/') Args: cfg (config.Config): current config """ def __init__(self, cfg): self.config = cfg self.profileID = cfg.currentProfile() self.isRoot = True self.sid = '/' self.date = datetime.datetime(datetime.MAXYEAR, 12, 31) self.__le__ = self.__lt__ self.__ge__ = self.__gt__ def __lt__(self, other): return False def __gt__(self, other): return True @property def name(self): """ Name of this snapshot Returns: str: name of this snapshot """ return _('Now') def path(self, *path, use_mode = []): """ Current path of this snapshot automatically altered for remote/encrypted version of this path Args: *path (str): one or more folder/files to join at the end of the path. use_mode (list): list of modes that should alter this path. If the current mode is in this list, the path will automatically altered for the remote/encrypted version of this path. Returns: str: full snapshot path """ current_mode = self.config.snapshotsMode(self.profileID) if 'ssh_encfs' in use_mode and current_mode == 'ssh_encfs': if path: path = self.config.ENCODE.remote(os.path.join(*path)) return os.path.join(self.config.ENCODE.chroot, path) else: return os.path.join(os.sep, *path) def iterSnapshots(cfg, includeNewSnapshot = False): """ Iterate over snapshots in current snapshot path. Use this in a 'for' loop for faster processing than list object Args: cfg (config.Config): current config includeNewSnapshot (bool): include a NewSnapshot instance if 'new_snapshot' folder is available. Yields: SID: snapshot IDs """ path = cfg.snapshotsFullPath() if not os.path.exists(path): return None for item in os.listdir(path): if item == NewSnapshot.NEWSNAPSHOT: newSid = NewSnapshot(cfg) if newSid.exists() and includeNewSnapshot: yield newSid continue try: sid = SID(item, cfg) if sid.exists(): yield sid except Exception as e: if not isinstance(e, LastSnapshotSymlink): logger.debug("'{}' is no snapshot ID: {}".format(item, str(e))) def listSnapshots(cfg, includeNewSnapshot = False, reverse = True): """ List of snapshots in current snapshot path. Args: cfg (config.Config): current config (config.Config instance) includeNewSnapshot (bool): include a NewSnapshot instance if 'new_snapshot' folder is available reverse (bool): sort reverse Returns: list: list of :py:class:`SID` objects """ ret = list(iterSnapshots(cfg, includeNewSnapshot)) ret.sort(reverse = reverse) return ret def lastSnapshot(cfg): """ Most recent snapshot. Args: cfg (config.Config): current config (config.Config instance) Returns: SID: most recent snapshot ID """ sids = listSnapshots(cfg) if sids: return sids[0] if __name__ == '__main__': config = config.Config() snapshots = Snapshots(config) snapshots.backup() backintime-1.2.1/common/config-example-ssh0000644000175000017500000000517413530533316020052 0ustar germargermarprofile1.snapshots.automatic_backup_day=1 profile1.snapshots.automatic_backup_mode=0 profile1.snapshots.automatic_backup_time=0 profile1.snapshots.automatic_backup_weekday=7 profile1.snapshots.backup_on_restore.enabled=true profile1.snapshots.bwlimit.enabled=false profile1.snapshots.bwlimit.value=3000 profile1.snapshots.continue_on_errors=true profile1.snapshots.copy_links=false profile1.snapshots.copy_unsafe_links=false profile1.snapshots.cron.ionice=true profile1.snapshots.cron.nice=true profile1.snapshots.custom_backup_time=8,12,18,23 profile1.snapshots.dont_remove_named_snapshots=true profile1.snapshots.exclude.1.value=.gvfs profile1.snapshots.exclude.10.value=/proc/* profile1.snapshots.exclude.11.value=/sys/* profile1.snapshots.exclude.12.value=/dev/* profile1.snapshots.exclude.13.value=/run/* profile1.snapshots.exclude.2.value=.cache* profile1.snapshots.exclude.3.value=[Cc]ache* profile1.snapshots.exclude.4.value=.thumbnails* profile1.snapshots.exclude.5.value=[Tt]rash* profile1.snapshots.exclude.6.value=*.backup* profile1.snapshots.exclude.7.value=*~ profile1.snapshots.exclude.8.value=/home/USER/Ubuntu One profile1.snapshots.exclude.9.value=.dropbox* profile1.snapshots.exclude.size=13 profile1.snapshots.include.1.type=0 profile1.snapshots.include.1.value=/home/USER profile1.snapshots.include.size=1 profile1.snapshots.local_encfs.path= profile1.snapshots.log_level=3 profile1.snapshots.min_free_space.enabled=true profile1.snapshots.min_free_space.unit=20 profile1.snapshots.min_free_space.value=1 profile1.snapshots.mode=ssh profile1.snapshots.no_on_battery=false profile1.snapshots.notify.enabled=true profile1.snapshots.path= profile1.snapshots.path.auto=true profile1.snapshots.path.host=HOST profile1.snapshots.path.profile=1 profile1.snapshots.path.user=USER profile1.snapshots.preserve_acl=false profile1.snapshots.preserve_xattr=false profile1.snapshots.remove_old_snapshots.enabled=true profile1.snapshots.remove_old_snapshots.unit=80 profile1.snapshots.remove_old_snapshots.value=10 profile1.snapshots.smart_remove=false profile1.snapshots.smart_remove.keep_all=2 profile1.snapshots.smart_remove.keep_one_per_day=7 profile1.snapshots.smart_remove.keep_one_per_month=24 profile1.snapshots.smart_remove.keep_one_per_week=4 profile1.snapshots.ssh.cipher=default profile1.snapshots.ssh.host=REMOTE_HOST profile1.snapshots.ssh.password.save=false profile1.snapshots.ssh.password.use_cache=true profile1.snapshots.ssh.path= profile1.snapshots.ssh.port=22 profile1.snapshots.ssh.private_key_file=/home/USER/.ssh/id_dsa profile1.snapshots.ssh.user=USER profile1.snapshots.use_checksum=false profile1.snapshots.user_backup.ionice=false profiles.version=1 backintime-1.2.1/common/logger.py0000644000175000017500000000726313530533316016270 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import syslog import os import sys import atexit import tools import bcolors DEBUG = False APP_NAME = 'backintime' def openlog(): name = os.getenv('LOGNAME', 'unknown') syslog.openlog("%s (%s/1)" %(APP_NAME, name)) atexit.register(closelog) def changeProfile(profile_id): name = os.getenv('LOGNAME', 'unknown') syslog.openlog("%s (%s/%s)" %(APP_NAME, name, profile_id)) def closelog(): syslog.closelog() def error(msg , parent = None, traceDepth = 0): if DEBUG: msg = '%s %s' %(_debugHeader(parent, traceDepth), msg) print('%sERROR%s: %s' %(bcolors.FAIL, bcolors.ENDC, msg), file=sys.stderr) for line in tools.wrapLine(msg): syslog.syslog(syslog.LOG_ERR, 'ERROR: ' + line) def warning(msg , parent = None, traceDepth = 0): if DEBUG: msg = '%s %s' %(_debugHeader(parent, traceDepth), msg) print('%sWARNING%s: %s' %(bcolors.WARNING, bcolors.ENDC, msg), file=sys.stderr) for line in tools.wrapLine(msg): syslog.syslog(syslog.LOG_WARNING, 'WARNING: ' + line) def info(msg , parent = None, traceDepth = 0): if DEBUG: msg = '%s %s' %(_debugHeader(parent, traceDepth), msg) print('%sINFO%s: %s' %(bcolors.OKGREEN, bcolors.ENDC, msg), file=sys.stdout) for line in tools.wrapLine(msg): syslog.syslog(syslog.LOG_INFO, 'INFO: ' + line) def debug(msg, parent = None, traceDepth = 0): if DEBUG: msg = '%s %s' %(_debugHeader(parent, traceDepth), msg) print('%sDEBUG%s: %s' %(bcolors.OKBLUE, bcolors.ENDC, msg), file = sys.stdout) for line in tools.wrapLine(msg): syslog.syslog(syslog.LOG_DEBUG, 'DEBUG: %s' %line) def deprecated(parent = None): frame = sys._getframe(1) fdir, fname = os.path.split(frame.f_code.co_filename) fmodule = os.path.basename(fdir) line = frame.f_lineno if parent: fclass = '%s.' %parent.__class__.__name__ else: fclass = '' func = frame.f_code.co_name frameCaller = sys._getframe(2) fdirCaller, fnameCaller = os.path.split(frameCaller.f_code.co_filename) fmoduleCaller = os.path.basename(fdirCaller) lineCaller = frameCaller.f_lineno msg = '%s/%s:%s %s%s called from ' %(fmodule, fname, line, fclass, func) msgCaller = '%s/%s:%s' %(fmoduleCaller, fnameCaller, lineCaller) print('%sDEPRECATED%s: %s%s%s%s' %(bcolors.WARNING, bcolors.ENDC, msg, bcolors.OKBLUE, msgCaller, bcolors.ENDC), file=sys.stderr) syslog.syslog(syslog.LOG_WARNING, 'DEPRECATED: %s%s' %(msg, msgCaller)) def _debugHeader(parent, traceDepth): frame = sys._getframe(2 + traceDepth) fdir, fname = os.path.split(frame.f_code.co_filename) fmodule = os.path.basename(fdir) line = frame.f_lineno if parent: fclass = '%s.' %parent.__class__.__name__ else: fclass = '' func = frame.f_code.co_name return '[%s/%s:%s %s%s]' %(fmodule, fname, line, fclass, func) backintime-1.2.1/common/bcolors.py0000644000175000017500000000221313530533316016442 0ustar germargermar#!/usr/bin/env python3 # Copyright (C) 2015-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys if sys.stdout.isatty(): HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' else: HEADER = '' OKBLUE = '' OKGREEN = '' WARNING = '' FAIL = '' ENDC = '' BOLD = '' UNDERLINE = '' backintime-1.2.1/common/driveinfo.py0000644000175000017500000001275613530533316017001 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import configfile import sys import tools #TODO: rewrite and finally USE this class DriveInfo(configfile.ConfigFile): def __init__(self, path): configfile.ConfigFile.__init__(self) self.path = path self.load(self._get_driveinfo_file_()) dirty = False if sys.platform == 'win32': #there is nothing to do pass else: if not self.hasKey('hardlinks'): self.setBoolValue('hardlinks', self._check_hardlinks_()) dirty = True if not self.hasKey('permissions'): self.setBoolValue('permissions', self._check_perms_()) dirty = True if not self.hasKey('usergroup'): self.setBoolValue('usergroup', self._check_usergroup_()) dirty = True if dirty: self.save(self._get_driveinfo_file_()) def support_hardlinks(self): return self.boolValue('hardlinks', False) def support_permissions(self): return self.boolValue('permissions', False) def support_usergroup(self): return self.boolValue('usergroup', False) def _get_driveinfo_file_(self): return os.path.join(self.path, 'driveinfo') def _check_hardlinks_(self): tmp_path = os.path.join(self.path, 'driveinfo.tmp') tools.makeDirs(tmp_path) if not os.path.isdir(tmp_path): return False file1_path = os.path.join(tmp_path, 'file1') file2_path = os.path.join(tmp_path, 'file2') ret_val = False os.system("echo abc > \"%s\"" % file1_path) os.system("ln \"%s\" \"%s\"" % (file1_path, file2_path)) os.system("echo abc > \"%s\"" % file2_path) if os.path.exists(file1_path) and os.path.exists(file2_path): try: info1 = os.stat(file1_path) info2 = os.stat(file2_path) if info1.st_size == info2.st_size: ret_val = True except: pass os.system("rm -rf \"%s\"" % tmp_path) return ret_val def _check_perms_for_file_(self, file_path, mode): ret_val = False os.system("chmod %s \"%s\"" % (mode, file_path)) try: info = "%o" % os.stat(file_path).st_mode info = info[-3 :] if info == mode: ret_val = True except: pass return ret_val def _check_perms_(self): tmp_path = os.path.join(self.path, 'driveinfo.tmp') tools.makeDirs(tmp_path) if not os.path.isdir(tmp_path): return False file_path = os.path.join(tmp_path, 'file') os.system("echo abc > \"%s\"" % file_path) if not os.path.isfile(file_path): return False ret_val = False if self._check_perms_for_file_(file_path, '111'): if self._check_perms_for_file_(file_path, '700'): if self._check_perms_for_file_(file_path, '600'): if self._check_perms_for_file_(file_path, '711'): if self._check_perms_for_file_(file_path, '300'): if self._check_perms_for_file_(file_path, '666'): ret_val = True os.system("rm -rf \"%s\"" % tmp_path) return ret_val def _check_usergroup_(self): tmp_path = os.path.join(self.path, 'driveinfo.tmp') tools.makeDirs(tmp_path) if not os.path.isdir(tmp_path): return False file_path = os.path.join(tmp_path, 'file') os.system("echo abc > \"%s\"" % file_path) if not os.path.isfile(file_path): return False ret_val = False uid = os.getuid() gid = os.getgid() try: info = os.stat(file_path) if info.st_uid == uid and info.st_gid == gid: ret_val = True except: pass if ret_val and uid == 0: #try to change the group import grp #search for another group new_gid = gid new_name = '' for group in grp.getgrall(): if group.gr_gid != gid: new_gid = group.gr_gid new_name = group.gr_name break if new_gid != gid: os.system("chgrp %s \"%s\"" % (new_name, file_path)) try: info = os.stat(file_path) if info.st_gid != new_gid: ret_val = False except: ret_val = False os.system("rm -rf \"%s\"" % tmp_path) return ret_val backintime-1.2.1/common/po/0000755000175000017500000000000013530533316015045 5ustar germargermarbackintime-1.2.1/common/po/ja.po0000644000175000017500000011416513530533316016007 0ustar germargermar# Japanese translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:24+0000\n" "Last-Translator: Toshiharu Kudoh \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "プロファイル \"%s\" はすでに存在しています!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "最後のプロファイルを削除することが出来ません!" #: ../../common/config.py:77 msgid "Disabled" msgstr "無効" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "起動/再起動毎に" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "5分毎" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "10分毎" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "毎日" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "毎週" #: ../../common/config.py:92 msgid "Every Month" msgstr "毎月" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "日" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "週" #: ../../common/config.py:98 msgid "Year(s)" msgstr "年" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "メインプロファイル" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "プロファイル: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "スナップショットのフォルダは有効ではありません!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "バックアップするためには最低1つのフォルダを選択しなくてはなりません!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "バックアップフォルダを含むことはできません!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "バックアップサブフォルダを含むことはできません!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s はフォルダではありません!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "%s に書き込めません。\\n\n" "書き込み権限を持っていますか?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "リンクをコピー(シンボリックリンクを参照)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "上級者向けオプション" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "crontab がみつかりません。\\n\n" "cron をインストールしてもよろしいですか?\\n\n" "インストールしないのであれば、全ての自動バックアップは無効になります。" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "スナップショット取得" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "完了" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "スナップショットフォルダがみつかりません。\\n\n" "もしリムーバブルドライブ上にあるのなら、接続して下さい。" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "%s 秒待っています。" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "スナップショット %s の取得に失敗しました!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "ファイナライズ中" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "フォルダ %s を作成できません" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "設定ファイルを保存..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "パーミッションを保存..." #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "フォルダ %s を削除できません" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "スナップショット取得" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "賢く削除" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "古いスナップショットを削除" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "最小限のフリースペースの確保を試みる" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "現在" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "変更の検出にチェックサムを使用" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "スナップショットリストを更新" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "スナップショット名" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "スナップショット削除" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "スナップショットのログを閲覧" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "最近のログを閲覧" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "設定" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "終了" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "ヘルプ" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "ウェブサイト" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "情報" #: ../../qt/app.py:204 msgid "Up" msgstr "上層へ" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "不可視ファイルを表示" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "復元" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "スナップショット" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "ショートカット" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "スナップショットフォルダがみつかりません。\\n\n" "もしリムーバブルドライブ上にあるのなら、接続後に OK を押して下さい。" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "作業中:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "完了、バックアップの必要はありませんでした" #: ../../qt/app.py:723 msgid "Error:" msgstr "エラー:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "全体" #: ../../qt/app.py:795 msgid "Root" msgstr "ルート" #: ../../qt/app.py:796 msgid "Home" msgstr "ホーム" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "バックアップフォルダ" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "スナップショット %s を\\n\n" "削除してもよろしいですか" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "現在のディスクの内容を閲覧" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "スナップショット:%s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "%s に作成したスナップショットを閲覧" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "プロファイル:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "フィルタ:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "全て" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "エラー" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "変更点" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "情報" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] エラー、 [I] インフォメーション、 [C] 変更点" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "作業中..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "今日" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "昨日" #: ../../qt/qttools.py:229 msgid "This week" msgstr "今週" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "先週" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "編集" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "一般" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "スナップショットの保存場所" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "ホスト:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "ユーザ:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "上級設定" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "スケジュール" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "時:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "内包" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "含むファイルとフォルダ" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "ファイルを追加" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "フォルダを追加" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "除外" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "ファイルやフォルダの除外パターン" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "いち押し:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "自動削除" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "以下より古い場合:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "以下より空き容量が少ない場合:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "名付けたスナップショットは削除しない" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "オプション" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "通知を有効にする" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "バッテリ駆動の際はスナップショット取得を無効化" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "システムから電源情報が得られません" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "エラー発生時に継続 (不完全なスナップショットをキープ)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "ログレベル:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "変更点とエラー" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "何をしているか本当に理解している場合に限りこれらのオプションを変更してください!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "ACL を保存" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "拡張属性を維持(xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "危険なリンクをコピー(絶対リンクに対してのみ動作)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "新規プロファイル" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "プロファイルをリネーム" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "プロファイル \"%s\" を削除してよろしいですか?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "除外するパターン" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "除外するファイル" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "除外するフォルダ" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "含めるファイル" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "含めるフォルダ" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "スナップショットフォルダを変更してよろしいですか?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff のオプション" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "コマンド:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "パラメータ:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "パスのパラメータに %1 と %2 を使う" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "異なるスナップショットだけを列挙" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "ディープチェック (より正確ですが遅いです)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff (差分)" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "移動" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "スナップショット自体とは比較できません" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "コマンド %s がみつかりませんでした" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/is.po0000644000175000017500000012077013530533316016027 0ustar germargermar# translation of 20110902-common_po_common-is.po to Icelandic # Icelandic translation for backintime # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the backintime package. # # FIRST AUTHOR , 2011. # Sveinn í Felli , 2011, 2015, 2017. msgid "" msgstr "" "Project-Id-Version: 20110902-common_po_common-is\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2017-11-09 12:01+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "Language: is\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Mistókst að vista stillingaskrá: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Mistókst að hlaða inn stillingaskrá: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Sniðið \"%s\" er þegar til staðar !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Þú getur ekki fjarlægt síðasta snið !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Óvirkt" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Við hverja ræsingu/endurræsingu" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Á 5 mínútna fresti" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Á 10 mínútna fresti" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Á 30 mínútna fresti" #: ../../common/config.py:82 msgid "Every hour" msgstr "Á klukkustundar fresti" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Á 2 klukkustunda fresti" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Á 4 klukkustunda fresti" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Á 6 klukkustunda fresti" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Á 12 klukkustunda fresti" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Sérsniðnar klukkustundir" #: ../../common/config.py:88 msgid "Every Day" msgstr "Daglega" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Endurtekið (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Þegar drif er tengt (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Vikulega" #: ../../common/config.py:92 msgid "Every Month" msgstr "Mánaðarlega" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "dag(a)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "viku(r)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "ár" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "klukkustund(ir)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "mánuð(ir)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " Á tilraunastigi!" #: ../../common/config.py:129 msgid "Local" msgstr "Staðvært" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH einkalykill" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Staðvært dulritað" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Dulritun" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH dulritað" #: ../../common/config.py:135 msgid "Default" msgstr "Sjálfgefið" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Aðalsnið" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Snið: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Mappa fyrir skyndiafrit er ekki gild !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Þú verður að velja a.m.k. eina möppu til að öryggisafrita !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Þú mátt ekki hafa með möppuna sem öryggisafritin eiga að fara í !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Þú mátt ekki hafa með undirmöppu öryggisafritamöppunnar!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s er ekki mappa !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Get ekki skrifað í: %s\n" "Ertu viss um að þú hafir skrifaðgang þarna ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Afrita tengla (afbyggja tákntengi - dereference symbolic links)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Ítarlegri valkostir" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Finn ekki crontab.\n" "Ertu viss um að cron sé uppsett ?\n" "Ef ekki, ættirðu að gera alla sjálfvirka öryggisafritun óvirka." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Mistókst að skrifa nýtt crontab." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Áætlað udev virkar ekki með hamnum %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Gat ekki fundið UUID fyrir \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Get ekki tengt '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Búa til nýja dulkóðaða möppu?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Hætta við" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Staðfestu aðgangsorð" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Lykilorðin stemma ekki" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Taka skyndiafrit" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Get ekki aftengt %(proc)s úr %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "%(proc)s fannst ekki. Endilega settu upp t.d. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "tengipunkturinn %s ekki laus." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "MISTÓKST" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Endurheimta heimildir:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Búið" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Fresta afritun þegar rafhlöður eru í notkun" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Bið %s sekúndu." msgstr[1] "Bið %s sekúndur." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Mistókst að taka skyndiafritið %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Geng frá" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Get ekki búið til möppu: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Vista stillingaskrá ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Vista aðgangsheimildir ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Get ekki fjarlægt möppu: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Taka skyndiafrit" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Gat ekki endurnefnt %(new_path)s sem %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Snjöll fjarlæging" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Fjarlægja gömul skyndiafrit" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Reyna að halda í lágmarksmagn af lausu plássi" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Reyna að halda a.m.k. %d%% af lausum ihnútum (inodes)" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MEÐ VILLUM !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Núna" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Get ekki tengt %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s fannst ekki í ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Fjartengd slóð er ekki skrifanleg:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Fjartengd slóð er ekki keyranleg:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Tókst ekki að útbúa fjartengda slóð:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Nota gátsummu til að skynja breytingar" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Gera hlé á vinnslu skyndiafrits" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Halda áfram með vinnslu skyndiafrits" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Stöðva vinnslu skyndiafrits" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Endurnýja lista yfir skyndiafrit" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Heiti skyndiafrits" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Fjarlægja skyndiafrit" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Skoða skyndiafritaannál" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Skoða síðasta annál" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Stillingar" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Slökkva" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Slökkva á kerfi þegar skyndiafritun lýkur." #: ../../qt/app.py:149 msgid "Exit" msgstr "Hætta" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjálp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Hjálp fyrir stillingaskrá" #: ../../qt/app.py:163 msgid "Website" msgstr "Vefsvæði" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Breytingasaga" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ / Algengar spurningar" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Spyrja spurninga" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Tilkynna um villu" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Um forritið" #: ../../qt/app.py:204 msgid "Up" msgstr "Upp" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Sýna faldar skrár" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Endurheimta" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Endurheimta í ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Skyndiafrit" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Skyndiafrit" #: ../../qt/app.py:271 msgid "View" msgstr "Skoða" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Flýtilyklar" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Bæta við meðfylgjandi" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Bæta við útilokun" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Að vinna:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Búið, engin öryggisafritun nauðsynleg" #: ../../qt/app.py:723 msgid "Error:" msgstr "Villa:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Sent:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Hraði:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Áætluð lok:" #: ../../qt/app.py:794 msgid "Global" msgstr "Víðvært" #: ../../qt/app.py:795 msgid "Root" msgstr "Kerfisstjóri (root)" #: ../../qt/app.py:796 msgid "Home" msgstr "Einkamappa (Home)" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Öryggisafritunarmöppur" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Ertu viss um að þú viljir fjarlægja skyndiafritið:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Fjarlægja nýjar skrár í upprunalegri möppu" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Skoða innihald á diski" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Skyndiafrit: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Skoða skyndiafritið sem búið var til %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Endurheimta '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Endurheimta '%s' í ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Höfundar" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Þýðingar" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Notkunarleyfi" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Snið:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Sía:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Allt" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Villur" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Breytingar" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Upplýsingar" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Villa, [I] Upplýsingar, [C] Breyta" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "afkóða slóðir" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Villa" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Spurning" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Ræsa BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Í vinnslu..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Í dag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Í gær" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Í þessari viku" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Í síðustu viku" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Síðasta athugun %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Birta fullan annál" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Breyta" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Bæta við" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Fjarlægja" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Almennt" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Hamur:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Hvar á að vista skyndiafrit" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Mappa" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH stillingar" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Miðlari:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Gátt:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Notandi:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Slóð:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Dulkóðunarlykill:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Einkalykill:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Lykilskrá" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Lykilorð" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Vista lykilorð í lyklakippu" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Nánar" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Heildarslóð skyndiafrita: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Vinnuáætlun" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dagur:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Vikudagur:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Klukkustund:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Klukkustundir:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Hverjar:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Taka með" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Hafa með skrár og möppur" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Bæta við skrá" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Bæta við möppu" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Undanskilja" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Undanskilja mynstur, skrár eða möppur" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Sérstaklega mælt með:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Bæta við sjálfgefnu" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Hunsa skrár stærri en: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Sjálfvirk fjarlæging" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Eldri en:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ef laust pláss er minna en:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Ef lausir ihnútar (inodes) eru færri en:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Keyra í bakgrunni á fjartengdri vél." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Geyma öll skyndiafrit síðustu" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dag(a)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Geyma eitt skyndiafrit á dag síðustu" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Geyma eitt skyndiafrit á viku síðustu" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "viku(r)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Geyma eitt skyndiafrit á mánuði síðustu" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mánuði(r)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Geyma eitt skyndiafrit á ári" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ekki fjarlægja nefnd skyndiafrit" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Valkostir" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Virkja tilkynningar" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Koma í veg fyrir skyndiafritun þegar rafhlaða er í notkun" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Staða rafhlöðu er ekki tiltæk frá kerfinu" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Keyra aðeins eitt skyndiafrit í einu" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Öryggisafrit skipti út skrám við endurheimtingu" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Halda áfram við villur (geyma ókláruð skyndiafrit)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Taka skyndiafrit sama hvort nokkuð hafi breyst." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Annálsstig:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Ekkert" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Breytingar og villuboð" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "EKKI breyta þessum stillingum nema að þú vitir hvað þú ert að gera !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Keyra 'nice':" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "sem cron-verk" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "á fjartengdri vél" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Keyra 'ionice':" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "við að taka handvirkt skyndiafrit" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Keyra 'rsync' með 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "á staðværri vél" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Endurbeina stdout í /dev/null í cron-verkum." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Endurbeina stderr í /dev/null í cron-verkum." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Takmarka notkun rsync á bandbreidd: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sek" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Varðveita ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Varðveita ítarleg eigindi (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Afrita ótrygga tengla (virkar aðeins með algilda tengla)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Líma viðbótarvalkosti inn í rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Bæta forskeyti við SSH-skipanir" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "sjálfgefið" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Athuga hvort fjarlæg vél er á netinu" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Endurheimta stillingaskrá" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nýtt snið" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Endurnefna snið" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Ertu viss um að þú viljir eyða sniðinu \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Einkalykilsskráin \"%(file)s\" er ekki til." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Útilokunarmynstur" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Undanskilja skrá" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Undanskilja möppu" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Hafa með skrá" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Hafa með möppu" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Ertu viss um að þú viljir skipta um möppu undir skyndiafrit ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Mistókst að búa til nýjan SSH-lykil í %(path)s" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "virkt" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "óvirkt" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Endurheimta stillingar" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " og bættu notandanum þínum í hópinn 'fuse'" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Engin stillingaskrá fannst" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff valkostir" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Skipun:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Viðföng:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Ítarleg yfirferð (nákvæmari, en hægvirkt)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Eyða" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Velja allt" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Fara í" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Þú getur ekki borið skyndiafrit saman við sjálft sig" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Skipun fannst ekki: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Ertu viss um að þú viljir eyða \"%(file)s\" í skyndiafritinu " "\"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Ertu viss um að þú viljir eyða \"%(file)s\" í %(count)d skyndiafritum?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "AÐVÖRUN: Þetta er ekki hægt að afturkalla!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Útiloka \"%s\" framvegis frá skyndiafritum?" backintime-1.2.1/common/po/ar.po0000644000175000017500000012176313530533316016021 0ustar germargermar# Arabic translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:18+0000\n" "Last-Translator: Germar \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "فشل في حفظ الإعداد: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "فشل في جلب الإعداد: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "الملف الشخصي \"%s\" موجود بالفعل" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "لا يُمكنك إزالة آخر ملف شخصي !" #: ../../common/config.py:77 msgid "Disabled" msgstr "مُعطل" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "في كل اقلاع/اعادة اقلاع" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "كل ٥ دقائق" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "كل ١٠ دقائق" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "كل ٣٠ دقيقة" #: ../../common/config.py:82 msgid "Every hour" msgstr "كل ساعة" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "كل ساعتان" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "كل ٤ ساعات" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "كل ٦ ساعات" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "كل ١٢ ساعات" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "ساعات مخصصة" #: ../../common/config.py:88 msgid "Every Day" msgstr "كل يوم" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "عند وصل وسيط تخزين (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "كل أسبوع" #: ../../common/config.py:92 msgid "Every Month" msgstr "كل شهر" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "يوم(أيام)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "أسبوع(أسابيع)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "سنة(سنين)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "شهور" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " إختباري!" #: ../../common/config.py:129 msgid "Local" msgstr "محلي" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "مفتاح SSH خاص" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "التعمية" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "تشفير SSH" #: ../../common/config.py:135 msgid "Default" msgstr "إفتراضيّ" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "الملف الشخصي الرئيسي" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "الملف الشخصي: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "مُجلد اللقطات غير صالح !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "يجب أن تُحدد على الأقل مُجلداً واحداً للنسخ الأحتياطي !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "لا يُمكنك أن تُضَمْن مُجلد النسخ الإحتياطي !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "لا يُمكنك أن تُضَمْن مُجلد نسخ إحتياطي فرعي !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ليس مُجلداً !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "لا يستطيع الكتابة على %s\n" "هل انت مُتأكد بأن لديك حق الكتابة ؟" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "نسخ الروابط (احصل علي محتوي العنوان الرمزي)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "خيارات الخبراء" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "لا يستطيع إيجاد crontab.\n" "ِِِِِِِِِِهل أنت مُتأكد بأن cron مثبت فعلاً ؟\n" "أن لم يكن كذلك فعليك بإظهار جميع نُسخ الإحتياطية التلّقائية." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "فشك كتابة crontab جديد" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "تعذر العثور على UUID لـ \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "أأنشئ مجلدا مشفرا جديدا؟" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "ألغِ" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "رجاء أكد كلمة السر" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "الكلمتان مختلفتان" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "تحوي النسخة 1.7.2 من encfs على علة مع خيار --reverse، رجاء حدث encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "خذ لقطة" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s ليس عضوا في مجموعة 'fuse'.\n" " شغل 'sudo adduser %(user)s fuse'. لتطبيق التغييرات سجّل الخروج ثم ادخل.\n" "ألق نظرة على 'man backintime' لمزيد من التعليمات." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "نقطة الضم %s ليست فارغة" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "فشل" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "إستعادة التراخيص:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "تم" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "لا يستطيع إيجاد مُجلد اللقطات.\n" "إذا كان في قرص قابل للإزالة من فضلك وَصْلّهُ." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "ينتظر %s ثانية." msgstr[1] "ينتظر %s ثواني." msgstr[2] "ينتظر %s ثانية." msgstr[3] "ينتظر %s ثواني." msgstr[4] "ينتظر %s ثانية." msgstr[5] "ينتظر %s ثواني." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "فشل بأخذ لقطة %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "يُنْهيّ" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "لا يُمكن إنشاء مُجلد: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "أحفظ ملف التعديل ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "أحفظ ترخيص ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "لا يُمكن إزالة مُجلد: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "خذ لقطة" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "تعذرت إعادة تسمية %(new_path)s إلى %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "إزالة ذكية" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "أزل اللقطات القديمة" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "حاول أبقاء حد أدنى من المساحة فارغة" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "بأخطاء" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "الآن" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "تعذر ضم %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "تعذر فتح مفتاح ssh الخاص. إما أن كلمة السر خاطئة أو أنها غير متوفرة لـcron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "لم يوجد %s في ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "أستخدم تدقيق المجموع لِكشف التغيُّرات" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "حدث قائمة اللقطات" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "اسم اللقطة" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "أزل اللقطة" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "عرض سجل اللقطات" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "عرض اخر سجل" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "إعدادات" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "أغلق" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "أطفئ النظام بعد اكتمال أخذ اللقطة." #: ../../qt/app.py:149 msgid "Exit" msgstr "أخرج" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "مُساعدة" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "موقع إلكتروني" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "سجل التغييرات" #: ../../qt/app.py:167 msgid "FAQ" msgstr "الأسئلة الأكثر شيوعاً" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "إسأل سُؤالاً" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "بلّغ عن عِلة" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "عنْ" #: ../../qt/app.py:204 msgid "Up" msgstr "أعلى" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "أظهر الملفات المخفيّة" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "إسترجع" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "إسترجع إلى ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "لقطات" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "إختصارات" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "لا يُمكن إيجاد مُجلد اللقطات.\n" "إذا كان على قرص قابل للإزالة من فضلك وَصْلّهُ ومن ثم أضغط موافق" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "يعمل:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "تم، لا حاجة للنسخ الاحتياطي" #: ../../qt/app.py:723 msgid "Error:" msgstr "خطأ:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "السرعة:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "عام" #: ../../qt/app.py:795 msgid "Root" msgstr "جذر" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "مجلدات النسخ الاحتياطي" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "هل أنت مُتأكد بأنك تُريد إزالة اللقطة:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "هل أنت متأكد من إستعادة هذه الملفات:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "أعرض مُحتوى القرص الحالي" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "لقطة: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "أعرض اللقطة المُعِدة في %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "إسترجع '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "إسترجع '%s' إلى ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "المؤلفون" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "الترجمات" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "الرخصة" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "ملف شخصي:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "مُرَشِح:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "كل" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "أخطاء" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "تغييرات" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "معلومات" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] خطأ، [I] معلومات، [C] غيّر" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "خطأ" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "يعمل..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "اليوم" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "البارحة" #: ../../qt/qttools.py:229 msgid "This week" msgstr "هذا الأسبوع" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "الأسبوع الماضي" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "هذه ليست لقطة بلا عرض حي لملفاتك المحلية" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "اعرض السجل كاملا" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "تعديل" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "أضف" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "أزل" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "عام" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "أين سيتم حفظ اللقطات" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "المجلد" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "إعدادات SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "المُضيف:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "المنفذ:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "مستخدم:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "مُتقدم" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "جدول" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "يوم:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "يوم الأسبوع:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "ساعة:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "ساعات:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "كل:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "ضمْن" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "ضمْن ملفات ومُجلدات" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "أضف ملف" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "أضف مُجلد" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "أستثني" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "إستثني الأنماط, ملفات أو مُجلدات" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "مُوصى بشدة:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "إستثناء الملفات الأكبر من: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "إزالة-تلقائية" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "أقدم من:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "إذا كانت المساحة الفارغة أقل من:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "أبقي كل اللقطات حتى نهاية" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "يوم (أيّام)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "أبقي لقطة واحدة ليوم واحد حتى النهاية" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "أبقي لقطة واحدة للأسبوع حتى النهاية" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "أسبوع(أسابيع)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "أبقي لقطة واحدة لكل شهر حتى النهاية" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "شهر(أشهر)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "أبقي لقطة واحدة للسنة وهكذا لكل السنين" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "لا تُزيل اللقطات المُسماّة" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "خيارات" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "فَعْلّ التنبيهات" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "عطلّ اللقطات عندما تعمل بالجهاز على البطارية" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "حالة الطاقة غير متوفرة من النظام" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "أستمر عند الأخطاء (أبقي اللقطات الغير مُكتملة)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "مستوي السجل:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "لا شيء" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "تغييرات & أخطاء" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "غيّر هذه الخيارات فقط عندما تكون واثق مما تفعله !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "في الجهاز المحلي" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "حِفاظ ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "المُحافظة على الصفات المُوسعة (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "أنسخ الروابط الغير الآمنة (تعمل فقط مع الروابط الأساسية)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "الإفتراضي" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "إستعادة الإعداد" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "ملف شخصي جديد" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "أعِد تسمية الملف الشخصي" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "هل أنت مُتأكد بأنك تُريد حذف ملف الشخصي \"%s\" ؟" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "إستثني نمط" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "إستثني ملف" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "إستثني مُجلد" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "ضمْن ملف" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "ضمْن مُجلد" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "هل أنت مُتأكد بأنك تُريد تغيير مُجلد اللقطات ؟" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "لم يتم إيجاد الإعداد" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "خيارات الاختلافات" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "الأمر :" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "الموسطات:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "استعمل ١٪ و ٢٪ لِمسار الموسطات" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "سرد لقطات المُختلفة فقط" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "فحص بعمق (أكثر دقة, ولكن بطيء)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "احذف" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "تحديد الكل" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "فرق" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "أذهب إلى" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "لا تستطيع مُقارنة اللقطة بنفسها" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "الأمر لم يُعثر عليه: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/el.po0000644000175000017500000011050013530533316016002 0ustar germargermar# Greek translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Germar \n" "Language-Team: Greek \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Το προφίλ \"%s\" υπάρχει ήδη !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Αδύνατη η αφαίρεση του τελευταίου προφίλ !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Απενεργοποιημένο" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Σε κάθε εκκίνηση/επανεκκίνηση" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Κάθε 5 λεπτά" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Κάθε 10 λεπτά" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Κάθε 30 λεπτά" #: ../../common/config.py:82 msgid "Every hour" msgstr "Κάθε ώρα" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Κάθε 2 ώρες" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Κάθε 4 ώρες" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Κάθε 6 ώρες" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Κάθε 12 ώρες" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Καθημερινά" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Όταν συνδέεται δίσκος" #: ../../common/config.py:91 msgid "Every Week" msgstr "Κάθε εβδομάδα" #: ../../common/config.py:92 msgid "Every Month" msgstr "Κάθε μήνα" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Ημέρα(ες)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Εβδομάδα(ες)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Έτος(η)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "Τοπικό" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Τοπικό κρυπτογραφημένο" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Κρυπτογράφηση" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH κρυπτογραφημένο" #: ../../common/config.py:135 msgid "Default" msgstr "Προεπιλογή" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Κύριο Προφίλ" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Προφίλ: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Ο φάκελος στιγμιοτύπων δεν είναι έγκυρος !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Πρέπει να διαλέξετε τουλάχιστον ένα φάκελο για backup!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Δεν μπορείτε να συμπεριλάβετε φάκελο backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Δεν μπορείτε να συμπεριλάβετε υποφάκελο backup !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "Το %s δεν είναι φάκελος !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Αδύνατη η εγγραφή στο: %s\n" "Είστε σίγουροι ότι έχετε δικαίωμα εγγραφής;" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Δε βρέθηκε crontab.\n" "Είστε σίγουροι ότι το cron είναι εγκατεστημένο ;\n" "Αν όχι, θα πρέπει να απενεργοποιήσετε όλα τα αυτοματοποιημένα back up." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Δεν βρέθηκε UUID για \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Δημιουργία νέου κρυπτογραφημένου φακέλου;" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Ακύρωση" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Παρακαλώ επιβεβαιώστε τον κωδικό" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Ο κωδικός δεν ταιριάζει" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Λήψη στιγμιοτύπου" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "ΑΠΟΤΥΧΙΑ" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Δε βρέθηκε ο φάκελος στιγμιοτύπων.\n" "Εάν βρίσκεται σε αφαιρούμενη συσκευή, παρακαλώ συνδέστε την." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Αναμονή %s δευτερόλεπτο." msgstr[1] "Αναμονή %s δευτερόλεπτα." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Αποτυχία λήψης στιγμιοτύπου %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Οριστικοποίηση" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Αδύνατη η δημιουργία του φακέλου: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Λήψη στιγμιοτύπου" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "ΜΕ ΛΑΘΗ !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Τώρα" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "" #: ../../qt/app.py:204 msgid "Up" msgstr "" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:220 msgid "Today" msgstr "" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "" #: ../../qt/qttools.py:229 msgid "This week" msgstr "" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/bs.po0000644000175000017500000010567113530533316016023 0ustar germargermar# Bosnian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:09+0000\n" "Last-Translator: Germar \n" "Language-Team: Bosnian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" već postoji !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Ne možeš izbrisati zadnji profil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Isključeno" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Svakih 5 minuta" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Svakih 10 minuta" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Svaki dan" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Svake sedmice" #: ../../common/config.py:92 msgid "Every Month" msgstr "Svaki mjesec" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dan(i)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Sedmica(e)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Godina(e)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Glavni profil!" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Folder za slike zaslona nije validan !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Moraš izabrati najmanje jedan folder za rezervu !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Ne možeš dodati folder rezerve !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nije direktorij !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Završeno" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nemoguće kreirati direktorij: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Spremi dozvole ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nemoguće izbrisati direktorij: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Pametno brisanje" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Sad" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Postavke" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Izlaz" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomoć" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O" #: ../../qt/app.py:204 msgid "Up" msgstr "Gore" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Prikaži skrivene datoteke" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Obnovi" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Prečice" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalno" #: ../../qt/app.py:795 msgid "Root" msgstr "Korijen" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Pogledaj trenutni sadržaj diska" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Danas" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Jučer" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ove sedmice" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Prošle sedmice" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Opšte" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Uključi" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Dodaje datoteku" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Dodaj direktorij" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Isključi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatsko brisanje" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Starije od:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ako je sloboni prostor manji od:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opcije" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Uključi obavijesti" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Uključi direktorij" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komanda:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Koristite %1 i %2 za parametre putanje" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Idi na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Komanda nije pronađena: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/cs.po0000644000175000017500000015126013530533316016017 0ustar germargermar# Czech translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-06-03 09:02+0000\n" "Last-Translator: Pavel Borecki \n" "Language-Team: Czech \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "Language: cs\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Nastavení se nepodařilo uložit: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Nastavení se nepodařilo načíst: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil „%s“ už existuje!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nelze odebrat poslední zbývající profil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Vypnuto" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Při každém startu/restartu počítače" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Každých 5 minut" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Každých 10 minut" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Každých 30 minut" #: ../../common/config.py:82 msgid "Every hour" msgstr "Každou hodinu" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Každé 2 hodiny" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Každé 4 hodiny" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Každých 6 hodin" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Každých 12 hodin" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Vlastní interval" #: ../../common/config.py:88 msgid "Every Day" msgstr "Každý den" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Opakovaně (jako anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Při připojení (flash)disku (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Každý týden" #: ../../common/config.py:92 msgid "Every Month" msgstr "Každý měsíc" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dnů" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Týdnů" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Let" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Hodin" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Měsíců" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTÁLNÍ!" #: ../../common/config.py:129 msgid "Local" msgstr "Na tomto počítači" #: ../../common/config.py:130 msgid "SSH" msgstr "Na jiném stroji (skrze SSH tunel)" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Soukromou část SSH klíče" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Na tomto počítači – v šifrované podobě" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Šifrování" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "Na jiném stroji (skrze SSH tunel) – v šifrované podobě" #: ../../common/config.py:135 msgid "Default" msgstr "Výchozí" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hlavní profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: „%s“" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Složka zachycených stavů není platná!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Vyberte alespoň jednu složku, kterou zálohovat!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "" "Složku se zálohami nelze zahrnout mezi zálohované položky (zacyklení)!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" "Podsložku složky se zálohami nelze zahrnout mezi zálohované položky " "(zacyklení)!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s není složka!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" "Kolonka Stroj/Uživatel/Identifikátor-profilu nemůže zůstat nevyplněná!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nedaří se zapisovat do: %s\n" "Máte zde oprávnění k zápisu?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Cílový souborový systém pro „%(path)s“ je FAT a ten nepodporuje pevné odkazy " "(hardlink). Použijte namísto něj nějaký přirozený Linuxový souborový systém." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "Cílový souborový systém pro „%(path)s“ je SMB síťové sdílení. Ověřte, že " "tamní SMB server podporuje symbolické odkazy (symlink), případně v " "„%(expertOptions)s“ zapněte „%(copyLinks)s“" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopírovat až cíle odkazů (obejde symbolické odkazy)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Pokročilé předvolby" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "Cílový souborový systém pro '%(path)s je sshfs sdílení. sshfs nepodporuje " "pevné odkazy (hardlink). Použijte namísto toho přímo SSH režim." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Nedaří se nalézt soubor s naplánovanými úlohami (crontab).\n" "Opravdu máte nainstalovaný plánovač cron?\n" "V případě že ne, měli byste vypnout veškeré automatizované zálohování." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Nepodařilo se zapsat novou úlohu (crontab)." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Nepodařilo se nainstalovat Udev pravidlo pro profil %(profile_id)s, protože " "systémová služba DBus „%(dbus_interface)s“ nebyla k dispozici" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Plán, používající správce zařízení udev, nefunguje v režimu %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Nedaří se najít univerzálně jedinečný identifkátor (UUID) pro „%s“" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Nedaří se připojit (mount) „%(command)s“:\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Nastavení pro šifrovanou složku nebylo nalezeno." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Vytvořit novou šifrovanou složku?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Storno" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Potvrďte heslo" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Zadání hesla se neshodují" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "Implementace encfs verze 1.7.2 a starší obsahují chybu v předvolbě --reverse " ". Přejděte na novější verzi encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Pořídit zachycený stav" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Vyskytly se dva stejné otisky v hash_id %s. Zvyšte celkovou hodnotu " "parametru hash_collision a zkuste to znovu." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Nedaří se odpojit (umount) %(proc)s z %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" "%(proc)s nebylo nalezeno. Nainstalujte např. pomocí %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s není členem skupiny fuse.\n" " Spusťte příkaz: sudo adduser %(user)s fuse . Aby se změny projevily, bude " "nutné se odhlásit a znovu přihlásit.\n" "Další pokyny naleznete v manuálové stránce aplikace (man backintime)." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" "Přípojný bod (složka) %s není prázdný (obsahuje soubory a/nebo složky)." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Časový limit zámku procesu připojování (mount)" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil „%(profile)s“: Zadejte heslo pro %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Tento záznam událostí byl dekódován pomocí automatického vyhledávacího " "vzorce\n" "### Pokud některá umístění nejsou dekódována, můžete je dekódovat ručně, " "pomocí:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "NEZDAŘILO SE" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Obnovit přístupová práva:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Dokončeno" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" "Zálohování bylo odloženo, protože stroj je nyní napájen pouze z akumulátoru" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Nedaří se nalézt složku se zachycenými stavy.\n" "Pokud se nachází na vyjímatelném zařízení, připojte ho." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Čekání %s sekundu." msgstr[1] "Čekání %s sekundy." msgstr[2] "Čekání %s sekund." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Pořízení zachyceného stavu %s se nezdařilo!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Dokončování" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nedaří se vytvořit složku: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Ukládání souboru s nastaveními…" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Ukládání přístupových práv…" #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "Nalezen pozůstatek „%s“ ve kterém lze pokračovat." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Odebírání složky „%s“, zanechané minulým průchodem" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nelze odstranit složku: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Pořizování zachyceného stavu…" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "Nic se nezměnilo, pořízení nového zachyceného stavu není nutné" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Nelze přejmenovat %(new_path)s na %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Postupné odstranění" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Odstranění starých zachycených stavů" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Pokus o zachování neobsazeného prostoru, jak je nastaveno…" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" "Pokus o zachování alespoň %d%% volných pozic pro soubory a složky (inode)…" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "S CHYBAMI!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nyní" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "%s se nedaří připojit (mount)" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Nedaří se odemknout soukromou část ssh klíče. Heslo je buď chybně zadané " "nebo není k dispozici plánovači cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Ověření uživatele %(user)s na stroji %(host)s pomocí ssh klíče se nezdařilo. " "Další pokyny naleznete v manuálové stránce aplikace (man backintime)." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Použití šifry %(cipher)s se na stroji %(host)s nezdařilo:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s nebyl nalezen v souboru ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Umístění na protistraně existuje, ale není to složka:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Do vzdáleného umístění nelze zapisovat:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Umístění na protistraně nemá nastaveno oprávnění ke spouštění (tj. nelze do " "něho vstoupit):\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Umístění na protistraně se nedaří vytvořit:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "Ověření dostupnosti stroje (ping) %s nebylo úspěšné. Stroj je buď vypnutý, " "nebo je zadaná nesprávná IP adresa." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Protějšek, stroj %(host)s nepodporuje „%(command)s“:\n" "%(err)s\n" "Další pokyny naleznete v manuálové stránce aplikace (man backintime)" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Kontrolní příkazy na stroji %(host)s vrátily neznámou chybu:\n" "%(err)s\n" "Další pokyny naleznete v manuálové stránce aplikace (man backintime)" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Na protějšku, stroji %s nejsou podporovány pevné odkazy (hardlink)" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Kopírovat veřejnou část ssh klíče „%(pubkey)s“ na stroj „%(host)s“ na " "protistraně.\n" "Zadejte heslo k uživatelskému účtu „%(user)s“:" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Pořídit zachycený stav a opatřit ho kontrolními součty" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" "Zda se soubory, určené k zálohování změnily zjišťovat pomocí jejich " "kontrolního součtu (přesnější)" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Pozastavit pořizování zachyceného stavu" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Pokračovat v pořizování zachyceného stavu" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Ukončit toto pořizování zachyceného stavu" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Znovu načíst seznam zachycených stavů" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nazvat zachycený stav" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Odstranit zachycený stav" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Zobrazit záznam událostí pořizování zachyceného stavu" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Zobrazit záznam nedávných událostí" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Nastavení" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Vypnout počítač po dokončení úlohy" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Po pořízení zachyceného stavu vypnout počítač." #: ../../qt/app.py:149 msgid "Exit" msgstr "Ukončit aplikaci" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Nápověda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Nápověda k souboru s nastaveními" #: ../../qt/app.py:163 msgid "Website" msgstr "Webové stránky projektu" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Co je v aplikaci nového" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Často kladené dotazy (FAQ)" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Položit dotaz" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Nahlásit chybu / dát podnět" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O aplikaci" #: ../../qt/app.py:204 msgid "Up" msgstr "Přejít do nadřazené složky" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Zobrazovat skryté soubory" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Obnovit" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "Obnovit označené soubory či složky do jejich původních umístění." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Obnovit do…" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "Obnovit označené soubory či složky do nového umístění." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Obnovit právě zobrazenou složku a veškerý její obsah do původního umístění." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Obnovit právě zobrazenou složku a veškerý její obsah do nového umístění." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Obnovit označený soubor či složku.\n" "Pokud je toto tlačítko nedostupné (vyšedlé), je to nejspíš tím, že v seznamu " "zachycených stavů (vlevo) je označena položka „%(now)s“." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Zachycené stavy" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Zachycený stav" #: ../../qt/app.py:271 msgid "View" msgstr "Zobrazit" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Klávesové zkratky" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Tato složka v aktuálně označeném\n" "zachyceném stavu neexistuje!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Přidat do seznamu zálohovaných" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Přidat do seznamu vynechaných" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "Aplikace %(appName)s postrádá nastavení. Chcete obnovit to dřívější?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Složka se zachycenými stavy nebyla nalezena.\n" "Pokud se nachází na vyjímatelném médiu, připojte ho a klikněte na OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Pokud toto okno zavřete, pak aplikace Back In Time nebude moci po dokončení " "pořízení zachyceného stavu vypnout počítač.\n" "Opravdu chcete okno zavřít?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Zpracovává se:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Dokončeno, záloha není potřebná" #: ../../qt/app.py:723 msgid "Error:" msgstr "Chyba:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Odesláno:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Rychlost:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Odhadovaný zbývající čas:" #: ../../qt/app.py:794 msgid "Global" msgstr "Celkové" #: ../../qt/app.py:795 msgid "Root" msgstr "Kořen" #: ../../qt/app.py:796 msgid "Home" msgstr "Domovská složka" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Složky pro zálohu" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Opravdu chcete odstranit zachycený stav:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Stávající soubory, které by jinak byly\n" "odebrány nebo přepsány těmi ze zálohy,\n" "zachovat a jen připojit za jejich název\n" "„%(suffix)s“." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Novější verze souborů budou před zahájením obnovy přejmenovány přidáním " "předpony %(suffix)s.\n" "Až je už nebudete potřebovat, můžete je odstranit pomocí příkazu %(cmd)s" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" "Obnovit pouze soubory které neexistují\n" "nebo jsou novější, než ty v cíli.\n" "Využívá volbu „rsync --update“." #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Odebrat novější soubory v původní složce" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Obnovit označené soubory nebo složky do původního umístění a\n" "smazat soubory/složky, které nejsou obsažené v zachyceném stavu.\n" "Toto smaže soubor/složky, které byly vynechány během pořizování\n" "zachyceného stavu!\n" "Buďte velmi opatrní!!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" "Opravdu chcete obnovit tyto soubory\n" "do nové složky „%(path)s“:" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Opravdu chcete obnovit tyto soubory? :" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "Opravdu odebrat veškeré novější soubory v „%(path)s“?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "Opravdu chcete z původní složky odebrat veškeré novější soubory?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "VAROVÁNÍ: smazání souborů v kořenové složce souborového systému může " "způsobit nefunkčnost celého operačního systému!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Zobrazit stávající data" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Zachycený stav: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Zobrazit zachycený stav pořízený k %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Obnovit „%s“" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Obnovit „%s“ na…" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Vývojáři" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Překladatelé" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licence" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Zobrazení nedávných událostí" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Zobrazení událostí při pořizování zachyceného stavu" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtr:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Vše" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Chyby" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Změny" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informace" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Chyba (Error), [I] Informace, [C] Změna (Change)" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "dekódovat popisy umístění" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopírovat" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "Dekódovat" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "Opravdu toto chcete vynechat?" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Chyba" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Dotaz" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Spustit BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Zpracování…" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Dnes" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Včera" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Tento týden" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Minulý týden" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Toto NENÍ zachycený stav, ale pohled přímo do stávajících souborů na tomto " "počítači." #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Minulá kontrola %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Zobrazit kompletní záznam událostí" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Přejmenovat" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Upravit pro účely kompletní zálohy systému" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Přidat" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Odebrat" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Obecné" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Ukládání záloh:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Varování: %(app)s šifruje pomocí EncFS. U toho však nedávná " "bezpečnostní prověrka odhalila několik závažných nedostatků. Přečtěte si " "proto odstavec POZNÁMKA K ZABEZPEČENÍ v manuálové stránce backintime (man " "backintime)." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Kam ukládat zachycené stavy" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Složka" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Nastavení SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Stroj:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Uživatel:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Umístění:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Šifra:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Soukromá část klíče:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Soubor s klíčem" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Vytvořte nový SSH klíč, nechráněný heslem." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Heslo pro" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Uložit heslo do klíčenky desktopového prostředí" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Uložit heslo pro potřeby plánovače Cron (slabina v zabezpečení: správce " "systému si heslo může přečíst)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Pokročilé" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Úplný popis umístění zachyceného stavu: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Automatické zálohování" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Den:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Den v týdnu:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "V hodinu:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "V hodiny:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Spouštět aplikaci Back In Time opakovaně. Užitečné pokud počítač není " "zapínán pravidelně." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Co:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Spouštět aplikaci Back In Time na základě připojení určené jednotky datového " "úložiště k počítači (s tím, že četnost záloh se neřídí těmito " "odpo/připojeními, ale nastaveným intervalem mezi zálohami).\n" "Pro účely zapsání tohoto nastavení budete vyzváni k zadání hesla k " "uživatelskému účtu, který má práva pro správu systému (sudo)." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Zahrnout" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Zahrnout soubory a složky" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Přidat soubor" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Přidat složku" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Vynechat" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Varování: Zástupná vyjádření („foo*“, „[fF]oo“ a „fo?“) budou v " "režimu ukládání záloh „Na jiném stroji (skrze SSH tunel) – šifrováno“ " "přehlížena.\n" "V tomto případě je možné použít pouze zápis s oddělenými hvězdičkami " "(„foo/*“ a „foo/**/bar“)" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Vynechat zástupně vyjádřené, soubory a složky" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Důrazně doporučeno:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Přidat výchozí" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Vynechat soubory větší než: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Vynechat soubory větší, než zadaná hodnota v %(prefix)s.\n" "V případě, že není používán „Úplný rsync režim“, bude se toto týkat pouze " "nových\n" "souborů, protože pro nástroj rsync je toto předvolba přenosu, nikoli " "vynechání.\n" "Takže, velké soubory, které byly zazálohovány dříve, v zachycených stavech\n" "už zůstanou, i když se ve stávajícím stavu změní." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatické odstranění" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Starší než:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Pokud zbývá volného místa méně než:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" "Pokud z počtu složek a souborů, které lze na souborovém systému vytvořit " "(inode), zbývá méně než:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Na protistraně spusit na pozadí." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Ponechat všechny zachycené stavy za minulých" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dnů" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Ponechat jeden zachycený stav co den za minulých" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Ponechat jeden zachycený stav co týden za minulých" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "týdnů" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Ponechat jeden zachycený stav co měsíc za minulých" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "měsíců" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Ponechat jeden zachycený stav co rok za všechna leta" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Neodstraňovat ty zachycené stavy, které uživatel nějak nazval" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Předvolby" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" "Zobrazovat oznámení (prostřednictvím centra oznámení desktopového prostředí)" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Vypnout pořizování zachycených stavů při provozu na akumulátor" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Údaje o stavu napájení nejsou dispozici" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Pořizovat pouze jeden zachycený stav naráz" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Pořizování ostatních zachycených stavů bude blokováno do dokončení toho " "stávajícího.\n" "Toto je celková předvolba. Takže se týká všech profilů tohoto uživatele.\n" "Ale zapíná se pro každého uživatele zvlášť." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Zazálohovat soubory, které by byly při procesu obnovování nahrazeny" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" "Pokračovat i v případě výskytu chyb (zachovat i neúplné zachycené stavy)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Pořídit zachycený stav i v případě, že nedošlo k žádným změnám." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Podrobnost zaznamenávání událostí (log):" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Nic" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Změny a chyby" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Tyto předvolby měňte pouze v případě, že opravdu víte co děláte!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Spustit s nižší prioritou (nice):" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "když jako naplánovaná úloha (cron)" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "při zálohování na jiný stroj" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Spustit s nižší prioritou na vst./výst. (ionice):" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "při ručně spuštěném pořízení zachyceného stavu" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Spustit nástroj rsync s parametrem nocache:" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "při ukládání záloh přímo na zálohovaném počítači" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" "U naplánovaných úloh (cron) zahazovat výstup (stdout) (přesměrováním do " "/dev/null)." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" "U naplánovaných úloh (cron) zahazovat chybový výstup (stderr) (přesměrováním " "do /dev/null)." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Omezit využití přenosové kapacity, zabrané nástrojem rsync, na: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/s" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Zálohovat včetně seznamů řízení přístupu (ACL)" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Zálohovat včetně rozšířených atributů (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "V případě odkazů na soubory/složky, nacházející se mimo zálohovanou složku, " "zazálohovat přímo je a nikoli jen odkaz (funguje pouze s absolutními odkazy)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Dodatečné parametry, se kterými spouštět nástroj rsync:" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Je třeba, aby předvolby byly obklopeny uvozovkami, např. --exclude-" "from=\"/umisteni/vynechany_soubor\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Před příkazy přes SSH přidávat:" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Čím uvést každý z příkazů, spouštěným na stroji na protějšku.\n" "Proměnné je třeba zbavit jejich významu pomocí zpětného lomítka (příklad: \\" "$NECO).\n" "Toto se nedotýká nástroje rsync. Pro ten použijte předvolbu " "„%(cbRsyncOptions)s“ s\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "výchozí" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Zkontrolujte zda je stroj na protistraně dostupný na síti" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Varování: pokud je vypnuté a stroj na protějšku\n" "není dostupný, může toto vést k některým\n" "podivným chybám." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "Ověřte zda stroj na protistraně podporuje všechny nezbytné příkazy" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Varování: pokud je vypnuto a stroj na protějšku\n" "nepodporuje veškeré nezbytné příkazy,\n" "může toto vést k některým podivným chybám." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Obnovit nastavení" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "Upravit uživatelsky definované akce" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Zachycený stav, pořízený pomocí funkce kompletní záloha systému, je s " "jistotou možné obnovit pouze na stejnou jednotku datového úložiště, ze které " "byl pořízena a to ještě za předpokladu, že rozvržení oddílů na ní bude " "stejné, jaké je v zachyceném stavu. Pokus o obnovení na jednotku lišící se " "kapacitou a/nebo rozvržením oddílů může vyústit v rozbitý a tím nepoužitelný " "systém.\n" "\n" "Úprava profilu pro účely kompletní zálohy systému může vést ke změně " "některých nastavení, které jste v něm mohli udělat. Přesto pokračovat?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nový profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Přejmenovat profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Opravdu chcete smazat profil „%s“?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Vlastní doby mohou být jen čárkou oddělovaný seznam hodin (například " "8,12,18,23) nebo (např.) */3 pro pravidelné zálohy každé 3 hodiny" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Nezvolili jste soukromou část klíče pro SSH.\n" "Přejete si vytvořit novou dvojici veřejná/soukromá část nechráněná heslem?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Soubor „%(file)s“ se soukromou částí klíče neexistuje." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Přejete si zkopírovat veřejnou část vašeho SSH klíče\n" "na protější stroj a umožnit tak přihlašování bez hesla?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "Pravost stroje „%(host)s“ se nepodařilo ověřit.\n" "\n" "%(keytype)s otisk klíče je:" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Zkontrolujte tento otisk! Přejete si ho přidat do souboru „known_hosts“?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Zástupné vyjádření vynechaného" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Vynechat soubor" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Vynechat složku" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Zahrnout soubor" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "„%s“ je symbolický odkaz. Odkazovaný cíl nebude zazálohován, pokud jeho " "umístění výslovně nezahrnete.\n" "Zahrnout tedy cíl symbolického odkazu namísto odkazu samotného?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Zahrnout složku" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Opravdu změnit složku se zachycenými stavy?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "V umístění %(path)s se nepodařilo vytvořit nový SSH klíč" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "zapnuto" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "vypnuto" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Načíst dřívější nastavení" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " a přidejte svůj uživatelský účet do systémové skupiny fuse" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Přejděte k zachycenému stavu, ze kterého chcete obnovit nastavení " "%(appName)s. Umístění může vypadat nějak takto: \n" "%(samplePath)s\n" "\n" "Pokud se zachycené stavy nacházejí na síťovém úložišti nebo jsou šifrované, " "bude třeba toto umístění nejprve ručně připojit. V případě, že jsou zálohy " "ukládány na vzdálený stroj prostřednictvím SSH tunelu, je také třeba " "zajistit přihlašování k tomuto stroji%(addFuse)s pomocí klíče.\n" "Další pokyny naleznete v manuálové stránce aplikace (man backintime)." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Nebylo nalezeno žádné nastavení" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" "Skript s uživatelsky definovanými akcemi postrádá řádek určující jeho " "interpret (#!/bin/sh)." #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" "Soubor se skriptem uživatelsky definovaných akcí nemá nastavený příznak " "spustitelné." #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Předvolby porovnávání (diff)" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Příkaz:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametry:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Jako parametry umístění použít %1 a %2" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Vypsat pouze odlišné zachycené stavy" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Vypsat pouze zachycené stavy, shodné s: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Hloubková kontrola (přesnější, ale pomalejší)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Smazat" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Vybrat vše" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Porovnat" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Přejít na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Porovnávat zachycený stav s ním samotným nedává smysl" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Příkaz nebyl nalezen: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Opravdu chcete vymazat „%(file)s“ ze zachyceného stavu „%(snapshot_id)s?“\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "Opravdu chcete vymazat „%(file)s“ z %(count)d zachycených stavů?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "VAROVÁNÍ: Tuto operaci nelze vzít zpět!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Vynechat „%s“ z budoucích zachycených stavů?" backintime-1.2.1/common/po/zh_TW.po0000644000175000017500000010743713530533316016454 0ustar germargermar# Chinese (Traditional) translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:12+0000\n" "Last-Translator: Germar \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "\"%s\"設定檔已經存在!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "你不能刪除最後一個設定檔!" #: ../../common/config.py:77 msgid "Disabled" msgstr "關閉" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "每五分鐘" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "每十分鐘" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "每天" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "每週" #: ../../common/config.py:92 msgid "Every Month" msgstr "每月" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "天" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "週" #: ../../common/config.py:98 msgid "Year(s)" msgstr "年" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "主要設定檔" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "設定檔:\"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "快照資料夾不存在!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "必須選擇一個資料夾進行備份" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "不能包含備份資料夾" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "不能包含備份子目錄" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s並不是資料夾!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "不能寫入:%s\n" "請確認是否有寫入權限?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "進階選項" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "找不到crontab檔案!\n" "請確認cron是否安裝?\n" "如果沒有的話,你應該停用所有自動備份。" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "進行快照" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "完成" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "快照資料夾不存在。\n" "若存在於移動儲存設備,請插入裝置" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "等待%s秒。" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "快照 %s 執行失敗!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "關閉光碟中" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "無法新增資料夾:%s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "保留組態檔..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "保留存取權限..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "無法刪除資料夾:%s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "進行快照" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "智慧移除" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "刪除快照" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "嘗試保留最小剩餘空間" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "現在" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "快照名稱" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "刪除快照" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "設定" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "離開" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "求助" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "網站" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "關於" #: ../../qt/app.py:204 msgid "Up" msgstr "向上" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "顯示隱藏檔案" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "還原" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "快照" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "快速鍵" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "快照資料夾不存在。\n" "若存在於移動儲存設備,請插入裝置並確認" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "運作中 :" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "已完成,不需要進行備份" #: ../../qt/app.py:723 msgid "Error:" msgstr "錯誤:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "全域設定" #: ../../qt/app.py:795 msgid "Root" msgstr "主目錄" #: ../../qt/app.py:796 msgid "Home" msgstr "家目錄" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "備份資料夾" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "確認要刪除此快照:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "檢視目前磁碟內容" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "快照:%s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "檢視於%s完成之快照" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "設定組合:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "作業中..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "今天" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "昨天" #: ../../qt/qttools.py:229 msgid "This week" msgstr "本週" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "上週" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "編輯" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "一般" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "快照存放位置" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "排程" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "時:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "包含" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "新增檔案" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "新增資料夾" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "不包含" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "自動移除" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "時間超過:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "剩餘空間少於:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "不要移除命名的快照" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "選項" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "開啟通知" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "使用電池時停用快照功能" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "無法獲得系統電源狀態" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "新增設定檔" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "重新命名設定檔" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "確認刪除設定檔\"%s\"" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "排除樣式" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "排除檔案" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "排除資料夾" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "包含檔案" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "包含資料夾" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "確認修改快照資料夾" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "比對選項" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "指令:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "參數:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "使用%1和%2作為路徑參數" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "差異比較" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "前往" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "無法進行快照自我比對" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "指令不存在:%s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/jv.po0000644000175000017500000010421013530533316016022 0ustar germargermar# Javanese translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2009-04-17 14:06+0000\n" "Last-Translator: Rahman Yusri Aftian \n" "Language-Team: Javanese \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 != 0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "" #: ../../common/config.py:77 msgid "Disabled" msgstr "Gak Digawe" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Sak Ben 5 Menit" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Sak Ben 10 Menit" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Sak Ben Dino" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Sak Ben Minggu" #: ../../common/config.py:92 msgid "Every Month" msgstr "Sak Ben Wulan" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "" #: ../../common/config.py:98 msgid "Year(s)" msgstr "" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "" #: ../../qt/app.py:204 msgid "Up" msgstr "" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:220 msgid "Today" msgstr "" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "" #: ../../qt/qttools.py:229 msgid "This week" msgstr "" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/et.po0000644000175000017500000011003313530533316016013 0ustar germargermar# Estonian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Tauno Erik \n" "Language-Team: Estonian \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profiil \"%s\" on juba olemas!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Sa ei saa eemaldada viimast profiili!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Välja lülitatud" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Igal käivitamisel/taaskäivitamisel" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Iga 5 minuti tagant" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Iga 10 minuti tagant" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Iga päev" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Iga nädal" #: ../../common/config.py:92 msgid "Every Month" msgstr "Iga kuu" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Päev(a)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Nädal(at)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Aasta(t)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Peamine profiil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profiil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Tõmmise kataloog ei ole kehtiv!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Sa pead valima vähemalt ühe kataloogi tagavarakoopia tegemiseks!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Sa ei saa kaasata tagavarakoopia kataloogi ennast!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Sa ei saa kaasata tagavarakoopia kataloogis olevaid katalooge!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ei ole kataloog!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Ei saa kirjutada: %s\n" "Oled kindel, et sul kirjutamis õigused?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Võta tõmmis" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "EBAÕNNESTUS" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Taastamise õigused:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Valmis" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Ei leia tagavarakoopia kataloogi.\n" "Kui see on eemaldatav seade palun ühenda see." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Lõpetan" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Ei saa luua kataloogi: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Salvesta seade fail ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Salvesta õigused ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ei saa eemaldada kataloogi: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Võta tõmmis" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Tark eemaldamine" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Eemalda vanad tõmmised" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "VIGATEGA!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nüüd" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Uuenda tõmmiste nimekirja" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Tõmmise Nimi" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Eemalda Tõmmis" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Vaata Tõmmise Logi" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Vaata Viimast Logi" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Seaded" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Välju" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Abi" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Veebileht" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Programmist" #: ../../qt/app.py:204 msgid "Up" msgstr "Üles" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Näita peidetud faile" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Taasta" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Taasata ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Tõmmis" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Otseteed" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Ei leia tõmmiste kataloogi.\n" "Kui see on eemaldataval seadmel palun ühenda see ja vajuta OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Töötan:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "Veateade:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Üleüldine" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "Kodukataloog" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Tagavarakoopia kataloogid" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Oled kindel, et tahad eemalada tõmmist:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Vaata praeguse ketta sisu" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Tõmmis: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Vaata tõmmist, mis on tehtud %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profiil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Kõik" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Veateated" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Muutused" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Teave" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Töötan..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Täna" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Eile" #: ../../qt/qttools.py:229 msgid "This week" msgstr "See nädal" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Eelmine nädal" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Muutmine" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Üldine" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Kuhu salvestada tõmmis" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Server:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Kasutaja:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Põhjalikum" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Päev:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Nädalapäev:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Tund:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Kaasa" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Kaasa failid ja kataloogid" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Lisa fail" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Lisa kaust" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Jäta välja" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Jäta välja mustrid, failid või kataloogid" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Rangelt soovitatud:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automaatselt eemalda" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Vanem kui:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Kui vabaruumi on vähem kui:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "päev(ad)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "nädal(ad)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "kuu(d)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Valikud" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Luba teated" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Logitase:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Pole" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Muudatused & Veateated" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Uus profiil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Muuda profiili nime" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Oled kindel, et tahad kustuda profiili \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Jäta välja fail" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Jäta välja kataloog" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Kaasa fail" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Kaasa katloog" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Oled kindel, et tahad muuta tõmmiste kataloogi?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Käsk:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parameetrid:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Erinevus" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Mine" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Sa ei saa võrrelda tõmmist iseendaga" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Käsku ei leitud: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/uk.po0000644000175000017500000011704613530533316016035 0ustar germargermar# Ukrainian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Germar \n" "Language-Team: Ukrainian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Профіль \"%s\" вже існує !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Ви не можете видалити останній профіль !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Вимкнено" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "При кожній загрузці/перезагрузці" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Кожні 5 хвилин" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Кожні 10 хвилин" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Щодня" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Щотижня" #: ../../common/config.py:92 msgid "Every Month" msgstr "Щомісяця" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "День(ів)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Тиждень(нів)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Роки(ів)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Основний профіль" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Профіль: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Неправильна тека" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Потрібно обрати хоча б одну теку для резервування !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Ви не можете приєднати теку резервної копії !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Ви не можете приєднати підтеку резервної копії !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s не є текою !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Неможливо записати у: %s\n" "Ви впевнені що маєете право на запис ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Копіювати посилання (слідувати за символьним посиланнях)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Розширені параметри" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Не можу знайти crontab.\n" "Ви впевнені, що cron встановлено ?\n" "Якщо ні, Вам варто вимкнути усе автоматичне резервування." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Зробити знімок" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "НЕВДАЧА" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Відновлення дозволів:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Виконано" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Не можу знайти теку знімків.\n" "Якщо вона на знімному пристрої, будь ласка приєднайте його." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Очікую %s секунду." msgstr[1] "Очікую %s секунд." msgstr[2] "Очікую %s секунд." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Не вийшло зробити знімок %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Завершення роботи" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Не можу створити теку: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Зберегти файл конфігурації ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Зберегти дозвіл ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Не можу видалити теку: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Зробити знімок" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Розумне видалення" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Видалити старі знімки" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Намагатись зберігати мінімум вільного місця" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "З ПОМИЛКАМИ!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Зараз" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Використовувати контролюну суму для виявлення змін" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Оновити список знімків" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Назва знімку" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Видалити знімок" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Переглянути журнал" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Переглянути останній журнал" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Настроювання" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Вийти" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Допомога" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Вебсайт" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Про програму" #: ../../qt/app.py:204 msgid "Up" msgstr "Вгору" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Показати приховані файли" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Відновити" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Відновлення до ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Знімки" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Скорочення" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Не можливо знайти робочу теку.\n" "Якщо вона знаходиться на змінному носії, тоді приєднайте його і натисніть ОК" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Працюю:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Виконано, резервування не потрібне" #: ../../qt/app.py:723 msgid "Error:" msgstr "Помилка:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Загальні" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Папки резервування" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Бажаєте перемістити знімок:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Переглянути вміст диску" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Знімок: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Переглянути знімок зроблений %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Відновити '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Відновлення '%s' до ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Профіль:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Фільтр:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Все" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Помилки" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Змінено" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Відомості" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Помилка, [I] Інформація, [C] Зміна" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "В процесі ..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Сьогодні" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Вчора" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Цього тижня" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Попереднього тижня" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Редагувати" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Загальне" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Де зберігати резервні копії" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Сервер:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Користувач:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Додатково" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Розклад" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "День:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Тиждень:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Година:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Включити" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Включаючи файли і папки" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Додати файл" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Додати теку" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Виключити" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Виключити шаблони, файли, або папки" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Важлива рекомендація:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Автоматичне видалення" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Старіше ніж:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Якщо вільного місця менше ніж:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "день(днів)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "тижнів" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "місяців" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Не видаляти названі резервні копії" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Параметри" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Увімкнути сповіщення" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Вимкнути резервування при роботі від батареї" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Статус живлення не доступний" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Ігнорувати помилки (зберігати незавершені копії)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Рівень ведення журналу:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Нічого" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Зміни та помилки" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Змінюйте ці налаштування тільки у випадку, якщо Ви знаєте що робите!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Зберігати ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Зберігати додаткові атрибути (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Копіювати ненадійні посилання (працює лише з абсолютними посиланнями)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Новий профіль" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Перейменувати профіль" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Ви впевнені, що хочите знищити профіль \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Виключити по шаблону" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Виключити файл" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Виключити каталог" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Включить файл" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Включить каталог" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Ви впевнені, що бажаєте змінити папку для знімків системи?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Параметри diff" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Команда:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Параметри:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Використовувати %1 та %2 до пааметрів шляху" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Список тільки знімків, що розрізняються" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Глибока перевірка (більш точна, але повільніша)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Відмінності" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Перейти до" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Неможна порівнювати резервну копію саму з собою" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Команду не знайдено: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/fo.po0000644000175000017500000010765213530533316016024 0ustar germargermar# Faroese translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:15+0000\n" "Last-Translator: Germar \n" "Language-Team: Faroese \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Umhvarv \"%s\" finnst longu !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Tú kannst ikki taka tað síðsta umhvarvið burtur !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Ógilda" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Við hvørjari byrjan/endurbyrjan" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Hvønn 5 minutt" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Hvønn 10 minutt" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Hvønn dag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Hvørja viku" #: ../../common/config.py:92 msgid "Every Month" msgstr "Hvønn mánað" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(ar)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Vika(ur)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Ár" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Høvuðsumhvarv" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Umhvarv: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Støðumyndaskjáttan er ikki lóglig !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Tú má í minnsta lag velja eina skjáttu at trygdarrita !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Tú kann ikki hava trygdarritsskjáttuna við !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Tú kann ikki hava eina trygdarritsskjáttu við !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s er ikki ein skjatta" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Kann ikki skriva til: %s\n" "Hevur tú skrivi rættindi ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Framkomnir kostir" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Kann ikki finna crontab.\n" "Er tú viss/ur í at cron er innlagt ?\n" "Um so ikk er, eigur tú at ógilda allar sjálvvirknar trygdarritingar." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Tak eina løtumynd" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Liðugt" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Bíði %s sekund." msgstr[1] "Bíði %s sekund." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Kann ikki stovna skjáttuna: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Goymi samansetingarfíluna ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Goymi loyvi ...." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Kaann ikki taka burtur skjáttuna: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tak eina løtumynd" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Tak gamlar støðumyndir burtir" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Royn at halda minstamark av tøkum plássi" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "VIÐ VILLUM !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nú" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Navn á støðumynd" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Tak støðumynd burtur" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Instillingar" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Far úr" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjálp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Heimasíða" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Um forritið" #: ../../qt/app.py:204 msgid "Up" msgstr "Upp" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Vís fjaldar fílur" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Endurstovna" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Støðumyndir" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Snarvegir" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Arbeiði:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Liðug, eingin trygdarriting neyðug" #: ../../qt/app.py:723 msgid "Error:" msgstr "Villa:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Heiltøkur" #: ../../qt/app.py:795 msgid "Root" msgstr "Rót" #: ../../qt/app.py:796 msgid "Home" msgstr "Heim" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Trygdarritingar-skjáttur" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Er tú viss/ur í at taka støðumyndina burtur:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Sýn núverandi innihald á diski" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Støðumynd: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Sýn støðumyndina ið gjørd varð við %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Umhvarv:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtur:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Alt" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Villur" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Broytingar" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Upplýsingar" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Arbeiði..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Í dag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Í gjár" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Henda vikan" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Fyrra vikan" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Ritstjórna" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Alment" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Hvar skullu støðumyndirnar goymast" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Vertur:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Brúkari:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Framkomið" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Skrá" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Tími:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Tak við" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Legg fílu til" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Legg skjáttu til" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Útiloka" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Eldri enn:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Um tað tøka plássið er minni enn:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Kostir" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Virkja kunningar" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Einki" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Broytingar & brek" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nýtt umhvarv" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Nýnevn umhvarv" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Er tú viss/ur í at strika umhvarvið \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Tak fílu við" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Tak skjáttur við" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Er tú viss/ur í at broyta støðumyndaskjáttu ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Stýriboð:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Far til" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Tú kannst ikki samanbera eina støðumynd við sær sjálvari" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Stýriboð ikki funni: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/en_CA.po0000644000175000017500000010754313530533316016364 0ustar germargermar# English (Canada) translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Germar \n" "Language-Team: English (Canada) \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profile \"%s\" already exists!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "You can't remove the last profile!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Disabled" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Every 5 minutes" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Every 10 minutes" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Every Day" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Every Week" #: ../../common/config.py:92 msgid "Every Month" msgstr "Every Month" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Day(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Week(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Year(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Main profile" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profile: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Snapshots folder is not valid!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "You must select at least one folder to backup!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "You can't include backup folder!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "You can't include a backup sub-folder!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s is not a folder!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Can't write to: %s\n" "Are you sure you have write access?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Expert Options" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Take snapshot" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Done" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Can't find snapshots folder.\n" "If it is on a removable drive, please plug it in." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Waiting %s second." msgstr[1] "Waiting %s seconds." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalizing" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Can't create folder: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Save config file ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Save permission..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Can't remove folder: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Take snapshot" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart remove" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Remove old snapshots" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Try to keep min free space" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Now" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Snapshot Name" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Remove Snapshot" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Settings" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Exit" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Help" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Website" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "About" #: ../../qt/app.py:204 msgid "Up" msgstr "Up" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Show hidden files" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restore" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snapshots" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Shortcuts" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Can't find snapshots folder.\n" "If it is on a removable drive, please plug it in and then press OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Working:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Done, no backup needed" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Backup folders" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Are you sure you want to remove the snapshot\n" "\"%s\"?" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "View the current disk content" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snapshot: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "View the snapshot made at %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profile:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Working..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Today" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Yesterday" #: ../../qt/qttools.py:229 msgid "This week" msgstr "This week" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Last week" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Edit" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "General" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Where to save snapshots" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Schedule" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Include" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Add file" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Add folder" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exclude" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto-remove" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Older than:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "If free space is less than:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Don't remove named snapshots" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Options" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Enable notifications" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Disable snapshots when on battery" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Power status not available from system" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "New profile" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Rename profile" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Are you sure you want to delete the profile \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Exclude pattern" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exclude file" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exclude folder" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Include folder" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Are you sure you want to change snapshots folder?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff Options" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Command:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parameters:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Use %1 and %2 for path parameters" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Go To" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "You can't compare a snapshot to itself" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Command not found: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/ca.po0000644000175000017500000011522113530533316015772 0ustar germargermar# Catalan translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 17:57+0000\n" "Last-Translator: Mario Rodrigo \n" "Language-Team: Catalan \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "El perfil \"%s\" ja existeix !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "No es pot esborrar el darrer perfil !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Deshabilitat" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "En cada inici/reinici" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Cada 5 minuts" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Cada 10 minuts" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Cada 30 minuts" #: ../../common/config.py:82 msgid "Every hour" msgstr "Cada hora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Cada 2 hores" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Cada 4 hores" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Cada 6 hores" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Cada 12 hores" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Hores personalitzades" #: ../../common/config.py:88 msgid "Every Day" msgstr "Cada dia" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Cada setmana" #: ../../common/config.py:92 msgid "Every Month" msgstr "Cada mes" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dia(es)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Setmana(es)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Any(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Clau privada SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Xifrat local" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Xifrat" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "Xifrat amb SSH" #: ../../common/config.py:135 msgid "Default" msgstr "Predeterminat" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Perfil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Perfil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "La carpeta d'instantànies no es vàlida!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Heu de seleccionar al menys una carpeta per salvaguardar!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "No podeu incloure la carpeta de còpies de seguretat!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "No podeu incloure una subcarpeta de còpies de seguretat!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s no és una carpeta!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "No es pot escriure a: %s\n" "Esteu segurs de que teniu permisos d'escriptura ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copia enllaços (desarbitra els enllaços simbòlics)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opcions avançades" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "No es pot trobar el 'crontab'.\n" "Esteu segur que el 'cron' està instal·lat ?\n" "Si no és així, deveu desactivar totes les còpies automàtiques." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "No s'ha pogut muntar '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "No s'ha trobat la configuració de la carpeta xifrada." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Voleu crear una nova carpeta xifrada?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Canceŀla" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Confirmeu la contrasenya" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "La contrasenya no concorda" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Fes una instantània" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s no és membre del grup 'fuse'.\n" " Executeu 'sudo adduser %(user)s fuse'. Per aplicar els canvis cal que " "sortiu i torneu a entrar a la sessió.\n" "Mireu a 'man backintime' per a més instruccions." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "el punt de muntatge %s no està buit." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "HA FALLAT" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Restaura els permisos:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Fet" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Postposant la còpia de seguretat mentre s'utilitza la bateria" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "No es pot trobar la carpeta d'instantànies.\n" "Si està en una unitat extraïble, connecteu-la." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Esperant %s segon." msgstr[1] "Esperant %s segons." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "S'ha produït un error fent la instantània %s!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalitzant" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "No es pot crear la carpeta: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Guarda el fixter de configuració ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Guarda els permisos ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "No es pot eliminar la carpeta: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Fes una instantània" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Eliminació intel·ligent" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Elimina les instantànies antigues" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Proveu de mantenir un minim d'espai lliure" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "AMB ERRORS !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Ara" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "No s'ha pogut muntar %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Utilitza el checksum per detectar canvis" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Refresca la llista d'instantànies" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nom de la instantània" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Elimina la instantània" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Visualitza el log d'instantànies" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Visualitza l'últim log" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Configuració" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Sortir" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ajuda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Lloc web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "PMF" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Fer una pregunta" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Informar d'un error" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Quant a" #: ../../qt/app.py:204 msgid "Up" msgstr "Amunt" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostra els fitxers ocults" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaura" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Restaura a..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Instantànies" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Dreceres" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "No es pot trobar la carpeta d'instantànies.\n" "Si es troba en una unitat extraïble, connecteu-la i premeu OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "S'està treballant:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Fet, no ha estat necessari crear una còpia de seguretat" #: ../../qt/app.py:723 msgid "Error:" msgstr "S'ha produït un error:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Arrel" #: ../../qt/app.py:796 msgid "Home" msgstr "Inici" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Carpetes de còpia de seguretat" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Esteu segur que voleu eliminar la instantània:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Visualitza el contingut actual del disc" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Instantània: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Visualitza la instantània creada a %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Restaura '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Restaura '%s' a..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Perfil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtra:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Tots" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Errors" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Canvis" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informacions" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E]Errors, [I]Informació, [C]Canvia" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "S'està treballant..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Avui" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ahir" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Aquesta setmana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "La setmana passada" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Edita" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "General" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Mode:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "A on guardar Instanànies" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Ordinador amfitrió:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Usuari:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Camí:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Xifrat:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Clau privada:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Contrasenya" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avançat" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Planificació" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dia:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Dia de la setmana:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Hores:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inclou" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Inclou fitxers i carpetes" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Afegeix un fitxer" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Afegeix un directori" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exclou" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Exclou fitxers i carpetes" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Molt recomanat" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Eliminació automàtica" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Més antics que:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Si l'espai lliure és inferior a:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Mantingues totes les instantànies durant els darrers" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dia(es)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Mantingues una instantània al dia durant els darrers" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Mantingues una instantània a la setmana durant les darreres" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "setmana(es)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Mantingues una instantània al mes durant els darrers" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mes(os)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Mantingues una instantània a l'any durant els darrers" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "No eliminis les instantànies amb nom" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opcions" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activa les notificacions" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Desactiva les instantànies treballant en bateria" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "No està disponible l'estat de l'energia" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continua amb errors (Mantingues instantànies incompletes)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Nivell de log" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Cap" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Canvis i Errors" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Canvia aquestes opcions només si saps el que estas fent !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preserva ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preserva els atributs extesos (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Copia links insegurs (Només funciona amb links absoluts)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Perfil nou" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Reanomena el perfil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Esteu segurs de que voleu eliminar el perfil \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Les hores personalitzades només poden ser una llista d'hores separades per " "comes (p.e. 8,12,18,23) o */3 per fer còpies periòdiques cada 3 hores" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Exclou el patró" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exclou el fitxer" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exclou el directori" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Afegeix un fitxer" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inclou el directori" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Esteu segur que voleu cambiar el directori d'instantànies?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opcions de diff" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Ordre:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Paràmetres:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Utilitza %1 i %2 com a paràmetres de les rutes" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "LLista només les instantànies diferents" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Comprovació a fons (més acurada, però lenta)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Vés a" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "No podeu compara una instantània amb sí mateixa" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "No s'ha trobat l'ordre: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/ru.po0000644000175000017500000013314213530533316016037 0ustar germargermar# Russian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:04+0000\n" "Last-Translator: Makar \n" "Language-Team: Russian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Просмотр содержимого текущего диска" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Добавить каталог" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Автоматическое удаление" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Исключить каталог" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Включить каталог" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Не удалось сохранить конфигурацию: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Не удалось загрузить конфигурацию: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Профиль \"%s\" уже существует!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Невозможно удалить последний профиль!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Отключён" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "При каждой загрузке системы" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Каждые 5 минут" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Каждые 10 минут" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Каждые 30 минут" #: ../../common/config.py:82 msgid "Every hour" msgstr "Каждый час" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Каждые 2 часа" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Каждые 4 часа" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Каждые 6 часов" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Каждые 12 часов" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Другое" #: ../../common/config.py:88 msgid "Every Day" msgstr "Каждый день" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Когда подключено устройство (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Каждую неделю" #: ../../common/config.py:92 msgid "Every Month" msgstr "Каждый месяц" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Дней (Дня)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Недель" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Лет (Года)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Час(ов)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Месяцев" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " ЭКСПЕРИМЕНТАЛЬНО!" #: ../../common/config.py:129 msgid "Local" msgstr "Локально" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "личный ключ SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Локальное шифрование" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Шифрование" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH зашифровано" #: ../../common/config.py:135 msgid "Default" msgstr "По умолчанию" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Основной профиль" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Профиль: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Каталог резервных копий задан неверно!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Вы должны выбрать хотя бы одну папку для резервного копирования!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Вы не можете добавить папку для резервного копирования!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Вы не можете включить в архив вложенные каталоги" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s не папка !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Сервер/Пользователь/Профиль-ID не должны быть пустыми!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Не удаётся произвести запись в: %s\n" "Вы уверены, что имеете право на запись?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Файловая система на '%(path)s' отформатирована в FAT которая не поддерживает " "\"жесткие\" ссылки. Используйте нативные файловые системы для Linux." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Копировать ссылки (разыменование символических ссылок)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Расширенные настройки" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Невозможно найти crontab\n" "Вы уверены, что cron установлен?\n" "Если не установлен, вы должны отключить автоматическое резервное копирование." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Не удалось создать новую задачу cron" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Не удалось установить Udev правило для профиля %(profile_id)s. DBus сервис " "'%(dbus_interface)s' недоступен" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Расписание udev неработает в этом режиме %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Не удалось найти UUID для \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Не могу смонтировать '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Не найдена конфигурация для зашифрованной директории." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Создать новую зашифрованную папку?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Отмена" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Пожалуйста, подтвердите пароль" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Пароль не подходит" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs версии 1.7.2 и ранние имеют баг с опцией --reverse. Пожалуйста, " "обновите encfs." #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Сделать резервную копию" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "В hash_id %s возникла хеш-коллизия. Увеличьте глобальную переменую " "hash_collision и попробуйте снова." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Не удалось размонтировать %(proc)s из %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "%(proc)s не надено. Пожалуйста установить нап. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s не является членом группы 'fuse'.\n" " Запустите 'sudo adduser %(user)s fuse'. Чтобы применить изменения, выйдите " "и войдите снова.\n" "Выполните 'man backintime' для дальнейших инструкций." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "точка монтирования %s не пустая." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Профиль '%(profile)s': Введите пароль для %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "НЕУСПЕШНО" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Восстановить права:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Готово" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Невозможно найти каталог резервных копий!\n" "Если он находится на съёмном диске, пожалуйста, подключите его." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Ждать %s сек." msgstr[1] "Ждать %s сек." msgstr[2] "Ждать %s сек." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Не удалось создать резервную копию %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Окончание" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Не могу создать каталог: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Сохранить конфигурационный файл..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Сохранить разрешение ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Не могу удалить каталог: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Сделать резервную копию" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Не удалось переименовать %(new_path)s в %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Умное удаление" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Удалить старые резервные копии" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Стараться сохранять минимальное свободное место" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "С ОШИБКАМИ!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Сейчас" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Не могу смонтировать %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Не удалось разблокировать приватный ключ ssh. Неверный пароль или пароль не " "подходит для cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s не найдено в ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Удаленный путь доступен, но это не дериктория:\n" "%s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Удаленный путь не доступен для записи:\n" "%s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Не удалось создать удаленный путь:\n" "%s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "Отсутсвует подключение к %s. Сервер не отвечает или неправильный адрес." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Использовать контрольную сумму для обнаружения изменений" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Обновить список резервных копий" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Название резервной копии" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Удалить резервную копию" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Просмотр журнала снимков состояния" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Просмотреть последний журнал" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Настройки" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Выключить" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Выключить систему после завершения задания." #: ../../qt/app.py:149 msgid "Exit" msgstr "Выйти" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Справка" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Справка о файле конфигурации" #: ../../qt/app.py:163 msgid "Website" msgstr "Сайт" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Список изменений" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Часто задаваемые вопросы" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Задать вопрос" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Сообщить об ошибке" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "О программе" #: ../../qt/app.py:204 msgid "Up" msgstr "Вверх" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Показать скрытые файлы" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Восстановить" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Восстановить в ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Резервные копии" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Резервная копия" #: ../../qt/app.py:271 msgid "View" msgstr "Вид" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Ярлыки" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Включить" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Добавить в исключения" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s не настроена. Вы хотите восстановить предыдущую конфигурацию?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Невозможно найти каталог резервных копий!\n" "Если он находится на съёмном диске, пожалуйста, подключите его и нажмите ОК" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Работаю:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Всё сделано, сохранять ничего не надо" #: ../../qt/app.py:723 msgid "Error:" msgstr "Ошибка:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Отправлено:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Скорость:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Общее" #: ../../qt/app.py:795 msgid "Root" msgstr "Корневой каталог" #: ../../qt/app.py:796 msgid "Home" msgstr "Домашний каталог" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Резервные директории" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Вы уверены что вы хотите удалить резервную копию:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Вы действительно хотите восстановить этот файл(ы):" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Резервная копия: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Посмотреть резервную копию, которая сделана %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Восстановить '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Восстановить '%s' в ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Разработчики" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Переводы" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Лицензия" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Профиль:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Фильтр:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Все" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Ошибки" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Изменения" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Оповещения" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Ошибка, [I] Информация, [C] Изменение" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Ошибка" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Вопрос" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Запустить BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Выполняется..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Сегодня" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Вчера" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Эта неделя" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "На прошлой неделе" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Показать весь лог" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Изменить" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Добавить" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Удалить" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Общие" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Режим:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Место для сохранения резервных копий" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Папка" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Найстроки SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Хост:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Порт:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Пользователь:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Путь:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Приватный ключ:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Файл ключа" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Пароль" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Сохранить пароль в связку ключей" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "Закешировать пароль для Cron (Внимание: root может прочитать пароль)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Дополнительно" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Расписание" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "День:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "День недели:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Часы:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Часы:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Каждые:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Запускать Back In Time как только устройство подключено (только раз в " "несколько дней).\n" "Будет запрошен sudo-пароль." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Включить" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Включить файлы и папки" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Добавить файл" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Исключить" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Исключить шаблоны, файлы или папки" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Очень рекомендуется:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Добавить по умолчанию" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Старее чем:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Если свободного места меньше чем:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Хранить все копии за последние" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "дней" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Хранить дневную копию за последние" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Хранить недельную копию за последние" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "недель" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Хранить месячную копию за последние" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "месяцев" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Хранить годовую копию за все время" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Не удалять переименованные резервные копии" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Опции" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Включить уведомления" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Отключить создание резервных копий при работе от батареи" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Статус питания недоступен." #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Игнорировать ошибки (сохранять незавершенные копии)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Уровень журналирования" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Нет" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Изменения и ошибки" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Изменяйте эти параметры, только если вы точно знаете, что делаете!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "как задача cron" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "на удаленном сервере" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Запустить 'rsync' как 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "на локальной машине" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " КБ/сек" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Сохранять ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Сохранять дополнительные атрибуты (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Копировать небезопасные ссылки (работает только с абсолютными ссылками)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Добавить префикс для SSH команд" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "по умолчанию" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Восстановить конфигурацию" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Новый профиль" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Переименовать профиль" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Вы действительно хотите удалить профиль \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Исключать папку по шаблону" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Исключая файл" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Включить файл" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" "Вы уверены, что хотите изменить каталог для хранения резервных копий?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "включено" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "отключено" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Восстановить настройки" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " и добавить пользователя в группу 'fuse'" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Не найдено конфигурации" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Параметры сравнения" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Команда:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Параметры:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Использовать %1 и %2 для комманды" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Показать только различающиеся снимки состояния" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Глубокая проверка (более точная, но медленная)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Удалить" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Выделить всё" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Различие" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Перейти к" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Нельзя сравнивать резервную копию с саму с собой" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Команда не найдена: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/de.po0000644000175000017500000014457413530533316016014 0ustar germargermar# German translation of Back In Time # Copyright (C) 2008-2009 Oprea Dan # This file is distributed under the same license as the Back In Time package. # msgid "" msgstr "" "Project-Id-Version: Back In Time 0.9.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2019-04-14 16:10+0000\n" "Last-Translator: Germar \n" "Language-Team: German/Germany \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil »%s« besteht bereits!" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Speichern der Konfiguration ist fehlgeschlagen: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Laden der Konfiguration ist fehlgeschlagen: %s" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Das letzte Profil kann nicht entfernt werden!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Deaktiviert" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Bei jedem Start/Neustart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Alle 5 Minuten" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Alle 10 Minuten" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Alle 30 Minuten" #: ../../common/config.py:82 msgid "Every hour" msgstr "Jede Stunde" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Alle 2 Stunden" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Alle 4 Stunden" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Alle 6 Stunden" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Alle 12 Stunden" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Benutzerdefinierte Stunden" #: ../../common/config.py:88 msgid "Every Day" msgstr "Jeden Tag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Wiederholend (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Sobald die Festplatte angeschlossen ist (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Jede Woche" #: ../../common/config.py:92 msgid "Every Month" msgstr "Jeden Monat" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Tag(e)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Woche(n)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Jahr(e)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Stunde(n)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Monat(e)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTELL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Privater SSH-Schlüssel" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokal verschlüsselt" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Verschlüsselung" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH verschlüsselt" #: ../../common/config.py:135 msgid "Default" msgstr "Standard" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hauptprofil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: »%s«" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Schnappschussordner ist ungültig!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Wenigstens einen Ordner zum Sichern auswählen!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Sicherungsordner kann nicht hinzugefügt werden!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Sicherungsunterordner kann nicht hinzugefügt werden!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ist kein Ordner!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Rechner/Benutzer/Profil darf nicht leer sein!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nach %s kann nicht geschrieben werden.\n" "Sind Sie sicher, dass Sie Schreibzugriff haben?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Das Zieldateisystem für »%(path)s« ist mit FAT formatiert, welches harte " "Verknüpfungen nicht unterstützt. Bitte benutzen Sie ein echtes Linux-" "Dateisystem." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "Das Zieldateisystem für »%(path)s« ist eine eingehängte SMB-Freigabe. Bitte " "stellen Sie sicher, dass der entfernte SMB-Server symbolische Verknüpfungen " "unterstützt oder aktivieren Sie »%(copyLinks)s« in »%(expertOptions)s«." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Verknüpfungen kopieren (symbolische Verknüpfungen zurückverfolgen)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Einstellungen für Experten" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "Das Zieldateisystem für »%(path)s« ist eine eingehängte sshfs-Freigabe. " "sshfs unterstützt keine harten Verknüpfungen. Bitte benutzen Sie stattdessen " "den SSH-Modus." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Crontab wurde nicht gefunden!\n" "Sind Sie sicher, dass cron installiert ist?\n" "Wenn nicht, sollten Sie alle automatischen Sicherungen deaktivieren!" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Schreiben eines neuen crontab ist fehlgeschlagen." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "udev-Regel für Profil %(profile_id)s konnte nicht erstellt werden. DBus-" "Dienst »%(dbus_interface)s« war nicht verfügbar." #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "udev-Zeitplan funktioniert nicht mit Modus %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "UUID für »%s« konnte nicht gefunden werden" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "»%(command)s« kann nicht eingehängt werden:\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Einstellungen für den verschlüsselten Ordner nicht gefunden." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Soll ein neuer verschlüsselter Ordner erstellt werden?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Abbruch" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Bitte Passwort bestätigen." #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Passwort stimmt nicht überein." #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs-Version 1.7.2 und davor haben einen Fehler mit der Option --reverse. " "Bitte encfs aktualisieren." #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Schnappschuss erstellen" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Prüfsummenkollision in hash_id %s. Der globale Wert für hash_collision wird " "heraufgesetzt und erneut versucht." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "%(proc)s von %(mountpoint)s kann nicht ausgehängt werden" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" "%(proc)s nicht gefunden. Bitte z.B. mit %(install_command)s installieren" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s ist kein Mitglied der Gruppe »fuse«.\n" "Bitte »sudo adduser %(user)s fuse« ausführen. Zum Anwenden der Änderungen " "bitte einmal ab- und wieder anmelden.\n" "Weitere Informationen unter »man backintime«." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "Einhängepunkt %s ist nicht leer." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Zeitüberschreitung beim Einhängen." #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil »%(profile)s«: Bitte Passwort für %(mode)s eingeben: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Dieses Protokoll wurde mit automatischen Suchmustern entschlüsselt.\n" "### Wenn einige Dateinamen nicht entschlüsselt wurden, können sie manuell " "entschlüsselt werden mit:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "GESCHEITERT" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Berechtigungen wiederherstellen:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Fertig" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Sicherungen verschieben, solange der Rechner im Akkubetrieb ist." #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Schnappschussordner konnte nicht gefunden werden.\n" "Wenn es ein Wechsellaufwerk ist, bitte verbinden!" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "%s Sekunde wird gewartet." msgstr[1] "%s Sekunden wird gewartet." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Schnappschuss %s konnte nicht erstellt werden!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalisierung läuft" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Ordner %s kann nicht erstellt werden." #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Konfigurationsdatei wird gespeichert …" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Zugriffsrechte werden gespeichert …" #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "Überbleibsel »%s« gefunden, welche fortgesetzt werden können." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Übrig gebliebener Ordner »%s« vom letzten Vorgang wird entfernt" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ordner %s kann nicht entfernt werden." #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Schnappschuss wird erstellt" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "Keine Änderungen, es ist kein neuer Schnappschuss notwendig" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Umbenennen von %(new_path)s in %(path)s fehlgeschlagen." #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Intelligentes Löschen" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Alte Schnappschüsse werden entfernt" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Das Minimum an freiem Speicher wird freigehalten" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Es wird versucht mindestens %d%% freie Inodes zu behalten" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MIT FEHLERN!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Jetzt" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "%s kann nicht eingebunden werden" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Privater SSH-Schlüssel konnte nicht entsperrt werden. Passwort falsch oder " "für cron nicht verfügbar." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Passwortlose Anmeldung von %(user)s@%(host)s fehlgeschlagen. Weitere " "Informationen unter »man backintime«." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Verschlüsselungsverfahren %(cipher)s fehlgeschlagen für %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s nicht in ssh_known_hosts gefunden." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Der Pfad existiert auf dem entfernten Rechner, ist aber kein Verzeichnis:\n" "%s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Der Pfad auf dem entfernten Rechner ist nicht beschreibbar:\n" "%s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Der Pfad auf dem entfernten Rechner ist nicht ausführbar:\n" "%s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Erstellen des Pfades auf dem entfernten Rechner fehlgeschlagen:\n" "%s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "Ping %s fehlgeschlagen. Rechner ist ausgeschaltet oder hat eine falsche " "Adresse." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Entfernter Rechner %(host)s unterstützt »%(command)s« nicht:\n" "%(err)s\n" "Weitere Informationen unter »man backintime«." #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Überprüfen der Befehle auf dem Rechner %(host)s gab unbekanntem Fehler " "zurück:\n" "%(err)s\n" "Weitere Informationen unter »man backintime«." #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Der entfernte Rechner %s unterstützt keine Hardlinks" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Den öffentlichen SSH-Schlüssel »%(pubkey)s« zum entfernten Rechner " "»%(host)s« kopieren.\n" "Bitte das Password für »%(user)s« eingeben:" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Schnappschuss mit Prüfsummen erstellen" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Prüfsumme benutzen, um Änderungen zu erkennen" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Schnappschuss anhalten" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Schnappschuss fortsetzen" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Schnappschuss stoppen" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Schnappschussliste auffrischen" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Schnappschussname" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Schnappschuss entfernen" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Schnappschussprotokoll ansehen" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Letztes Protokoll ansehen" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Einstellungen" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Herunterfahren" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Rechner herunterfahren, nachdem der Schnappschuss erstellt wurde." #: ../../qt/app.py:149 msgid "Exit" msgstr "Beenden" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hilfe" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Konfigurationsdateihilfe" #: ../../qt/app.py:163 msgid "Website" msgstr "Internetseite" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Änderungsprotokoll" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Häufige Fragen (FAQ)" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Frage stellen" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Fehlerbericht einsenden" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Über" #: ../../qt/app.py:204 msgid "Up" msgstr "Hoch" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Versteckte Dateien anzeigen" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Wiederherstellen" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "Ausgewählte Dateien oder Ordner zum Originalort wiederherstellen." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Wiederherstellen zu …" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" "Ausgewählte Dateien oder Ordner zu einer neuen Position wiederherstellen." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Aktuell ausgewählten Ordner und den kompletten Inhalt zum Originalort " "wiederherstellen." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Aktuell ausgewählten Ordner und den kompletten Inhalt zu einer neuen " "Position wiederherstellen." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Stellt die ausgewählte Datei oder den Ordner wieder her.\n" "Wenn dieser Knopf deaktiviert ist, liegt das vermutlich daran, dass " "»%(now)s« in der linken Schnappschussliste aktiviert ist." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Schnappschüsse" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Schnappschuss" #: ../../qt/app.py:271 msgid "View" msgstr "Ansicht" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Verknüpfungen" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Dieser Ordner ist im aktuell ausgewählten\n" "Schnappschuss nicht vorhanden!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Einbeziehen" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Ausschließen" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s ist noch nicht konfiguriert. Möchten Sie vorherige Einstellungen " "wiederherstellen?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Schnappschussordner wurde nicht gefunden.\n" "Wenn es ein Wechsellaufwerk ist, bitte verbinden und dann OK drücken." #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Wenn Sie das Fenster schließen, kann »Back In Time« den Rechner nicht " "herunterfahren, sobald die Sicherung beendet ist.\n" "Wirklich schließen?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "In Bearbeitung:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Fertig, keine Sicherung notwendig." #: ../../qt/app.py:723 msgid "Error:" msgstr "Fehler:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Gesendet:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Geschwindigkeit:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Verbleibend:" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Wurzelverzeichnis" #: ../../qt/app.py:796 msgid "Home" msgstr "Persönlicher Ordner" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Sicherungsordner" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Sind Sie sicher, dass Sie den Schnappschuss löschen wollen:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Lokale Dateien vor dem Überschreiben oder entfernen\n" "sichern mit angehängtem »%(suffix)s«." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Neuere Dateiversionen werden mit einem angehängten »%(suffix)s« vor dem " "Wiederherstellen umbenannt.\n" "Wenn sie nicht mehr benötigt werden, können Sie sie mit »%(cmd)s« entfernen." #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" "Nur Dateien wiederherstellen, die im Zielordner nicht existieren\n" "oder im Backup neuer sind als im Zielordner.\n" "Dies nutzt die \"rsync --update\" Option." #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Neuere Dateien im Originalordner entfernen" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Ausgewählte Dateien oder Ordner zur original Position wiederherstellen und\n" "Dateien/Ordner löschen, die nicht in dem Schnappschuss enthalten sind.\n" "Das wird Dateien/Ordner löschen, die während des Erstellen des " "Schnappschusses ausgeschlossen waren!\n" "Seien Sie Vorsichtig!!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" "Wollen Sie diese Datei(en) wirklich\n" "in dem neuen Ordner wiederherstellen?\n" "»%(path)s«:" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Möchten Sie wirklich diese Datei(en) wiederherstellen:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" "Sind Sie sicher, dass Sie alle neueren Dateien in »%(path)s« entfernen " "wollen?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Sind Sie sicher, dass Sie alle neueren Dateien in dem Ursprungsordner " "löschen möchten?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "ACHTUNG: das Löschen von Dateien im Wurzelverzeichnis kann das komplette " "System zerstören!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Den aktuellen Festplatteninhalt anzeigen" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Schnappschuss: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Den Schnappschuss vom %s anzeigen" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "»%s« wiederherstellen" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "»%s« wiederherstellen zu …" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Entwickler" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Übersetzungen" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Lizenz" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Letzte Protokollansicht" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Schnappschussprotokollansicht" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Alle(s)" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Fehler" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Änderungen" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informationen" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Fehler, [I] Information, [C] Änderung" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "Pfade entschlüsseln" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopieren" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "Dekodieren" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "Wollen Sie das ausschließen?" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Fehler" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Frage" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "BackInTime starten" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Wird bearbeitet …" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Heute" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Gestern" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Diese Woche" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Letzte Woche" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Das hier ist KEIN Schnappschuss, aber eine aktuellen Ansicht Ihrer lokalen " "Daten." #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Letzte Überprüfung %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Komplettes Protokoll anzeigen" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Bearbeiten" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Für vollständige Systemsicherung verändern" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Hinzufügen" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Entfernen" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Allgemein" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modus:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "ACHTUNG: %(app)s nutzt EncFS zur Verschlüsselung. Eine " "Sicherheitsüberprüfung hat kürzlich mehrere mögliche Angriffsmethoden " "aufgedeckt. Weitere Informationen im Kapitel »A NOTE ON SECURITY« unter »man " "backintime«." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Speicherort für Schnappschüsse" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Ordner" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH-Einstellungen" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Rechner:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Benutzer:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Pfad:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Verschlüsselung:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Privater Schlüssel:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Schlüsseldatei" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Einen neuen SSH-Schlüssel ohne Passwort erstellen." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Passwort" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Passwort im Schlüsselbund speicheren" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Passwort für Cron zwischenspeichern (Sicherheitsproblem: Systemverwalter " "»root« kann das Passwort lesen)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Erweitert" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Vollständiger Schnappschusspfad: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Zeitplan" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Tag:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Wochentag:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Stunde:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Stunden:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "»Back In Time« wiederholt starten. Das ist nützlich, wenn der Rechner nicht " "immer an ist." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Jede:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "»Back In Time« starten, sobald die Festplatte angeschlossen wurde (nur " "einmal alle X Tage).\n" "Sie werden nach Ihrem sudo-Passwort gefragt werden." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Einbeziehen" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Dateien und Ordner einbeziehen" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Datei hinzufügen" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Ordner hinzufügen" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Ausschließen" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "ACHTUNG: Platzhalter (»foo*«, »[fF]oo«, »fo?«) werden im Modus »SSH " "verschlüsselt« ignoriert.\n" "Nur einzeln stehende Sternchen sind erlaubt (»foo/*«, »foo/**/bar«)" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Ausschlussmuster, Dateien oder Ordner" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Dringend empfohlen:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Voreinstellungen hinzufügen" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Dateien ausschließen, die größer sind als: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Schließt Dateien aus, die größer als der Wert in %(prefix)s sind.\n" "Wenn »Voller rsync-Modus« deaktiviert ist, wird das nur neue Dateien " "betreffen,\n" "weil das für rsync eine Transfervorgang ist, keine Ausschlussoption.\n" "Das heißt, dass größere Dateien, die bereits zuvor gesichert wurden,\n" "auch in neuen Schnappschüssen gesichert werden, selbst wenn sie verändert " "wurden." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatisch entfernen" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Älter als:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Falls freier Speicher kleiner als:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Falls freie Inodes kleiner sind als:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Auf entferntem Rechner im Hintergrund ausführen." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Alle Schnappschüsse behalten, der letzten" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "Tag(e)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Einen Schnappschuss pro Tag behalten, der letzten" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Einen Schnappschuss pro Woche behalten, der letzten" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "Woche(n)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Einen Schnappschuss pro Monat behalten, der letzten" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "Monat(e)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Einen Schnappschuss pro Jahr behalten, für alle Jahre" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Benannte Schnappschüsse nicht entfernen" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Optionen" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Benachrichtigungen aktivieren" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Schnappschüsse im Akkubetrieb deaktivieren" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Energiestatus des Systems nicht verfügbar." #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Nur einen Schnappschuss zur selben Zeit ausführen" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Andere Schnappschüsse werden blockiert, bis der aktuelle Schnappschuss " "fertiggestellt ist.\n" "Das ist eine globale Option, die alle Profile dieses Benutzers betreffen " "wird.\n" "Die Option muss aber auch für alle anderen Benutzer aktiviert werden." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Beim Wiederherstellen Dateien ersetzen" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Bei Fehlern fortfahren (unvollständige Schnappschüsse behalten)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Neuen Schnappschuss unabhängig von Änderungen erstellen." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Protokollierungsstufe:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Kein(e)" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Änderungen & Fehler" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Ändern Sie diese Optionen nur, wenn Sie sich wirklich sicher sind!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "»nice« starten:" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "als cron-job" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "auf entfernten Rechnern" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "»ionice« starten:" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "wenn ein manueller Schnappschuss erstellt wird" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "»rsync« mit »nocache« starten:" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "auf dem lokalen Rechner" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "stdout in cronjobs nach /dev/null umleiten." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "stderr in cronjobs nach /dev/null umleiten." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "rsync-Bandbreite drosseln: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " kB/s" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "ACLs bewahren" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Erweiterte Attribute (xattr) bewahren" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Unsichere Verknüpfungen kopieren (funktioniert nur mit absoluten " "Verknüpfungen)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Weitere Optionen zu rsync hinzufügen" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Optionen müssen mit schließendem Anführungszeichen angegeben werden z.B.: --" "exclude-from=\"/pfad/zu/meiner_ausschlussdatei\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Präfix zum SSH-Befehl hinzufügen" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Präfix der vor jedem Befehl auf dem Entfernten Rechner ausgeführt wird.\n" "Variablen müssen mit \\$FOO geschützt werden.\n" "Dies betrifft nicht rsync. Um einen Präfix für rsync hinzuzufügen\n" "muss \"%(cbRsyncOptions)s\" mit\n" "%(rsync_options_value)s genutzt werden.\n" "\n" "%(default)s: %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "Standard" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Überprüfen, ob der entfernte Rechner am Netz ist" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Achtung: Wenn dies deaktiviert ist und der entfernte Rechner\n" "nicht verfügbar ist, kann es zu einigen verwirrenden\n" "Fehlern kommen." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" "Bitte prüfen, ob der entfernte Rechner alle erforderlichen Befehle " "unterstützt" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Achtung: Wenn dies deaktiviert ist und der entfernte Rechner\n" "nicht alle erforderlichen Befehle unterstützt, kann es zu\n" "einigen verwirrenden Fehlern kommen." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Konfiguration wiederherstellen" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "Benutzerrückruf bearbeiten" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Die vollständige Systemsicherung kann nur auf der selben physikalischen " "Platte, mit den selben Festplattenpartitionen, wie er von der Quelle, einen " "Schnappschuss erstellen. Das Wiederherstellen auf einer neuen physischen " "Festplatte oder der selben Platte mit anderen Partitionen, wird " "möglicherweise ein defektes und unbrauchbares System erstellen.\n" "\n" "Die vollständige Systemsicherung wird einige Einstellungen überschreiben, " "die angepasst wurden. Fortfahren?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Neues Profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Profil umbenennen" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Sind Sie sicher, dass Sie das Profil »%s« löschen wollen?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Benutzerdefinierte Stunden, bitte als Kommata getrennte Stundenliste " "schreiben (z.B. 8,12,18,23) oder */3 für wiederholte Sicherungen alle 3 " "Stunden." #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Sie haben keine private Schlüsseldatei für SSH ausgewählt.\n" "Möchten Sie ein neues Öffentlich/Privates Schlüsselpaar ohne Passwort " "erstellen?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Die private Schlüsseldatei »%(file)s« ist nicht vorhanden." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Möchten Sie Ihren öffentlichen SSH-Schlüssel\n" "auf den entfernten Rechner kopieren,\n" "um Anmeldung ohne Passwort zu aktivieren?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "Die Echtheit des Rechners »%(host)s« kann nicht festgestellt werden.\n" "\n" "%(keytype)s Schlüsselfingerabdruck ist:" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Bitte überprüfen Sie diesen Fingerabdruck! Möchten Sie ihn zu Ihrer " "known_hosts-Datei hinzufügen?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Ausschlussmuster" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Datei ausschließen" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Ordner ausschließen" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Datei einbeziehen" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "»%s« ist eine symbolische Verknüpfung. Das verknüpfte Ziel wird nicht mit " "gesichert, wenn Sie es nicht auch hinzufügen.\n" "Möchten Sie das Ziel der Verknüpfung stattdessen hinzufügen?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Ordner einbeziehen" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Sind Sie sicher, dass Sie den Schnappschussordner ändern wollen?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Erstellen eines neuen SSH-Schlüssels in %(path)s ist fehlgeschlagen" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "Aktiviert" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "Deaktiviert" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Einstellungen wiederherstellen" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " und Ihren Benutzer zur Gruppe »fuse« hinzufügen" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Bitte ein Schnappschuss auswählen, von dem Sie die Einstellungen von " "%(appName)s wiederherstellen möchten.\n" "Der Pfad kann aussehen wie folgender: \n" "%(samplePath)s\n" "\n" "Wenn sich der Schnappschuss auf einer externen Festplatte befindet, oder " "verschlüsselt ist, muss er vorher manuell eingehängt werden. Wenn Sie den " "SSH-Modus verwenden, müssen Sie außerdem die öffentliche Schlüsselanmeldung " "zum entfernten Rechner einrichten%(addFuse)s.\n" "Weitere Informationen unter »man backintime«." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Keine Einstellungen gefunden." #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "Benutzerrückrufskript hat keine Shebang-Zeile (#!/bin/sh)." #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "Shebang im Benutzerrückrufskript ist nicht ausführbar." #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Vergleichsoptionen" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Befehl:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parameter:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "%1 und %2 als Pfadparameter verwenden" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Nur verschiedene Schnappschüsse auflisten." #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Nur gleiche Schnappschüsse auflisten zu: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Gründliche Prüfung (genauer, aber langsamer)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Löschen" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Alles auswählen" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Unterschiede" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Gehen zu" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Sie können einen Schnappschuss nicht mit sich selbst vergleichen." #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Befehl nicht gefunden: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Soll »%(file)s« wirklich in dem Schnappschuss »%(snapshot_id)s« gelöscht " "werden?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Soll »%(file)s« wirklich in %(count)d Schnappschüssen gelöscht werden?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "ACHTUNG: Das kann nicht rückgängig gemacht werden!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "»%s« von zukünftigen Schnappschüssen ausschließen?" backintime-1.2.1/common/po/updatelaunchpad.sh0000755000175000017500000000115613530533316020551 0ustar germargermar#!/bin/bash #EXCEPTIONS="es.po de.po" EXCEPTIONS="none" TRANSLATIONFILE="launchpad-export.tar.gz" rm -rf tmp mkdir tmp tar xfz $TRANSLATIONFILE -C tmp for popath in `find tmp -name \*.po`; do #echo $popath #lang=`basename $popath | cut -d- -f4` lang=`basename $popath | cut -d- -f2` #echo $lang ignore="0" for exception in $EXCEPTIONS; do if [ $lang = $exception ]; then ignore="1" break fi done if [ $ignore = "1" ]; then echo "Ignore $lang" else if [ -f $lang ]; then echo "rm $lang" rm $lang fi echo "cp $popath $lang" cp $popath $lang fi done rm -rf tmp rm $TRANSLATIONFILE backintime-1.2.1/common/po/it.po0000644000175000017500000013234513530533316016031 0ustar germargermar# Italian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2017-01-23 04:37+0000\n" "Last-Translator: Germar \n" "Language-Team: Italian \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Impossibile includere la cartella di backup !" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Fallimento nel salvataggio della configurazione: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Fallimento nel caricamento della configurazione: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Il profilo \"%s\" esiste già !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Non si può rimuovere l'ultimo profilo !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Disabilitato" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Ad ogni avvio/riavvio" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Ogni 5 minuti" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Ogni 10 minuti" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Ogni 30 minuti" #: ../../common/config.py:82 msgid "Every hour" msgstr "Ogni ora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Ogni 2 ore" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Ogni 4 ore" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Ogni 6 ore" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Ogni 12 ore" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Orario personalizzato" #: ../../common/config.py:88 msgid "Every Day" msgstr "Ogni giorno" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Ripetutamente (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Quando il drive è connesso (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Ogni settimana" #: ../../common/config.py:92 msgid "Every Month" msgstr "Ogni mese" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Giorno(i)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Settimana(e)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Anno(i)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Ora(e)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mese(i)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " SPERIMENTALE!" #: ../../common/config.py:129 msgid "Local" msgstr "Locale" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Chiave privata SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Cifratura locale" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Cifratura" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH cifrato" #: ../../common/config.py:135 msgid "Default" msgstr "Predefinito" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profilo principale" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profilo: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Cartella delle istantanee non valida !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Scegliere almeno una cartella per il backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Impossibile includere una sottocartella di backup !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s non è una cartella !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Host/Utente/Profilo non può essere vuoto!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Impossibile accedere a: %s\n" "Verificare di avere i permessi in scrittura?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Il filesystem di destinazione per '%(path)s' è formattato con FAT che non " "supporta hard-link. Per favore usa un filesystem Linux nativo." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copia collegamenti (segue i collegamenti simbolici)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opzioni per esperti" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Impossibile trovare la crontab.\n" "Verificare che cron sia installato ?\n" "Se non lo è, disattivare tutti i backup automatici." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Scrittura del nuovo crontab fallita" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Non è stato possibile installare la regola udev per il profilo " "%(profile_id)s. Il servizio DBus '%(dbus_interface)s' non era disponibile" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "La pianificazione udev non funziona con la modalità %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Impossibile trovare UUID per \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Non posso montare '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Configurazione per cartella cifrata non trovata" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Creo una nuova cartella cifrata?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Annulla" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Per favore conferma la password" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "La password non combacia" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "la versione di encfs 1.7.2 e precedenti ha un baco con l'opzione --reverse. " "Per favore aggiorna encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Prendi istantanea" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Collisione creata in hash_id %s. Incrementail valore globale hash_collision " "e prova di nuovo" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s non è un membro del gruppo'fuse'.\n" "Esegui 'sudo adduser %(user)s fuse'. Per applicare le modifiche, fai logout " "e di nuovo login.\n" "Guarda 'man backintime' per ulteriori istruzioni." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "In punto di montaggio %s non è vuoto" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Timeout nell'acquisizione del lock durante il processo di mount" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profilo '%(profile)s': Inserisci la password per %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Questo log è stato decodificato con un pattern di ricerca automatico\n" "### Se alcuni percorsi non sono decodificati, puoi decodificarli manualmente " "con:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "Fallito" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Ripristina permessi:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Fatto" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Posticipa il backup nel caso di funzionamento a batteria" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Impossibile trovare la cartella delle istantanee.\n" "Se si tratta di un disco rimovibile, collegarlo." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Aspetta %s secondo." msgstr[1] "Aspetta %s secondi." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Creazione dell'istantanea %s fallita !" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalizzazione" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Impossibile creare la cartella: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Salva il file di configurazione .." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Salva permessi ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Impossibile eliminare la cartella: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Prendi istantanea" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Non posso rinominare %(new_path)s in %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Rimozione intelligente" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Rimuovi vecchie istantanee" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Prova a tenere il minor spazio libero" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Prova a mantenere almeno il %d%% di inode liberi" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "CON ERRORI !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Adesso" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Non riesco a montare %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Non ho potuto sbloccare la chiave privata ssh. Password errata o non " "disponibile per cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Autenticazione senza password per %(user)s@%(host)s fallita. Guarda 'man " "backintime' per ulteriori istruzioni." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Cifratura %(cipher)s fallita per %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s non trovato in ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Il percorso remoto esiste, ma non è una cartella:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Il percorso remoto non è scrivibile:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Il percorso remoto non è eseguibile:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Non ho potuto create il percorso remoto:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "Il ping verso %s è fallito. L'host non funziona o l'indirizzo è sbagliato." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "L'host remoto %(host)s non supporta '%(command)s':\n" "%(err)s\n" "Guarda 'man backintime' per ulteriori istruzioni" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Il controllo dei comandi sull'host %(host)s ha restituito un errore " "sconosciuto:\n" "%(err)s\n" "Guarda 'man backintime' per ulteriori istruzioni" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "L'host remoto %s non supporta gli hard link" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Usa il checksum per scoprire i cambiamenti" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Aggiorna lista istantanee" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nome istantanea" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Rimuovi istantanea" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Visualizza log istantanea" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Visualizza ultimo log" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Impostazioni" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Arresto" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Arresta il sistema quando l'istantanea è terminata." #: ../../qt/app.py:149 msgid "Exit" msgstr "Esci" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Aiuto" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Guida al file di configurazione" #: ../../qt/app.py:163 msgid "Website" msgstr "Sito web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Registro dei cambiamenti" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Domande frequenti" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Poni una domanda" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Segnala un bug" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Informazioni" #: ../../qt/app.py:204 msgid "Up" msgstr "Su" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostrare file nascosti" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Ripristina" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Ripristina a..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Ripristina il file o la cartella selezionato/a.\n" "Se il pulsante è disabilitato molto probabilmente è perché \"%(now)s\" è " "selezionato nell'elenco delle istantanee sulla sinistra." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Istantanee" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Istantanea" #: ../../qt/app.py:271 msgid "View" msgstr "Visualizza" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Collegamenti" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Questa cartella non esiste\n" "nello snapshot selezionato al momento!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Aggiungi alle inclusioni" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Aggiungi alle esclusioni" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s non è configurato. Vuoi ripristinare una precedente " "configurazione?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Impossibile trovare la cartella delle istantanee.\n" "Se si tratta di un disco rimovibile, collegarlo e premere OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Se chiudi questa finestra Back In Time non sarà in grado di arrestare il " "sistema al termine dell'istantanea.\n" "Vuoi veramente chiuderla?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Lavoro in corso:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Fatto, nessun backup necessario" #: ../../qt/app.py:723 msgid "Error:" msgstr "Errore:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Inviati:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Velocità:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Tempo rimanente stimato:" #: ../../qt/app.py:794 msgid "Global" msgstr "Globale" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Cartelle di backup" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Sei sicuro di voler rimuovere l'istantanea:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Fai il backup dei file locali prima di sovrascriverli o\n" "di rimuoverli aggiungendo '%(suffix)s'." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Le versioni nuove dei file verranno rinominate con il suffisso '%(suffix)s' " "prima di effettuare il ripristino.\n" "Se non ne hai più bisogno, puoi rimuoverle con '%(cmd)s'" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Vuoi veramente ripristinare il/i file seguente/i:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Sei sicuro di voler rimuovere tutti i file più nuovi nella tua cartella " "originale?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "ATTENZIONE: cancellare i file nella radice del filesystem potrebbe " "danneggiare l'intero sistema!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Visualizza il contenuto corrente del disco" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Istantanea: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Visualizza l'istantanea fatta il %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Ripristina '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Riporta '%s' a..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Autori" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Traduzioni" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licenza" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profilo:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtro:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Tutti" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Errori" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Cambiamenti" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informazioni" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Errore, [I] Informazione, [C] Cambiamento" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "decodifica i percorsi" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Errore" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Domanda" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Avvia BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Lavoro in corso..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Oggi" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ieri" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Questa settimana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Scorsa settimana" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Questa NON è un'istantanea, bensì una vista attiva dei tuoi file locali" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Ultimo controllo %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Mostra il log completo" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Modifica" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Aggiungi" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Rimuovi" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Generale" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modalità:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Attenzione: %(app)s utilizza EncFS per la crittografia. Una recente " "revisione di sicurezza ha rivelato numerosi possibili vettori d'attacco in " "questa configurazione. Per favore consulta la sezione 'A NOTE ON SECURITY' " "in 'man backintime'." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Posizione delle istantanee" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Cartella" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Impostazioni di SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Host:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Porta:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Utente:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Percorso:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Cifratura:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Chiave privata:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "File chiave" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Password" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Salva la password nel gestore delle password" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Salva la password per Cron (problema di sicurezza: l'utente root può leggere " "la password)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avanzate" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Percorso completo per le istantanee: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Pianifica" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Giorno:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Giorno della settimana:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Ora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Ore:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Avvia Back In Time ripetutamente. È utile se il computer non viene avviato " "regolarmente." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Ogni:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Avvia Back In Time non appena il dispositivo viene collegato (solo una volta " "ogni X giorni).\n" "Ti verrà richiesta la tua password di sudo." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Includi" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Includi file e cartelle" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Aggiungi file" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Aggiungi cartella" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Escludi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Attenzione: le wildcard ('foo*', '[fF]oo', 'fo?') verranno ignorate " "con la modalità 'SSH cifrato'.\n" "Sono ammessi solo asterischi separati ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Esclude pattern, file o cartelle" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Fortemente raccomandato:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Aggiungi predefiniti" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Escludi file più grandi di: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Escludi file più grandi del valore in %(prefix)s.\n" "Se la modalità 'rsync completa' è disabilitata, verrà applicato solo\n" "ai file nuovi, perché per rsync si tratta di un'opzione di \n" "trasferimento, non di un'opzione di esclusione. Per questo motivo,\n" "i file che erano stati copiati precedentemente continueranno a \n" "rimanere nelle istantanee anche se sono cambiati." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Rimozione automatica" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Più vecchi di:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Se lo spazio libero è minore di:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Se gli inode liberi sono meno del:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Esegui in modo asincrono sull'host remoto" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Mantieni tutte le istantanee degli ultimi" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "giorno/i" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Mantieni un'istantanea al giorno per gli ultimi" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Mantieni un'istantanea alla settimana per le ultime" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "Settimana/e" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Mantieni un'istantanea al mese per gli ultimi" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mese/i" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Mantieni un'istantanea all'anno per tutti gli anni" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Non rimuovere le istantanee a cui è stato assegnato un nome" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opzioni" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Attivare le notifiche" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Disabilita le istantanee quando si usa la batteria" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Impossibile stabilire la modalità di alimentazione" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Esegui solo un'istantanea alla volta" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Le altre istantanee verranno bloccate finché l'istantanea corrente non sarà " "terminata.\n" "Questa è un'opzione globale, pertanto avrà effetto su tutti i profili di " "questo utente.\n" "Tuttavia devi attivare quest'opzione anche per gli altri utenti." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Esegui il backup dei file sostituiti durante il ripristino" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continua in caso di errore (mantiene un'istantanea incompleta)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" "Prendi un'istantanea anche se non ci sono modifiche rispetto alla precedente." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Livello dei log" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Nulla" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Modifica & Errori" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Cambiare questo opzioni solo se si sa cosa si sta facendo !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Esegui 'nice':" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "come cron job" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "sull'host remoto" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Esegui 'ionice':" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "quando si prende un'istantanea manuale" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Esegui 'rsync' con 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "sulla macchina locale" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Redirigi stdout verso /dev/null nei cronjob" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Redirigi stderr verso /dev/null nei cronjob" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Limita la banda utilizzata da rsync: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/s" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preserva ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preserva attributi estesi (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Copia collegamenti non verificati (funziona sono con collegamenti assoluti)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Passa opzioni addizionali ad rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Le ozioni devono essere racchiuse tra virgolette, ad esempio --exclude-" "from=\"/percorso/verso/il/mio file escluso\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Aggiungi il prefisso ai comandi SSH" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "default" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Ripristina la configurazione" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nuovo profilo" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Rinomina profilo" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Sei sicuro di voler eliminare il profilo \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Le ore personalizzate possono essere solo un elenco di ore separate da " "virgola (es. 8,12,18,23) oppure */3 per backup periodici ogni 3 ore" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Pattern di esclusione" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "File esclusi" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Cartelle Escluse" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Includi il file" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "\"%s\" è un link simbolico. La destinazione del link non sarà copiata nel " "backup fintantoché non la includerai esplicitamente.\n" "Vuoi piuttosto includere la destinazione del link simbolico?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Cartella inclusa" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Cambiare veramente la cartella delle istantanee?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "abilitato" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "disabilitato" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Ripristina impostazioni" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " ed aggiungi il tuo utente al gruppo 'fuse'" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Per favore localizza l'istantanea dalla quale vuoi ripristinare la " "configurazione di %(appName)s. Il percorso potrebbe assomigliare a:\n" "%(samplePath)s\n" "\n" "Se le tue istantanee sono su un'unità remota o se sono cifrate, devi prima " "montarle manualmente. Se usi la modalità SSH, potresti anche aver bisogno di " "configurare l'accesso all'host remoto %(addFuse)s mediante chiave pubblica.\n" "Dai un'occhiata a: 'man backintime'." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Configurazione non trovata" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opzioni Diff" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Comando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Usare %1 e %2 per i parametri del percorso" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Elenca solo istantanee differenti" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Mostra solo istantanee uguali a: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Controllo approfondito (più accurato ma più lento)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Elimina" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Seleziona tutti" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Vai a" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Non è possibile confrontare un'istantanea con se stessa" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Comando non trovato: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Vuoi veramente cancellare \"%(file)s\" nell'istantanea \"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "Vuoi veramene cancellare \"%(file)s\" in %(count)d istantanee?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "ATTENZIONE: l'operazione è irreversibile" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Escludi \"%s\" dalle istantanee future?" backintime-1.2.1/common/po/gl.po0000644000175000017500000013625613530533316016024 0ustar germargermar# Galician translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-11-16 00:05+0000\n" "Last-Translator: Marcos Lans \n" "Language-Team: Galician \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "Language: gl\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Produciuse un erro gardando a configuración: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Produciuse un erro gardando a configuración: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "O perfil «%s» xa existe" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Non pode eliminar o último perfil." #: ../../common/config.py:77 msgid "Disabled" msgstr "Desactivado" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "En todos os arranques" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Cada 5 minutos" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../../common/config.py:82 msgid "Every hour" msgstr "Cada hora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Cada dúas horas" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Cada 4 horas" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Horas personalizadas" #: ../../common/config.py:88 msgid "Every Day" msgstr "Todos os días" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Repetidamente (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Cando a unidade se conecte (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Todas as semanas" #: ../../common/config.py:92 msgid "Every Month" msgstr "Todos os meses" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "día(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "semana(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "ano(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Hora(s)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mes(es)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Chave privada SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Cifrado local" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Cifrado" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "Cifrado SSH" #: ../../common/config.py:135 msgid "Default" msgstr "Predeterminado" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Perfil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Perfil: «%s»" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "O cartafol das copias de seguranza non é correcto." #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Debe escoller polo menos un cartafol para copiar." #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Non pode incluír un cartafol da copia de seguranza." #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Non pode incluír un sub-cartafol da copia de seguranza." #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s non é un cartafol." #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "O servidor/usuario/ID do perfil non poden estar baleiros." #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Non se pode escribir en:%s\n" "Está certo de ter acceso á escritura?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "O sistema de ficheiros de destino de '%(path)s está formatado con FAT o cal " "non soporta ligazóns fortes. Use un sistema de ficheiros nativo de Linux." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "O sistema de ficheiros de destino %(path)s é unha comparticion montada de " "SMB. Asegúrese de que o servidor SMB remoto acepta symlinks ou active " "%(copyLinks)s en %(expertOptions)s." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copiar as ligazóns (seguir as ligazóns simbólicas aos ficheiros)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opcións avanzadas" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "O sistema de ficheiros de destino de %(path)s é unha compartición montada de " "sshfs. sshfs non acepta ligazóns fortes. Use o modo SSH." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Non se atopa «crontab».\n" "Está certo de que «cron» está instalado?\n" "Se non o está debería desactivar todas as copias automáticas." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Produciuse un fallo escribindo no novo crontab." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Non foi posíbel instalar a regra de Udev para o perfil %(profile_id)s. O " "servizo DBus «%(dbus_interface)s» non está dispoñíbel" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "O programador udev non funciona en modo %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Non foi posíbel atopar o UUID de \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Non é posible montar '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Non se atopou a configuración do cartafol cifrado." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Desexa crear un novo cartafol cifrado?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Cancelar" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Confirme o contrasinal" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "O contrasinal non coincide" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "A versión de encfs 1.7.2 e anteriores teñen un fallo coa opción --reverse. " "Actualice encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Facer copia" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Produciuse un conflito de hash no hash_id %s. Incremente o valor global " "hash_collision e probe de novo." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Non é posíbel desmontar %(proc)s de %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "Non foi posíbel atopar %(proc)s. Instalar p.e. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s non é membro do grupo 'fuse'.\n" " Execute 'sudo adduser %(user)s fuse'. Para aplicar os trocos reinicie a " "sesión.\n" "Vexa 'man backintime' para máis instrucións." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "o punto de montaxe %s non está libre." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Tempo de espera do bloqueo do proceso de montaxe" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Perfil '%(profile)s': Introduza o contrasinal para %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Este rexistro decodificouse cun patrón de busca automático\n" "### Se algunhas rutas non están decodificadas pode facelo manualmente con:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "FALLOU" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Restabelecer permisos:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Feito" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Atraso da copia no modo batería" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Non se pode atopar o cartafol das copias de seguranza.\n" "Se está nun dispositivo extraíbel débeo conectar." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Agardando %s segundo." msgstr[1] "Agardando %s segundos." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Produciuse un fallo durante a copia %s." #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Rematando" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Non se pode crear o cartafol: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "gardando o ficheiro de configuración..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "gardando os permisos..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "Atopáronse restos en «%s» desde os cales se pode continuar." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Eliminar o cartafol «%s» con restos da última execución" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Non se pode eliminar o cartafol: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Facer copia" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "Non se precisa unha nova copia de seguranza porque non houbo cambios" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Non é posible renomear %(new_path)s a %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Eliminación intelixente" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Eliminar as copias de seguranza antigas" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Tentar preservar o espazo libre mínimo" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Tentar manter un mínimo de %d%% inodos libres" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "HAI ERROS" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Agora" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Non é posible montar %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "Non foi posible" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Fallou a autenticación de %(user)s@%(host)s. Vexa 'man backintime' para máis " "instrucións." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Fallou o cifrado %(cipher)s para %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s non se encotrou en ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "A ruta remota existe pero non é un cartafol:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "A ruta remota non permite a escritura:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "A ruta remota non é executable:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Non foi posible crear a ruta remota:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Fallou o ping %s. O servidor está caído ou o enderezo é incorrecto." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "O servidor remoto %(host)s non permite utilizar '%(command)s':\n" "%(err)s\n" "Mire 'man backintime' para máis instrucións" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "As ordes de comprobación no servidor %(host)s devolveron un erro " "descoñecido:\n" "%(err)s\n" "Mire 'man backintime' para máis instrucións" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "O servidor remoto %s non admite hardlinks" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Facer unha copia con sumas de comprobación (checksums)" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Usar a suma de comprobación para detectar cambios" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Deter o proceso de copia" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Continuar o proceso de copia" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Parar o proceso de copia" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Actualizar a lista de copias de seguranza" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nome da copia de seguranza" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Eliminar a copia de seguranza" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Ver o rexistro de copias de seguranza" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Ver o último rexistro" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Axustes" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Apagar" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Apagar o sistema ao rematar a copia de seguranza." #: ../../qt/app.py:149 msgid "Exit" msgstr "Saír" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Axuda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Axuda para o ficheiro de configuración" #: ../../qt/app.py:163 msgid "Website" msgstr "Sitio web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Rexistro de cambios" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Fai unha pregunta" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Informar dun erro" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Sobre" #: ../../qt/app.py:204 msgid "Up" msgstr "Arriba" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostrar os ficheiros ocultos" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurar" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" "Restabelecer os ficheiros ou cartafoles seleccionados no seu destino " "orixinal." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Restablecer como ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" "Restabelecer os ficheiros ou cartafoles seleccionados nun novo destino." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Restabelecer o cartafol actual e todo o seu contido ao destino orixinal." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Restabelecer o cartafol actual e todo o seu contido a un novo destino." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Restabelecer o ficheiro ou cartafol seleccionado.\n" "Se este botón está en gris probabelmente «%(now)s» está seleccionado na " "lista de copias da esquerda." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Copias de seguranza" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Copia de seguranza" #: ../../qt/app.py:271 msgid "View" msgstr "Ver" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Atallos" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Este cartafol non existe\n" "na actual imaxe seleccionada." #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Engadir a incluír" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Engadir a excluír" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s non está configurado. Desexa restabelecer unha configuración " "anterior?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Non se pode atopar o cartafol de copias de seguranza.\n" "Se está nun dispositivo extraíbel débeo conectar e premer «Aceptar»" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Se pecha esta xanela Back In Time non poderá apagar o seu sistema cando " "remate a copia de seguranza.\n" "Desexa pechala?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "En proceso:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Rematado, non foi necesario facer unha copia de seguranza" #: ../../qt/app.py:723 msgid "Error:" msgstr "Produciuse un erro" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Enviado:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Velocidade:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Tempo:" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Inicio" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Cartafoles para copiar" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Está certo de querer eliminar a copia de seguranza?:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Copiar os ficheiros locais antes de sobrescribir ou\n" "retiralos engadíndolles un «%(suffix)s» final." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "As versións máis novas dos ficheiros renomearanse cun «%(suffix)s» antes da " "restauración.\n" "Se xa non os precisa pode eliminalos con «%(cmd)s»" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Eliminar os ficheiros máis novos do cartafol orixe" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Restabelecer os ficheiros ou cartafoles seleccionados ao destino orixinal e\n" "eliminar os ficheiros/cartafoles que no están na copia de seguranza.\n" "Isto eliminará os ficheiros/cartafoles excluídos durante a copia.\n" "Teña moito coidado." #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Confirma o restabelecemento destes ficheiros:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "Desexa eliminar os ficheiros máis novos de «%(path)s»?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Seguro que desexa eliminar todos os ficheiros novos do cartafol orixinal?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "AVISO: a eliminación de ficheiros no sistema raíz pode estragar todo o " "sistema!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Ver o contido do disco actual" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Copia de seguranza: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Ver a copia de seguranza feita en %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Restabelecer '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Restabelecer '%s' como ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Autores" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Traducións" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licenza" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Última visualización do rexistro" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Visualización do rexistro da imaxe" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Perfil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtro:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Todo" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Erros" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Cambios" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informacións" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Erro, [I] Información, [C] Cambio" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "decodificar rutas" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Copiar" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Erro" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Pregunta" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Iniciar BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "En proceso..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hoxe" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Onte" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Esta semana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "A semana pasada" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "Esta NON é unha copia senón unha vista actual dos ficheiros locais" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Última comprobación %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Mostrar o rexistro completo" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editar" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Modificar para copias de seguranza de todo o sistema" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Engadir" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Eliminar" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Xeral" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modo:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Aviso: %(app)s usa o cifrado de EncFS. Unha auditoría recente de " "seguranza mostrou varios posíbeis vectores de ataque para el. Bota unha " "ollada a «A NOTE ON SECURITY» no manual do backintime." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Onde gardar as copias de seguranza" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Cartafol" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Axustes SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Servidor:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Porto:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Usuario:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Ruta:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Cifrado:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Chave privada:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Ficheiro de chaves" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Crear unha nova chave SSH sen contrasinal." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Contrasinal" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Gardar o contrasinal no chaveiro" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Caché do contrasinal para Cron (incidencia de seguridade: root pode ler o " "contrasinal)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avanzado" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Ruta completa á copia: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Programar" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Día:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Día da semana:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Horas:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Executar Back In Time repetidamente. Útil se o computador non ten un " "funcionamento regular." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Cada:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Executar Back In Time cando o dispositivo estea conectado (só unha vez cada " "X días).\n" "Pediráselle o seu contrasinal para sudo." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Incluír" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Incluír os ficheiros e os cartafoles" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Engadir ficheiro" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Engadir cartafol" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Excluír" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Aviso: os comodíns ('foo*', '[fF]oo', 'fo?') ignoraranse no modo 'SSH " "cifrado'.\n" "Unicamente se permiten asteriscos ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Excluír os patróns, ficheiros ou cartafoles" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Altamente recomendábel:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Engadir predeterminado" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Excluír ficheiros maiores de: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Excluír os ficheiros maiores dun valor en %(prefix)s.\n" "Co «Modo resync completo» desactivado isto só afectará os novos ficheiros\n" "porque para rsync é unha opción de transferencia non unha exclusión.\n" "Por iso, os ficheiros grandes que se copiaron antes permanecerán nas copias\n" "incluso se tiveron cambios." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Eliminar automaticamente" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Máis de:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Se o espazo libre é menor de:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Se os inodos libres son menos de:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Executar en segundo plano no servidor remoto." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Conservar todas as copias dos últimos" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "día(s)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Conservar unha copia diaria dos últimos" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Conservar unha copia semanal das últimas" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "semana(s)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Conservar unha copia mensual dos últimos" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mes(es)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Conservar unha copia de seguranza anual" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Non eliminar as copias de seguranza con nome" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opcións" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activar as notificacións" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Desactivar as copias de seguranza cando estea en modo batería" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "O estado da alimentación non está dispoñíbel no sistema" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Executar só unha copia á vez" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "As demais copias bloquearanse até que remate a actual.\n" "Esta é unha opción global. Afectará a todos os perfís deste usuario.\n" "Pero tamén precisa activalo para o resto de usuarios." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Facer copia dos ficheiros substituídos na restauración" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continuar con erros (mantén as copias de seguranza incompletas)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Facer unha nova copia aínda que non houbese cambios." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Nivel de rexistro:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Ningún" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Cambios e erros" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Cambie estas opcións unicamente se sabe ben o que está a facer" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Executar «nice»:" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "como un traballo de cron" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "nun servidor remoto" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Executar «ionice»:" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "ao facer unha copia manual" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Executar «rsync» con «nocache»:" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "na máquina local" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Redireccionar stdout a /dev/null en cronjobs." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Redireccionar stderr a /dev/null en cronjobs." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Limitar o uso do largo de banda para rsync: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/seg" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preservar permisos (ACL)" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preservar os atributos estendidos (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Copiar as ligazóns inseguras (funciona unicamente con ligazóns absolutas)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Engadir as opcións adicionais a rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "As opcións deben levar comiñas p.e. --exclude-" "from=\"/ruta/ao/ficheiro_excluído\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Engadir prefixo ás ordes de SSH" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "predeterminado" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Comprobar se o servidor remoto está en liña" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "Comprobe se o servidor remoto acepta todas as ordes" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Restabelecer config." #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Facer unha copia de todo o sistema creará unha imaxe para restabelecer no " "mesmo disco(s) físico co mesmo particionado que a orixe; o restabelecemento " "nun novo disco físico ou no mesmo disco físico cun particionado distinto " "resultará nunha quebra potencial e nun sistema non usábel.\n" "\n" "A copia de seguranza do sistema completo sobrescribirá algúns axustes " "personalizados polo usuario. Continuamos?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Perfil novo" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Renomear o perfil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Está certo de eliminar o perfil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "As horas personalizadas só poden ser unha lista de horas separadas por comas " "(p.e: 8,12,18,23) ou */3 para copias periódicas cada 3 horas" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Non escolleu un ficheiro coa chave privada para o SSH.\n" "Gustaríalle xerar un par de chaves públicas/privadas sen contrasinal?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Non existe o ficheiro coa chave privada «%(file)s»." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Excluír o patrón" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Excluír o ficheiro" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Excluír o cartafol" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Incluír o ficheiro" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "«%s» é unha ligazón simbólica. O destino ligado non se copiará até que o " "inclúa.\n" "Desexa incluír tamén o destino das ligazóns simbólicas?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Incluír o cartafol" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Está certo de querer cambiar o cartafol de copias de seguranza?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Produciuse un fallo creando a nova chave SSH en %(path)s" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "activado" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "desactivado" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Restabelecer axustes" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " e engadir o seu usuario ao grupo «fuse»" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Vaia á copia de seguranza na que desexa restabelecer a configuración de " "%(appName)s. A ruta será como esta: \n" " %(samplePath)s\n" "\n" "Se as copias de seguranza están nunha unidade remota ou están cifradas debe " "montalas primeiro. Se usa o modo SSH pode necesitar\n" "configurar o acceso coa chave pública ao host%(addFuse)s." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Non se atopou config" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opcións de comparación" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Orde:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parámetros:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Usar %1 e %2 como parámetros da ruta" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Listar unicamente as copias de seguranza diferentes" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Listar só as copias de seguranza iguais a: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Comprobación exhaustiva (máis precisa pero máis lenta)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Eliminar" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Selecionar todo" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diferenzas" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ir a" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Non pode comparar unha copia de seguranza con ela mesma" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Non se atopou a orde: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Está certo de eliminar \"%(file)s\" na copia de seguranza " "\"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Está certo de eliminar \"%(file)s\" en %(count)d copias de seguranza?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "AVISO: isto non se pode revogar" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Quere excluír \"%s\" de copias de seguranza futuras?" backintime-1.2.1/common/po/sl.po0000644000175000017500000010604013530533316016024 0ustar germargermarmsgid "" msgstr "" "Project-Id-Version: Back In Time 0.9.10\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-02-14 11:38+0000\n" "Last-Translator: Matic Gradišer \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "X-Poedit-Country: SLOVENIA\n" "X-Poedit-Language: Slovenian\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" Že obstaja !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "" #: ../../common/config.py:77 msgid "Disabled" msgstr "Onemogočeno" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Ob vsakem zagonu/ponovnem zagonu" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Vsakih 5 minut" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Vsakih 10 minut" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Vsakih 30 minut" #: ../../common/config.py:82 msgid "Every hour" msgstr "Vsako uro" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Vsaki 2 uri" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Vsake 4 ure" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Vsakih 6 ur" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Vsakih 12 ur" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Specifične ure" #: ../../common/config.py:88 msgid "Every Day" msgstr "Vsak dan" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Ponavljajoče (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Ko se priključi naprava (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Vsak teden" #: ../../common/config.py:92 msgid "Every Month" msgstr "Vsak mesec" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dni" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Tednov" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Let" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Ura(Ure)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mesec(ev)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " ESKPERIMENTALNO!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokalno" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Privatni SSH ključ" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokalno šifrirano" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Šifriranje" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH šifrirano" #: ../../common/config.py:135 msgid "Default" msgstr "Privzeto" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Glavni profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ni mapa !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Napredne možnosti" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Prekliči" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Naredi posnetek" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "SPODLETELO" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Narejeno" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Zaključevanje" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Naredi posnetek" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Zdaj" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Ime posnetka" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Odstrani posnetek" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Nastavitve" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Izhod" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomoč" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O programu" #: ../../qt/app.py:204 msgid "Up" msgstr "Gor" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Pokaži skrite datoteke" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Obnovi" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Posnetki" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Narejeno, varnostna kopija ni potrebna" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Splošno" #: ../../qt/app.py:795 msgid "Root" msgstr "Koren" #: ../../qt/app.py:796 msgid "Home" msgstr "Dom" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Res želite zbrisati posnetek:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Danes" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Včeraj" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ta teden" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Prejšnji teden" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Kam naj se shranijo posnetki" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ne odstranjuj posnetkov z imenom" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Izključitveni vzorec" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Vključi imenik" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Možnosti za primerjavo" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Ukaz:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Uporabi %1 in %2 kot vrednosti za pot" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Primerjava" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Pojdi na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Posnetka ni mogoče primerjati s samim sabo" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Ukaza ni mogoče najti: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/pl.po0000644000175000017500000011627713530533316016036 0ustar germargermar# Polish translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-08-07 17:07+0000\n" "Last-Translator: Daniel Koć \n" "Language-Team: Polish \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%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" już istnieje!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nie możesz usunąć ostatniego profilu!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Nieaktywny" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Przy każdym uruchomieniu / restarcie" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Co 5 minut" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Co 10 minut" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Co 30 minut" #: ../../common/config.py:82 msgid "Every hour" msgstr "Co godzinę" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Co 2 godziny" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Co 4 godziny" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Co 6 godzin" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Co 12 godzin" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Własny harmonogram" #: ../../common/config.py:88 msgid "Every Day" msgstr "Codziennie" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Wielokrotnie (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Po podłączeniu dysku (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Co tydzień" #: ../../common/config.py:92 msgid "Every Month" msgstr "Co miesiąc" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "dni" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "tygodni" #: ../../common/config.py:98 msgid "Year(s)" msgstr "lat" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "godzin" #: ../../common/config.py:105 msgid "Month(s)" msgstr "miesięcy" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EKSPERYMENTALNE!" #: ../../common/config.py:129 msgid "Local" msgstr "lokalnie" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Klucz prywatny SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "lokalnie z szyfrowaniem" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Szyfrowanie" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH z szyfrowaniem" #: ../../common/config.py:135 msgid "Default" msgstr "Domyślny" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profil główny" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Katalog migawek jest nieprawidłowy!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" "Musisz wybrać co najmniej jeden katalog do wykonania kopii zapasowej!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nie możesz dołączyć katalogu z kopią zapasową!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nie można dołączyć podkatalogu backup!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nie jest katalogiem!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Pola Host, Użytkownik i Profil nie mogą być puste!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nie mogę zapisać do: %s\n" "Jesteś pewien, że posiadasz uprawnienia do jego zapisu?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopiowanie linków (odwołanie linków symbolicznych)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opcje zaawansowane" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Nie można odnaleźć tablicy cron.\n" "Czy cron jest zainstalowany ?\n" "Jeżeli nie, wszystkie automatyczne kopie zapasowe powinny zostać wyłączone." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Anuluj" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Potwierdź hasło" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Hasło niezgodne" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs w wersji 1.7.2 i wcześniejsze miały bład z opcją --reverse. " "Zaktualizuj encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Utwórz migawkę" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil '%(profile)s': podaj hasło do %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "NIEPOWODZENIE" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Przywracanie uprawnień:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Gotowe" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Nie można odnaleźć katalogu migawek.\n" "Jeżeli katalog znajduje się na dysku wymiennym proszę go podłączyć." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Pozostała %s sekunda." msgstr[1] "Pozostały %s sekundy." msgstr[2] "Pozostało %s sekund." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Nie udało się wykonać migawki %s!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalizuję" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nie mogę stworzyć katalogu: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Zapisz plik konfiguracyjny ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Zapis uprawnień ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nie mogę usunąć katalogu: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Utwórz migawkę" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Inteligentne usuwanie" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Usuwanie poprzednich migawek" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Spróbuj utrzymać minimalną ilość wolnego miejsca" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "Z BŁĘDAMI!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Teraz" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Migawka z sumami kontrolnymi" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Używaj sum kontrolnych do wykrywania zmian" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Wstrzymaj wykonywanie migawki" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Wznów wykonywanie migawki" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Zakończ wykonywanie migawki" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Odśwież listę migawek" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nazwa migawki" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Usuń migawkę" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Podgląd dziennika migawki" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Podgląd ostatniego dziennika" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Ustawienia" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Zamykanie" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Zamknij system po wykonaniu migawki" #: ../../qt/app.py:149 msgid "Exit" msgstr "Wyjście" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomoc" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Podręcznik pliku konfiguracji" #: ../../qt/app.py:163 msgid "Website" msgstr "Strona WWW" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Lista zmian" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Zadaj pytanie" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Zgłoś błąd" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O programie" #: ../../qt/app.py:204 msgid "Up" msgstr "Do góry" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Pokaż ukryte pliki" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Przywróć" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Przywróć do ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Migawki" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Migawka" #: ../../qt/app.py:271 msgid "View" msgstr "Widok" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Skróty" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Nie można odnaleźć katalogu migawek.\n" "Jeżeli katalog znajduje się na dysku wymiennym proszę go podłączyć i wcisnąć " "OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Pracuje:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Gotowe, archiwizacja niepotrzebna" #: ../../qt/app.py:723 msgid "Error:" msgstr "Błąd:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Wysłane:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Prędkość:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Do końca:" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalne" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Start" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Katalogi kopii zapasowej" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Czy na pewno usunąć migawkę:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Pokaż obecną zawartość dysku" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Migawka: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Zobacz migawkę wykonaną %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Przywróć '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Przywróć '%s' do ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Autorzy" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Tłumaczenia" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licencja" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtr:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "wszystkie" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "błędy" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "zmiany" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "informacje" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] błąd, [I] informacja, [C] zmiana" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopiuj" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Błąd" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Pytanie" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Uruchom BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Pracuję..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Dziś" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Wczoraj" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ten tydzień" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Poprzedni tydzień" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Edycja" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Ustaw pełną kopię systemu" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Dodaj" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Usuń" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Ogólne" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Tryb:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Gdzie zapisać migawki" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Katalog" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Ustawienia SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Host:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Użytkownik:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Ścieżka:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Szyfr:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Klucz prywatny:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Plik klucza" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Utwórz nowy klucz SSH bez hasła" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Hasło" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Zapisz hasło w portfelu" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Zaawansowane" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Harmonogram" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dzień:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Dzień powszedni:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Godzina:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Godziny:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Co" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Dołącz" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Dołącz pliki i katalogi" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Dodaj plik" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Dodaj katalog" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Wyklucz" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Wyklucz wzorce, pliki lub katalogi" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Bardzo zalecane:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Dodaj domyślne" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatyczne usuwanie" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Starsze niż:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Jeżeli wolnej przestrzeni na dysku jest mniej niż:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Jeżeli wolnych i-węzłów jest mniej niż:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Uruchom w tle na zdalnym hoście" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dni" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Przechowaj jedną migawkę na dzień" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Przechowaj jedną migawkę na tydzień" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "tygodni" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Przechowaj jedną migawkę na miesiąc" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "miesięcy" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Przechowuj jedną migawkę na rok przez wszystkie lata" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Nie usuwaj nazwanych migawek" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Ustawienia" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Włącz powiadomienia" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Wyłącz migawki podczas zasilania z baterii" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Status zasilania niedostępny w systemie" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Uruchamiaj tylko jedną migawkę na raz" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Kontynuuj przy błędach (pozwól na niekompletne migawki)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Poziom dziennika:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Brak" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Zmiany i błędy" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Zmień te ustawienia tylko jeżeli dobrze wiesz co robisz!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Uruchamiaj 'nice':" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "jako zadanie crona" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "na zdalnym hoście" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Uruchamiaj 'ionice':" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "podczas wykonywania ręcznej migawki" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Uruchamiaj 'rsync' z 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "na lokalnej maszynie" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Przekieruj stdout z zadań crona do /dev/null" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Przekieruj stderr z zadań crona do /dev/null" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Ograniczenie przepustowości rsync: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/s" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Zachowaj ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Zachowaj rozszerzone atrybuty (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Kopiowanie niebezpiecznych linków (działa tylko z linkami bezwzględnymi)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Dodatkowe opcje dla rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "domyślnie" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Sprawdź czy zdany host jest dostępny" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Przywróć konfigurację" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nowy profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Zmień nazwę profilu" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Na pewno usunąć profil \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Wzór wykluczenia" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Wyklucz plik" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Wyklucz katalog" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Dołącz plik" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Uwzględnij katalog" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Na pewno zmienić katalog migawek?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "włączone" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "wyłączone" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Przywróć ustawienia" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Nie znaleziono konfiguracji" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opcje diff" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Polecenie:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametry:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Użyj %1 i %2 dla ścieżki parametrów" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Wyświetl tylko różne migawki" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Szczegółowa analiza (dokładniejsza, ale bardziej czasochłonna)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Usuń" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Wybierz wszystko" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Różnice" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Idź do" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Nie możesz porównywać migawki samej ze sobą" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Polecenie nie znalezione: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Wykluczyć \"%s\" z przyszłych migawek?" backintime-1.2.1/common/po/bg.po0000644000175000017500000012015613530533316016002 0ustar germargermar# Bulgarian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:18+0000\n" "Last-Translator: PhobosK \n" "Language-Team: Bulgarian \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../qt/app.py:794 msgid "Global" msgstr "Глобални" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Профилът \"%s\" вече съществува!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Не можете да премахнете последния профил!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Изключено" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "При всяко зареждане/рестартиране" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "На всеки 5 минути" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "На всеки 10 минути" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Ежедневно" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Ежеседмично" #: ../../common/config.py:92 msgid "Every Month" msgstr "Ежемесечно" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Дни" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Седмици" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Години" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Основен профил" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Профил: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Папката за моментни архиви не е валидна!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Трябва да изберете поне една папка за архивиране !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Не можете да включите папката за резервни архиви !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Не можете да включите подпапките в резервно копие !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s не е папка !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Не може да се записва в: %s\n" "Сигурни ли сте, че имате права за запис?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Копирай връзките към файлове (следвай символните връзки)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Експертни настройки" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "crontab не може да бъде намерен.\n" "Сигурни ли сте, че cron е инсталиран ?\n" "Ако не е, трябва да изключите всички автоматични архивирания." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Създаване на моментен архив" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Готово" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Папката за моментни архиви не може да бъде открита.\n" "Ако е на преносимо устройство, моля включете го." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Изчакване %s секунда." msgstr[1] "Изчакване %s секунди." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Неуспех при създаването на моментен архив %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Приключване" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Папката не може да бъде създадена: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Запазване на конфигурационен файл ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Запазване на правата ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Папката не може да бъде премахната: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Създаване на моментен архив" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Умно премахване" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Премахване на старите моментни архиви" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Опит за запазване на минимално свободно пространство" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "С ГРЕШКИ!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Сега" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Използвайте проверка на контролната сума, за да засечете промените" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Опресняване списъка с моментни архиви" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Име на моментния архив" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Премахване на моментния архив" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Преглед на дневника на моментните архиви" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Преглед на последния запис" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Настройки" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Изход" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Помощ" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Уебсайт" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Относно" #: ../../qt/app.py:204 msgid "Up" msgstr "Нагоре" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Показване на скритите файлове" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Възстановяване" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Моментни архиви" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Препратки" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Папката за моментни архиви не може да бъде открите.\n" "Ако е на преносимо устройство, моля включете го." #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Изпълнение:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Готово, не е необходимо архивиране" #: ../../qt/app.py:723 msgid "Error:" msgstr "Грешка:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "Файлова система" #: ../../qt/app.py:796 msgid "Home" msgstr "Домашна папка" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Резевни папки" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Сигурни ли сте, че желаете окончателно да премахнете моментния архив '%s'?" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Преглеждане на текущото съдържание на диска" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Моментен архив: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Преглеждане на моментния архив, създаден на %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Профил:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Филтър:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Всичко" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Грешки" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Промени" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Информации" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[Г] Грешка, [И] Информация, [П] Промяна" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Изпълнение..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Днес" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Вчера" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Тази седмица" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Миналата седмица" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Редактиране" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Общи" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Къде да се запазват моментните архиви" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Компютър:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Потребител:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Разширени" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Разписание" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Час:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Включване" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Включване на файлове и папки" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Добавяне на файл" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Добавяне на папка" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Изключване" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Изключване на шарки, файлове или папки" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Силно препоръчително:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Автоматично премахване" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "По-стари от:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ако свободното пространство е по-малко от:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Да не се премахват именувани архиви" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Настройки" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Включване на известяването" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Изключване на моментни архиви при работа на батерия" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Енергийното състояние не е налично от системата" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Продължаване при грешки (запазване на непълни моментни архиви)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Ниво на записа:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Нищо" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Промени и грешки" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Пременяйте тези настройки само ако знаете какво правите !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Запазване на ACL (списък за контрол на достъпа)" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Запазване на разширените атрибути (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Копиране на несигурните връзки (работи само с абсолютни връзки)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Нов профил" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Преименуване на профил" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Сигурни ли сте, че желаете да изтриете профила \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Шаблон за изключване" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Изключване на файл" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Изключване на папка" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Включване на файл" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Включване на папка" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Сигурни ли сте, че жеалете да промените папката за моментни архиви ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Настройки на сравняването" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Команда:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Параметри:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Използване на %1 и %2 за параметри на пътя" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Изброяване само на различаващите се моментни архиви" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Дълбока проверка (по-точна, но бавна)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Сравняване" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Отиване до" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Не можете да сравнявате моментен архив сам със себе си" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Командата не е открита: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/zh_CN.po0000644000175000017500000011366713530533316016424 0ustar germargermar# Simplified Chinese translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:06+0000\n" "Last-Translator: Germar \n" "Language-Team: Simplified Chinese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "\"%s\"配置已存在!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "不能删除唯一的配置!" #: ../../common/config.py:77 msgid "Disabled" msgstr "已禁用" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "重启时" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "每5分钟" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "每10分钟" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "每30分钟" #: ../../common/config.py:82 msgid "Every hour" msgstr "每小时" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "每2小时" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "每4小时" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "每6小时" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "每12小时" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "自定义" #: ../../common/config.py:88 msgid "Every Day" msgstr "每天" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "当设备连接时(udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "每周" #: ../../common/config.py:92 msgid "Every Month" msgstr "每月" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "天" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "周" #: ../../common/config.py:98 msgid "Year(s)" msgstr "年" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " 实验功能!" #: ../../common/config.py:129 msgid "Local" msgstr "本地" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH 私钥" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "加密" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "默认" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "主要配置。" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "配置:\"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "快照文件夹无效!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "请至少选择一个文件夹进行备份!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "不能包含备份文件夹!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "不能包含备份文件夹的子文件夹!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s 不是一个文件夹!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "不能写入: %s\n" "您确定有写入权限吗?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "复制链接(废除符号链接)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "专家选项" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "无法找到 crontab。\n" "您确定已经安装了 cron?\n" "如果没有安装,您应当禁用所有自动备份。" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "无法找到 \"%s\" 的 UUID" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "无法挂载 '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "未找到加密文件夹的配置文件" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "是否创建一个新的加密文件夹?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "取消" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "确认密码" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "密码不一致" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "encfs 1.7.2 及更早的版本中 --reverse 选项存在缺陷,请更新系统中安装的 encfs 版本" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "创建快照" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "在 hash_id %s 中发现哈希碰撞。请递增 hash_collision 的全局设定值并重试。" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "挂载点 %s 不为空。" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "解除挂载锁超时" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "失败" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "恢复权限:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "已完成" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "找不到快照文件夹。\n" "如果使用的是可移动磁盘,请先连接到电脑。" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "等待 %s 秒" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "创建快照 %s 失败!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "正在完成" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "无法新建文件夹: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "保存配置文件 ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "保存权限 ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "无法删除文件夹: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "创建快照" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "智能移除" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "移除旧的快照" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "尝试保留最小可用空间" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "发生错误!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "现在" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "无法挂载 %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "无法解锁 SSH 私钥,可能密码不正确或该密码不适用于 cron。" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "未在 ssh_known_hosts 中找到 %s。" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "远程路径存在但不是一个目录:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "远程路径不可写:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "远程路径不可被执行:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "无法创建远程路径:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Ping %s 失败。可能主机未上线或您输入的地址错误。" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "远程主机 %s 不支持硬链接。" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "使用校验检测变更" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "刷新快照列表" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "快照名" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "移除快照" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "查看快照日志" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "查看最近的日志" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "设置" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "退出" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "帮助" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "网站" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "常见问题" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "提出问题" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "报告 BUG" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "关于" #: ../../qt/app.py:204 msgid "Up" msgstr "上移" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "显示隐藏文件" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "还原" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "还原至:" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "快照" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "快捷方式" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "找不到快照文件夹。\n" "如果使用的是可移动磁盘,请连接到电脑,然后按 “确定”" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "运行中:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "已完成,无需备份。" #: ../../qt/app.py:723 msgid "Error:" msgstr "错误:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "全局" #: ../../qt/app.py:795 msgid "Root" msgstr "根目录" #: ../../qt/app.py:796 msgid "Home" msgstr "主目录" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "备份文件夹" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "您确定要移除快照:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "查看当前磁盘内容" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "快照:%s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "查看快照 %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "还原 '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "还原 '%s' 至 ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "配置:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "过滤器" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "所有的" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "错误" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "变更" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "提示信息" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] 错误,[I] 通知,[C] 变更" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "正在进行..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "今天" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "昨天" #: ../../qt/qttools.py:229 msgid "This week" msgstr "本周" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "上周" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "编辑" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "常规" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "模式:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "何处保存快照" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH 设置" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "主机:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "端口:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "用户名:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "路径:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "私钥:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "密码" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "保存密码至密钥环" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "高级" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "计划任务" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "日:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "工作日:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "小时:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "小时:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "包含" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "包含文件和文件夹" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "添加文件" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "添加文件夹" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "排除" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "不包含模式,文件或文件夹" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "强烈推荐:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "自动移除" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "早于:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "如果磁盘可用空间少于:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "保留最新的所有快照" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "天" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "每天保留一个最新的快照" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "每周保留一个最新的快照" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "周" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "每月保留一个最新的快照" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "月" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "每年保留一个快照" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "不要移除已命名的快照" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "选项" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "启用通知" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "使用电池时禁用快照" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "无法从系统中获取电源状态" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "忽略错误并继续(保留不完整的快照)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "日志级别" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "空" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "变更 & 错误" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "除非您知道自己在干什么,否则不要变更这些选项!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "限制 rsync 使用带宽: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/秒" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "保留 ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "保留扩展属性 (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "复制不安全的链接(仅绝对链接有效)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "新建配置" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "重命名配置" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "是否确定删除配置“%s”?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "排除模式" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "排除文件" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "排除文件夹" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "包含文件" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "包含文件夹" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "确定要改变快照文件夹吗?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff 选项" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "命令:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "参数:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "用 %1 和 %2 作为路径参数" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "仅列出不同的快照" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "深度检查(更精确,但是较慢)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "删除" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "选择所有" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "转到" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "不能将快照与其自身比较" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "命令未找到:%s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "警告:该操作无法撤销!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/eo.po0000644000175000017500000010535513530533316016021 0ustar germargermar# Esperanto translation for backintime # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2012-04-14 10:04+0000\n" "Last-Translator: Michael Moroni \n" "Language-Team: Esperanto \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profilo \"%s\" jam ekzistas!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Vi ne povas forigi la lastan profilon!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Malŝaltita" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Je ĉiu startigo/restartigo" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Je ĉiuj 5 minutoj" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Je ĉiuj 10 minutoj" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Ĉiutage" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Ĉiusemajne" #: ../../common/config.py:92 msgid "Every Month" msgstr "Ĉiumonate" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Tago(j)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Semajno(j)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Jaro(j)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Ĉefa profilo" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profilo: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Vi devas almenaŭ elekti unu dosieron por sekurkopio!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Vi ne povas inkluzivi sekurkopian dosieron!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ne estas dosierujo!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Farite" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ne povas forigi dosieron: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nun" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Agordoj" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Eliri" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Helpo" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Retejo" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Pri" #: ../../qt/app.py:204 msgid "Up" msgstr "Supren" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Montri kaŝitajn dosierojn" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaŭri" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Klavkombinoj" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "Eraro:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "Hejmo" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profilo:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtrilo:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Eraroj" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Ŝanĝoj" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "informoj" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Laborante..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hodiaŭ" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Hieraŭ" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Nuna semajno" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Lasta semajno" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Redakti" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Ĝenerale" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Uzanto:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Horo:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inkluzivi" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Aldoni dosieron" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Aldoni dosierujon" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Ekskluzivi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Agordoj" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Aktivigi sciigojn" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Neniu" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametroj:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Iri al" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/fr.po0000644000175000017500000014413713530533316016026 0ustar germargermar# French translation of Back In Time. # Copyright (C) 2008-2009 Oprea Dan # This file is distributed under the same license as the Back In Time package. # # msgid "" msgstr "" "Project-Id-Version: Back In Time 0.8.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2017-02-06 20:24+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Échec de l'enregistrement de la configuration : %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Impossible de charger la configuration : %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Le profil \"%s\" existe déjà !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Vous ne pouvez pas supprimer le dernier profil !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Désactivée" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "À chaque démarrage/re-démarrage" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Toutes les 5 minutes" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Toutes les 10 minutes" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Toutes les 30 minutes" #: ../../common/config.py:82 msgid "Every hour" msgstr "Toutes les heures" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Toutes les 2 heures" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Toutes les 4 heures" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Toutes les 6 heures" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Toutes les 12 heures" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Heures personnalisées" #: ../../common/config.py:88 msgid "Every Day" msgstr "Quotidiennement" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "À plusieurs reprises (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Quand le lecteur est connecté (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Chaque semaine" #: ../../common/config.py:92 msgid "Every Month" msgstr "Chaque mois" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Jour(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Semaine(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Année(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Heure(s)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mois" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPÉRIMENTAL !" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Clé privée SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Chiffré localement" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Chiffrement" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH chiffré" #: ../../common/config.py:135 msgid "Default" msgstr "Par défaut" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil : « %s »" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Le dossier des instantanés n'est pas valide !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Vous devez sélectionner au moins un dossier à sauvegarder !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Vous ne pouvez pas inclure le dossier des sauvegardes !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" "Vous ne pouvez pas inclure un sous-dossier du dossier des sauvegardes !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s n'est pas un dossier !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Hôte/Utilisateur/Profile-ID ne doit pas être vide !" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Impossible d'écrire dans : %s\n" "Êtes-vous sûr(e) d'avoir les droits en écriture ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Le système de fichiers FAT de la destination '%(path)s' ne supporte pas les " "liens physiques. Veuillez utiliser un système de fichier Linux natif." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "Le système de fichiers de '%(path)s' est un partage SMB. Merci de vérifier " "que le serveur SMB distant supporte les liens symboliques ou sinon activez " "'%(copyLinks)s' dans '%(expertOptions)s'." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copier les liens (supprime les liens symboliques)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Options avancées" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "Le système de fichiers de '%(path)s' est un partage SSHFS. SSHFS ne supporte " "pas les liens physiques. Merci d'utiliser le mode 'SSH' à la place." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Impossible de trouver crontab.\n" "Êtes-vous sûr(e) que cron est installé ?\n" "Si ce n'est pas le cas vous devriez désactiver les sauvegardes automatiques." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Échec d'écriture de la nouvelle crontab" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Échec d'installation de la règle Udev pour le profil %(profile_id)s. Le " "service DBus '%(dbus_interface)s' n'était pas disponible." #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Le programme udev ne fonctionne pas avec le mode %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Impossible de trouver l'UUID pour \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Impossible de monter '%(command)s' :\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Configuration du dossier chiffré introuvable." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Créer un nouveau dossier chiffré ?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Annuler" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Veuillez confirmer votre mot de passe" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Le mot de passe ne correspond pas" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "Les versions 1.7.2 et précédentes de encfs ont un bug avec l'option --" "reverse. Veuillez mettre à jour encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Prendre un instantané" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Une collision de hash s'est produite dans hash_id %s. Incrémentez la valeur " "globale hash_collision et réessayez." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Impossible de démonter %(proc)s depuis %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" "%(proc)s non trouvé. Veuillez par exemple installer %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s n'est pas membre du groupe 'fuse'.\n" " Lancer 'sudo adduser %(user)s fuse'. Pour appliquer les modifications " "déconnectez-vous et reconnectez-vous.\n" "Consultez 'man backintime' pour de plus amples instructions." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "le point de montage %s n'est pas vide." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Délai de montage dépassé" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil '%(profile)s' : Entrez le mot de passe pour %(mode)s : " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Ce journal a été décodé avec le modèle de recherche automatique\n" "### Si certains chemins ne sont pas décodés vous pouvez les décoder " "manuellement avec :\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "ÉCHEC" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Restaurer les permissions :" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Terminé" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Reporter la sauvegarde lors du fonctionnement sur batterie" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Impossible de trouver le dossier des instantanés.\n" "S'il se trouve sur un disque externe, veuillez le connecter." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "En attente %s seconde." msgstr[1] "En attente %s secondes." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Impossible d'effectuer la sauvegarde %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalisation" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Impossible de créer le dossier : %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Sauvegarde du fichier de configuration…" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Sauvegarde des permissions…" #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "L'instantané non terminé '%s' a été trouvé et peut être poursuivi." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Suppression du répertoire '%s' restant de la dernière exécution" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Impossible de supprimer le répertoire : %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Prise de l'intantané" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" "Rien n'a changé, il n'est pas nécessaire de faire une nouvelle sauvegarde" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Impossible de renommer %(new_path)s en %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Suppression intelligente" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Supprimer les anciens instantanés" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Essai de conservation d'un espace libre minimum" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Essai de conservation d'un minimum de %d%% d'inodes libres" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "AVEC DES ERREURS !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Maintenant" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Impossible de monter %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Impossible de déverrouiller la clé privée SSH. Mot de passe incorrect ou mot " "de passe non disponible pour cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "L'authentification sans mot de passe pour %(user)s@%(host)s à échoué. " "Consultez 'man backintime' pour de plus amples instructions." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Le chiffrage %(cipher)s à échoué pour %(host)s :\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s non trouvé dans ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Le chemin d'accès distant existe mais n'est pas un répertoire :\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Le chemin distant n'est pas accessible en écriture :\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Le chemin distant n'est pas exécutable :\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Impossible de créer le chemin distant :\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Le ping de %s a échoué. Hôte en panne ou adresse incorrecte." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "L'hôte distant %(host)s ne supporte pas la commande '%(command)s' :\n" "%(err)s\n" "Consultez 'man backintime' pour plus d'informations" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Les commandes de vérifications sur l'hôte %(host)s ont retourné une erreur " "inconnue :\n" "%(err)s \n" "Consultez 'man backintime' pour obtenir des instructions supplémentaires" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "L'hôte distant %s ne supporte pas les liens physiques" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Copie de la clé SSH publique \"%(pubkey)s\" sur l'hôte distant " "\"%(host)s\".\n" "Veuillez entrer le mot de passe pour \"%(user)s\" :" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Prendre un instantané avec somme de contrôle" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Utiliser la somme de contrôle pour détecter les changements" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Mettre en pause la prise de l'instantané" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Reprendre la prise de l'instantané" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Arrêter la prise de l'instantané" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Rafraîchir la liste des instantanés" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nommer l'instantané" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Supprimer l'instantané" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Voir le journal des instantanés" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Voir la dernière entrée du journal" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Préférences" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Arrêt" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Éteindre le système après l'instantané ?" #: ../../qt/app.py:149 msgid "Exit" msgstr "Quitter" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Aide" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Aide du fichier de configuration" #: ../../qt/app.py:163 msgid "Website" msgstr "Site Web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Notes de version" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Poser une question" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Signaler un bogue" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "À propos" #: ../../qt/app.py:204 msgid "Up" msgstr "Dossier parent" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Afficher les fichiers cachés" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurer" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" "Restaurer les fichiers ou répertoires sélectionnés à leur emplacement " "d'origine." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Restaurer vers…" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" "Restaurer les fichiers ou répertoires sélectionnés vers un nouvel " "emplacement." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Restaurer le répertoire actuellement affiché et tout son contenu à " "l'emplacement d'origine." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Restaurer le répertoire actuellement affiché et tout son contenu vers un " "nouvel emplacement." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Restaurer les fichiers ou dossiers sélectionnés.\n" "Si ce bouton est grisé, c'est probablement parce que \"%(now)s\" est " "sélectionné dans la liste des sauvegardes à gauche." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Instantanés" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Instantané" #: ../../qt/app.py:271 msgid "View" msgstr "Vue" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Raccourcis" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Ce répertoire n'existe pas\n" "dans l'instantané actuellement sélectionné !" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Ajouter aux Inclusions" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Ajouter aux Exclusions" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s n'est pas configuré(e). Voulez vous restaurer une ancienne " "configuration ?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Impossible de trouver le répertoire des instantanés.\n" "S'il se trouve sur un disque externe, veuillez connecter celui-ci puis " "cliquer sur OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Si vous fermez cette fenêtre, Back In Time ne sera pas en mesure d'arrêter " "votre système lorsque l'instantané sera terminé.\n" "Voulez-vous vraiment fermer ?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "En cours :" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Terminé, il n'y a rien à sauvegarder" #: ../../qt/app.py:723 msgid "Error:" msgstr "Erreur :" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Envoyé :" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Vitesse :" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Temps restant estimé :" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Système de fichiers" #: ../../qt/app.py:796 msgid "Home" msgstr "Répertoire personnel" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Répertoires sauvegardés" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Êtes-vous sûr(e) de vouloir supprimer l'instantané :\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Sauvegarder les fichiers locaux avant écrasement ou\n" "suppression avec le suffixe '%(suffix)s'." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Les nouvelles versions des fichiers seront renommés avec le préfixe " "'%(suffix)s' avant la restauration.\n" "Si vous n'avez pas besoin de ces fichiers, vous pouvez les supprimer avec " "'%(cmd)s'" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Supprimer les fichiers les plus récents dans le dossier d'origine" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Restaurer les fichiers ou répertoires vers leur emplacement d'origine et\n" "supprimer les fichiers/répertoires qui ne font pas partie de la sauvegarde.\n" "Cela va supprimer les fichiers/répertoires qui étaient exclus lors de la " "sauvegarde !\n" "Soyez extrêmement prudent !!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Voulez-vous vraiment restaurer ce(s) fichiers(s) :" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" "Voulez-vous vraiment supprimer tous les fichiers les plus récents dans " "'%(path)s' ?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Êtes vous sûr(e) de vouloir supprimer tous les fichiers plus récents dans le " "répertoire d'origine ?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "ATTENTION : supprimer des fichiers de la racine pourrait casser tout votre " "système !!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Voir le contenu actuel" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Instantané : %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Voir le contenu de l'instantané fait à %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Restaurer '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Restaurer '%s' vers…" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Auteurs" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Traductions" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licence" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Voir le dernier journal" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Voir le journal des instantanés" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil :" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtre :" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Tous" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Erreurs" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Modifications" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informations" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Erreur, [I] Information, [C] Modification" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "décoder les chemins" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Erreur" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Question" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Démarrer BackinTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Traitement en cours…" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Aujourd'hui" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Hier" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Cette semaine" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "La semaine dernière" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Ce n'est PAS un instantané (sauvegarde) mais une vue de l'état actuel de " "vous fichiers locaux." #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Dernière vérification %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Afficher le journal complet" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Modifier" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Modifier pour le système de sauvegarde complète" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Ajouter à" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Supprimer" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Général" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Mode :" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Attention : %(app)s utilise EncFS pour le chiffrement. Un récent " "audit de sécurité à révélé plusieurs vecteurs d'attaque possibles le " "concernant. Veuillez jeter un oeil à la section 'A NOTE ON SECURITY' dans " "'man backintime'." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Dossier pour les sauvegardes" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Dossier" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Réglages SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Hôte :" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port :" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Utilisateur :" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Chemin :" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Type de chiffrement :" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Clé privée :" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Fichier clé" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Créer une nouvelle clé SSH sans mot de passe." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Mot de passe" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Enregistrer le Mot de passe dans le trousseau" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Mot de passe en cache pour Cron (note de sécurité : root peut lire le mot de " "passe)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Options avancées" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Chemin complet de l'instantané : " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Planification" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Jour :" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Jour de la semaine :" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Heure :" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Heures :" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Exécuter BackInTime à plusieurs reprises. Ce réglage est utile si " "l'ordinateur n'est pas allumé régulièrement" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Tous les :" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Exécuter Back In Time dès que le lecteur est connecté (seulement une fois " "tous les X jours).\n" "Vous serez invité à entrer votre mot de passe sudo." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inclure" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Inclure les fichiers et répertoires" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Ajouter un fichier" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Ajouter un répertoire" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exclure" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Attention : Les caractères génériques ('foo*', '[FF]oo', 'fo?') " "seront ignorés en mode 'SSH chiffré'.\n" "Seuls les astérisques séparés sont autorisés ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Exclure les motifs, fichiers ou répertoires" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Fortement recommandé :" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Ajouter par défaut" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Exclure les fichiers plus gros que : " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Exclure les fichiers plus gros que cette valeur en %(prefix)s.\n" "Avec 'Full rsync mode' désactivé, seuls les nouveaux fichiers seront " "affectés\n" "car du point de vue de rsync c'est une option de transfert et non " "d'exclusion.\n" "Les gros fichiers transférés précédemment resteront donc dans l'instantané\n" "même s'ils ont changé." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Suppression automatique" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Si antérieur à :" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Si l'espace libre est inférieur à :" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Si les inodes libres sont inférieurs à :" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Exécuter en tâche de fond sur l'hôte distant." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Garder tous les instantanés depuis les derniers" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "jour(s)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Garder un instantané par jour depuis les derniers" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Garder un instantané par semaine depuis les dernières" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "semaine(s)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Garder un instantané par mois depuis les derniers" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mois" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Garder un instantané par an tous les ans" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ne pas effacer les instantanés avec des noms" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Options" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activer les notifications" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Désactiver les sauvegardes automatiques en mode batterie" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Impossible d'obtenir l'état de l'alimentation du système" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Exécuter un seul instantané à la fois" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Les autres instantanés seront bloqués jusqu'à ce que l'instantané en cours " "soit terminé.\n" "Ceci une option globale. Elle affectera donc tous les profils de cet " "utilisateur.\n" "Vous avez cependant besoin de l'activer pour les autres utilisateurs." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Sauvegarder les fichiers remplacés lors de la restauration" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continuer en cas d'erreur (conserver les instantanés incomplets)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Prendre un instantané qu'il y ait eu des changements ou non." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Niveau de journalisation :" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Aucun" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Changements et Erreurs" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" "Modifiez ces options uniquement si vous savez réellement ce que vous faites !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Exécuter 'nice'" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "comme une tâche cron" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "sur un serveur distant" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Exécuter 'ionice'" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "lors d'un instantané manuel" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Exécuter 'rsync' avec l'option 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "sur la machine locale" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Rediriger stdout vers /dev/null dans les tâches cron." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Rediriger stderr vers /dev/null dans les tâches cron." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Limiter l'utilisation de bande passante par rsync : " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " ko/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Conserver les autorisations" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Conserver les attributs étendus (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Copier les liens non sécurisés (fonctionne seulement avec les liens absolus)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Passer des options supplémentaires à rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Les options doivent être entourés de double quotte, par exemple: --exclude-" "from=\"/path/to/my exclude file\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Ajouter un préfixe aux commandes SSH" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Préfixe à exécuter avant chaque commande sur l'hôte distant.\n" "Les variables doivent être échappées avec \\$FOO.\n" "Cela n'affecte pas rsync. Pour ajouter un préfixe\n" "à rsync veuillez utiliser \"%(cbRsyncOptions)s\" avec\n" "%(rsync_options_value)s\n" "\n" "%(default)s : %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "par défaut" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Vérifier si l'hôte distant est en ligne" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Attention : si désactivé et si l'hôte distant\n" "n'est pas disponible, cela pourrait conduire à\n" "d'étranges erreurs." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "Vérifier si l'hôte distant supporte toutes les commandes nécessaires" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Attention : si désactivé et si l'hôte distant\n" "ne supporte pas toutes les commandes nécessaires,\n" "cela pourrait conduire à des erreurs étranges." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Restaurer la configuration" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "La sauvegarde complète du système peut uniquement créer un instantané " "pouvant être restauré sur le(s) même(s) disque(s) physique(s) et avec le " "même partitionnement que la source ; restaurer vers de nouveaux disques ou " "les mêmes disques avec un partitionnement différent conduira potentiellement " "à un système cassé et inutilisable.\n" "\n" "La sauvegarde complète du système écrasera certains paramètres qui avaient " "pu être modifiés. Continuer ?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nouveau profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Renommer le profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Êtes-vous sûr(e) de vouloir supprimer le profil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Les heures personnalisées doivent être séparées par une virgule (ex : " "8,12,18,23) ou */3 pour les sauvegardes périodiques toutes les 3 heures" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Vous n'avez pas sélectionné de clé privée pour SSH.\n" "Voulez-vous générer une nouvelle paire de clé publique/privée sans mot de " "passe ?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Le fichier de clé privée \"%(file)s\" n'existe pas." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Voulez-vous copier votre clé publique SSH sur\n" "l'hôte distant pour activer l'identification sans mot de passe ?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "L'authenticité de l'hôte %(host)s\" ne peut pas être confirmée.\n" "\n" "L'empreinte de la clé %(keytype)s est :" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Merci de vérifier cette empreinte ! Voulez-vous l'ajouter à votre fichier " "'known_hosts' ?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Exclure selon un modèle" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exclure un fichier" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exclure un répertoire" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Inclure le fichier" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "\"%s\" est un lien symbolique. La cible du lien ne sera pas sauvegardée tant " "que vous ne l'aurez pas inclue également.\n" "Voulez-vous plutôt inclure la cible du lien ?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inclure un répertoire" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Êtes-vous sûr(e) de vouloir changer le répertoire des instantanés ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Erreur à la création de la nouvelle clé SSH dans %(path)s" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "activé" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "désactivé" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Restaurer les préférences" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " et ajouter votre utilisateur au groupe 'fuse'" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Merci de naviguer dans l'instantané depuis lequel vous voulez restaurer la " "configuration de %(appName)s. \n" "Le chemin doit ressembler à %(samplePath)s\n" "\n" "Si vos instantanés sont sur un disque distant ou sont chiffrés, vous devez " "d'abord les monter manuellement. Si vous utilisez le mode SSH, vous devez " "peut-être aussi configurer votre clé publique sur le serveur distant " "%(addFuse)s.\n" "Consultez la documentation disponible via 'man backintime'." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Aucune configuration trouvée" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Options de comparaison" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Commande :" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Paramètres :" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Utiliser %1 et %2 pour passer les chemins en paramètre" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Lister uniquement les instantanés différents" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Lister uniquement les instantanés égals à : " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Vérification avancée (plus sûre mais lente)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Supprimer" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Tout sélectionner" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Comparer" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Atteindre" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Vous ne pouvez pas comparer une sauvegarde à elle-même" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Commande non trouvée : %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Voulez-vous vraiment supprimer \"%(file)s\" dans l'instantané " "\"%(snapshot_id)s ?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Voulez-vous vraiment supprimer \"%(file)s\" dans les instantanés " "%(count)d ?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "AVERTISSEMENT : Ce ne peut être révoqué !" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Exclure \"%s\" des futurs instantanés ?" backintime-1.2.1/common/po/sr.po0000644000175000017500000011225413530533316016036 0ustar germargermar# Serbian translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:18+0000\n" "Last-Translator: Germar \n" "Language-Team: Serbian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" već postoji!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nije moguće ukloniti poslednji profil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Onemogućeno" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Pri svakom pokretanju/ponovnom pokretanju sistema" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Svakih 5 minuta" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Svakih 10 minuta" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Svakog dana" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Jednom nedeljno" #: ../../common/config.py:92 msgid "Every Month" msgstr "Jednom mesečno" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dana" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Sedmica" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Godina" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Glavni profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Direktorijum za snimak nije ispravan!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Morate odabrati bar jedan direktorijum za rezervne kopije!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nije moguće uključiti direktorijum za rezervne kopije!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nije moguće uključiti poddirektorijum za rezervne kopije!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nije direktorijum!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Ne mogu da upisujem u: %s\n" "Da li ste sigurni da imate dozvolu za upisivanje?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopiraj linkove (prati simboličke linkove)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Napredne opcije" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Ne mogu da pronađem crontab.\n" "Da li si siguran da je crontab inastaliran?\n" "Ako nije, treba da onemogućiš automatsko kreiranje rezervnih kopija." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Napravi snimak" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Gotovo" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Ne mogu da pronađem direktorijum za snimke.\n" "Ako je na izmenljivom medijumu, molim vas da ga priključite." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Čekam %s sekund" msgstr[1] "Čekam %s sekundi" msgstr[2] "Čekam %s sek." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Nisam uspeo da napravim snimak %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Završavam" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Ne mogu da kreiram direktorijum: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Sačuvaj konfiguracioni fajl ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Sačuvaj dozvolu ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ne mogu da uklonim direktorijum: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Napravi snimak" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Pametno uklanjanje" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Ukloni stare snimke" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Pokušaj da sačuvaš minimum slobodnog prostora" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "SA GREŠKAMA !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Sada" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Koristi kontrolnu sumu da otkriješ izmene" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Obnovi listu snimaka" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Ime snimka" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Ukloni snimak" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Pogledaj izveštaj snimka" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Pogledaj poslednji izveštaj" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Podešavanja" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Izađi" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomoć" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Internet stranica" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O programu" #: ../../qt/app.py:204 msgid "Up" msgstr "Gore" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Prikaži skrivene fajlove" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Povrati" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snimci" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Prečice" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Ne mogu da pronađem direktorijum sa snimcima.\n" "Ako se nalazi na izmenjivom mediju, molim da ga priključite i pritisnete OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Radim:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Gotovo, nije bila potrebna rezervne kopija" #: ../../qt/app.py:723 msgid "Error:" msgstr "Greška:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalno" #: ../../qt/app.py:795 msgid "Root" msgstr "Koren" #: ../../qt/app.py:796 msgid "Home" msgstr "Lični direktorijum" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Direktorijumi za rezervne kopije" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Da li ste sigurni da želite da uklonite snimak:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Pogledaj trenutni sadržaj diska" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snimak: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Pogledaj snimak načinjen %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Sve" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Greške" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Izmene" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informacije" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Greška, [I] Informacije, [C] Izmena" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Radim..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Danas" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Juče" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ove nedelje" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Prošla sedmica" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Uredi" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Opšte" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Gde da čuvam snimke" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Računar:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Korisnik:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Napredno" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Plan rada" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Čas:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Uključi" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Uključi fajlove i direktorijume" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Dodaj fajl" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Dodaj direktorijum" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Izostavi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Izostavi šablone, fajlove, ili direktorijume" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Toplo preporučeno:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatsko uklanjanje" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Stariji od:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ako je slobodan prostor manji od:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Nemoj ukloniti imenovane snimke" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opcije" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Omogući obaveštenja" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Onemogući snimke kada se računar napaja iz baterije" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Informacija o status napajanja nije dostupna od sistema" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Nastavi nakon greške (zadrži nekompletan snimak)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Nivo detalja u izveštaju:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Nijedan" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Izmene i greške" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Izmeni ove opcije samo ako znaš šta radiš!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Sačuvaj ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Sačuvaj proširene atribute (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Kopiraj nebezbedni link (funkcioniše samo sa apsolutnim linkovima)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Novi profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Preimenuj profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Da li ste sigurni da želite da uklonite profil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Izostavi šablon" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Izostavi fajl" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Izostavi direktorijum" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Uključi fajl" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Uključi direktorijum" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Da li stvarno želiš da promeniš direktorijum za snimkea?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff opcije" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Naredba:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Koristi %1 i %2 kao parametre putanje" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Izlistaj samo različite snimke" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Detaljna provera (tačnija, ali spora)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Idi na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Nije moguće uporediti snimak sa samim sobom" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Naredba nije pronađena: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/ro.po0000644000175000017500000010626513530533316016037 0ustar germargermar# Romanian translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2012-01-08 00:47+0000\n" "Last-Translator: mariusshh@gmail.com \n" "Language-Team: Romanian \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 % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profilul „%s” există deja !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nu puteți șterge ultimul profil !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Dezactivat" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "La fiecare pornire/restart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "La fiecare 5 minute" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "La fiecare 10 minute" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Zilnic" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Săptămânal" #: ../../common/config.py:92 msgid "Every Month" msgstr "Lunar" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Zi (zile)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Săptămâni" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Ani" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: „%s”" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Folderul pentru instantaneu nu este valid!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Trebuie să selectați măcar un director pentru copia de rezervă !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nu poți include directorul de backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nu poti include un sub-folder de backup" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nu este un director !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opțiuni expert" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Gata" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Se finalizează" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nu se poate crea directorul: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nu se poate elimina directorul: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Eliminare inteligentă" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "CU ERORI !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Acum" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Setări" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Ieșire" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ajutor" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Pagină web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Despre" #: ../../qt/app.py:204 msgid "Up" msgstr "Sus" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Arată fișierele ascunse" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurează" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Scurtături" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Se lucrează:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Rădăcină" #: ../../qt/app.py:796 msgid "Home" msgstr "Acasă" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Se lucrează..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Astăzi" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ieri" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Săptămâna aceasta" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Săptămâna trecută" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Modifică" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Orar" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Include" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Adaugă fișier" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Adaugă director" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exclude" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Mai vechi de:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Dacă spațiul disponibil este mai mic de:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opțiuni" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activează notificările" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Profil nou" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Redenumește profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Sigur doriți să ștergeți profilul „%s” ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exclude fișier" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exclude director" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Include director" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Comandă:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Mergi la" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Comandă negăsită: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/fi.po0000644000175000017500000011257313530533316016014 0ustar germargermar# Finnish translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:06+0000\n" "Last-Translator: Germar \n" "Language-Team: Finnish \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profiili \"%s\" on jo olemassa !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Et voi poistaa viimeistä profiilia !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Poissa käytöstä" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Joka käynnistyksessä/uudelleenkäynnistyksessä" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "5 minuutin välein" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "10 minuutin välein" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Joka päivä" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Joka viikko" #: ../../common/config.py:92 msgid "Every Month" msgstr "Joka kuukausi" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Päivä(ä)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Viikko(a)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Vuosi(a)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Pääprofiili" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profiili: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Otoskansio ei ole pätevä !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Valitse ainakin yksi kansio varmuuskopioitavaksi!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Varmuuskopiokansiota ei voi lisätä!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Varmuuskopionkansion alikansiota ei voi lisätä!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ei ole kansio!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Ei voi kirjoittaa: %s\n" "Oletko varma että sinulla on kirjoitusoikeudet?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopioi linkit (ratkaise symboliset linkit)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Lisäasetukset" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Crontab-ohjelmaa ei löydy.\n" "Onko cron-ohjelmaa asennettu?\n" "Jos ei ole, kaikki automaattiset varmuuskopiot kannattaa ottaa pois käytöstä" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Ota otos" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "EPÄONNISTUI!" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Palauta oikeudet:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Valmis" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Otoskansiota ei löydy.\n" "Jos otoskansio sijaitsee ulkoisella asemalla, liitä asema tietokoneeseen." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Odotetaan %s sekunti." msgstr[1] "Odotetaan %s sekuntia." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Otoksen %s otto epäonnistui !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Viimeistellään" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Ei voinut luoda kansiota: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Tallenna asetustiedosto ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Tallenna käyttöoikeudet ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ei voida poistaa kansiota: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Ota otos" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Älykäs poisto" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Poista vanhat otokset" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Pidä vähän vapaata tilaa" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "VIRHEITÄ!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nyt" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Käytä tarkistussummia muutosten havaitsemiseen" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Päivitä otoslista" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Otoksen nimi" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Poista otos" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Selaa otoslokia" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Selaa viimeisintä lokia" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Asetukset" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Lopeta" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ohje" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Verkkosivu" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Tietoja ohjelmasta" #: ../../qt/app.py:204 msgid "Up" msgstr "Ylös" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Näytä piilotiedostot" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Palauta" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Palauta kohteeseen ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Otokset" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Sijainnit" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Otoskansiota ei löydy.\n" "Jos kansio on ulkoisella asemalla, kytke laite kiinni ja paina OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Käsitellään:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Valmis, varmuuskopiota ei tarvittu" #: ../../qt/app.py:723 msgid "Error:" msgstr "Virhe:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Yleiset" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Varmuuskopiokansiot" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Oletko varma että haluat poistaa otoksen:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Selaa nykyistä levyn sisältöä" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Otos: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Selaa otosta joka on tehty %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Palauta '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Palauta '%s' kohteeseen ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profiili:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Suodatin:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Kaikki" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Virheet" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Muutokset" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Tiedot" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Virhe, [I] Tietoa, [C] Muutokset" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Työn alla..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Tänään" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Eilen" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Tällä viikolla" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Viime viikolla" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Muokkaa" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Yleiset" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Otosten tallennuspaikka" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Verkkonimi:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Käyttäjä:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Lisäasetukset" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Aikataulu" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Päivä:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Viikonpäivä:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Tunti:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Sisällytä" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Sisällytä tiedostot ja hakemistot" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Lisää tiedosto" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Lisää kansio" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Poissulje" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Poissulje hakuehdoilla, tiedoilla tai kansioilla" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Erityisesti suositeltu:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automaattinen poisto" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Vanhempia kun:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Vapaata tilaa vähemmän kun:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Säilytä kaikki otokset viimeiseltä" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "päivältä" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Säilytä yksi otos jokaiselta päivältä viimeiseltä" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Säilytä yksi otos jokaiselta viikolta viimeiseltä" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "viikkolta" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Säilytä yksi otos jokaiselta kuukaudelta viimeiseltä" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "kuukaudelta" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Säilytä yksi otos jokaiselta vuodelta viimeiseltä" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Älä poista nimettyjä otoksia" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Valinnat" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Näytä ilmoitukset" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Älä ota otoksia kun kone käyttää akkua" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Virranhallinnan tilatiedot eivät ole käytettävissä" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Jatka virheistä huolimatta (pidä keskeneräiset otokset)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Lokitaso:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Ei mitään" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Muutokset & virheet" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Muuta näitä asetuksia vain jos tiedät mitä teet !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Säilytä tiedostojärjestelmän pääsylistat (ACL)" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Säilytä tiedostojen lisäominaisuudet (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" "Kopioi turvattomat linkit (toimii vain absoluuttisten linkkien kanssa)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Uusi profiili" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Uudelleennimeä profiili" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Oletko varma että haluat poistaa profiilin \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Poissulje hakulausekkeella" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Poissulje tiedosto" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Poissulje kansio" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Sisällytä tiedosto" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Sisällytä kansio" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Oletko varma että haluat vaihtaa otosten kansiota?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff-asetukset" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komento:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametrit:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Käytä %1 ja %2 polkuparametreinä" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Listaa vain eri otokset" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Syvätarkistus (tarkempi, mutta hitaampi)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Erot" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Siirry" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Otosta ei voi verrata itseensä" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Komentoa ei löydy: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/pt.po0000644000175000017500000011251613530533316016036 0ustar germargermar# Portuguese translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:15+0000\n" "Last-Translator: Ivo Xavier \n" "Language-Team: Portuguese \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "O perfil \"%s\" já existe!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Não pode remover o último perfil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Desactivado" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "A cada arranque/reinício" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "A cada 5 minutos" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../../common/config.py:82 msgid "Every hour" msgstr "A cada hora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "A cada duas horas" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "A cada quatro horas" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "A Horas Definidas" #: ../../common/config.py:88 msgid "Every Day" msgstr "Diariamente" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Repetidamente (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Qunado o dispositifo for conectado (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Semanalmente" #: ../../common/config.py:92 msgid "Every Month" msgstr "Mensalmente" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dia(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Semana(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Ano(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Hora(s)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mês/Meses" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Chave privada SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Local encriptado" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Encriptação" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH encriptado" #: ../../common/config.py:135 msgid "Default" msgstr "Padrão" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Perfil Principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Perfil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "A pasta dos Snapshots não é valida !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" "Tem de selecionar pelo menos uma directoria para realizar a cópia de " "segurança !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Não pode incluir a directoria de backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Não pode incluir a sub-directoria de backup !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s não é uma directoria !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Impossível escrever em : %s\n" "Verifique se tem acesso ." #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opções Avançadas" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Crontab não encontrado.\n" "Confirme que tem o cron instalado.\n" "Caso não esteja, deverá desactivar todas as cópias de segurança automáticas." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Calendarização udev não funciona com o perfil %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Impossível encontrar UUID para %s" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Impossível montar '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Configuração para pasta encriptada não encontrada" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Criar uma nova pasta encriptada?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Cancelar" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Por favor, confirmar password" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Password não coincide" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "A versão 1.7.2 de encfs tem um erro com a opção --reverse. Por favor, " "actualize encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Tirar snapshot" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s não é membro do grupo 'fuse'.\n" " Executar 'sudo adduser %(user)s fuse'. Para aplicar as alterações faça " "logout e login.\n" "Leia 'man backintime' para mais informações." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "Ponto de montagem %s não está vazio" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Perfil '%(profile)s': Insira password for %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Este ficheiro log foi descodificado com os padrões automáticos de " "pesquisa\n" "### Se alguns caminhos não estão descodificados pode descodifica-los " "manualmente com:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "ERRO" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Restaurar permissões" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Concluído" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Adiar o backup se estiver a usar bateria" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Não foi possível encontrar a pasta dos snapshots.\n" "Se estiver numa drive amovível, ligue-a por favor." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Aguardar %s segundo." msgstr[1] "Aguardar %s segundos." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Falhou a criação da snapshot %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "A finalizar" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Impossível criar pasta: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Gravar ficheiro de configuração ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Gravar permissões ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Impossível remover pasta: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tirar snapshot" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Impossível renomear %(new_path)s para %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Remoção inteligente" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Remover snapshots antigas" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Tentar manter" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "COM ERROS !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Agora" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Não foi possível montar %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Use a soma de verificação para detectar mudanças" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Configurações" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Sair" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ajuda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Página Web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Sobre" #: ../../qt/app.py:204 msgid "Up" msgstr "Subir" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostrar ficheiros escondidos" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurar" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Capturas de ecrã" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Atalhos" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "A processar:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Concluído, cópia de segurança desnecessária" #: ../../qt/app.py:723 msgid "Error:" msgstr "Erro:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Raiz" #: ../../qt/app.py:796 msgid "Home" msgstr "Pasta Pessoal" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Directorias de backup" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Ver conteúdo actual do disco" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Perfil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Erros" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Alterações" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informações" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "A Processar..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hoje" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ontem" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Esta semana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Semana passada" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editar" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Geral" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Onde guardar as snapshots" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Servidor:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Utilizador:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Agenda" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Incluir" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Adicionar um ficheiro" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Adicionar pasta ..." #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Excluir" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Altamente recomendado:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto-remoção" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Mais antigo do que:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Se espaço livre é inferior a:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Não remover snapshots nomeadas" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opções" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activar as notificações" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Alterações & Erros" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Novo perfil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Renomear perfil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Tem a certeza que desja remover este perfil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Excluir ficheiro" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Excluir pasta" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Incluir pasta" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Comando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parâmetros:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ir para" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Comando não encontrado: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/nl.po0000644000175000017500000014366413530533316016034 0ustar germargermar# Dutch translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-05-13 20:27+0000\n" "Last-Translator: rob \n" "Language-Team: Dutch \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Kon volgende configuratie niet opslaan: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Kon volgende configuratie niet laden: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profiel \"%s\" bestaat al!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "U kunt het laatste profiel niet verwijderen!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Uitgeschakeld" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Bij elke start/herstart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Elke 5 minuten" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Elke 10 minuten" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Elke 30 minuten" #: ../../common/config.py:82 msgid "Every hour" msgstr "Elk uur" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Elke 2 uren" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Elke 4 uren" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Elke 6 uren" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Elke 12 uren" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Aangepaste uren" #: ../../common/config.py:88 msgid "Every Day" msgstr "Elke dag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Herhaaldelijk (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Wanneer er een extern medium aangesloten wordt (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Elke week" #: ../../common/config.py:92 msgid "Every Month" msgstr "Elke maand" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(en)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Week/weken" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Jaar/jaren" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Uur/uren" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Maand(en)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTEEL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokaal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH-privésleutel" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokaal versleuteld" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Versleuteling" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH-versleuteld" #: ../../common/config.py:135 msgid "Default" msgstr "Standaardwaarde" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hoofdprofiel" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profiel: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Reservekopiemap is niet geldig!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Selecteer tenminste één map om een reservekopie te kunnen maken !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "U kunt de reservekopiemap niet toevoegen!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "U kunt geen submap van de reservekopiemap toevoegen!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s is geen map!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Gastcomputer/Gebruiker/Profiel-ID mag niet leeg zijn!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Kan niet schrijven naar: %s\n" "Heeft u schrijfrechten?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Doelbestandssysteem voor '%(path)s' is geformatteerd als FAT dat geen harde " "links ondersteunt. Gebruik hiervoor in de plaats a.u.b een Linux-" "bestandssysteem." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "Doelbestandssysteem voor '%(path)s' is een aangekoppeld SMB-netwerk. Zorg er " "a.u.b. voor dat de SMB-server op afstand symbolische links ondersteunt of " "activeer '%(copyLinks)s' in '%(expertOptions)s'." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Links kopiëren (symbolische links dereferentie)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Geavanceerde opties" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "Doelbestandssysteem voor '%(path)s' is een aangekoppeld sshfs-netwerk dat " "geen harde links ondersteunt. Gebruik hiervoor in de plaats a.u.b. de 'SSH-" "modus'." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Kan crontab niet vinden.\n" "Weet u zeker dat cron geïnstalleerd is?\n" "Indien dit niet het geval is, dient u het maken van automatische " "reservekopieën uit te schakelen." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Kon geen nieuwe crontab schrijven." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Kon udev-regel voor profiel %(profile_id)s niet installeren. DBus-dienst " "'%(dbus_interface)s' was niet beschikbaar" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Planning udev werkt niet bij modus %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Kon de unieke identificatiecode voor \"%s\" niet vinden" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Kan '%(command)s' niet aankoppelen :\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Configuratie voor versleutelde map niet gevonden." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Nieuwe versleutelde map aanmaken?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Annuleren" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Wachtwoord bevestigen" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Wachtwoord komt niet overeen" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs-versie 1.7.2 en daarvoor hebben een fout met de optie --reverse. Werk " "encfs a.u.b. bij" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Reservekopie maken" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Er heeft een Hash collision plaatsgevonden in hash_id %s. Vergroot de " "globale waarde voor hash_collision en probeer het opnieuw." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Kon %(proc)s niet ontkoppelen van %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "%(proc)s niet gevonden. Installeer b.v. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s is geen lid van de groep 'fuse'.\n" " Voer de opdracht 'sudo adduser %(user)s fuse' uit. Om de wijzigingen toe te " "passen dient u zich eerst af te melden en daarna weer aan te melden.\n" "Bekijk de 'Back In Time-handleiding' voor verdere instructies." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "koppelpunt-%s niet leeg." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Time-out aankoppelprocesvergrendeling" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profiel '%(profile)s': Voer wachtwoord in voor %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Dit logboek is gedecodeerd met automatisch zoekpatroon\n" "### Als sommige paden niet gedecodeerd zijn dan kunt u deze handmatig " "decoderen met:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "MISLUKT" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Rechten herstellen:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Voltooid" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Maken van reservekopieën uitstellen indien op accu" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Kan reservekopiemap niet vinden.\n" "Als deze op een extern medium staat, gelieve dit aan te sluiten." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Wacht %s seconde" msgstr[1] "Wacht %s seconden" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Kon reservekopie %s niet maken!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Voltooien" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Kan deze map niet aanmaken: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Configuratiebestand opslaan..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Rechten opslaan..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "Restant '%s' gevonden waarmee u verder kunt gaan." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "De van de laatste keer overgebleven map '%s' verwijderen" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Kan deze map niet verwijderen: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Reservekopie maken" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" "Er is niets gewijzigd, dus hoeft er geen nieuwe reservekopie gemaakt te " "worden" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Kan %(new_path)s niet hernoemen naar %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Slim verwijderen" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Oude reservekopieën verwijderen" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Probeer een minimum aan vrije ruimte te houden" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Probeer een minimum van %d%% vrije inodes te houden" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MET FOUTEN!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Huidige schijfinhoud" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Kan %s niet aankoppelen" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Kon SSH-privésleutel niet ontgrendelen. Het wachtwoord is ongeldig of is " "niet beschikbaar voor cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Authenticatie aanmelden zonder wachtwoord voor %(user)s@%(host)s is mislukt. " "Bekijk de 'Back In Time-handleiding' voor verdere instructies." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Codering %(cipher)s mislukt voor %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s is niet gevonden in de ssh_bekende_gastcomputers." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Pad op afstand bestaat maar is geen map:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Pad op afstand is niet beschrijfbaar:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Pad op afstand is niet uitvoerbaar:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Kon geen pad op afstand aanmaken:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "Pingen van %s is mislukt. Gastcomputer is uitgeschakeld of er is een " "verkeerd adres gebruikt." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Gastcomputer op afstand %(host)s ondersteunt geen '%(command)s':\n" "%(err)s\n" "Bekijk de 'Back In Time-handleiding' voor verdere instructies" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Controleer de opdrachten op de gastcomputer. %(host)s gaf een onbekende fout " "aan:\n" "%(err)s\n" "Bekijk de 'Back In Time-handleiding' voor verdere instructies" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Gastcomputer op afstand %s ondersteunt geen harde links" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Kopieer de openbare SSH-sleutel \"%(pubkey)s\" naar gastcomputer op afstand " "\"%(host)s\".\n" "Voer a.u.b. het wachtwoord in voor \"%(user)s\":" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Reservekopie maken met controlesom" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Controlesom gebruiken om wijzigingen op te sporen" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Maken van reservekopie pauzeren" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Maken van reservekopie hervatten" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Maken van reservekopie stoppen" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Reservekopielijst vernieuwen" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Naam reservekopie" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Reservekopie verwijderen" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Reservekopielogboek bekijken" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Laatste logboek bekijken" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Instellingen" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Uitschakelen" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Computer uitschakelen wanneer de reservekopie voltooid is." #: ../../qt/app.py:149 msgid "Exit" msgstr "Afsluiten" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hulp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Configuratiebestand-hulp" #: ../../qt/app.py:163 msgid "Website" msgstr "Website" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Wijzigingslogboek" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Een vraag stellen" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Een fout melden" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Info" #: ../../qt/app.py:204 msgid "Up" msgstr "Omhoog" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Verborgen bestanden tonen" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Herstellen" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" "Herstel de geselecteerde bestanden of mappen naar het oorspronkelijke doel." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Herstellen naar..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "Herstel de geselecteerde bestanden of mappen naar een nieuw doel." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Herstel de momenteel getoonde map en al zijn inhoud naar het oorspronkelijke " "doel." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Herstel de momenteel getoonde map en al zijn inhoud naar een nieuw doel." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Geselecteerd bestand of map herstellen.\n" "Wanneer deze knop grijs gedimd is komt dat hoogstwaarschijnlijk omdat " "\"%(now)s\" is geselecteerd in de reservekopielijst aan de linkerkant.\n" "Deze knop zal weer geactiveerd worden wanneer u op een reservekopie in deze " "reservekopielijst klikt." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Reservekopieën" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Reservekopie" #: ../../qt/app.py:271 msgid "View" msgstr "Beeld" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Snelkoppelingen" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Deze map bestaat niet\n" "in de huidige geselecteerde reservekopie!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Toevoegen om op te nemen" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Toevoegen om uit te sluiten" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s is niet geconfigureerd. Wilt u een eerdere configuratie " "herstellen?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Kan reservekopiemap niet vinden.\n" "Als deze op een extern medium staat, gelieve dit aan te sluiten en op OK te " "drukken." #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Als u dit venster sluit, zal Back In Time de computer niet uit kunnen " "schakelen wanneer de reservekopie voltooid is.\n" "Weet u zeker dat u het wilt sluiten?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Bezig met:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Klaar, geen reservekopie nodig" #: ../../qt/app.py:723 msgid "Error:" msgstr "Fout:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Verzonden:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Snelheid:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Geschatte aankomsttijd:" #: ../../qt/app.py:794 msgid "Global" msgstr "Algemeen" #: ../../qt/app.py:795 msgid "Root" msgstr "Hoofdmap" #: ../../qt/app.py:796 msgid "Home" msgstr "Persoonlijke map" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Mappen om reservekopie van te maken" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Weet u zeker dat u de volgende reservekopie wilt verwijderen?\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Maak reservekopie van lokale bestanden voordat u ze overschrijft of\n" "verwijdert d.m.v. het plaatsen van '%(suffix)s' erachter." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Nieuwere versies van bestanden zullen hernoemd worden met een '%(suffix)s' " "erachter voordat deze hersteld worden.\n" "Indien u deze niet meer nodig heeft kunt u ze verwijderen d.m.v. '%(cmd)s'" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Nieuwere bestanden in oorspronkelijke map verwijderen" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Herstel de geselecteerde bestanden of mappen naar het oorspronkelijke doel\n" "en verwijder de bestanden/mappen die niet opgenomen waren in de " "reservekopie. Pas op:\n" "Hierbij zullen dus de bestanden/mappen verwijderd worden die niet opgenomen " "waren in de reservekopie!\n" "Wees hier uiterst voorzichtig mee!!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" "Weet u zeker dat u het volgende bestand(en) wilt herstellen\n" "naar de nieuwe map '%(path)s':" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Weet u zeker dat u het volgende bestand(en) wilt herstellen:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" "Weet u zeker dat u alle nieuwere bestanden in '%(path)s' wilt verwijderen?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Weet u zeker dat u alle nieuwere bestanden in de oorspronkelijke map wilt " "verwijderen?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "WAARSCHUWING: het verwijderen van systeembestanden uit de hoofdmap kan uw " "hele systeem ruïneren!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Overzicht huidige schijfinhoud" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Reservekopie: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Reservekopie gemaakt op %s bekijken" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "'%s' herstellen" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "'%s' herstellen naar..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Schrijvers" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Vertalingen" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licentie" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Laatste logboekweergave" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Reservekopielogboekweergave" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profiel:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Alles" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Fouten" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Wijzigingen" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informatie" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Fout, [I] Informatie, [C] Wijziging" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "decodeerpaden" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopiëren" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "Decoderen" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Fout" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Vraag" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Back InTime starten" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Bezig met..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Vandaag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Gisteren" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Deze week" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Afgelopen week" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Dit is GEEN reservekopie maar een actuele weergave van uw lokale bestanden" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Laatste controle %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Volledig logboek tonen" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Bewerken" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Aanpassen voor volledige systeemreservekopie" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Toevoegen" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Verwijderen" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Algemeen" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modus:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Waarschuwing: %(app)s gebruikt EncFS voor versleuteling. Na een " "recente veiligheidscontrole is gebleken dat er diverse kwetsbaarheden in " "EncFS zitten. Bekijk a.u.b. de 'Back In Time-handleiding' over 'A NOTE ON " "SECURITY'." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Waar wilt u de reservekopieën opslaan" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Map" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH-instellingen" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Gastcomputer:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Poort:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Gebruiker:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Pad:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Codering:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Privésleutel:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Sleutelbestand" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Maak een nieuwe SSH-sleutel aan zonder wachtwoord." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Wachtwoord" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Wachtwoord toevoegen aan sleutelbos" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Wachtwoordbuffergeheugen voor Cron (Veiligheidskwestie: beheerder kan " "wachtwoord lezen)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Geavanceerd" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Volledige reservekopiepad: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Planning" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dag:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Dag van de week:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Uur:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Uren:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Laat Back In Time herhaaldelijk een reservekopie maken. Dit is vooral " "bruikbaar wanneer de computer niet regelmatig wordt gebruikt." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Elke:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Laat Back In Time een reservekopie maken zodra er een extern medium " "aangesloten wordt (alleen om de X dagen).\n" "Er zal om uw beheerderswachtwoord gevraagd worden." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Opnemen" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Bestanden en mappen opnemen" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Bestand toevoegen" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Map toevoegen" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Uitsluiten" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Waarschuwing: Wildcards ('foo*', '[fF]oo', 'fo?') zullen genegeerd " "worden in de modus 'SSH-encrypted'.\n" "Alleen ster-tekens (*) die gescheiden zijn zijn toegestaan ('foo/*', " "'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Patronen, bestanden en mappen uitsluiten" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Zeer aanbevolen:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Standaardwaarde toevoegen" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Bestanden uitsluiten die groter zijn dan: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Sluit bestanden uit die groter zijn dan de waarde in %(prefix)s.\n" "Indien de 'Volledige rsync-modus' uitgeschakeld wordt zal dit alleen gelden " "voor nieuwe bestanden\n" "omdat voor rsync dit een optie is voor verplaatsen en niet voor uitsluiten.\n" "Dus grote bestanden waar reeds een reservekopie van bestond zullen behouden " "blijven\n" "zelfs bij een eventuele wijziging." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatisch verwijderen" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Ouder dan:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Indien de vrije ruimte kleiner is dan:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Indien de vrije inodes kleiner zijn dan:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Op de achtergrond uitvoeren op gastcomputer op afstand." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Behoud alle reservekopieën van de afgelopen" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dag(en)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Behoud één reservekopie per dag van de afgelopen" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Behoud één reservekopie per week van de afgelopen" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "week/weken" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Behoud één reservekopie per maand van de afgelopen" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "maand(en)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Behoud één reservekopie per jaar van alle jaren" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Geen hernoemde reservekopieën verwijderen" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opties" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Meldingen activeren" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Maken van reservekopieën uitschakelen indien op accu" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Status stroomvoorziening niet beschikbaar vanuit systeem" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Alleen maar één reservekopie tegelijk maken" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Andere reservekopieën zullen geblokkeerd worden totdat de huidige is " "voltooid.\n" "Dit is een algemene optie en zal daarom effect hebben op alle profielen van " "deze gebruiker.\n" "U moet dit echter wel nog instellen voor alle andere gebruikers." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Reservekopie maken van vervangen bestanden bij het herstellen" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Doorgaan op fouten (incomplete reservekopieën behouden)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Maak ook een nieuwe reservekopie als er niets gewijzigd is." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Logboekniveau:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Geen" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Wijzigingen & fouten" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Wijzig deze opties alleen als u zeker weet wat u doet!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "'nice' uitvoeren:" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "als cron job" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "op gastcomputer op afstand" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "'ionice' uitvoeren:" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "bij het maken van een handmatige reservekopie" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "'rsync' uitvoeren met 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "op lokale machine" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "stdout omleiden naar /dev/null in cronjobs." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "stderr omleiden naar /dev/null in cronjobs." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "rsync-bandbreedteverbruik limiteren: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "ACL bewaren" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Uitgebreide attributen (xattr) bewaren" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Onveilige links kopiëren (werkt alleen met absolute links)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Extra opties aan rsync plakken" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Opties moeten tussen aanhalingstekens staan b.v. --exclude-" "from=\"/path/to/my exclude file\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Voorvoegsel aan SSH-opdrachten toevoegen" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Voorvoegsel om vooraf uit te voeren bij elke opdracht op gastcomputer op " "afstand.\n" "Variabelen dienen te worden afgesloten met \\$FOO.\n" "Dit heeft geen consequenties voor rsync. Dus om een voorvoegsel\n" "voor rsync in te stellen gebruik dan \"%(cbRsyncOptions)s\" met\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "standaardwaarde" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Controleer of de gastcomputer op afstand online is" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Waarschuwing: indien uitgeschakeld en wanneer de gastcomputer\n" "op afstand niet beschikbaar is, kan dit mogelijk leiden tot\n" "enige vreemde fouten." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" "Controleer of de gastcomputer op afstand alle noodzakelijke opdrachten " "ondersteunt" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Waarschuwing: indien uitgeschakeld en wanneer de gastcomputer\n" "op afstand niet alle noodzakelijke opdrachten ondersteunt, kan dit mogelijk\n" "leiden tot enige vreemde fouten." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Configuratie herstellen" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "User-callback bewerken" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Wanneer u met Volledige systeemreservekopie een reservekopie gaat maken zal " "deze alleen werken wanneer u deze herstelt naar dezelfde schijf/schijven en " "met dezelfde schijfpartitionering als de bron waar de reservekopie van wordt " "gemaakt; herstellen naar een andere schijf of dezelfde schijf maar met een " "andere partitionering zal mogelijk een gebroken en onbruikbaar systeem als " "gevolg hebben.\n" "\n" "Volledige systeemreservekopie zal enige instellingen die mogelijk aangepast " "zijn opheffen. Wilt u doorgaan?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nieuw profiel" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Profiel hernoemen" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Weet u zeker dat u het profiel \"%s\" wilt verwijderen ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Aangepaste uren kunnen alleen een door een komma gescheiden lijst met uren " "zijn (b.v. 8,12,18,23) of */3 om elke 3 uren een periodieke reservekopie te " "maken" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "U heeft geen privésleutel voor SSH geselecteerd.\n" "Wilt u een nieuwe openbare en privésleutel aanmaken voor het aanmelden " "zonder wachtwoord?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Privésleutel \"%(file)s\" bestaat niet." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Wilt u uw openbare SSH-sleutel kopiëren naar de gastcomputer op afstand\n" "zodat u zich in het vervolg zonder wachtwoord kunt aanmelden?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "De authenticatie van gastcomputer \"%(host)s\" kon niet geverifieerd " "worden.\n" "\n" "%(keytype)s-sleutelvingerafdruk is:" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Verifieer a.u.b. deze vingerafdruk! Wilt u deze toevoegen aan uw " "'bekende_gastcomputers'?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Uit te sluiten patroon" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Selecteer een bestand om uit te sluiten van de reservekopie" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Selecteer een map om uit te sluiten van de reservekopie" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Bestand opnemen" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "\"%s\" is een symbolische link. Er zal geen reservekopie gemaakt worden van " "het gekoppelde doel totdat u het doel zelf ook opneemt.\n" "Wilt u i.p.v. de symbolische link het doel zelf opnemen in de reservekopie?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Volgende map opnemen" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Weet u zeker dat u de reservekopiemap wilt wijzigen?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Kon geen nieuwe SSH-sleutel aanmaken in %(path)s" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "ingeschakeld" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "uitgeschakeld" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Instellingen herstellen" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " en uw gebruiker toe te voegen aan de groep 'fuse'" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Navigeer a.u.b. naar de reservekopie waarvan u de %(appName)s's configuratie " "wilt herstellen. Het pad kan er mogelijk zo uitzien: \n" "%(samplePath)s\n" "\n" "Als deze reservekopieën op een extern medium staan of versleuteld zijn dient " "u deze eerst handmatig aan te koppelen. Wanneer u SSH-versleuteling gebruikt " "dient u het aanmelden met een openbare sleutel op de gastcomputer op afstand " "in te stellen %(addFuse)s.\n" "Bekijk de 'Back In Time-handleiding'." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Geen configuratie gevonden" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "User-callback-script heeft geen shebang-regel (#!/bin/sh)." #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "Shebang in user-callback-script is niet uitvoerbaar." #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Vergelijkopties" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Opdracht:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parameters:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "%1 en %2 voor padparameters gebruiken" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Alleen reservekopieën tonen die verschillen" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Alleen soorgelijke reservekopieën tonen als: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Diepe controle (nauwkeuriger, maar langzaam)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Verwijderen" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Alles selecteren" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Vergelijken met" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Gaan naar" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "U kunt een reservekopie niet met zichzelf vergelijken" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Opdracht niet gevonden: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Weet u zeker dat u \"%(file)s\" uit reservekopie \"%(snapshot_id)s wilt " "verwijderen?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Weet u zeker dat u \"%(file)s\" uit %(count)d reservekopieën wilt " "verwijderen?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "WAARSCHUWING: Dit kan niet ongedaan worden gemaakt!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "\"%s\" uitsluiten van toekomstige reservekopieën?" backintime-1.2.1/common/po/id.po0000644000175000017500000011576213530533316016015 0ustar germargermar# Indonesian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:01+0000\n" "Last-Translator: Germar \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" sudah terpakai !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Anda tidak dapat menghapus profil terakhir !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Dinonaktifkan" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Pada setiap boot/reboot" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Setiap 5 menit" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Setiap 10 menit" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Setiap 30 menit" #: ../../common/config.py:82 msgid "Every hour" msgstr "Setiap jam" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Setiap 2 jam" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Setiap 4 jam" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Setiap 6 jam" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Setiap 12 jam" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Menentukan Jam Sendiri" #: ../../common/config.py:88 msgid "Every Day" msgstr "Setiap Hari" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Ketika drive dihubungkan (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Setiap Minggu" #: ../../common/config.py:92 msgid "Every Month" msgstr "Setiap Bulan" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Hari(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Minggu(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Tahun(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Kunci private SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokal terenkripsi" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Enkripsi" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH terenkripsi" #: ../../common/config.py:135 msgid "Default" msgstr "Bawaan" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profil utama" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Folder snapshot tidak valid !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Anda harus memilih setidaknya satu folder untuk backup !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Anda jangan memasukkan juga folder backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Anda jangan memasukkan juga sub-folder backup !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s bukan sebuah folder !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Tidak dapat menulis: %s\n" "Apakah anda yakin memiliki hak akses tulis?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Tidak dapat menemukan crontab.\n" "Apakah anda yakin cron sudah terpasang ?\n" "Jika tidak, anda harus mematikan semua backup otomatis." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Jadwal udev tidak bekerja pada mode %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Tidak mampu menemukan UUID untuk \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Tidak mampu untuk memuat '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Konfig untuk folder yang terenkripsi tidak ditemukan." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Buat sebuah folder terenkripsi yang baru?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Batal" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Mohon kata sandi dikonfirmasi" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Kata sandi tidak cocok" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "versi encfs 1.7.2 dan setelahnya mempunyai bug ketika menggunakan opsi --" "reverse. Silahkan perbaharui encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Ambil snapshot" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Tabrakan hash muncul pada hash_id %s. Naikkan nilai global hash_collision " "dan cobalah lagi." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s bukan merupakan anggota dari grup 'fuse'.\n" " Jalankan 'sudo adduser %(user)s fuse'. Untuk menerapkan perubahan silahkan " "logout dan login kembali.\n" "Lihat pada 'man backintime' untuk instruksi lebih lanjut." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "mountpoint %s tidak kosong." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Kunci proses mount telah habis" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil '%(profile)s': Masukkan kata sandi untuk %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Catatan ini telah di decode dengan pencarian pola otomatis\n" "### Jika ada beberapa jalur yang tidak didecode anda dapat mendecodenya " "secara manual menggunakan:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "GAGAL" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Kembalikan hak akses:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Selesai" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Tidak dapat menemukan folder snapshot.\n" "Jika ada di hardisk eksternal atau perangkat lainnya silahkan ditancapkan." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Menunggu %s detik." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Gagal untuk mengambil snapshot %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Menyelesaikan" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Tidak mampu membuat folder: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Simpan berkas konfigurasi ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Simpan hak akses ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Tidak mampu menghapus folder: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Ambil snapshot" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Tidak bisa mengubah nama %(new_path)s ke %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Penghapusan pintar" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Hapus snapshot lama" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Coba untuk selalu menyimpan sisa partisi yang minimal" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Coba untuk menyimpan sisa inodes %d%%" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "DENGAN KESALAHAN !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Saat Ini" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Tidak dapat mengkaitkan %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Tidak dapat membuka kunci privat SSH. Kata sandi yang salah atau tidak " "tersedia untuk cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Otentikasi tak bersandi untuk %(user)s@%(host)s gagal. Lihat pada 'man " "backintime' untuk instruksi lebih lanjut." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Cipher %(cipher)s gagal untuk %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s tidak ditemukan dalam ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Jalur yang dipantau tersedia tapi sayangnya bukan sebuah direktori:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Jalur yang dipantau tidak dapat ditulisi:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Jalur yang dipantau tidak dapat dieksekusi:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Tidak mampu membuat jalur pemantau:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Ping %s gagal. Host sedang down atau alamatnya salah." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Host yang dipantau %(host)s tidak mendukung '%(command)s':\n" "%(err)s\n" "Lihat pada 'man backintime' untuk instruksi lebih lanjut" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Periksa perintah-perintah pada host %(host)s yang menyebabkan kesalahan:\n" "%(err)s\n" "Lihat pada 'man backintime' untuk penjelasan lebih lanjut" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Host %s yang dipantau tidak mendukung hardlink" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Segarkan daftar snapshot" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nama Snapshot" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Singkirkan Snapshot" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Lihat Catatan Snapshot" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Lihat Catatan Terakhir" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Pengaturan" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Matikan sistem setelah snapshot selesai." #: ../../qt/app.py:149 msgid "Exit" msgstr "Keluar" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Bantuan" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Situs Web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Tanya Jawab" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Ajukan sebuah pertanyaan" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Laporkan bug" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Tentang" #: ../../qt/app.py:204 msgid "Up" msgstr "Naik" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Tampilkan berkas-berkas tersembunyi" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Pulihkan" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Pulihkan ke ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snapshot" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Jalan Pintas" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Tidak dapat menemukan folder snapshot.\n" "Jika berada pada perangkat USB atau lainnya, silahkan tancapkan dan tekan OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Jika anda menutup jendela ini Back In Time tidak akan mampu mematikan sistem " "anda ketika snapshot selesai dibuat.\n" "Apakah anda yakin ingin menutupnya?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Sedang Bekerja:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Selesai, backup tidak diperlukan" #: ../../qt/app.py:723 msgid "Error:" msgstr "Kesalahan:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Rumah" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Folder Backup" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Apakah anda yakin untuk menghapus snapsot:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Lihat isi disk yang sekarang" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snapshot: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Lihat snapshot yang dibuat pada %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Memulihkan '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Pulihan '%s' ke ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Semua" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Kesalahan" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Perubahan" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informasi" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Sedang Bekerja..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hari ini" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Kemarin" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Minggu Ini" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Minggu kemarin" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Penjadwalan" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Termasuk berkas dan folder" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Diluar pola, berkas atau folder" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Tidak ada" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Perubahan dan Kesalahan" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Profil baru" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Ubah nama profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Apakah anda yakin untuk menghapus profile \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Custom hour hanya dapat menjadi koma pemisah dalam daftar jam (misal " "8,12,18,23) atau */3 untuk backup periodik setiap 3 jam" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Apakah anda yakin ingin mengubah folder snapshot?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Beda" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" "Anda tidak dapat membandingkan sebuah snapshot dengan dirinya sendiri" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Perintah tidak ditemukan: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Apakah anda yakin ingin menghapus \"%(file)s\" dalam snapshot " "\"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Apakah anda yakin ingin menghapus \"%(file)s\" dalam %(count)d snapshot?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "PERINGATAN: Ini tidak bisa dibatalkan!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/th.po0000644000175000017500000010510313530533316016020 0ustar germargermar# Thai translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2009-03-12 08:48+0000\n" "Last-Translator: Thammaraj \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "" #: ../../common/config.py:77 msgid "Disabled" msgstr "" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "ทุก 5 นาที" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "ทุก 10 นาที" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "ทุกวัน" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "ทุกสัปดาห์" #: ../../common/config.py:92 msgid "Every Month" msgstr "ทุกเดือน" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "วัน" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "สัปดาห์" #: ../../common/config.py:98 msgid "Year(s)" msgstr "ปี" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "ทำเสร็จ" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "เดี๋ยวนี้" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "การตั้งค่า" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "ออก" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "ช่วยเหลือ" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "เกี่ยวกับ" #: ../../qt/app.py:204 msgid "Up" msgstr "ขึ้น" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "แสดงแฟ้มที่ซ่อน" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "ทำเสร็จ, ไม่จำเป็นต้องสำรอง" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:220 msgid "Today" msgstr "วันนี้" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "เมื่อวาน" #: ../../qt/qttools.py:229 msgid "This week" msgstr "สัดาห์นี้" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "สัปดาห์ที่แล้ว" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "ไปที่" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/da.po0000644000175000017500000011352513530533316016000 0ustar germargermar# Danish translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Germar \n" "Language-Team: Danish \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" findes allerede !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Du kan ikke fjerne den sidste profil !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Deaktiveret" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Ved hver opstart/genstart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Hver 5 minutter" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Hvert 10. minut" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Hvert 30. minut" #: ../../common/config.py:82 msgid "Every hour" msgstr "Hver time" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Hver 2. time" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Hver 4. time" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Hver 6. time" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Hver 12. time" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Angiv interval" #: ../../common/config.py:88 msgid "Every Day" msgstr "Hver dag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Når drev bliver tilsluttet (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Hver uge" #: ../../common/config.py:92 msgid "Every Month" msgstr "Hver måned" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(e)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Uge(r)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "År" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH privat nøgle" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokal krypteret" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Kryptering" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH krypteret" #: ../../common/config.py:135 msgid "Default" msgstr "Standard" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "hovedprofil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Snapshots mappe er ikke gyldig !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Du skal vælge mindst én mappe, der skal sikkerhedskopieres !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Du kan ikke inkludere sikkerhedskopierings-mappen !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Du kan ikke inkludere en sikkerhedskopierings-mappe !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s er ikke en mappe !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Kan ikke skrive til: %s\n" "Er du sikker på, du har skrive-rettigheder ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Avancerede indstillinger" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Kan ikke finde crontab.\n" "Er du sikker på, at cron er installeret ?\n" "Hvis ikke, skal du deaktivere alle automatiske sikkerhedskopieringer." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Skedulere udev virker ikke med indstilling %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Fandt ikke UUID for \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Kan ikke tilslutte '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Konfig for krypteret mappe ikke fundet." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Lav en ny krypteret mappe?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Annullér" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Bekræft venligst kodeord" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Kodeord passer ikke" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs version 1.7.2 og tidligere har en fejl ved brug af option --reverse. " "Opdatér venligst encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Tag et tilstands-billede" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Hash kollision skete i hash_id %s. Forøg den globale værdi hash_collision og " "forsøg igen." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s er ikke medlem af gruppe 'fuse'.\n" " Kør 'sudo adduser %(user)s fuse'. Bekræft ændringerne ved at logge ud og " "ind igen.\n" "Se 'man backintime' for yderlig information." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "tilsluttelsespunkt %s ikke tomt." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Lås af tilslutningsproces udløbet" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil '%(profile)s': Indtast kodeord for %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Denne log er blevet afkodet med automatisk søge mønster\n" "### Hvis nogle stier ikke er afkodet kan du manuelt afkode dem med:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "MISLYKKEDES" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Gendan tilladelser:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Færdig" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Kan ikke finde tilstands-billede-mappen.\n" "Hvis den er på et flytbart drev indsæt venligst dette." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Venter %s sekund." msgstr[1] "Venter %s sekunder." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Kunne ikke tage tilstands-billede %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Afslutter" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Kan ikke oprette mappen: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Gem config fil ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Gem tilladelse ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Kan ikke fjerne mappen: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tag et tilstands-billede" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Kan ikke omdøbe %(new_path)s til %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart fjern" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Fjern gamle tilstands-billeder" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Prøv at holde minimum fri plads" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Prøv at beholde minimum %d%% inoder fri" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MED FEJL!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nu" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Kan ikke tilslutte %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Kunne ikke fjerne låsen på ssh privat nøgle. Forkert kodeord elle kodeordet " "er ikke tilgængelig for cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Kodeløs login for %(user)s@%(host)s fejlede. Se'man backintime' for yderlig " "informationer." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Tilstands-billede-navn" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Fjern tilstands-billede" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Indstillinger" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Afslut" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjælp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Websted" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Rapporter en fejl" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Om" #: ../../qt/app.py:204 msgid "Up" msgstr "Op" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Vis skjulte filer" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Gendan" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Tilstamds-billeder" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Genveje" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Kan ikke finde tilstands-billede-mappen.\n" "Hvis den er på et flytbar drev, indsæt venligst drevet og tryk OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Arbejder:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Færdig, ingen sikkerhedskopiering nødvendig" #: ../../qt/app.py:723 msgid "Error:" msgstr "Fejl:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalt" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Hjemmemappe" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Sikkerhedskopi-mapper" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Er du sikker på du ønsker at fjerne tilstands-billedet:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Se nuværende disk-indhold" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Tilstands-billede: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Se tilstands-billedet lavet ved %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Fejl" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Arbejder..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "I dag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "I går" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Denne uge" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Sidste uge" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Redigér" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Generelt" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Hvor skal tilstands-billeder gemmes" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Planlæg" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inkludér" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Tilføj fil" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Tilføj mappe" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Ekskludér" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto-fjern" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Ældre end:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Hvis fri plads er mindre end:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Fjern ikke navngivne tilstands-billeder" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Indstillinger" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Aktivér bekendtgørelser" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "De-aktivér tilstands-billeder ved batteri-drift" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Strømstatus ikke tilgængelig fra system" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Ny profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Omdøb profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Er du sikker på at du vil slette profilen \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Ekskludér mønster" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Ekskludér fil" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Ekskludér mappe" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inkludér mapper" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Er du sikker på du ønsker at skifte tilstands-billede-mappe ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff-indstillinger" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Kommando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametre:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Brug %1 og %2 som sti-parametre" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Gå til" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Du kan ikke sammenligne et tilstands-billede med sig selv" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Kommando ikke fundet: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/hr.po0000644000175000017500000011123313530533316016017 0ustar germargermar# Croatian translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:12+0000\n" "Last-Translator: gogo \n" "Language-Team: Croatian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" već postoji!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nije moguće ukloniti zadnji profil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Onemogućeno" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Pri svakom paljenju/podizanju" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Svakih 5 minuta" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Svakih 10 minuta" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Svaki dan" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Svaki tjedan" #: ../../common/config.py:92 msgid "Every Month" msgstr "Svaki mjesec" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dan(a)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Tjedan(a)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Godina" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Glavni profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Mapa snimki nije valjana" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Morate odabrati barem jednu mapu za rezervu !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nije moguće uključiti mapu rezerve !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nije moguće uključiti pod-mapu rezerve !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nije mapa !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nije moguće zapisati u: %s\n" "Provjerite imate li pristup zapisivanju ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Stručne opcije" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Nije moguće pronaći crontab.\n" "Provjerite jeli cron instaliran ?\n" "Ako nije, onesposobite sve automatske rezerve." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Uzmi snimku" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Završeno" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Nije moguće pronači mapu snimki.\n" "Ako se nalazi na izmjenjivom disku, molimo, spojite ga." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Čekanje %s sekunda." msgstr[1] "Čekanje %s sekundi." msgstr[2] "Čekanje %s sekundi." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Neuspjelo uzimanje snimke %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Završavanje" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nije moguće napraviti mapu: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Spremi datoteku postavki ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Spremi dopuštenje ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nije moguće ukloniti mapu: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Uzmi snimku" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart uklanjanje" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Ukloni stare snimke" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Pokušaj sačuvati min slobodno mjesta" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "S GRJEŠKAMA !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Sada" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Osvježi popis snimki" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Ime Snimke" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Ukloni Snimku" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Prikaži Zapis Snimke" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Prikaži Zadnji Zapis" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Postavke" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Izlaz" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomoć" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Web stranica" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O programu" #: ../../qt/app.py:204 msgid "Up" msgstr "Gore" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Prikaži skrivene datoteke" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Povrati" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snimke" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Prečaci" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Nije moguće pronaći mapu snimki.\n" "Ako je na izmjenjivom disku, molimo, spojite ga i pritisnite OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Radim:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Završeno, nije potrebna rezerva" #: ../../qt/app.py:723 msgid "Error:" msgstr "Greška:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalno" #: ../../qt/app.py:795 msgid "Root" msgstr "Korijen" #: ../../qt/app.py:796 msgid "Home" msgstr "Početak" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Mape rezerve" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Jeste li sigurni da želite ukloniti snimku:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Prikaži trenutni sadržaj diska" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snimka: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Prikaži snimku napravljenu %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Sve" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Grješke" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Promjene" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informacije" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Grješka, [I] Informacije, [C] Promjeni" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Obrađujem..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Danas" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Jučer" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ovaj tjedan" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Prošli tjedan" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Uredi" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Općenito" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Gdje sačuvati snimke" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Domaćin:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Korisnik:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Napredno" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Raspored" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Sat:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Uključi" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Ukljući mape i datoteke" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Dodaj datoteku" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Dodaj mapu" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Isključi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Iskljući sljedove, datoteke ili mape" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Visoko preporučeno" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto-ukloni" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Starije od:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ako je slobodan prostor manji od:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Nemoj uklanjati imenovane snimke" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opcije" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Omogući obavijesti" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Onesposobi snimke tijekom rada na bateriji" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Stanje energije nije dostupno od sustava" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Nastavi ne grješkama (zadrži nepotpune snimke)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Razina Zapisa:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Nijedno" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Promjene & Grješke" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Mjenjajte ove opcije samo ako stvarno znate što radite !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Sačuvaj ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Novi profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Preimenuj profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Jeste li sigurni da želite obrisati profil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Isključi slijed" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Isključi datoteku" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Isključi mapu" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Uključi datoteku" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Uključi mapu" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Jeste li sigurni da želite promjeniti mapu snimki?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Naredba:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametri:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Prikaži samo različite snimke" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Dubinska provjera (preciznije, ali sporije)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Razlika" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Idi Na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Nije moguće usporediti snimku s njom samom" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Naredba nije pronađena: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/he.po0000644000175000017500000011344013530533316016004 0ustar germargermar# Hebrew translation for backintime # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Konstantin Golenberg \n" "Language-Team: Hebrew \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "הפרופיל \"%s\" כבר קיים !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "לא ניתן להסיר את הפרופיל האחרון !" #: ../../common/config.py:77 msgid "Disabled" msgstr "מנוטרל" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "כל איתחול של מערכת" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "כל 5 דקות" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "כל 10 דקות" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "כל 30 דקות" #: ../../common/config.py:82 msgid "Every hour" msgstr "כל שעה" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "כל שעתיים" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "כל 4 שעות" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "כל 6 שעות" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "כל 12 שעות" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "כל יום" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "כל שבוע" #: ../../common/config.py:92 msgid "Every Month" msgstr "כל חודש" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "יום/ימים" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "שבוע/ות" #: ../../common/config.py:98 msgid "Year(s)" msgstr "שנה/שנים" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "מקומי" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "מפתח פרטי SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "ברירת מחדל" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "הפרופיל הראשי" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "הפרופיל: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "תיקיית הגיבויים אינה תקנית !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "עליך לבחור לפחות תיקייה אחת לגיבוי !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "לא ניתן לכלול את תיקיית הגיבוי !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "לא ניתן לכלול תת־תיקיות של תיקיית הגיבוי !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s אינה תיקייה !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "לא ניתן לכתוב אל: %s\n" "האם יש ברשותך גישה לכתיבה ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "אפשרויות מתקדמות" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "לא ניתן למצוא את crontab.\n" "האם cron מותקן?\n" "במידה שלא יש לבטל את כל הגיבויים האוטומטיים." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "ביצוע הגיבוי" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "נכשל" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "בוצע" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "לא ניתן למצוא את תיקיית הגיבויים.\n" "אם היא נמצאת בכונן נשלף עליך לחבר אותו." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "בהמתנה של שניה אחת." msgstr[1] "בהמתנה של %s שניות." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "נכשל בלקיחת גיבוי %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "בהליכי סיום" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "לא ניתן ליצור את התיקייה: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "שומר קובץ הגדרות ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "שמירת ההרשאות ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "לא ניתן להסיר את התיקייה: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "ביצוע הגיבוי" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "הסרה חכמה" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "הסרת גיבויים ישנים" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "נסיון לשמירת כמה שפחות מקום פנוי" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "עם שגיאות !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "כעת" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s לא נמצא ברשימה ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "לרענן רשימת גיבוים" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "שם הגיבוי" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "הסר לכידה" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "הגדרות" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "יציאה" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "עזרה" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "אתר הבית" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "שאל שאלה" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "דיווח על תקלה" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "אודות" #: ../../qt/app.py:204 msgid "Up" msgstr "מעלה" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "הצג קבצים מוסתרים" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "שחזור" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "לשחזר ל..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "גיבויים" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "קיצורים" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "לא ניתן למצוא את תיקיית הגיבויים.\n" "אם היא נמצאת על כונן נשלף יש לחבר אותו וללחוץ על אישור" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "בעבודה:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "הסתיים, לא נדרש גיבוי" #: ../../qt/app.py:723 msgid "Error:" msgstr "שגיאה:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "כללי" #: ../../qt/app.py:795 msgid "Root" msgstr "תיקיית העל" #: ../../qt/app.py:796 msgid "Home" msgstr "תיקיית הבית" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "תיקיות הגיבוי" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "אתה בטוח שברצונך להסיר את הגיבוי:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "צפיה בתוכן הנוכחי של הכונן" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "גיבוי: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "צפיה בגיבוי שבוצע ב־%s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "לשחזר '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "לשחזר '%s' ל..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "פרופיל:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "סינון:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "הכל" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "שגיאות" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "שינויים" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "פועל..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "היום" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "אתמול" #: ../../qt/qttools.py:229 msgid "This week" msgstr "השבוע" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "שבוע שעבר" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "עריכה" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "כללי" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "מצב:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "איפה לשמור גיבויים" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "הגדרות SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "פורט:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "צופן:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "מפתח פרטי:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "סיסמה" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "הגדרות מתקדמות" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "תזמון" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "יום:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "שעה:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "שעות:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "כלול" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "הוספת קובץ" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "הוספת תיקייה" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "כלול" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "מאוד מומלץ:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "הסרה-אוטומטית" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "ישן מ:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "אם המקום פנוי קטן מ:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "שבועות" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "חודשים" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "אל תסיר לכידות בעלות שם" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "אפשרויות" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "אפשר הודעות" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "השבת גיבויים כאשר על בטרייה" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "מצב הכוח אינו זמין מהמערכת" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "שינוים ושגיאות" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "עשו שינוים בהגדרות אלו רק אם אתם באמת יודעים מה אתם עושים !" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "פרופיל חדש" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "שינוי שם לפרופיל" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "האם אתה בטוח שברצונך למחוק את הפרופיל \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "הכללת תבנית" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "הכללת קובץ" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "הכללת תיקיה" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "לכלול קובץ" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "לכלול תיקיה" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "האם לשנות את תיקיית הגיבויים?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "אפשרויות שינויים" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "פקודה:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "פרמטרים:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "השתמש ב־%1 ו־%2 כפרמטרים לניתוב" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "שינויים" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "עבור אל" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "לא ניתן להשוות לכידה לעצמה" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "הפקודה לא נמצאה: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/nn.po0000644000175000017500000010726413530533316016032 0ustar germargermar# Norwegian Nynorsk translation for backintime # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:25+0000\n" "Last-Translator: Yngve Spjeld Landro \n" "Language-Team: Norwegian Nynorsk \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profilen \"%s\" finst allereie." #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Du kan ikkje fjerna den siste profilen." #: ../../common/config.py:77 msgid "Disabled" msgstr "Slått av" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Kvart 5. minutt" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Kvart 10. minutt" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Kvar dag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Kvar veke" #: ../../common/config.py:92 msgid "Every Month" msgstr "Kvar månad" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(ar)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Veke(r)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "År" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hovudprofil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Mappa for augneblinksbileta er ugyldig." #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Du må velja minst éi mappe for kopiering" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Tryggleikskopimappa kan ikkje vera med." #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Undermapper til tryggleikskopimappa kan ikkje vera med." #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s er ikkje ei mappe." #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Klarer ikkje å skriva til: %s\n" "Er du sikker på at du har skrivetilgang?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Finn ikkje crontab.\n" "Er du sikker på at cron er installert?\n" "Dersom ikkje, skru av alle automatiske tryggleikskopijobbar." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Ta augneblinksbilete" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Fullført" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Finn ikkje augneblinksmappa.\n" "Dersom ho er på ei ekstern lagringseining, plugg ho i." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Venter %s sekund." msgstr[1] "Ventar %s sekund." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Sluttfører" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Klarer ikkje å laga mappa: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Lagra innstillingsfila …" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Lagra løyve …" #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Klarer ikkje å fjerna mappa: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Ta augneblinksbilete" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart-sletting" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Fjern gamle augneblinksbilete" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "No" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Biletnamn" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Fjern augneblinksbiletet" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Innstillingar" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Avslutt" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjelp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Om" #: ../../qt/app.py:204 msgid "Up" msgstr "Opp" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Vis gøymde filer" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Før tilbake" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Augneblinksbilete" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Snarvegar" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Finn ikkje augneblinksbiletmappa.\n" "Dersom ho er på ei ekstern lagringseining, plugg eininga i og trykk OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Arbeider:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Ferdig, trong ikkje tryggleikskopiera" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalt" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Heim" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Kopieringsmapper" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Sjå på innhaldet til det gjeldande lageret" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Augneblinksbilete: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Sjå på augneblinksbiletet som blei laga %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Arbeider …" #: ../../qt/qttools.py:220 msgid "Today" msgstr "I dag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "I går" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Denne veka" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Førre veke" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Endra" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Ny profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Gje profilen nytt namn" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Vil du verkeleg sletta profilen \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Ekskluder mønster" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Ekskluder fil" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Ekskluder mappe" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inkluder mappe" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Vil du verkeleg endra biletmappa?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Du kan ikke samanlikna eit augneblinksbilete med seg sjølv" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Fann ikkje kommandoen: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/sk.po0000644000175000017500000011224513530533316016027 0ustar germargermar# Slovak translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # Tomáš Vadina , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:18+0000\n" "Last-Translator: Germar \n" "Language-Team: Tomáš Vadina \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) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "X-Poedit-Country: SLOVAKIA\n" "X-Poedit-Language: Slovak\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" už existuje !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nemôžete odstrániť posledný profil !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Zakázané" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Pri každom štarte/reštartu" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Každých 5 minút" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Každých 10 minút" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Každý deň" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Každý týždeň" #: ../../common/config.py:92 msgid "Every Month" msgstr "Každý mesiac" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dni" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Týždne" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Roky" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hlavný profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Priečinok snímok nie je platný !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Musíte vybrať aspoň jeden priečinok pre zálohovanie!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nemožno zahrnúť priečinok zálohy !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nemožno zahrnúť podpriečinok zálohy !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nie je priečinok !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nie je možné zapisovať do: %s\n" "Určite máte právo na zápis ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopírovať odkazy (znefunkční symbolické odkazy)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Možnosti expertov" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Nemožno nájsť crontab.\n" "Ste si istí, že je nainštalovaný ?\n" "Ak nie, mali by ste vypnúť všetky automatické zálohovania." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Urobiť snímku" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Dokončené" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Nie je možné nájsť priečinok snímok.\n" "Ak je na prenosnom médiu prosím vložte ho." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Čakajte %s sekúnd." msgstr[1] "Čakajte %s sekundu." msgstr[2] "Čakajte %s sekundy." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Zlyhalo vytváranie snímky %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Dokončovanie" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nemožno vytvoriť priečinok: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Uložiť konfiguračný súbor" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Uložiť práva ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nemožno odstrániť priečinok: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Urobiť snímku" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Šikovné odstránenie" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Odstrániť staré snímky" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Snažiť sa udržať minimálne voĺné miesto" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "S CHYBAMI!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Teraz" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Použiť kontrolný súčet pre zistenie zmien" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Obnoviť zoznam snímok" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Názov snímky" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Odstrániť snímku" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Zobraziť záznam snímok" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Zobraziť posledný log" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Nastavenia" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Ukončiť" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pomocník" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Webová stránka" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "O programe" #: ../../qt/app.py:204 msgid "Up" msgstr "Hore" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Ukázať skryté súbory" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Obnoviť" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snímky" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Skratky" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Nie je možné nájsť priečinok snímok.\n" "Ak je na prenosnom médiu prosím vložte ho a potom stlačte OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Prebieha:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Dokončené, záloha nie je potrebná" #: ../../qt/app.py:723 msgid "Error:" msgstr "Chyba:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globálne" #: ../../qt/app.py:795 msgid "Root" msgstr "Koreňový priečinok" #: ../../qt/app.py:796 msgid "Home" msgstr "Domovský priečinok" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Priečinky zálohy" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Ste si istí, že chcete odstrániť snímku:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Zobraziť aktuálny obsah disku" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snímka: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Zobraziť snímku vytvorenú %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Všetko" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Chyby" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Zmeny" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informácie" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Chyba, [I] Informácia, [C] Zmena" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Prebieha..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Dnes" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Včera" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Tento týždeň" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Minulý týždeň" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editovať" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Hlavné" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Kam uložiť snímky" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Server:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Používateľ" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Rozšírené" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Plánovanie" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hodina:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Zahrnúť" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Zahrňuje súbory a priečinky" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Pridať súbor" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Pridať priečinok" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Vylúčiť" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Nazahrňovať vzory, súbory alebo priečinky" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Vysoko odporúčané:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatické odstránenie" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Staršie ako:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ak je voľné miesto menšie než:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Neodstraňovať pomenované snímky" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Možnosti" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Povoliť upozornenia" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Nevytvárať snímky pokiaľ systém beží na batérie" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Nie je možné zistiť stav napájania" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Pokračovať pri chybách (zachovať nekompletné snímky)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Úroveň záznamu:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Žiadne" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Zmeny a chyby" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Meňte tieto možnosti len pokiaľ naozaj viete, čo robíte!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Zachovať ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Zachovať rozšírené atribúty (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Kopírovať nezabezpečené odkazy (funguje len s absolútnymi odkazmi)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nový profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Premenovať profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Určite chcete vymazať profil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Vylúčiť vzor" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Vylúčiť súbor" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Vylúčiť priečinok" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Zahrnúť súbor" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Zahrnúť priečinok" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Ste si istí, že chcete zmeniť priečinok snímok?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Možnosti rozdielov" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Príkaz:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametre:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Použiť %1 a %2 parametre cesty" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Zoznam iba rozdielnych snímok" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Hĺbková kontrola (presnejšia, ale pomalšia)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Rozdiel" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ísť na" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Nemôžete porovnávať snímku s ňou samou" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Príkaz nenájdený: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/hu.po0000644000175000017500000012344413530533316016031 0ustar germargermar# Hungarian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # # FIRST AUTHOR , 2009. # Kósa Lajos , 2013. msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:01+0000\n" "Last-Translator: Germar \n" "Language-Team: Hungarian \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" "Language: hu\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "A \"%s\" már létezik!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Nem távolíthatod el az utolsó profilt!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Kikapcsolva" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Minden (újra)indításkor" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Ötpercenként" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Tízpercenként" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "30 percenként" #: ../../common/config.py:82 msgid "Every hour" msgstr "Óránként" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Kétóránként" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Négyóránként" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Hatóránként" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Tizenkétóránként" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Egyedi beállítás (óra)" #: ../../common/config.py:88 msgid "Every Day" msgstr "Naponta" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Ha csatlakozik a meghajtó (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Hetente" #: ../../common/config.py:92 msgid "Every Month" msgstr "Havonta" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Nap" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Hét" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Év" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " KÍSÉRLETI!" #: ../../common/config.py:129 msgid "Local" msgstr "Helyi" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH privát kulcs" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Helyi titkosított" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Titkosítás" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH-val titkosított" #: ../../common/config.py:135 msgid "Default" msgstr "Alapértelmezett" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Fő profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "A pillanatkép-könyvtár nem érvényes" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Legalább egy könyvtárat ki kell jelölnie a mentéshez" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Nem adható hozzá a biztonsági mentés mappája" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Nem adható hozzá a biztonsági mentés almappája" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "A(z) %s nem könyvtár" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Nem tudok ide írni: %s\n" "Biztos, hogy van írási jogod?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Linkek másolása (szimbolikus linkeknél nem csak a hivatkozást)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Szakértői beállítások" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "A crontab nem található.\n" "Biztos, hogy telepítve van a cron?\n" "Ha nem, akkor ki kell kapcsolni az automatikus biztonsági mentést." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Az udev időzítése nem működik ezzel a móddal: %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Nem találom a \"%s\" meghajtó UUID-ját" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Nem tudtam felcsatolni a következőt: '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "A titkosított mappa konfigurációja nem található" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Létrehozzak egy új titkosított mappát?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Mégsem" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Erősítsd meg a jelszót" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "A jelszavakat nem egyeznek" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "Az encfs az 1.7.2-es és korábbi verzióknál hibás, ha a --reverse opciót " "használod. Frissítsd az encfs-t" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Pillanatkép készítése" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Hash-ütközés történt: hash_id %s. Megnövelem a hash_collision értékét, és " "újra próbálom." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "A(z) %(user)s nem tagja a 'fuse' csoportnak.\n" " Futtasd le a 'sudo adduser %(user)s fuse' parancsot, majd jelentkezz ki és " "vissza.\n" "Nézd meg a 'man backintime'-ot további részletekért." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "A %s csatolási pont foglalt" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "A csatolási folyamat túl sok időt vett igénybe" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" "A(z) '%(profile)s' profil: add meg a jelszót a következőhöz: %(mode)s " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Ezt a naplófájlt automatikus keresési mintával dekódolták\n" "### Ha néhány útvonal dekódolása elmaradt, a következővel tudod kézzel " "dekódolni:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "MEGHIÚSULT" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Engedélyek visszaállítása:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Kész" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "A pillanatképek könyvtára nem található.\n" "Ha egy eltávolítható adathordozón van, csatlakoztasd." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "%s másodperc várakozás." msgstr[1] "%s másodperc várakozás." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "A %s pillanatkép készítése meghiúsult!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Véglegesítés" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "A(z) %s mappa nem hozható létre" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Konfigurációs fájl mentése..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Hozzáférési jogosultságok mentése..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "A(z) %s mappa nem távolítható el" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Pillanatkép készítése" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Nem tudom a(z) %(path)s útvonalat átnevezni erre: %(new_path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Okos eltávolítás" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Régi pillanatképek eltávolítása" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "A minimálisan megadott szabad hely kialakítása" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Megpróbálok legalább %d%% szabad inode-ot tartani" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "HIBÁKKAL!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Most" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Nem tudom felcsatolni: %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Nem tudtam feloldani az ssh privát kulcsát. Hibás jelszó vagy a cron nem éri " "el a jelszót." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "A %(user)s@%(host)s nem tudott jelszó nélkül bejelentkeztni. Nézd meg a 'man " "backintime'-ot további részletekért." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "A(z) %(cipher)s nem sikerült a %(host)s esetében:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "A(z) %s nem található itt: ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "A távoli útvonal létezik, de nem könyvtár:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "A távoli útvonal nem írható:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "A távoli útvonal nem futtatható:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Nem tudom távoli útvonalat elkészíteni:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" "A(z) %s ping sikertelen volt. A kiszolgáló nem működik vagy rossz a cím." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "A(z) %(host)s távoli kiszolgáló nem támogatja a következőt: '%(command)s':\n" "%(err)s\n" "Nézd meg a 'man backintime'-ot további részletekért" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "A parancsok ellenőzése a(z) %(host)s kiszolgálón ismeretlen hibát okozott:\n" "%(err)s\n" "Nézd meg a 'man backintime'-ot további részletekért" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "A(z) %s kiszolgáló nem támogatja a hardlinkeket." #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Checksum használata hibák felfedezéséhez" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Pillanatképek listájának frissítése" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Pillanatkép neve" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Pillanatkép eltávolítása" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "A pillanatképek naplófájljának megtekintése" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Utolsó naplófájl megtekintése" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Beállítások" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Leállítás" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Állítsd le a rendszert, ha elkészült a pillanatkép." #: ../../qt/app.py:149 msgid "Exit" msgstr "Kilépés" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Súgó" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Honlap" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "GYIK" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Kérdezz" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Hiba jelentése" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Névjegy" #: ../../qt/app.py:204 msgid "Up" msgstr "Fel" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Rejtett fájlok megjelenítése" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Visszaállítás" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Visszaállítás ide..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Pillanatképek" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Billentyűparancsok" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Nem található a pillanatképek könyvtára.\n" "Ha egy eltávolítható lemezen van, csatlakoztasd és nyomd meg az OK-t" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Ha bezárod ezt az ablakot, a Back In Time nem tudja lekapcsolni a rendszert " "a biztonsági mentés elvégzése után.\n" "Biztos bezárod?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Dolgozik:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Kész, nincs szükség biztonsági mentés készítésére" #: ../../qt/app.py:723 msgid "Error:" msgstr "Hiba:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globális" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Biztonsági mentés mappái" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Biztos, hogy el akar távolítani a következő pillanatképet:\n" "%s?" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "A lemez jelenlegi tartalmának megtekintése" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Pillanatkép: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "A %s időpontban észült pillanatkép megtekintése" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "A(z) '%s' visszaállítása" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "A(z) '%s' visszaállítása ide..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Szűrő:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Mindegyik" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Hibák" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Változások" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Információk" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] hiba, [I] információ, [C] változtat" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "dekódolás útvonalai" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Dolgozom..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Ma" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Tegnap" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Ezen a héten" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Múlt héten" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Szerkesztés" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Általános" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Mód:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Hova mentse a pillanatképeket" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Az SSH beállításai" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Kiszolgáló:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Felhasználó:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Elérési út:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Cipher:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Privát kulcs" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Jelszó" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Jelszó mentése a kulcstartóba" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Jelszó mentése a Cron számára (biztonsági figyelmeztetés: a root látja a " "jelszót)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Szakértői" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Ütemterv" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Nap:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Hét napja:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Óra:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Óra:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Futtassa a Back In Time-ot, amint csatolod a meghajtót (X naponta egyszer).\n" "Be fogja kérni a sudo jelszót." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Hozzáadás" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Felveendő fájlok és mappák" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Fájl hozzáadása" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Mappa hozzáadása" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Kihagyás" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Figyelem: a helyettesítő karaktreket ('foo*', '[fF]oo', 'fo?') az " "'SSH encrypted' mód nem veszi figyelembe.\n" "Csak az elválasztó csillag megengedett ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Kihagyandó minták, fájlok és mappák" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Erősen ajánlott:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatikus eltávolítás" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Régebbi, mint:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Ha a szabad hely kevesebb, mint:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Ha a szabad inode-ok száma kevesebb, mint" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Tartsd meg a pillanatképeket a legutóbbi:" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "napból" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Tarts meg napi egy pillanatképet a legutóbbi:" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Tarts meg heti egy pillanatképet a legutóbbi:" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "hétből" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Tarts meg havi egy pillanatképet a legutóbbi:" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "hónapból" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Tarts meg évi egy pillanatképet a legutóbbi:" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ne távolítsa el a névvel ellátott pillanatképeket" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Beállítások" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Értesítések engedélyezése" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Pillanatképek készítésének tiltása akkumulátorról működésnél" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "A rendszer nem adja meg az energiaellátás állapotát" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Folytatás hibák esetén (megtartja a nem teljes pillanatképeket)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Naplózás szintje:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Egyik sem" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Változások & Hibák" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" "Ezeket a beállításokat csak akkor változtasd meg, ha biztosan tudod, mit " "csinálsz!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Az rsync sávszélesség-használatának korlátja: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "ACL-ek megtartása" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Kiterjesztett jogosultságok (xattr) megtartása" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Nem biztonságos linkek másolása (csak abszolút linkekkel működik)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Új profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Profil átnevezése" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Biztosan törlöd a(z) \"%s\" profilt?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Az egyedi órák csak vesszővel elválasztott, listázott értékek lehetnek (pl. " "8,12,18,23), vagy */3, ha háromóránként akarsz mentést készíteni." #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Kihagyási minta" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Kihagyandó fájl" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Kihagyandó mappa" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Felveendő fájl" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Felveendő mappa" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Biztos, hogy szeretnéd megváltoztatni a pillanatképek mappáját?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff beállítások" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Parancs:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Paraméterek:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Használja ezeket útvonal-paraméterként: %1 és %2" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Csak az eltérő pillanatképek listázása" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Csak a következőkkel megegyező pillanatképek listázása: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Alapos ellenőrzés (pontosabb, de lassú)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Töröl" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Minden kijelölése" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Különbség" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ugrás ide:" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Egy pillanatkép nem hasonlítható össze önmagával" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "A következő parancs nem található: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Biztosan töröljem a \"%(file)s\" fájlt a \"%(snapshot_id)s pillanatképből?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "Biztos, hogy törlöd a \"%(file)s\"-t a \"%(count)d-pillanatképből?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "Nem lehet visszavonni!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Kizárjam a \"%s\"-t a jövőbeli pillanatképekből?" backintime-1.2.1/common/po/sv.po0000644000175000017500000014064613530533316016050 0ustar germargermar# Swedish translation for backintime # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2019-01-31 19:11+0000\n" "Last-Translator: Jonatan Nyberg \n" "Language-Team: Swedish \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Misslyckades med att spara konfiguration: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Misslyckades med att ladda konfiguration: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"%s\" finns redan!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Du kan inte ta bort den senaste profilen!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Inaktiverad" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Vid varje start/omstart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Var 5:e minut" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Var 10:e minut" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Var 30:e minut" #: ../../common/config.py:82 msgid "Every hour" msgstr "Varje timme" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Varannan timme" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Var 4:e timme" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Var 6:e timme" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Var 12:e timme" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Anpassade timmar" #: ../../common/config.py:88 msgid "Every Day" msgstr "Varje dag" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Upprepad (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "När enhet blir ansluten (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Varje vecka" #: ../../common/config.py:92 msgid "Every Month" msgstr "Varje månad" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(ar)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Vecka(-or)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "År" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Timme(-ar)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Månad(er)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTELL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH privat nyckel" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokal krypterad" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Kryptering" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH krypterad" #: ../../common/config.py:135 msgid "Default" msgstr "Standard" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Huvudprofil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Mappen för ögonblicksbilder är ogiltig!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Du måste välja minst en mapp att säkerhetskopiera!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Du kan inte inkludera mappen för säkerhetskopior!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Du kan inte inkludera en undermapp för säkerhetskopior!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s är inte en mapp!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Värd/användare/profil-ID får inte vara tomt!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Kan inte skriva till: %s\n" "Är du säker på att du har skrivrättighet?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "Destinationsfilsystem för \"%(path)s\" är formaterat med FAT som inte stöder " "hard-links. Använd ett inbyggt Linux-filsystem." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "Destinationsfilsystem för \"%(path)s\" är en SMB-monterad delning. " "Kontrollera att fjärr-SMB-servern stöder symlinks eller aktivera " "'%(copyLinks)s' i \"%(expertOptions)s\"." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopiera länkar (dereference symbolic links)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Expertinställningar" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "Destinationsfilsystem för \"%(path)s är en sshfs-monterad delning. sshfs " "stöder inte hard-links. Vänligen använd läget \"SSH\" istället." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Kan inte hitta crontab.\n" "Är du säker på att cron är installerad?\n" "Om inte så måste du inaktivera alla automatiska säkerhetskopior." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Misslyckades med att skriva ny crontab." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Kunde inte installera Udev-regel för profil %(profile_id)s. DBus-tjänst " "\"%(dbus_interface)s\" var inte tillgängligt" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Schema udev fungerar inte med läget %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Kunde inte hitta UUID för \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Kan inte montera \"%(command)s\":\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Config för krypterad mapp har inte hittats." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Skapa en ny krypterad mapp?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Avbryt" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Bekräfta lösenord" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Lösenord matchar inte" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs version 1.7.2 och tidigare har ett fel med alternativet --reverse. " "Vänligen uppdatera encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Ta ögonblicksbild" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Hash-kollision inträffade i hash_id %s. Öka globalvärdet för hash_collision " "och försök igen." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Kan inte avmontera %(proc)s från %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" "%(proc)s hittades inte. Vänligen installera t.ex. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s är inte medlem i gruppen \"fuse\".\n" " Kör \"sudo adduser %(user)s fuse\". För att tillämpa ändringar logga ut och " "logga in igen.\n" "Se \"man backintime\" för ytterligare instruktioner." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "monteringspunkten %s är inte tom." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Monteringsprocess lås tiden ute" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profil \"%(profile)s\": Ange lösenord för %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Den här loggen har avkodats med automatiskt sökmönster\n" "### Om några sökvägar inte har avkodats kan du manuellt avkoda dem med:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "MISSLYCKADES" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Återställ behörigheter:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Färdig" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Uppskjut säkerhetskopiering vid batteridrift" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Det går inte att hitta mapp för ögonblicksbilder.\n" "Om den är på en flyttbar enhet, anslut den." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Väntar %s sekund." msgstr[1] "Väntar %s sekunder." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Misslyckades att skapa ögonblicksbild %s!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Färdigställer" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Kan inte skapa mapp: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Spara konfigurationsfil..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Sparar behörigheter..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "Hittade överbliven \"%s\" som kan fortsättas." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Tar bort överbliven \"%s\"-mapp från senaste körning" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Kan inte ta bort mapp: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tar ögonblicksbild" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "Inget har förändrats, ingen ny ögonblicksbild behövs" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Kunde inte byta namn från %(new_path)s till %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart borttagning" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Tar bort gamla ögonblicksbilder" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Försöker att behålla minimum ledigt utrymme" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Försöker behålla minst %d%% fria inoder" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MED FEL!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nu" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Kan inte montera %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Kunde inte låsa upp privat ssh-nyckel. Fel lösenord eller lösenord är inte " "tillgängligt för cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Lösenordslös autentisering för %(user)s@%(host)s misslyckades. Se \"man " "backintime\" för ytterligare instruktioner." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Chiffer %(cipher)s misslyckades för %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s hittades inte i ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Fjärrsökväg finns men är inte en katalog:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Fjärrsökväg är inte skrivbar:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Fjärrsökväg är inte körbar:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Kunde inte skapa fjärrsökväg:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Pinga %s misslyckades. Värd är nere eller fel adress." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Fjärrvärd %(host)s stöder inte \"%(command)s\":\n" "%(err)s\n" "Se \"man backintime\" för ytterligare instruktioner" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Kontrollera kommandon på värd %(host)s gav okänt fel:\n" "%(err)s\n" "Se \"man backintime\" för ytterligare instruktioner" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Fjärrvärd %s stöder inte hardlinks" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Kopiera offentlig ssh-nyckel \"%(pubkey)s\" till fjärrvärd \"%(host)s\".\n" "Ange lösenord för \"%(user)s\":" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Ta ögonblicksbild med checksums" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Använd checksum för att detektera ändringar" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Pausa process för ögonblicksbilder" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Återuppta process för ögonblicksbilder" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Stoppa process för ögonblicksbilder" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Uppdatera listan över ögonblicksbilder" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Namn på ögonblicksbild" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Ta bort ögonblicksbild" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Visa logg för ögonblicksbild" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Visa senaste logg" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Inställningar" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Stäng av" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Stäng av systemet efter ögonblicksbild har slutförts." #: ../../qt/app.py:149 msgid "Exit" msgstr "Avsluta" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjälp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Hjälp för konfigurationsfil" #: ../../qt/app.py:163 msgid "Website" msgstr "Webbsida" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Ändringslogg" #: ../../qt/app.py:167 msgid "FAQ" msgstr "Vanliga frågor" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Ställ en fråga" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Rapportera ett fel" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Om" #: ../../qt/app.py:204 msgid "Up" msgstr "Upp" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Visa dolda filer" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Återskapa" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" "Återskapa valda filerna eller mapparna till den ursprungliga destinationen." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Återskapa till..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "Återskapa valda filerna eller mapparna till en ny destination." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Återskapa aktuella mappen och hela dess innehåll till den ursprungliga " "destinationen." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Återskapa aktuella mappen och hela dess innehåll till en ny destination." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Återskapa vald fil eller mapp.\n" "Om denna knapp är gråtonad är det högst sannolikt för att \"%(now)s\" är " "vald i listan över ögonblicksbilder på vänstra sidan." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Ögonblicksbilder" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Ögonblicksbild" #: ../../qt/app.py:271 msgid "View" msgstr "Visa" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Genvägar" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Denna mapp finns inte\n" "i den aktuellt valda ögonblicksbilden!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Lägg till i inkludera" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Lägg till i exkludera" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s är inte konfigurerad. Vill du återställa till en tidigare " "konfiguration?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Kan inte hitta mappen för ögonblicksbilder.\n" "Anslut enheten om den finns på en flyttbar enhet och tryck på OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Om du stänger detta fönster kan Back In Time inte stänga av ditt system när " "överblicksbilden är färdig.\n" "Vill du verkligen stänga?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Arbetar:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Färdig, ingen säkerhetskopiering behövdes" #: ../../qt/app.py:723 msgid "Error:" msgstr "Fel:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Skickat:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Hastighet:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "Tid kvar:" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Hem" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Mappar för säkerhetskopior" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Är du säker på att du vill ta bort ögonblicksbilden:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Säkerhetskopiera lokala filer innan du skriver över eller\n" "ta bort med efterföljande \"%(suffix)s\"." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Nyare versioner av filer kommer att omdöpas med efterföljande \"%(suffix)s\" " "innan de återställs.\n" "Om du inte behöver dem längre kan du ta bort dem med \"%(cmd)s\"" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" "Återställ endast filer som inte existerar eller\n" "är nyare än de i destinationen.\n" "Använd alternativet \"rsync - update\"." #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Ta bort nyare filer i originalmappen" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Återställ valda filer eller mappar till ursprunglig destinationen och\n" "ta bort filer/mappar som inte finns i ögonblicksbilden.\n" "Detta kommer att ta bort filer/mappar som var exkluderade när " "ögonblicksbilden togs!\n" "Var extremt försiktig!!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" "Vill du verkligen återställa files(s)\n" "till ny mapp '%(path)s':" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Vill du verkligen återställa denna/dessa fil(er):" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "Är du säker på att du vill ta bort alla nyare filer i \"%(path)s\"?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Är du säker på att du vill ta bort alla nyare filer i din ursprungliga mapp?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "VARNING: Att ta bort filer i root filsystemet kan bryta hela ditt system!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Visa det aktuella diskinnehållet" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Ögonblicksbild: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Visa ögonblicksbilden skapad %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Återställ \"%s\"" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Återställ \"%s\" till..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Utvecklare" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Översättningar" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licens" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Senaste loggvisning" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Ögonblicksbilds loggvisning" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Alla" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Fel" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Ändringar" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Information" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Fel, [I] Information, [C] Ändra" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "avkoda sökvägar" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopiera" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "Avkoda" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "Vill du utesluta detta?" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Fel" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Fråga" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Starta BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Arbetar..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Idag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Igår" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Denna vecka" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Förra veckan" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" "Detta är INTE en ögonblicksbild utan en levande visning av dina lokala filer" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Senaste kontroll %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Visa fullständig logg" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Redigera" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Modifiera för fullständig systemsäkerhetskopiering" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Lägg till" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Ta bort" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Allmänt" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Läge:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Varning: %(app)s använder EncFS för kryptering. En ny " "säkerhetsrevision avslöjade flera möjliga angreppsvektorer för detta. Ta en " "titt på \"A NOTE ON SECURITY\" i \"man backintime\"." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Var ögonblicksbilder ska sparas" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Mapp" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH-inställningar" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Värd:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Användare:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Sökväg:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Chiffer:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Privat nyckel:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Nyckelfil" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Skapa en ny SSH-nyckel utan lösenord." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Lösenord" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Spara lösenord till nyckelring" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "Cache-lösenord för Cron (säkerhetsproblem: root kan läsa lösenord)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avancerat" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Full ögonblicksbild-sökväg: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Schema" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dag:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Veckodag:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Timme:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Timmar:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Kör Back In Time upprepade gånger. Detta är användbart om datorn inte körs " "regelbundet." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Varje:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Kör Back In Time så snart enheten är ansluten (endast en gång var X dag).\n" "Du kommer att bli tillfrågad om ditt sudo-lösenord." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inkludera" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Inkludera filer och mappar" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Lägg till fil" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Lägg till mapp" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exkludera" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Varning: Jokertecken (\"foo*\", \"[fF]oo\", \"fo?\") ignoreras med " "läget \"SSH krypterat\".\n" "Endast separat asterisk är tillåten (\"foo/*\", \"foo/**/bar\")" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Exkludera mönster, filer eller mappar" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Starkt rekommenderat:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Lägg till standard" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Exkludera filer större än: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Exkludera filer större än värdet i %(prefix)s.\n" "Med \"Full rsync-läge\" inaktiverat påverkas endast nya filer\n" "eftersom detta är ett överföringsalternativ för rsync, inte ett " "exkluderingsalternativ.\n" "Så stora filer som har säkerhetskopierats tidigare kommer att behållas i " "överblicksbilder\n" "även om de hade förändrats." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Automatisk borttagning" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Äldre än:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Om ledigt utrymme är mindre än:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Om lediga inoder är mindre än:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Kör i bakgrunden på fjärrvärden." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Behåll alla ögonblicksbilder för de senaste" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dag(ar)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Behåll en ögonblicksbild per dag de senaste" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Behåll en ögonblicksbild per vecka för de senaste" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "vecka/veckor" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Behåll en ögonblicksbild per månad de senaste" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "månad(er)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Behåll en ögonblicksbild per år för alla år" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ta inte bort namngivna ögonblicksbilder" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Inställningar" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Aktivera aviseringar" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Inaktivera ögonblicksbilder vid batteridrift" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Strömstatus inte tillgängligt från system" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Kör bara en ögonblicksbild i taget" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Andra ögonblicksbilder blockeras tills den aktuella ögonblicksbilden är " "färdig.\n" "Detta är en global inställning. Så det kommer att påverka alla profiler för " "denna användaren.\n" "Men du behöver aktivera detta för alla andra användare också." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Säkerhetskopiering ersatte filer vid återställning" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Fortsätt vid fel (behåll icke kompletta ögonblicksbilder)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Ta en ny ögonblicksbild oavsett om det fanns ändringar eller inte." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Loggnivå:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Inga" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Ändringar & fel" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Ändra dessa inställningar endast om du vet vad du gör!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Kör \"nice\":" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "som cronjobb" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "på fjärrvärd" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Kör \"ionice\":" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "vid tagning av en manuell ögonblicksbild" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Kör \"rsync\" med \"nocache\":" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "på lokal maskin" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Omdirigera stdout till /dev/null i cronjobb." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Omdirigera stderr till /dev/null i cronjobb." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Begränsa rsync-bandbreddsanvändning: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sek" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Behåll ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Behåll utökade attribut (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Kopiera osäkra länkar (fungerar endast med absoluta länkar)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Klistra in ytterligare alternativ till rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Alternativ måste citeras t.ex. --exclude-from=\"/sökväg/till/min exkludera " "fil\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Lägg till prefix till SSH-kommandon" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Prefix att köra före varje kommando på fjärrvärd.\n" "Variabler behöver undvikas med \\$FOO.\n" "Detta berör inte rsync. Så för att lägga till ett prefix\n" "för rsync använd \"%(cbRsyncOptions)s\" med\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "standard" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Kontrollera om fjärrvärd är uppkopplad" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Varning: om den är inaktiverad och fjärrvärden\n" "inte är tillgänglig, kan detta leda till några\n" "konstiga fel." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "Kontrollera om fjärrvärd stöder alla nödvändiga kommandon" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Varning: om inaktiverad och fjärrvärden\n" "inte stöder alla nödvändiga kommandon,\n" "kan detta leda till några konstiga fel." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Återställ Config" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "Redigera user-callback" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Full systemsäkerhetskopiering kan bara skapa en ögonblicksbild som ska " "återställas till samma fysiska disk(ar) med samma diskpartitionering som " "från källan; återställa till nya fysiska skivor eller samma skivor med olika " "partitionering ger ett potentiellt brutet och oanvändbart system.\n" "\n" "Full systemsäkerhetskopiering åsidosätter några inställningar som kan ha " "anpassats. Fortsätta?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Ny profil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Byt namn på profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Är du säker på att du vill ta bort profilen \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Anpassade timmar kan endast vara en kommaseparerad lista över timmar (t.ex. " "8,12,18,23) eller */3 för periodiska säkerhetskopior var 3:e timme" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Du valde inte en privat nyckelfil för SSH.\n" "Vill du skapa ett nytt lösenordsfritt offentligt/privat nyckelpar?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "Privat nyckelfil \"%(file)s\" finns inte." #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Vill du kopiera din offentliga SSH-nyckel till\n" "fjärrvärden för att aktivera lösenordslös inloggning?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "Autenticiteten för värd \"%(host)s\" kan inte fastställas.\n" "\n" "%(keytype)s nyckelfingeravtryck är:" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Kontrollera detta fingeravtryck! Vill du lägga till det i din " "\"known_hosts\"-fil?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Exkludera mönster" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exkludera fil" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exkludera mapp" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Inkludera fil" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "\"%s\" är en symlink. Det länkade målet kommer inte att säkerhetskopieras " "tills du inkluderar det också.\n" "Vill du inkludera symlinks-målet istället?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inkludera mapp" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Är du säker på att du vill ändra mappen för ögonblicksbilder?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Misslyckades med att skapa ny SSH-nyckel i %(path)s" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "aktiverad" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "inaktiverad" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Återställ inställningar" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " lägg till din användare till gruppen \"fuse\"" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Navigera till ögonblicksbilden från vilken du vill återställa %(appName)ss " "konfiguration. Sökvägen kan se ut som: \n" "%(samplePath)s\n" "\n" "Om dina ögonblicksbilder finns på en fjärrdisk eller om de är krypterade " "måste du manuellt montera dem först. Om du använder Mode SSH kan du också " "behöva ställa in inloggningen för offentlig nyckel till fjärrvärden " "%(addFuse)s.\n" "Ta en titt på \"man backintime\"." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Ingen konfiguration hittades" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "user-callback skript har ingen shebang (#!/bin/sh) rad." #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "Shebang i user-callback skript är inte körbart." #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Jämförelsealternativ" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Kommando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametrar:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Använd %1 och %2 för sökvägsparametrar" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Lista endast olika ögonblicksbilder" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Lista endast lika ögonblicksbilder till: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Djupkontroll (mer noggrann, men långsam)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Ta bort" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Välj alla" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Jämförelse" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Gå till" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Du kan inte jämföra en ögonblicksbild med sig själv" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Kommando hittades inte: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Vill du verkligen ta bort \"%(file)s\" i ögonblicksbild \"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Vill du verkligen ta bort \"%(file)s\" i %(count)d ögonblicksbilder?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "VARNING: Det här kan inte återkallas!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Exkludera \"%s\" från framtida ögonblicksbilder?" backintime-1.2.1/common/po/ko.po0000644000175000017500000011271013530533316016020 0ustar germargermar# Korean translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:04+0000\n" "Last-Translator: Germar \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "프로파일 \"%s\"가 이미 존재합니다." #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "마지막 프로파일은 제거할 수 없습니다." #: ../../common/config.py:77 msgid "Disabled" msgstr "비활성화됨" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "부팅/재부팅 할 때 마다" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "매 5분" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "매 10분" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "30분마다" #: ../../common/config.py:82 msgid "Every hour" msgstr "1시간마다" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "2시간마다" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "4시간마다" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "6시간마다" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "12시간마다" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "매일" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "매주" #: ../../common/config.py:92 msgid "Every Month" msgstr "매월" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "일" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "주" #: ../../common/config.py:98 msgid "Year(s)" msgstr "년" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH 개인키(비공개키)" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "암호화" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "기본값" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "메인 프로파일" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "프로파일: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "스냅샷 폴더가 유효하지 않습니다." #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "최소한 하나의 백업할 폴더를 선택해야 합니다." #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "백업 폴더를 포함할 수는 없습니다." #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "백업 하위폴더를 포함할 수는 없습니다." #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s는 폴더가 아닙니다." #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "%s에 쓰기를 할 수 없습니다.\n" "쓰기 권한이 있는지를 확인하세요." #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "링크 복사(심볼릭 링크와는 다름)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "고급 설정" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "crontab를 찾을 수 없습니다.\n" "cron이 설치되어 있습니까?\n" "설치되지 않았다면 모든 자동 백업을 실행불가 상태로 해야 합니다." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "취소" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "비밀번호 다시 입력" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "비밀번호 불일치" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "스냅샷 찍기" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "마운트 위치(폴더) %s가 비어 있지 않습니다." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "실패" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "완료" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "스냅샷 폴더를 찾을 수 없습니다." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "%s초 기다리는 중" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "%s 스냅샷을 가지지 못했습니다 !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "마치는 중" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "폴더(%s)를 생성할 수 없음" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "설정 파일 저장 ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "권한을 저장 ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "폴더: %s를 제거할 수 없습니다." #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "스냅샷 찍기" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "똑똑한 제거" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "오래된 스냅샷을 제거합니다." #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "최소 여유 공간을 유지합니다." #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "현재" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "원격 패스가 있지만 디텍토리가 아닙니다.\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "다음 원격 패스에 쓸 수 없습니다.\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "다음 원격 패스를 실행 할 수 없습니다.\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "다음 원격 패스를 만들 수 없습니다.\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "호스트가 다운 되었거나 잘못된 주소입니다. %s ping 실패" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "원격호스트 %s가 하드링크를 지원하지 않습니다." #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "스냅샷 이름" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "스냅샷 제거" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "설정" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "끄기" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "끝내기" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "도움말" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "웹사이트" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "정보" #: ../../qt/app.py:204 msgid "Up" msgstr "위로" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "숨김 파일 표시" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "복원" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "다음 위치에 복원" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "스냅샷" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "바로 가기" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "스냅샷 폴더를 찾을 수 없습니다.\n" "만일 이동식 드라이브에 저장되었다면 연결 하신 후에 확인을 누르십시오." #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "진행중:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "완료. 백업이 필요하지 않습니다." #: ../../qt/app.py:723 msgid "Error:" msgstr "오류:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "전역" #: ../../qt/app.py:795 msgid "Root" msgstr "루트" #: ../../qt/app.py:796 msgid "Home" msgstr "홈" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "백업 폴더" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "정말 스냅샷을 제거하시겠습니까?\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "현재 디스크의 내용을 봅니다." #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "스냅샷: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "%s에 만들어진 스냅샷을 봅니다." #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "%s 을/를 복원" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "다음 위치에 %s 을/를 복원" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "프로파일:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "동작 중..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "오늘" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "어제" #: ../../qt/qttools.py:229 msgid "This week" msgstr "어번 주" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "지난 주" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "편집" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "일반" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "스냅샷을 저장할 위치" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH 설정" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "고급 설정" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "일정" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "시간:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "포함" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "파일 추가" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "폴더 추가" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "제외" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "자동 제거" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "날짜가 다음 보다 오래된 경우:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "여유 공간이 다음보다 작은 경우:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "이름을 붙인 스냅샷은 제거하지 않습니다." #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "선택 사항" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "알림 사용하기" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "배터리 사용중에는 스냅샷을 찍을 수 없습니다." #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "시스템의 전원 상태를 알 수 없습니다." #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "기록 단계:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "이 옵션들이 무엇을 의미하는지 정확하게 알 경우에만 바꾸시오!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "새로운 프로파일" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "프로파일명을 변경" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "정말 프로파일 \"%s\"을 삭제하시겠습니까?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "제외할 패턴" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "제외할 파일" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "제외할 폴더" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "파일 포함" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "폴더를 포함" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "정말 스냅샷 폴더를 변경하시겠습니까?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "차이점 옵션" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "명령:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "매개 변수:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "경로 매개변수로 %1과 %2를 사용" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "삭제" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "전체 선택" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "차이점" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "이동하기" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "동일한 스냅샷을 비교할 수 없습니다." #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "명령어를 찾을 수 없음: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/lt.po0000644000175000017500000010751513530533316016035 0ustar germargermar# Lithuanian translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:18+0000\n" "Last-Translator: Mantas Kriaučiūnas \n" "Language-Team: Lithuanian \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%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "" #: ../../common/config.py:77 msgid "Disabled" msgstr "Išjungta" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Kas 5 minutės" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Kas 10 minučių" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "Kasdien" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "Kas savaitę" #: ../../common/config.py:92 msgid "Every Month" msgstr "Kas mėnesį" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Diena (os/ų)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Savaitė (ės/čių)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Metai (-ų)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Negalima įtraukti atsarginėms kopijoms skirto aplanko!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Negalima įtraukti atsarginėms kopijoms skirto poaplankio!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s nėra aplankas!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Parinktys ekspertams" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "Negaliu rasti crontab." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Priimti momentinę kopiją" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Atlikta" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Laukti %s sekundes." msgstr[1] "Laukti %s sekundžių." msgstr[2] "Laukti %s sekundžių." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Baigiu" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Nepavyko sukurti aplanko: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Išsaugoti konfigūracijos failą..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Nepavyko pašalinti aplanko: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Priimti momentinę kopiją" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Sumanus pašalinimas" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Pašalinti senas momentines kopijas" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Bandyti" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Dabar" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Pasikeitimų aptikimui naudoti kontrolines sumas" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Momentinės kopijos pavadinimas" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Pašalinti momentines kopijas" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Nustatymai" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Baigti" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Pagalba" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Interneto svetainė" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Apie" #: ../../qt/app.py:204 msgid "Up" msgstr "Aukštyn" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Rodyti paslėptus failus" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Atstatyti" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Momentinės kopijos" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Nuorodos" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Dirbu:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Atlikta, atsarginė kopija nebūtina" #: ../../qt/app.py:723 msgid "Error:" msgstr "Klaida:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Globalus" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Pradžia" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Atsarginių kopijų aplankai" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Ar jūs tikrai norite pašalinti momentinę kopiją:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Žiūrėti esamo disko turinį" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Momentinė kopija: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Žiūrėti momentinę kopiją, padarytą %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtras:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Kaidos" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Pakeitimai" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informacija" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Dirbama..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Šiandien" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Vakar" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Šią savaitę" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Praeitą savaitę" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Keisti" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Bendri" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Kur išsaugoti momentinę kopiją" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Naudotojas:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Tvarkaraštis" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Valanda:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Įtraukti" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Įtraukti failus bei aplankus" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Pridėti failą" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Pridėti aplanką" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Išskirti" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Pašalinti automatiškai" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Senesni nei:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Jei laisvos vietos mažiau nei:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Nešalinti momentinių kopijų, turinčių pavadinimus" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Parinktys" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Įgalinti pranešimus" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Pakeitimai ir klaidos" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Išskirti šabloną" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Išskirti failą" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Išskirti aplanką" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Įtraukti failą" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Įtraukti aplanką" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Pasikeitimų parinktys" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komanda:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametrai:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "naudoti %1 ir %2 kaip kelio parametrus" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Pasikeitimai" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Eiti į" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Jūs negalite palyginti momentinės kopijos su ja pačia" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Komanda nerasta: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/pt_BR.po0000644000175000017500000013134213530533316016417 0ustar germargermar# Brazilian Portuguese translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2017-01-23 04:37+0000\n" "Last-Translator: Germar \n" "Language-Team: Brazilian Portuguese \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Falha ao salvar o arquivo de configuração: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Falha ao carregar o arquivo de configuração: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "O perfil \"%s\" já existe!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Você não pode remover o último perfil!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Desabilitado" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Em cada início/reinício" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "A cada 5 minutos" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../../common/config.py:82 msgid "Every hour" msgstr "A cada hora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "A cada 2 horas" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "A cada 4 horas" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Horas customizadas" #: ../../common/config.py:88 msgid "Every Day" msgstr "A cada Dia" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Repetidamente (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Quando o drive for conectado (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "A cada semana" #: ../../common/config.py:92 msgid "Every Month" msgstr "A cada mês" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dia(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Semana(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Ano(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Hora(s)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mês(es)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Chave privada SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Local encriptado" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Criptografia" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH criptografado" #: ../../common/config.py:135 msgid "Default" msgstr "Padrão" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Perfil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Perfil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Pasta para Snapshots não é válida !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Você deve selecionar pelo menos uma pasta para backup !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Você não pode incluir uma pasta de backup !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Você não pode incluir uma sub-pasta de backup !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s não é uma pasta !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Host/Usuário/Perfil não podem estar vazios!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Não é possível escrever para: %s\n" "Tem certeza de que tem acesso para gravação ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "O sistema de arquivos de destino em '%(path)s' está formatado com FAT que " "não suporta hard-links. Por favor, utilize um sistema de arquivos nativo do " "Linux." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "O sistema de arquivos de destino em '%(path)s' é um compartilhamento SMB " "montado. Por favor, tenha certeza que o servidor SMB remoto suporta symlinks " "ou ative a opção '%(copyLinks)s' em '%(expertOptions)s'." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copiar links (criar links simbólicos)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opções avançadas" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "O sistema de arquivos de destino em '%(path)s' é um compartilhamento sshfs " "montado. O sshfs não suporta hard-links. Por favor, utilize o modo 'SSH' " "como alternativa." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Não é possível localizar crontab.\n" "Você tem certeza se o cron está instalado ?\n" "Se não você deve desabilitar todos os backups automáticos." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Falha ao escrever um novo crontab." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Não foi possível instalar a regra Udev para o perfil %(profile_id)s. O " "serviço DBus '%(dbus_interface)s' não está disponível" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Agendamento udev não funcionou com modo %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Não foi possível encontrar UUID para \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Não pude montar '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Configuração para pasta encriptada não foi encontrada." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Criar uma nova pasta encriptada?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Cancelar" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Por favor, confirme o password" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Password não corresponde" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "As versões até 1.7.2 do encfs possuem um bug com a opção --reverse. Por " "favor, atualize o encfs." #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Tirar snapshot" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Colisão de hash ocorreu em hash_id %s. Incrementando o valor global " "hash_collision e tentando de novo." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s não é membro do grupo 'fuse'.\n" " Execute 'sudo adduser %(user)s fuse'. Para aplicar as alterações, execute " "um logout e logue novamente.\n" "Veja o manual em 'man backintime' para instruções adicionais." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "O ponto de montagem %s não está vazio." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Perfil '%(profile)s': Digite o password para %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "FALHOU" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Permissões de restauração:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Pronto" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Adiando o backup enquanto estiver na bateria" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Não é possível localizar pasta de instantâneos.\n" "Se ele estiver em uma unidade removível, por favor conecte-a." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Esperando %s segundo." msgstr[1] "Esperando % segundos." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Falha ao fazer snapshot %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalizando" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Não é possível criar a pasta: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Salvar arquivo de configuração ..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Salvar permissão ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Não é possível remover pasta: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tirar snapshot" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Não foi possível renomear %(new_path)s para %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Remoção Inteligente" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Remover snapshots antigos" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Tentar manter o mínimo espaço livre" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Tente manter no mínimo %d%% de inodes livres" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "COM ERROS !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Agora" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Não foi possível montar %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Não foi possível destravar a chave privada ssh. O password está errado ou " "não está disponível para o cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "A autenticação sem password para %(user)s@%(host)s falhou. Veja 'man " "backintime' para instruções adicionais." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s não encontrado em ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "O caminho remoto existe mas não é um diretório:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "O caminho remoto não é gravável:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "O caminho remoto não é executável:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Não foi possível criar o caminho remoto:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Ping %s falhou. O host está inativo ou o endereço está errado." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "O host remoto %(host)s não suporta '%(command)s':\n" "%(err)s\n" "Veja 'man backintime' para instruções adicionais." #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Os comandos de verificação no host %(host)s retornaram um erro " "desconhecido:\n" "%(err)s\n" "Veja 'man backintime' para instruções adicionais." #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "O host remoto %s não suporta hardlinks" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Usar checksum para detectar mudanças" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Atualizar lista de snapshots" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nome do Snapshot" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Remover snapshot" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Ver log dos snapshots" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Ver último log" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Configurações" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Desligar" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Desligar o sistema após a finalização do snapshot." #: ../../qt/app.py:149 msgid "Exit" msgstr "Sair" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ajuda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Ajuda sobre o Arquivo de Configuração" #: ../../qt/app.py:163 msgid "Website" msgstr "Website" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Registro de alterações" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ (perguntas mais freqüentes)" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Fazer uma pergunta" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Relatar um problema (bug)" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Sobre" #: ../../qt/app.py:204 msgid "Up" msgstr "Para cima" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostrar arquivos ocultos" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurar" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Restaurar para ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Restaurar o arquivo ou pasta selecionado.\n" "Se este botão estiver cinza, é provável que \"%(now)s\" está selecionado na " "lista de snapshots à esquerda." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snapshots" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Snapshot" #: ../../qt/app.py:271 msgid "View" msgstr "Exibir" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Atalhos" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Essa pasta não existe\n" "no snapshot selecionado atualmente!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Adicionar para a Lista de Inclusões" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Adicionar para a Lista de Exclusões" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s não está configurado. Você gostaria de restaurar uma " "configuração anterior?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Não é possível localizar pasta de snapshots.\n" "Se ele estiver em uma unidade removível, por favor conecte-a e pressione OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Se você fechar essa janela, o Back In Time não será capaz de desligar o seu " "sistema quando o snapshot estiver terminado.\n" "Você realmente deseja fechar?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Trabalhando:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Concluído, backup não necessário" #: ../../qt/app.py:723 msgid "Error:" msgstr "Erro:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Enviado:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Velocidade:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "ETA:" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Pastas de backup" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Tem certeza de que deseja remover o snapshot:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Novas versões dos arquivos serão renomeadas com o sufixo '%(suffix)s' antes " "da restauração.\n" "Se você não precisar mais delas, você pode removê-las com o comando '%(cmd)s'" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Você tem certeza que deseja restaurar esse(s) arquivo(s):" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Você tem certeza que deseja remover todos os arquivos mais novos na sua " "pasta original?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "AVISO: deletar arquivos no sistema de arquivos raiz (root) poderá destruir " "todo o seu sistema!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Visualizar o conteúdo atual do disco" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snapshot: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Ver o snapshot feito em %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Restaurar '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Restaurar '%s' para ..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Autores" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Traduções" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Licença" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Visualização do Último Log" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Visualização do Log do Snapshot" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Perfil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtrar:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Todos" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Erros" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Alterações" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informações" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Erro, [I] Informação, [C] Mudar" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "decodificar caminhos" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Erro" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Pergunta" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Inicializar BackInTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Trabalhando..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hoje" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ontem" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Esta semana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Semana passada" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "Isto NÃO é um snapshot, mas uma visualização do seus arquivos locais" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Última verificação %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Mostrar Log Completo" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editar" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Modificar para Backup do Sistema Completo" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Adicionar" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Excluir" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Geral" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modo:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Aviso: %(app)s utiliza EncFS para criptografia. Uma auditoria de " "segurança recente revelou diversos vetores de ataque possíveis para o EncFS. " "Por favor, olhe a seção 'A NOTE ON SECURITY' em 'man backintime'." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Onde salvar os snapshots" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Pasta" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "Configurações do SSH" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Host:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Porta:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Usuário:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Caminho:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Chave privada:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Password" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Salvar o Password no Chaveiro" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Armazenar o Password para o Cron (Problema de segurança: o root poderá ler o " "password)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avançado" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Caminho completo do snapshot: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Agendar" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Dia:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Dia da Semana" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Horas:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Executar o Back In Time repetidamente. Isto é útil se o computador não é " "executado regularmente." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Todo:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Executar o Back In Time assim que o dispositivo for conectado (apenas uma " "vez a cada X dias).\n" "O seu password para o sudo será solicitado." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Incluir" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Incluir arquivos e pastas" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Adicionar arquivo" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Adicionar pasta" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Excluir" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Aviso: Os wildcards ('foo*', '[fF]oo', 'fo?') serão ignorados no modo " "'SSH criptografado'.\n" "Apenas asteriscos separados são permitidos ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Excluir padrões, arquivos e pastas" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Altamente recomendado:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Adicionar Padrões" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Excluir arquivos maiores que: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Excluir arquivos maiores que o valor em %(prefix)s.\n" "Se o 'Modo de resincronismo total' estiver desabilitado, essa opção irá " "afetar apenas novos\n" "arquivos, porque, para o rsync, isso é uma opção de transferência e não de " "exclusão.\n" "Dessa forma, arquivos grandes que foram copiados anteriormente permanecerão " "nos\n" "snapshots mesmo que tenham sido alterados." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Remoção-automatica" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Antigo quanto:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Se o espaço livre for menor do que:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Se o número de inodes livres é menor que:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Executar em segundo plano no Host remoto." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Manter snapshots pelos últimos" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "dia(s)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Manter um snapshot por dia pelos últimos" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Manter um snapshot por semana pelos últimos" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "semana(s)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Manter um instantâneo por mês pelos últimos" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mês(es)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Manter um snapshot por ano por todos os anos" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Não remover os snapshots nomeados" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opções" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Habilitar notifiações" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Desativar snapshot quando na bateria" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Estado da energia não está disponível a partir do sistema" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Executar apenas um snapshot por vez" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Todos os outros snapshots ficarão bloqueados até que o snapshot atual seja " "completado.\n" "Essa é uma opção global. Por isso, irá afetar todos os perfis para este " "usuário.\n" "No entanto, você precisará ativá-la para todos os outros usuários também." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Criar um backup dos arquivos substituídos na restauração" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continuar em caso de erros (manter snapshots incompletos)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" "Criar um novo snapshot independentemente de existir ou não alterações." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Nível de registro:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Nenhum" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Alterações & Erros" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Mudar essas opções só se você souber o que está fazendo!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Executar 'nice':" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "como uma tarefa cron" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "no host remoto" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Executar 'ionice':" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "quando for criar um snapshot manual" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Executar 'rsync' com 'nocache':" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "na máquina local" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Redirecionar o stdout para /dev/null nas tarefas cron" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Redirecionar o stderr para /dev/null nas tarefas cron" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Limitar a largura de banda utilizada pelo rsync: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preservar ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preservar atributos extendidos (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Copiar links inseguros (funciona apenas com hard links)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Utilizar opções adicionais para o rsync" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "As opções devem estar entre aspas, por exemplo: --exclude-from=\"/path/to/my " "exclude file\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Adicionar prefixo aos comandos SSH" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "padrão" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Restaurar Configuração" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Novo perfil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Renomear perfil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Você tem certeza que deseja excluir este perfil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Horas customizadas podem ser apenas uma lista de horários separados por " "vírgula (por exemplo, 8,12,18,23) ou */3 para backups periódicos a cada 3 " "horas" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Excluir modelos" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Excluir arquivo" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Excluir pasta" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Incluir arquivo" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Incluir pasta" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Deseja realmente mudar a pasta de snapshots ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "ativado" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "desativado" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Restaurar Configurações" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Nenhum arquivo de configuração encontrado" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opções do Diff" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Comando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parâmetros:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Use %1 e %2 para os parâmetros de caminho" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Listar apenas snapshots diferentes" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Listar apenas snapshots iguais a: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Checagem profunda (mais preciso, mas lento)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Excluir" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Selecionar Tudo" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diferença" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ir para" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Você não pode comparar um snapshot com ele mesmo" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Comando não encontrado: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Você realmente deseja apagar \"%(file)s\" no snapshot \"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "Você realmente deseja apagar \"%(file)s\" em %(count)d snapshots?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Excluir \"%s\" de snapshots futuros?" backintime-1.2.1/common/po/genmessages.sh0000755000175000017500000000011713530533316017704 0ustar germargermar#!/bin/bash xgettext --output=- ../../common/*.py ../../qt/*.py > messages.pot backintime-1.2.1/common/po/nb.po0000644000175000017500000011076013530533316016011 0ustar germargermar# Norwegian Bokmal translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-02-12 04:15+0000\n" "Last-Translator: Germar \n" "Language-Team: Norwegian Bokmal \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profil \"% s\" eksisterer allerede!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Du kan ikke fjerne den siste profilen!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Deaktivert" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "For hver start/omstart" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Hvert 5. minutt" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Hvert 10. minutt" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Hvert 30. minutt" #: ../../common/config.py:82 msgid "Every hour" msgstr "Hver time" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Annenhver time" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Hver fjerde time" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Hver sjette time" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Hver tolvte time" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Velg timer" #: ../../common/config.py:88 msgid "Every Day" msgstr "" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Når disken kobles til (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Hver uke" #: ../../common/config.py:92 msgid "Every Month" msgstr "Hver måned" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Dag(er)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Uke(r)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "År" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " USTABIL!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokal" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Privat SSH nøkkel" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokal kryptert" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Kryptering" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH kryptert" #: ../../common/config.py:135 msgid "Default" msgstr "Standard" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Hovedprofil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Øyeblikksbilde mappen er ikke gyldig !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Du velge minst en mappe å sikkerhetskopiere !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Du kan ikke inkludere sikkerhetskopi mappen !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Du kan ikke inkludere en sikkerhetskopi under-mappe !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s er ikke en mappe !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Kan ikke skrive til:% s\n" "Er du sikker på at du har skrivetilgang?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Avanserte innstillinger" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Kan ikke finne crontab.\n" "Er du sikker på at cron er installert?\n" "Hvis ikke bør du skru av alle automatiske sikkerhetskopier." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Kunne ikke finne UUID for \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Ta øyeblikksbilde" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Ferdig" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Kan ikke finne øyeblikksbilde mappe.\n" "Hvis den er på en ekstern disk, vennligst plugg den i." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Venter %s sekund." msgstr[1] "Venter %s sekunder." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Avslutter" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Kan ikke opprette mappe: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Lagre rettighet ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "…" #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Kan ikke fjerne mappe: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Ta øyeblikksbilde" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart sletting" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Slett gamle øyeblikksbilder" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Forsøk å bevare min ledig plass" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "MED FEIL !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Nå" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Navn på øyeblikksbilde" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Fjern Øyeblikksbilde" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Innstillinger" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Avslutt" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Hjelp" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Nettside" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Om" #: ../../qt/app.py:204 msgid "Up" msgstr "Opp" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Vis skjulte filer" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Gjennopprett" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Øyeblikksbilder" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Snarveier" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Kan ikke finne øyeblikksbilde mappe.\n" "Hvis den er på en ekstern disk vennligst plugg den i, deretter trykk OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Arbeider:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Ferdig, sikkerhetskopiering trengs ikke" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Rot" #: ../../qt/app.py:796 msgid "Home" msgstr "Hjem" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Øyeblikksbilde mapper" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Er du sikker på at du vil fjerne øyeblikksbilde:\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Se nåværende stasjons innhold" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Øyeblikksbilde: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Se øyeblikksbilde laget den %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Feil" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Endringer" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Arbeider …" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Idag" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Igår" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Denne uken" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Forrige uke" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Rediger" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Generelt" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Hvor lagre øyeblikksbilder" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Timeplan" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Inkluder" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Inkluder filer og mapper" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Legg til fil" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Legg til katalog" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Ekskludér" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Fjern automatisk" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Eldre enn:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Hvis ledig plass er mindre enn:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ikke fjern navngitte øyeblikksbilder" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Alternativer" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Slå på meldinger" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Slå av funksjonen snapshot ved bateridrift" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Omdøp profil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Er du sikker på at du vil slette profilen «% s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Utelukk mønster" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Ekskluder fil" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Ekskludér katalog" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Inkludér katalog" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Er du sikker på at vil bytte øyeblikksbilder mappen ?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff Valg" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Kommando:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametere:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Bruk %1 and %2 for path parameters" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Gå Til" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Du kan ikke sammenlikne et øyeblikksbilde med seg selv" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Kommando ikke funnet: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/eu.po0000644000175000017500000014102513530533316016021 0ustar germargermar# Basque translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2019-01-01 22:04+0000\n" "Last-Translator: Alexander Gabilondo \n" "Language-Team: Basque \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Huts egin du ezarpenak gordetzen: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Huts egin du ezarpenak kargatzen: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "\"%s\" profila badago honezkero." #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Ezin duzu ezabatu azken profila!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Ezgaituta" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Abiatze/berrabiaratze guztietan" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "5 minuturo" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "10 minuturo" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "30 minuturo" #: ../../common/config.py:82 msgid "Every hour" msgstr "Orduro" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "2 ordutan behin" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "4 ordutan behin" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "6 ordutan behin" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "12 ordutan behin" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "ordu pertsonalizatuetan" #: ../../common/config.py:88 msgid "Every Day" msgstr "Egunero" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Behin eta berriz (anacron)" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Unitatea konektatzean (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Astero" #: ../../common/config.py:92 msgid "Every Month" msgstr "Hilero" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Egun(ak)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "aste" #: ../../common/config.py:98 msgid "Year(s)" msgstr "urtez" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Ordu" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Hilabete" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " ESPERIMENTALA!" #: ../../common/config.py:129 msgid "Local" msgstr "Lokala" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH gako pribatua" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Lokala zifratua" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Zifraketa" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH zifratua" #: ../../common/config.py:135 msgid "Default" msgstr "Lehenetsia" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Profil nagusia" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profila: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Babeskopien karpeta ez da baliozkoa!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Gutxienez karpeta bat hautatu behar duzu babeskopiarako !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Ezin duzu babeskopiaren karpeta sartu babeskopian !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Ezin duzu babekopiaren azpi-karpetak sartu babeskopian !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s ez da karpeta bat !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Ostalari/Erabiltzaile/Profila-ID ez da hutsik egon behar!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Ezin da hor idatzi: %s\n" "Ziur zaude idazteko baimenik baduzula?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "'%(path)s'-(r)en helburuko fitxategi-sistemaren formatua FAT da eta ez du " "esteka gogorrik onartzen. Erabili Linux jatorriko fitxategi-sistema bat." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "'%(path)s'-(r)en helburuko fitxategi-sistema SMB-ez muntatutako partekatzea " "da. Egiaztatu urruneko SMB zerbitzariak esteka sinbolikoak onartzen dituela " "edo gaitu '%(copyLinks)s' '%(expertOptions)s'-en." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Kopiatu estekak (erreferentzia kendu esteka sinbolikoei)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Aukera aurreratuak" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "'%(path)s'-(r)en helburuko fitxategi-sistema sshfs-ez muntatutako " "partekatzea da. sshfs-ek ez du esteka gogorrik onartzen. Erabili 'SSH' haren " "ordez." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Ezin da aurkitu crontab.\n" "Seguru zaude crontab instalatuta dagoela?\n" "Crontab ez baduzu babeskopia automatiko guztiak ezgaitu beharko zenuke." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Huts egin du crontab berria idazten." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "Ezin izan da Udev araua instalatu %(profile_id)s profilarentzat. " "'%(dbus_interface)s' DBus zerbitzua ez zegoen erabilgarri." #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Programatutako udev-a ez dabil %s moduarekin" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Ezin da UUID aurkitu honentzat: \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "'%(command)s' ezin da muntatu:\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Ez dira aurkitu zifratutako karpetaren ezarpenak" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Sortu karpeta zifratu berri bat?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Utzi" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Egiaztatu pasahitza mesedez" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Pasahitzak ez datoz bat" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs-ren 1.7.2 bertsioak eta honen aurrekoek badute akats bat --reverse " "aukeran. Eguneratu encfs mesedez" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Egin babeskopia" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Hash talka gertatu da hemen: hash_id %s. Handitu hash_collision balioa eta " "saiatu berriz." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "Ezin izan du %(proc)s desmontatu %(mountpoint)s-tik" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "Ez du %(proc)s aurkitu. Instala ezazu ad. %(install_command)s" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s ez da 'fuse' taldeko partaidea.\n" " Exekutatu 'sudo adduser %(user)s fuse'. Aldaketak aplikatzeko atera zaitez " "eta sartu berriro.\n" "Begira ezazu 'man backintime' azalpen zabalagoa izateko." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "%s munstatze-puntua ez dago hutsik." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Muntatze prozedura blokeatuta iraungitzean" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "'%(profile)s' profila: Sartu pasahitza honentzat %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### Erregistro hau automatikoki bilatutako txantiloi baten bidez dekodetu " "da\n" "### Baldin eta bide-izenen bat ez badago dekodetua eskuz dekodetu dezakezu " "honekin\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "HUTS EGIN DU" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Berrezarri baimenak" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Eginda" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "Atzeratu babeskopia bateriaz dabilen bitartean" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Ezin du aurkitu babeskopien karpeta.\n" "Karpeta unitate eramangarri batean badago konekta ezazu, mesedez." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Itxaroten segundo %s" msgstr[1] "Itxaroten %s segundo" #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Huts egi du %s babeskopia egiten!!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Amaitzen" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Ezin da %s karpeta sortu" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Gorde ezarpenen fitxategia" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Baimenak gordetzen ..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "'%s' jarraitu daitekeen soberakina aurkitu du." #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "Azken exekuziotik '%s' karpeta soberakina kentzen." #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Ezin da %s karpeta ezabatu" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Babeskopia egiten." #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "Ez dago aldaketarik. Ez da babeskopia berririk egin behar.." #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Ezin jarri %(new_path)s izena honi %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Ezabatze automatikoa" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Babeskopia zaharrak ezabatzen" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Saiatu espazio minimoa mantentzen" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Saiatu gutxienez %d%% nodo libre mantentzen." #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "ERROREAK DAUDE!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Orain" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Ezin da %s muntatu" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Ezin da SSH-ren gako pribatua desblokeatu. Okerreko pasahitza edo cron-" "entzat baliozkoa ez den pasahitza." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Huts egin du %(user)s@%(host)s-en pasahitzik gabeko autentifikazioa. " "Begiratu 'man backintime' azalpenak ikusteko." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Huts egin du cipher %(cipher)s ostalari honetan: %(host)s\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "Ez da aurkitu %s ssh-known-host ostalarian." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Urrutiko bide-izena badago baina ez da direktorio bat:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Urrutiko bide-izena ez dauka idazteko baimenik:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Urrutiko bide-izena ez da exekutagarria:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Ezin da sortu urrutiko bide-izena:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Huts egin du %s ping. Ostalaria erorita dago edo helbidea okerra da." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "%(host)s urrutiko ostalaria ez du '%(command)s' onartzen:\n" "%(err)s\n" "Begiratu 'man backintime' azalpenak ikusteko." #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "%(host)s ostalariak txekeo komandoari errore ezezagunaz erantzun dio:\n" " %(err)s\n" "Begiratu 'man backintime' azalpenak ikusteko." #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "%s urrutiko ostalariak ez ditu esteka gogorrak onartzen" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" "Kopiatu \"%(pubkey)s\" ssh-gako publikoa \"%(host)s\" urrutiko ostalarira.\n" "Sartu \"%(user)s\" erabiltzailearen pasahitza:" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "Egin babeskopia kontrol baturarekin." #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Erabili kontrol-batura aldaketak detektatzeko" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "Pausatu babeskopia prozesua" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "Laburtu babeskopia prozesua" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "Gelditu babeskopia prozesua" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Freskatu babeskopien zerrenda" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Babeskopiaren izena" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Ezabatu babeskopia" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Ikusi babeskopiaren erregistroa" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Ikusi azken erregistroa" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Ezarpenak" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Itzali" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Itzali sistema babeskopia bukatu ondoren." #: ../../qt/app.py:149 msgid "Exit" msgstr "Irten" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Laguntza" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "Config fitxategiaren laguntza" #: ../../qt/app.py:163 msgid "Website" msgstr "Webgunea" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "Aldaketen egunkaria" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Zerbait galdetu" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Akats baten berri eman" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Honi buruz" #: ../../qt/app.py:204 msgid "Up" msgstr "Gora" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Erakutsi ezkututko fitxategiak" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Berreskuratu" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" "Leheneratu hautatutako fitxategiak eta karpetak jatorrizko kokalekura." #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Berreskuratu hona" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "Leheneratu hautatutako fitxategiak eta karpetak kokaleku berrira." #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" "Leheneratu erakutsitako karpeta eta bere eduki guztia jatorrizko kokalekura." #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" "Leheneratu erakutsitako karpeta eta bere eduki guztia kokaleku berrira." #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" "Leheneratu hautatutako fitxategi edo karpetak.\n" "Botoi hau grisa badago gehienetan da \"%(now)s\" hautatua dagoelako " "ezkerreko babeskopien zerrendan." #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Babeskopiak" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "Babeskopia" #: ../../qt/app.py:271 msgid "View" msgstr "Ikusi" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Lasterbideak" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" "Karpeta hau ez dago\n" "une honetan hautatutako babeskopian!" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "Gehitu sartu beharrekoetan" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "Gehitu kanpoan utzi beharrekoetan" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" "%(appName)s ez dago konfiguratua. Nahi duzu leheneratu aurreko " "konfiguraziora?" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Ezin da aurkitu babeskopien karpeta.\n" "Unitate eramangarri batean badago konekta ezazu eta sakatu Ados" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "Leiho hau ixten baduzu Back In Time-k ezin izango du zure sistema itzali " "babeskopia bukatzean.\n" "Seguru zaude itxi nahi duzula?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Lanean:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Egina, ez da babeskopia egin behar." #: ../../qt/app.py:723 msgid "Error:" msgstr "Errorea:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "Bidalita:" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "Abiadura:" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "ETA:" #: ../../qt/app.py:794 msgid "Global" msgstr "Orokorra" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Hasiera" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Babeskopia-karpetak" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Seguru zaude babeskopia ezabatu nahi duzula?\n" "%s" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" "Egin fitxategi lokalen babeskopia\n" "bukaerako '%(suffix)s'-en bidez gainidatzi edo ezabatu aurretik." #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" "Berriagoak diren fitxategiak berrizendatuko dira '%(suffix)s' kokapenarekin " "leheneratu baino lehen.\n" "Ez badituzu gehiago behar ezabatu ditzakezu '%(cmd)s'-rekin." #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" "Leheneratu soilik falta diren fitxategiak edo\n" "helburuko tokikoak baino berriagoak direnak.\n" "\"rsync --update\" aukera erabiltzen." #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "Ezabatu jatorrizko karpetako fitxategirik berrienak" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" "Leheneratu hautatutako fitxategiak edo karpetak jatorrizko kokalekura eta\n" "ezabatu babeskopian ez dauden fitxategi/karpetak.\n" "Honek babeskopia egitean baztertutako fitxategi/karpetak ezabatuko ditu!\n" "Argi ibili!!!" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" "Seguru zaude fitxategi hau(ek) leheneratu \n" "nahi dituzula '%(path)s' karpetan:" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "Ziur zaude fitxategi hori(ek) berreskuratu nahi duzula:" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "Seguru zaude '%(path)s' tokiko fitxategi berri guztiak?" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" "Seguru zaude ezabatu nahi duzula jatorrizko karpetatik berriagoak diren " "fitxategi guztiak?" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" "KONTUZ: fitxategi-sistemaren erroko fitxategiak ezabatzeak sistema osoa " "hondatu dezake!!!" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Ikusi diskoaren edukia" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Babeskopia: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Ikusi %s -ean egindako babeskopia" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Berreskuratu '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Berreskuratu '%s' hona..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "Egileak" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "Itzulpenak" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "Lizentzia" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "Azken erregistroaren ikuspegia" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "Babeskopiaren erregistro ikuspegia" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profila:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Iragazi:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Guztiak" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Akatsak" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Aldaketak" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informazioa" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Error, [I] Information, [C] Change" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "dekodetu bide-izenak" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "Kopiatu" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "Dekodetu" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "Nahi duzu hau kanpoan utzi?" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "Errorea" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "Galdera" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "Hasi BackinTime" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Lanean..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Gaur" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Atzo" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Aste honetan" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Joan den astean" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "Hau EZ da babeskopia bat zure fitxategi lokalen ikuspegia baizik" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "Azken kontrola %s" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "Erakutsi erregistro osoa" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editatu" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "Aldatu Full System Backup-entzat" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "Gehitu" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "Ezabatu" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Orokorra" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Modua:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" "Kontuz: %(app)s-k EncFS erabiltzen du kodetzeko. Berriki egindako " "segurtasun auditoria batek hari egindako hainbat erasoen berri eman du. Eman " "begirada bat Backintime-ren man-eko 'A NOTE ON SECURITY' oharrari." #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Non gorde babeskopiak" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "Karpeta" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH ezarpenak" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Ostalaria" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Ataka:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Erabiltzailea:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Bide-izena:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Zifratua:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Gako pribatua:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "Gako fitxategia" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "Sortu pasahitzik gabeko SSH gako berri bat." #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Pasahitza" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Gorde pasahitza" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" "Cron-entzako cache-pasahitza (Segurtasun akatsa: root-ek pasahitza irakur " "dezake)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Aurreratua" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "Babeskopiaren bide osoa: " #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Programaketa" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Eguna:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Asteguna" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Ordua:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Orduak:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" "Erabili Back In Time behin eta berriz. Egin bereziki ordenagailua ez badabil " "ongi." #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "Guztiak:" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Exekutatu Back In Time unitatea konektatu bezain pronto (X egunean behin " "bakarrik).\n" "Zure sudo pasahitza eskatuko zaizu" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Sartu" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "sartu fitxategiak eta karpetak" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Gehitu fitxategia" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Gehitu karpeta" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Kanpoan utzi" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Kontuz: Komodin karaktereak ('foo*', '[fF]oo', 'fo?') ez dira " "ezagutuko 'SSH encrypted' moduan.\n" "Bakarrik erabil daitezke banatutako asteriskoak ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Baztertu txantiloi, fitxategi edo karpeta hauek" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Oso gomendagarria" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "Gehitu lehenetsia" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "Utzi kanpoan hau baino handiagoak diren fitxategiak: " #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" "Utzi kanpoan hau baino handiagoak diren fitxategiak %(prefix)s\n" "'rsync osoko modua' desgaituta badago horrek fitxategi berriei soilik " "eragingo die\n" "zeren eta rsync-entzat hori transferentzia aukera bat da, ez baztertze " "aukera bat.\n" "Beraz babeskopia lehendik egina zituzten fitxategi handiak mantenduko dira " "irudian\n" "nahiz eta aldaketak jasan." #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Ezabaketa automatikoa" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Hau baino zaharragoa:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Toki librea hau baino txikagoa bada:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "Baldin eta nodo libreak hauek baino gutxiago badira:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "Exekutatu atzeko planoan urrutiko ostalarian." #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Mantendu babeskopia guztiak" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "egunez" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Mantendu eguneko babeskopia bana azkenerako" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Mantendu asteko babeskopia bana azkenerako" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "astetarako" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Mantendu hilabeteko babeskopia bana azkenerako" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "hilabetez" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Mantendu babeskopia bana urteko urte guztietan" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Ez ezabatu izena duten babeskopiak" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Aukerak" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Gaitu notifikazioak" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Ezgaitu babeskopiak egitea bateriaz funtzionatzean" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Energia egoera ez dago eskurtagarri sistemarentzat" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "Egin babeskopia bat aldiko." #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" "Beste babeskopiak blokeatuko dira oraingo babeskopia egiten den bitartean.\n" "Hau aukera globala da, beraz, erabiltzaile honen profil guztiei eragiten " "die.\n" "Baina beste erabiltzaileentzat aktibatu behar da ere." #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "Egin berreskurapenean ordeztutako fitxategien babeskopia" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Jarraitu erroreak egon arren (mantendu babeskopia osatu gabea)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "Egin babeskopia berria aldaketarik izan ote den kontuan izan gabe." #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Log maila:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Ezer Ez" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Aldaketa eta erroreak" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Aldatu aukera hauek bakarrik zertan ari zaren badakizu!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "Exekutatu 'nice':" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "programatutako ataza bezala" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "urrutiko ostalarian" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "Exekutatu 'ionice'" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "eskuzko babeskopia egitean" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "Exekutatu 'rsync' 'nocache'-rekin" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "ordenagailuan bertan" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "Birzuzendu stdout /dev/null-era cronjob-etan." #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "Birzuzendu stderr /dev/null-era cronjob-etan." #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Mugatu rsync-en banda-zabaleraren erabilera: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Mantendu ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Mantendu atributu hedatuak (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Kopiatu esteka inseguruak (egin bakarrik esteka absolutuekin)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "Itsatsi aukera gehigarriak rsync-eri" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" "Aukerak kakotxen artean idatzi, esate baterako --exclude-from=\"/path/to/my " "exclude file\"." #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "Gehitu aurrizkia SSH komandoei" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" "Ezarri exekutatzeko urrutiko ostalariko edozein komandoaren aurretik.\n" "Aldagaiak \\$FOO bidez alde egin behar dute.\n" "Honek ez dio eragiten rsync-i. Beraz gehitu aurrizki bat\n" "rsync erabili dezan \"%(cbRsyncOptions)s\" %(rsync_options_value)s-rekin\n" "\n" "%(default)s: %(def_value)s" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "lehenetsia" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "Markatu urrutiko ostalaria linean badago" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" "Kontuz: desgaitzen baduzu eta urrutiko ostalaria\n" "ezin bada erabili, ustekabeko erroreak sor daitezke ." #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" "Markatu urrutiko ostalariak behar diren komando guztiak onartzen baditu." #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" "Kontuz: desgaitzen baduzu eta urrutiko ostalariak\n" "behar diren komando guztiak onartzen ez baditu,\n" "ustekabeko erroreak sor daitezke ." #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "Leheneratu konfigurazioa" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "Editutatu erabiltzailearen atzeradeia" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" "Sistemaren babeskopia osoa bakarrik leheneratu daiteke disko fisiko " "bere(et)an eta jatorrizko partiketarekin; jatorrizkoa ez diren diskoetan edo " "partiketetan leheneratzeak sor dezake hautsitako edo egonkorra ez den " "sistema bat.\n" "Sistemaren babeskopia osoak pertsonalizatutako hainbat ezarpen gainidatz " "dezake. Jarraitu nahi duzu?" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Profil berria" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Berrizendatu profila" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Seguru zaude \"%s\" profila ezabatu nahi duzula?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Orduak pertsonalizatzeko komaz banatutako ordu-zerrenda erabili behar duzu " "(hala nola 8,12,18,23) edo */3 hiru ordutan behingo babeskopia egiteko." #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" "Ez duzu aukeratu SSHrako gako fitxategi pribatua.\n" "Nahi al duzu pasahitzik gabeko gako publiko/pribatu parea sortzea?" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "\"%(file)s\" gako pribatuko fitxategirik ez dago" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" "Nahi al duzu kopiatzea zure SSH gako publikoa\n" "urrutiko ostalarira pasahitzik gabe sartu ahal izateko?" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" "Ezin da egiaztatu \"%(host)s\" ostalariaren benekotasuna.\n" "\n" "%(keytype)s hatz-marka gakoa da:" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" "Egiaztatu hatz-marka! Nahi al duzu bera gehitzea zure 'known_hosts' " "fitxategira?" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Baztertu txantiloia" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Baztertu fitxategia" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Baztertu karpeta" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Sartu fitxategia" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" "\"%s\" esteka sinboliko bat da. Estekatutako objektuaren babeskopia ez da " "egingo are eta bera ere gehitu arte.\n" "Nahi duzu gehitu esteka sinbolikoen helburu-objektuak?" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Sartu karpeta" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Seguru zaude aldatu nahi duzula babeskopien karpeta?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "Huts egin du %(path)s kokalekuan SSH gako berria sortzen" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "gaituta" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "ezgaituta" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "Ezarpenak berreskuratu" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr " eta gehitu zure erabiltzailea 'fuse' taldera" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" "Nabigatu berreskuratu nahi duzun %(appName)s-en ezarpenak dauden " "babeskopiara. Bideak honelako itxura izan behar luke:\n" "%(samplePath)s\n" "\n" "Zure babeskopiak urrutiko unitate batean badaude edo zifratuta badaude aldez " "aurretik eskuz muntatu behar dituzu. SSH modua erabiltzen baduzu gako " "publikoa ezarri beharko duzu urrutiko ostalarian%(addFuse)s sartzeko\n" "Eman begirada bat 'man backintime' oharrei.." #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "Ez da ezarpenik topatu" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" "Erabiltzailearen atzeradeia-scriptak ez dauka shebang (#!/bin/sh) lerrorik." #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" "Erabiltzalearen atzera-deiaren scriptaren shebang ez da exekutagarria." #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff aukerak" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komandoa:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametroak:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Erabili %1 eta %2 bide-izenen parametroetarako" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Zerrendatu bakarri desberdinak diren babeskopiak" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "Zerrendatu bakarri berdinak diren babeskopiak hona: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Egiaztatze sakona (zehaztasun handiagoa, baina motela)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Ezabatu" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Hautatu denak" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Joan hona:" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Ezin duzu alderatu babeskopia bat bere buruarekin" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Ez da komandoa aurkitu: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Seguru zaude \"%(snapshot_id)s babeskopiako \"%(file)s\" fitxategia " "ezabatu nahi duzula?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" "Seguru zaude \"%(count)d babeskopiako \"%(file)s\" fitxategia ezabatu nahi " "duzula?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "ARGI IBILI: Honek ez dauka atzera bueltarik!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Baztertu \"%s\" hurrengo babeskopietan?" backintime-1.2.1/common/po/tr.po0000644000175000017500000011235113530533316016035 0ustar germargermar# Turkish translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2017-01-11 12:24+0000\n" "Last-Translator: Numan Demirdöğen \n" "Language-Team: Turkish \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Ayar kaydedilemedi: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Ayar yüklenemedi: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "\"%s\" profili zaten mevcut !" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "Son profili kaldıramazsınız !" #: ../../common/config.py:77 msgid "Disabled" msgstr "Etkisizleştirildi" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "Her yeniden başlattığında" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Her 5 dakikada bir" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Her 10 dakikada bir" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "30 dakikada bir" #: ../../common/config.py:82 msgid "Every hour" msgstr "Saatte bir" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "2 saatte bir" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "4 saatte bir" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "6 saatte bir" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "12 saatte bir" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Kullanıcı tanımlı saatlerde" #: ../../common/config.py:88 msgid "Every Day" msgstr "Her gün" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Disk bağlandığında (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Her Hafta" #: ../../common/config.py:92 msgid "Every Month" msgstr "Her Ay" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Günde" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Haftada" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Yılda" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Saatte" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Ayda" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " KARARSIZ!" #: ../../common/config.py:129 msgid "Local" msgstr "Yerel" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Gizli SSH anahtarı" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Şifrelenmiş yerel" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Şifreleme" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "Şifrelenmiş SSH" #: ../../common/config.py:135 msgid "Default" msgstr "Varsayılan" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Ana profil" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profil: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Anlıkçekim klasörü geçerli değil !" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Yedekleme için en az bir klasör seçmelisiniz !" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "Yedekleme klasörünü dahil edemezsiniz !" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "Yedekleme alt-klasörünü dahil edemezsiniz !" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s bir klasör değil !" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Sunucu/Kullanıcı/Profil ID boş bırakılmamalı" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Yazılamıyor: %s\n" "Yazma izniniz olduğuna emin misiniz ?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "'%(path)s' için girilen hedef dosya sistemi sabit bağları desteklemeyen FAT " "ile biçimlendirilmiş. Lütfen bir Linux dosya sistemi kullanın." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "'%(path)s' için girilen hedef dosya sistemi bir paylaşımlı SMB dizini. " "Lütfen SMB sunucunun sembolik bağları desteklediğini teyit edin ya da " "'%(expertOptions)s' bölümünden '%(copyLinks)s' seçeneğini etkinleştirin." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Bağları kopyala (sembolik bağların hedef dosyaslarını kopyalar)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Uzman Seçenekleri" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" "'%(path)s' için girilen hedef dosya sistemi bir paylaşımlı sshfs dizini. " "sshfs sabit bağları desteklemiyor. Lütfen 'SSH' usulünü kullanın." #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "crontab bulunamadı.\n" "cron'un yüklenmiş olduğundan emin misiniz ?\n" "Eğer değilseniz tüm otomatik yedeklemeleri etkisiz hale getirmeniz gerekir." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Yeni crontab yazımı başarısız oldu." #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "%(profile_id)s profilleri için Udev kuralı yüklenemedi. '%(dbus_interface)s' " "DBus Servisi mevcut değil." #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Lütfen şifreyi onaylatın" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Şifre eşleşmiyor" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "1.7.2 ve önceki encfs sürümlerinin --reverse seçeneğinde bir böcek var. " "Lütfen encfs'yi güncelleyin." #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Anlık durum al" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Tamamlandı" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "Anlık durum klasörü bulunamadı." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "%s saniye bekliyor." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Bitiriyor" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Dizin oluşturulamadı: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "... iznini kaydet" #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Klasör kaldırılamıyor: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Anlık durum al" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Akıllı kaldırma" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Eski anlık durumları sil" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "En az boş alanı korumaya çalış" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "HATALARLA!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Şimdi" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "%s takılamadı" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Anlık durum ismi" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Anlık durumu sil" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Ayarlar" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Çıkış" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Yardım" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Web sitesi" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Hakkında" #: ../../qt/app.py:204 msgid "Up" msgstr "Yukarı" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Gizli dosyaları göster" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Geri Yükle" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Anlık durumlar" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Kısayollar" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Anlık durum klasörü bulunamadı.\n" "Eğer çıkarılabilir bir sürücüde ise lütfen takın ve TAMAM'a tıklayın" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Çalışıyor:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Bitti, yedekleme gerekmiyor" #: ../../qt/app.py:723 msgid "Error:" msgstr "Hata:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Evrensel" #: ../../qt/app.py:795 msgid "Root" msgstr "Kök Dizini" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Yedekleme klasörleri" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Şu andaki disk içeriğini görüntüle" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "%s'da oluşturulan anlık durumu görüntüle" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Çalışıyor..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Bugün" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Dün" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Bu hafta" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Geçen hafta" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Düzenle" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "Genel" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Zamanlama" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Saat:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Dahil et" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Dosya ekle" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Klasör ekle" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Oto-kaldır" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Daha eski:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Eğer boş alan daha az ise:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Seçenekler" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Bildirimleri etkinleştir" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Profili yeniden adlandır" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "\"%s\" profilini silmek istediğinize emin misiniz ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Dosyayı dahil et" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Klasörü dahil et" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Anlık durum klasörünü değiştirmek istediğinizden emin misiniz?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Komut:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parametreler:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Yol parametreleri olarak %1 ve %2 kullan" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Git" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "Bir anlık durumu kendisi ile karşılaştıramazsınız" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Komut bulunamadı: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/messages.pot0000644000175000017500000010410013530533316017374 0ustar germargermar# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-27 15:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "" #: ../../common/config.py:77 msgid "Disabled" msgstr "" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "" #: ../../common/config.py:82 msgid "Every hour" msgstr "" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "" #: ../../common/config.py:88 msgid "Every Day" msgstr "" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "" #: ../../common/config.py:91 msgid "Every Week" msgstr "" #: ../../common/config.py:92 msgid "Every Month" msgstr "" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "" #: ../../common/config.py:98 msgid "Year(s)" msgstr "" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr "" #: ../../common/config.py:129 msgid "Local" msgstr "" #: ../../common/config.py:130 msgid "SSH" msgstr "" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1629 msgid "SSH private key" msgstr "" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "" #: ../../common/config.py:135 msgid "Default" msgstr "" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "" #: ../../common/config.py:153 msgid "Main profile" msgstr "" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:424 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" #: ../../common/config.py:404 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:409 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:412 ../../qt/settingsdialog.py:819 msgid "Copy links (dereference symbolic links)" msgstr "" #: ../../common/config.py:413 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "" #: ../../common/config.py:415 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1442 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" #: ../../common/config.py:1446 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1543 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1555 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "" #: ../../common/config.py:1564 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" #: ../../common/encfstools.py:491 ../../common/snapshots.py:797 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "" #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:671 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" #: ../../common/snapshots.py:673 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "" msgstr[1] "" #: ../../common/snapshots.py:705 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "" #: ../../common/snapshots.py:714 msgid "Finalizing" msgstr "" #: ../../common/snapshots.py:825 #, python-format msgid "Can't create folder: %s" msgstr "" #: ../../common/snapshots.py:839 msgid "Saving config file..." msgstr "" #: ../../common/snapshots.py:885 msgid "Saving permissions..." msgstr "" #: ../../common/snapshots.py:967 msgid "..." msgstr "" #: ../../common/snapshots.py:975 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:988 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:993 #, python-format msgid "Can't remove folder: %s" msgstr "" #: ../../common/snapshots.py:1027 msgid "Taking snapshot" msgstr "" #: ../../common/snapshots.py:1061 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1087 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "" #: ../../common/snapshots.py:1378 ../../common/snapshots.py:1429 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "" #: ../../common/snapshots.py:1405 msgid "Removing old snapshots" msgstr "" #: ../../common/snapshots.py:1439 msgid "Trying to keep min free space" msgstr "" #: ../../common/snapshots.py:1476 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2052 msgid "WITH ERRORS !" msgstr "" #: ../../common/snapshots.py:2517 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "" #: ../../common/sshtools.py:317 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:346 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:378 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:429 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:682 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:685 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:698 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "" #: ../../qt/app.py:204 msgid "Up" msgstr "" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1842 msgid "Show hidden files" msgstr "" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1884 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "" #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:201 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "" #: ../../qt/app.py:723 msgid "Error:" msgstr "" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:189 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:190 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:191 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "" #: ../../qt/app.py:795 msgid "Root" msgstr "" #: ../../qt/app.py:796 msgid "Home" msgstr "" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1971 msgid "Profile:" msgstr "" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "" #: ../../qt/qttools.py:221 msgid "Today" msgstr "" #: ../../qt/qttools.py:225 msgid "Yesterday" msgstr "" #: ../../qt/qttools.py:230 msgid "This week" msgstr "" #: ../../qt/qttools.py:234 msgid "Last week" msgstr "" #: ../../qt/qttools.py:353 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:355 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1973 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1613 msgid "Where to save snapshots" msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1693 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "" #: ../../qt/settingsdialog.py:680 msgid "Run 'rsync' with 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:720 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'rsync' with 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:710 msgid "(Please install 'nocache' to enable this option)" msgstr "" #: ../../qt/settingsdialog.py:716 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:723 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:729 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:738 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:741 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:776 msgid "Preserve ACL" msgstr "" #: ../../qt/settingsdialog.py:789 msgid "Preserve extended attributes (xattr)" msgstr "" #: ../../qt/settingsdialog.py:807 msgid "Copy unsafe links (works only with absolute links)" msgstr "" #: ../../qt/settingsdialog.py:838 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:841 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:851 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:854 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:862 ../../qt/settingsdialog.py:1744 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:872 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:873 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:876 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:877 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:890 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:891 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:910 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:939 msgid "New profile" msgstr "" #: ../../qt/settingsdialog.py:955 msgid "Rename profile" msgstr "" #: ../../qt/settingsdialog.py:969 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "" #: ../../qt/settingsdialog.py:1203 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1239 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1244 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1362 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1379 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1387 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1534 msgid "Exclude pattern" msgstr "" #: ../../qt/settingsdialog.py:1547 msgid "Exclude file" msgstr "" #: ../../qt/settingsdialog.py:1551 msgid "Exclude folder" msgstr "" #: ../../qt/settingsdialog.py:1570 msgid "Include file" msgstr "" #: ../../qt/settingsdialog.py:1578 ../../qt/settingsdialog.py:1598 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1590 msgid "Include folder" msgstr "" #: ../../qt/settingsdialog.py:1617 msgid "Are you sure you want to change snapshots folder ?" msgstr "" #: ../../qt/settingsdialog.py:1638 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1741 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1743 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1781 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1798 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1802 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1860 ../../qt/settingsdialog.py:1923 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2099 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2103 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/po/en_GB.po0000644000175000017500000011764313530533316016373 0ustar germargermar# English (United Kingdom) translation for backintime # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the backintime package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2016-10-30 18:01+0000\n" "Last-Translator: Germar \n" "Language-Team: English (United Kingdom) \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "Profile \"%s\" already exists!" #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "You can't remove the last profile!" #: ../../common/config.py:77 msgid "Disabled" msgstr "Disabled" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "At every boot/reboot" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Every 5 minutes" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Every 10 minutes" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Every 30 minutes" #: ../../common/config.py:82 msgid "Every hour" msgstr "Every hour" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Every 2 hours" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Every 4 hours" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Every 6 hours" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Every 12 hours" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Custom Hours" #: ../../common/config.py:88 msgid "Every Day" msgstr "Every Day" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "When drive get connected (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Every Week" #: ../../common/config.py:92 msgid "Every Month" msgstr "Every Month" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Day(s)" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Week(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Year(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "" #: ../../common/config.py:105 msgid "Month(s)" msgstr "" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "SSH private key" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Local encrypted" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Encryption" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "SSH encrypted" #: ../../common/config.py:135 msgid "Default" msgstr "Default" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Main profile" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Profile: \"%s\"" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "Snapshots folder is not valid!" #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "You must select at least one folder to backup!" #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "You can't include the backup folder!" #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "You can't include a backup sub-folder!" #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s is not a folder!" #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "Can't write to: %s\n" "Are you sure you have write access?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copy links (dereference symbolic links)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Expert Options" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "Can't find crontab.\n" "Are you sure cron is installed?\n" "If not, you should disable all automatic backups." #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Schedule udev doesn't work with mode %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "Couldn't find UUID for \"%s\"" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "Can't mount '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "Config for encrypted folder not found." #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "Create a new encrypted folder?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Cancel" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Please confirm password" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "Password doesn't match" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Take snapshot" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "mountpoint %s not empty." #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "Mountprocess lock timeout" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Profile '%(profile)s': Enter password for %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "FAILED" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Restore permissions:" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Done" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "Can't find snapshots folder.\n" "If it is on a removable drive, please plug it in." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Waiting %s second." msgstr[1] "Waiting %s seconds." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Failed to take snapshot %s !!!" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Finalising" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "Can't create folder: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Save config file..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Save permission..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "Can't remove folder: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Take snapshot" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "Can't rename %(new_path)s to %(path)s" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Smart remove" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Remove old snapshots" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Try to keep min free space" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "Try to keep min %d%% free inodes" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "WITH ERRORS !" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Now" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "Can't mount %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s not found in ssh_known_hosts." #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "Remote path exists but is not a directory:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "Remote path is not writable:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "Remote path is not executable:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "Couldn't create remote path:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "Ping %s failed. Host is down or wrong address." #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "Remote host %s doesn't support hardlinks" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Use checksum to detect changes" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Refresh snapshots list" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Snapshot Name" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Remove Snapshot" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "View Snapshot Log" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "View Last Log" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Settings" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "Shutdown" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "Shutdown system after snapshot has finished." #: ../../qt/app.py:149 msgid "Exit" msgstr "Exit" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Help" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Website" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "FAQ" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "Ask a question" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "Report a bug" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "About" #: ../../qt/app.py:204 msgid "Up" msgstr "Up" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Show hidden files" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restore" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Restore to..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Snapshots" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Shortcuts" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "Can't find snapshots folder.\n" "If it is on a removable drive, please plug it in and then press OK." #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Working:" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Done, no backup needed" #: ../../qt/app.py:723 msgid "Error:" msgstr "Error:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:795 msgid "Root" msgstr "Root" #: ../../qt/app.py:796 msgid "Home" msgstr "Home" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Backup folders" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "Are you sure you want to remove the snapshot:\n" "%s?" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "View the current disk content" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Snapshot: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "View the snapshot made at %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Restore '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Restore '%s' to..." #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Profile:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filter:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "All" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Errors" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Changes" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Information" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Error, [I] Information, [C] Change" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "decode paths" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Working…" #: ../../qt/qttools.py:220 msgid "Today" msgstr "Today" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Yesterday" #: ../../qt/qttools.py:229 msgid "This week" msgstr "This week" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Last week" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Edit" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "General" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "Mode:" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Where to save snapshots" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "SSH Settings" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Host:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "Port:" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "User:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "Path:" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "Cipher:" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "Private Key:" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "Password" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "Save Password to Keyring" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "Cache Password for Cron (Security issue: root can read password)" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Advanced" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Schedule" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Day:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Weekday:" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hour:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "Hours:" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Include" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Include files and folders" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Add file" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Add folder" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Exclude" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Exclude patterns, files or folders" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Highly recommended:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto-remove" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Older than:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "If free space is less than:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "If free inodes is less than:" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Keep all snapshots for the last" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "day(s)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "Keep one snapshot per day for the last" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "Keep one snapshot per week for the last" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "weeks(s)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "Keep one snapshot per month for the last" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "month(s)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Keep one snapshot per year for all years" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "Don't remove named snapshots" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Options" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Enable notifications" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Disable snapshots when on battery" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "Power status not available from system" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continue on errors (keep incomplete snapshots)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Log Level:" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "None" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Changes & Errors" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "Change these options only if you really know what you are doing!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "Limit rsync bandwidth usage: " #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr " KB/sec" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preserve ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preserve extended attributes (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Copy unsafe links (works only with absolute links)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "New profile" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Rename profile" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "Are you sure you want to delete the profile \"%s\"?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Exclude pattern" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Exclude file" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Exclude folder" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Include file" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Include folder" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "Are you sure you want to change snapshots folder?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Diff Options" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Command:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parameters:" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Use %1 and %2 for path parameters" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "List only different snapshots" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "List only equal snapshots to: " #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Deep check (more accurate, but slow)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "Delete" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "Select All" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diff" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Go To" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "You can't compare a snapshot to itself" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Command not found: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "WARNING: This can not be revoked!" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "Exclude \"%s\" from future snapshots?" backintime-1.2.1/common/po/es.po0000644000175000017500000011707313530533316016025 0ustar germargermar# Spanish translation of Backintime. # Copyright (C) 2008-2009 Oprea Dan # This file is distributed under the same license as the Backintime package. # Francisco M. Garcia Claramonte , 2008-2009. # msgid "" msgstr "" "Project-Id-Version: backintime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-08-20 20:43+0200\n" "PO-Revision-Date: 2018-02-13 23:00+0000\n" "Last-Translator: A Roach \n" "Language-Team: Spanish/Spain \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: 2019-04-14 16:16+0000\n" "X-Generator: Launchpad (build 18920)\n" #: ../../common/config.py:96 ../../common/config.py:103 msgid "Day(s)" msgstr "Día(s)" #: ../../common/config.py:98 msgid "Year(s)" msgstr "Año(s)" #: ../../common/config.py:1474 msgid "" "Can't find crontab.\n" "Are you sure cron is installed ?\n" "If not you should disable all automatic backups." msgstr "" "No se pudo encontrar crontab.\n" "¿Está seguro de que cron está instalado?\n" "Si no, debe desactivar todas las copias automáticas." #: ../../common/encfstools.py:491 ../../common/snapshots.py:795 #: ../../qt/app.py:87 ../../qt/app.py:91 msgid "Take snapshot" msgstr "Tomar instantánea" #: ../../common/snapshots.py:555 ../../qt/app.py:432 ../../qt/app.py:675 #: ../../qt/app.py:708 ../../qt/qtsystrayicon.py:73 msgid "Done" msgstr "Finalizado" #: ../../common/snapshots.py:712 msgid "Finalizing" msgstr "Terminando" #: ../../common/snapshots.py:1366 ../../common/snapshots.py:1417 #: ../../qt/settingsdialog.py:555 msgid "Smart remove" msgstr "Borrado inteligente" #: ../../qt/app.py:123 ../../qt/app.py:898 msgid "Snapshot Name" msgstr "Nombre de la instantánea" #: ../../qt/app.py:126 msgid "Remove Snapshot" msgstr "Eliminar instantánea" #: ../../qt/app.py:214 ../../qt/settingsdialog.py:1839 msgid "Show hidden files" msgstr "Mostrar archivos ocultos" #: ../../qt/app.py:321 msgid "Shortcuts" msgstr "Accesos directos" #: ../../qt/app.py:711 msgid "Done, no backup needed" msgstr "Hecho, no se necesita una copia de respaldo" #: ../../qt/app.py:795 msgid "Root" msgstr "Administrador" #: ../../qt/app.py:942 #, python-format msgid "" "Are you sure you want to remove the snapshot:\n" "%s" msgstr "" "¿Está seguro de que desea eliminar la instantánea:\n" "%s?" #: ../../qt/settingsdialog.py:139 ../../qt/settingsdialog.py:1610 msgid "Where to save snapshots" msgstr "Dónde guardar las instantáneas:" #: ../../qt/settingsdialog.py:417 ../../qt/settingsdialog.py:468 msgid "Add file" msgstr "Añadir archivo" #: ../../qt/settingsdialog.py:421 ../../qt/settingsdialog.py:472 msgid "Add folder" msgstr "Añadir carpeta" #: ../../qt/settingsdialog.py:598 msgid "Don't remove named snapshots" msgstr "No eliminar las instantáneas con nombre" #: ../../qt/settingsdialog.py:615 msgid "Enable notifications" msgstr "Activar notificaciones" #: ../../qt/settingsdialog.py:1544 msgid "Exclude file" msgstr "Excluir archivo" #: ../../qt/snapshotsdialog.py:53 ../../qt/snapshotsdialog.py:178 msgid "Diff Options" msgstr "Opciones al mostrar diferencias (Diff)" #: ../../qt/snapshotsdialog.py:68 msgid "Use %1 and %2 for path parameters" msgstr "Usar %1 y %2 para los parámetros de ruta" #: ../../qt/snapshotsdialog.py:166 msgid "Diff" msgstr "Diferencias" #: ../../common/configfile.py:105 #, python-format msgid "Failed to save config: %s" msgstr "Error al guardar la configuración: %s" #: ../../common/configfile.py:136 #, python-format msgid "Failed to load config: %s" msgstr "Se produjo un fallo al cargar la configuración: %s" #: ../../common/configfile.py:624 ../../common/configfile.py:707 #, python-format msgid "Profile \"%s\" already exists !" msgstr "El perfil «%s» ya existe." #: ../../common/configfile.py:664 msgid "You can't remove the last profile !" msgstr "No puede quitar el último perfil." #: ../../common/config.py:77 msgid "Disabled" msgstr "Desactivado" #: ../../common/config.py:78 msgid "At every boot/reboot" msgstr "En cada arranque/reinicio" #: ../../common/config.py:79 msgid "Every 5 minutes" msgstr "Cada cinco minutos" #: ../../common/config.py:80 msgid "Every 10 minutes" msgstr "Cada diez minutos" #: ../../common/config.py:81 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../../common/config.py:82 msgid "Every hour" msgstr "Cada hora" #: ../../common/config.py:83 msgid "Every 2 hours" msgstr "Cada 2 horas" #: ../../common/config.py:84 msgid "Every 4 hours" msgstr "Cada 4 horas" #: ../../common/config.py:85 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../../common/config.py:86 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../../common/config.py:87 msgid "Custom Hours" msgstr "Horas personalizadas" #: ../../common/config.py:88 msgid "Every Day" msgstr "Cada día" #: ../../common/config.py:89 msgid "Repeatedly (anacron)" msgstr "Repetidamente" #: ../../common/config.py:90 msgid "When drive get connected (udev)" msgstr "Cuando la unidad sea conectada (udev)" #: ../../common/config.py:91 msgid "Every Week" msgstr "Cada semana" #: ../../common/config.py:92 msgid "Every Month" msgstr "Cada mes" #: ../../common/config.py:97 ../../common/config.py:104 msgid "Week(s)" msgstr "Semana(s)" #: ../../common/config.py:102 msgid "Hour(s)" msgstr "Hora(s)" #: ../../common/config.py:105 msgid "Month(s)" msgstr "Mes(es)" #: ../../common/config.py:126 ../../qt/settingsdialog.py:564 msgid " EXPERIMENTAL!" msgstr " ¡EXPERIMENTAL!" #: ../../common/config.py:129 msgid "Local" msgstr "Local" #: ../../common/config.py:130 msgid "SSH" msgstr "SSH" #: ../../common/config.py:130 ../../common/config.py:132 #: ../../qt/settingsdialog.py:1626 msgid "SSH private key" msgstr "Llave privada SSH" #: ../../common/config.py:131 msgid "Local encrypted" msgstr "Cifrado local" #: ../../common/config.py:131 ../../common/config.py:132 msgid "Encryption" msgstr "Encriptación" #: ../../common/config.py:132 msgid "SSH encrypted" msgstr "Encriptado SSH" #: ../../common/config.py:135 msgid "Default" msgstr "Por defecto" #: ../../common/config.py:136 msgid "AES128-CTR" msgstr "AES128-CTR" #: ../../common/config.py:137 msgid "AES192-CTR" msgstr "AES192-CTR" #: ../../common/config.py:138 msgid "AES256-CTR" msgstr "AES256-CTR" #: ../../common/config.py:139 msgid "ARCFOUR256" msgstr "ARCFOUR256" #: ../../common/config.py:140 msgid "ARCFOUR128" msgstr "ARCFOUR128" #: ../../common/config.py:141 msgid "AES128-CBC" msgstr "AES128-CBC" #: ../../common/config.py:142 msgid "3DES-CBC" msgstr "3DES-CBC" #: ../../common/config.py:143 msgid "Blowfish-CBC" msgstr "Blowfish-CBC" #: ../../common/config.py:144 msgid "Cast128-CBC" msgstr "Cast128-CBC" #: ../../common/config.py:145 msgid "AES192-CBC" msgstr "AES192-CBC" #: ../../common/config.py:146 msgid "AES256-CBC" msgstr "AES256-CBC" #: ../../common/config.py:147 msgid "ARCFOUR" msgstr "ARCFOUR" #: ../../common/config.py:153 msgid "Main profile" msgstr "Perfil principal" #: ../../common/config.py:295 ../../common/config.py:302 #: ../../common/config.py:313 ../../common/config.py:318 #: ../../qt/qtsystrayicon.py:69 #, python-format msgid "Profile: \"%s\"" msgstr "Perfil: «%s»" #: ../../common/config.py:295 msgid "Snapshots folder is not valid !" msgstr "La carpeta de instantáneas no es válida." #: ../../common/config.py:302 msgid "You must select at least one folder to backup !" msgstr "Debe seleccionar al menos una carpeta para copiar." #: ../../common/config.py:313 msgid "You can't include backup folder !" msgstr "No puede incluir una carpeta de copias de seguridad." #: ../../common/config.py:318 msgid "You can't include a backup sub-folder !" msgstr "No puede incluir una subcarpeta de copias de seguridad." #: ../../common/config.py:373 #, python-format msgid "%s is not a folder !" msgstr "%s no es una carpeta." #: ../../common/config.py:382 msgid "Host/User/Profile-ID must not be empty!" msgstr "Servidor/Usuario/ID-Perfil no pueden estar vacíos!" #: ../../common/config.py:390 ../../common/config.py:422 #, python-format msgid "" "Can't write to: %s\n" "Are you sure you have write access ?" msgstr "" "No se puede escribir en: %s\n" "¿Está seguro de que tiene permiso de escritura?" #: ../../common/config.py:402 #, python-format msgid "" "Destination filesystem for '%(path)s' is formatted with FAT which doesn't " "support hard-links. Please use a native Linux filesystem." msgstr "" "El sistema de ficheros de destino para la ruta '%(path)s' está formateada " "como FAT, la cual no permite enlaces duros. Por favor, use un sistema de " "ficheros nativo de Linux." #: ../../common/config.py:407 #, python-format msgid "" "Destination filsystem for '%(path)s' is a SMB mounted share. Please make " "sure the remote SMB server supports symlinks or activate '%(copyLinks)s' in " "'%(expertOptions)s'." msgstr "" "El sistema de ficheros de destino para la ruta '%(path)s' es un recurso " "compartido SMB. Por favor, asegúrese qe que el servidor remoto soporta " "enlaces simbólicos o active '%(copyLinks)s' en '%(expertOptions)s'." #: ../../common/config.py:410 ../../qt/settingsdialog.py:817 msgid "Copy links (dereference symbolic links)" msgstr "Copiar vínculos (desarbitrar vínculos simbólicos)" #: ../../common/config.py:411 ../../qt/settingsdialog.py:671 msgid "Expert Options" msgstr "Opciones avanzadas" #: ../../common/config.py:413 #, python-format msgid "" "Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't " "support hard-links. Please use mode 'SSH' instead." msgstr "" #: ../../common/config.py:1478 msgid "Failed to write new crontab." msgstr "Error al escribir nuevo crontab" #: ../../common/config.py:1575 #, python-format msgid "" "Could not install Udev rule for profile %(profile_id)s. DBus Service " "'%(dbus_interface)s' wasn't available" msgstr "" "No se pudo instalar la regla Udev para el perfil %(profile_id)s. El servicio " "DBus '%(dbus_interface)s' no está disponible" #: ../../common/config.py:1587 #, python-format msgid "Schedule udev doesn't work with mode %s" msgstr "Programar udev no funciona con el modo %s" #: ../../common/config.py:1596 #, python-format msgid "Couldn't find UUID for \"%s\"" msgstr "No se pudo encontrar UUID para «%s»" #: ../../common/encfstools.py:86 #, python-format msgid "" "Can't mount '%(command)s':\n" "\n" "%(error)s" msgstr "" "No se pudo montar '%(command)s':\n" "\n" "%(error)s" #: ../../common/encfstools.py:132 msgid "Config for encrypted folder not found." msgstr "No se ha encontrado la configuración para el directorio encriptado" #: ../../common/encfstools.py:136 msgid "" "\n" "Create a new encrypted folder?" msgstr "" "\n" "¿Crear un nuevo directorio encriptado?" #: ../../common/encfstools.py:137 msgid "Cancel" msgstr "Cancelar" #: ../../common/encfstools.py:140 msgid "Please confirm password" msgstr "Por favor, confirme la contraseña" #: ../../common/encfstools.py:144 msgid "Password doesn't match" msgstr "La contraseña no coincide" #: ../../common/encfstools.py:161 msgid "" "encfs version 1.7.2 and before has a bug with option --reverse. Please " "update encfs" msgstr "" "encfs version 1.7.2 y anteriores tienen un error al usar la opcion --" "reverse. Por favor actualice encfs" #: ../../common/mount.py:415 #, python-format msgid "" "Hash collision occurred in hash_id %s. Incrementing global value " "hash_collision and try again." msgstr "" "Una colisión Hash ha ocurrido en hash_id%s. Incremente el valor global " "hash_collision y trate de nuevo." #: ../../common/mount.py:490 #, python-format msgid "Can't unmount %(proc)s from %(mountpoint)s" msgstr "No se pudo desmontar %(proc)s de %(mountpoint)s" #: ../../common/mount.py:577 #, python-format msgid "%(proc)s not found. Please install e.g. %(install_command)s" msgstr "" #: ../../common/mount.py:590 #, python-format msgid "" "%(user)s is not member of group 'fuse'.\n" " Run 'sudo adduser %(user)s fuse'. To apply changes logout and login again.\n" "Look at 'man backintime' for further instructions." msgstr "" #: ../../common/mount.py:611 #, python-format msgid "mountpoint %s not empty." msgstr "El punto de montaje %s está en uso" #: ../../common/mount.py:674 msgid "Mountprocess lock timeout" msgstr "" #: ../../common/password.py:240 #, python-format msgid "Profile '%(profile)s': Enter password for %(mode)s: " msgstr "Perfil '%(profile)s': Ingrese clave para %(mode)s: " #: ../../common/snapshotlog.py:62 msgid "" "### This log has been decoded with automatic search pattern\n" "### If some paths are not decoded you can manually decode them with:\n" msgstr "Este log ha sido decodificado con busqueda automática de patrón.\n" #: ../../common/snapshots.py:321 ../../common/snapshots.py:553 msgid "FAILED" msgstr "Falló" #: ../../common/snapshots.py:500 ../../common/snapshots.py:556 msgid "Restore permissions:" msgstr "Recuperar permisos" #: ../../common/snapshots.py:609 msgid "Deferring backup while on battery" msgstr "" #: ../../common/snapshots.py:669 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it." msgstr "" "No se pudo encontrar la carpeta de instantáneas.\n" "Si está en una unidad extraíble, por favor, conéctela." #: ../../common/snapshots.py:671 #, python-format msgid "Waiting %s second." msgid_plural "Waiting %s seconds." msgstr[0] "Esperando %s segundo." msgstr[1] "Esperando %s segundos." #: ../../common/snapshots.py:703 #, python-format msgid "Failed to take snapshot %s !!!" msgstr "Fallo al crear la instantánea %s" #: ../../common/snapshots.py:823 #, python-format msgid "Can't create folder: %s" msgstr "No se puede crear carpeta: %s" #: ../../common/snapshots.py:836 msgid "Saving config file..." msgstr "Guardando el archivo de configuración..." #: ../../common/snapshots.py:873 msgid "Saving permissions..." msgstr "Salvando permisos..." #: ../../common/snapshots.py:955 msgid "..." msgstr "..." #: ../../common/snapshots.py:963 #, python-format msgid "Found leftover '%s' which can be continued." msgstr "" #: ../../common/snapshots.py:976 #, python-format msgid "Removing leftover '%s' folder from last run" msgstr "" #: ../../common/snapshots.py:981 #, python-format msgid "Can't remove folder: %s" msgstr "No se puede eliminar la carpeta: %s" #: ../../common/snapshots.py:1015 msgid "Taking snapshot" msgstr "Tomar instantánea" #: ../../common/snapshots.py:1049 msgid "Nothing changed, no new snapshot necessary" msgstr "" #: ../../common/snapshots.py:1075 #, python-format msgid "Can't rename %(new_path)s to %(path)s" msgstr "No se puede renombrar %(new_path)s a %(path)s" #: ../../common/snapshots.py:1393 msgid "Removing old snapshots" msgstr "Eliminar instantáneas antiguas" #: ../../common/snapshots.py:1427 msgid "Trying to keep min free space" msgstr "Intentar mantener el espacio libre mínimo" #: ../../common/snapshots.py:1464 #, python-format msgid "Trying to keep min %d%% free inodes" msgstr "" #: ../../common/snapshots.py:2040 msgid "WITH ERRORS !" msgstr "¡CON ERRORES!" #: ../../common/snapshots.py:2505 ../../qt/app.py:251 ../../qt/app.py:1306 msgid "Now" msgstr "Ahora" #: ../../common/sshtools.py:163 #, python-format msgid "Can't mount %s" msgstr "No se puede montar %s" #: ../../common/sshtools.py:315 msgid "" "Could not unlock ssh private key. Wrong password or password not available " "for cron." msgstr "" #: ../../common/sshtools.py:345 #, python-format msgid "" "Password-less authentication for %(user)s@%(host)s failed. Look at 'man " "backintime' for further instructions." msgstr "" #: ../../common/sshtools.py:377 #, python-format msgid "" "Cipher %(cipher)s failed for %(host)s:\n" "%(err)s" msgstr "" #: ../../common/sshtools.py:428 #, python-format msgid "%s not found in ssh_known_hosts." msgstr "%s no se ha encontrado en ssh_known_hosts" #: ../../common/sshtools.py:468 #, python-format msgid "" "Remote path exists but is not a directory:\n" " %s" msgstr "" "La ruta remota existe, pero no es un directorio:\n" " %s" #: ../../common/sshtools.py:470 #, python-format msgid "" "Remote path is not writable:\n" " %s" msgstr "" "No tiene permisos de escritura en la ruta remota:\n" " %s" #: ../../common/sshtools.py:472 #, python-format msgid "" "Remote path is not executable:\n" " %s" msgstr "" "No tiene permisos de ejecución en la ruta remota:\n" " %s" #: ../../common/sshtools.py:474 #, python-format msgid "" "Couldn't create remote path:\n" " %s" msgstr "" "No se puede crear la ruta remota:\n" " %s" #: ../../common/sshtools.py:510 #, python-format msgid "Ping %s failed. Host is down or wrong address." msgstr "" #: ../../common/sshtools.py:577 ../../common/sshtools.py:683 #, python-format msgid "" "Remote host %(host)s doesn't support '%(command)s':\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:686 #, python-format msgid "" "Check commands on host %(host)s returned unknown error:\n" "%(err)s\n" "Look at 'man backintime' for further instructions" msgstr "" #: ../../common/sshtools.py:699 #, python-format msgid "Remote host %s doesn't support hardlinks" msgstr "" #: ../../common/sshtools.py:761 #, python-format msgid "" "Copy public ssh-key \"%(pubkey)s\" to remote host \"%(host)s\".\n" "Please enter password for \"%(user)s\":" msgstr "" #: ../../qt/app.py:93 msgid "Take snapshot with checksums" msgstr "" #: ../../qt/app.py:94 ../../qt/settingsdialog.py:643 msgid "Use checksum to detect changes" msgstr "Utilizar la suma de verificación (checksum) para detectar cambios" #: ../../qt/app.py:102 ../../qt/qtsystrayicon.py:78 msgid "Pause snapshot process" msgstr "" #: ../../qt/app.py:108 ../../qt/qtsystrayicon.py:82 msgid "Resume snapshot process" msgstr "" #: ../../qt/app.py:114 ../../qt/qtsystrayicon.py:87 msgid "Stop snapshot process" msgstr "" #: ../../qt/app.py:119 msgid "Refresh snapshots list" msgstr "Actualizar la lista de instantáneas" #: ../../qt/app.py:129 msgid "View Snapshot Log" msgstr "Ver registro de instantáneas" #: ../../qt/app.py:132 ../../qt/qtsystrayicon.py:96 msgid "View Last Log" msgstr "Ver último registro" #: ../../qt/app.py:137 ../../qt/settingsdialog.py:59 msgid "Settings" msgstr "Preferencias" #: ../../qt/app.py:142 msgid "Shutdown" msgstr "" #: ../../qt/app.py:143 msgid "Shutdown system after snapshot has finished." msgstr "" #: ../../qt/app.py:149 msgid "Exit" msgstr "Salir" #: ../../qt/app.py:158 ../../qt/app.py:177 ../../qt/app.py:287 msgid "Help" msgstr "Ayuda" #: ../../qt/app.py:160 msgid "Config File Help" msgstr "" #: ../../qt/app.py:163 msgid "Website" msgstr "Sitio web" #: ../../qt/app.py:165 ../../qt/app.py:993 msgid "Changelog" msgstr "" #: ../../qt/app.py:167 msgid "FAQ" msgstr "" #: ../../qt/app.py:169 msgid "Ask a question" msgstr "" #: ../../qt/app.py:171 msgid "Report a bug" msgstr "" #: ../../qt/app.py:174 ../../qt/app.py:1439 msgid "About" msgstr "Acerca de" #: ../../qt/app.py:204 msgid "Up" msgstr "Arriba" #: ../../qt/app.py:224 ../../qt/app.py:247 ../../qt/app.py:280 #: ../../qt/restoredialog.py:51 ../../qt/settingsdialog.py:1881 #: ../../qt/snapshotsdialog.py:139 ../../qt/snapshotsdialog.py:144 msgid "Restore" msgstr "Restaurar" #: ../../qt/app.py:225 msgid "Restore the selected files or folders to the original destination." msgstr "" #: ../../qt/app.py:228 ../../qt/app.py:1131 ../../qt/app.py:1163 #: ../../qt/snapshotsdialog.py:141 msgid "Restore to ..." msgstr "Recuperar en ..." #: ../../qt/app.py:229 msgid "Restore the selected files or folders to a new destination." msgstr "" #: ../../qt/app.py:234 msgid "" "Restore the currently shown folder and all its content to the original " "destination." msgstr "" #: ../../qt/app.py:239 msgid "" "Restore the currently shown folder and all its content to a new destination." msgstr "" #: ../../qt/app.py:249 #, python-format msgid "" "Restore selected file or folder.\n" "If this button is grayed out this is most likely because \"%(now)s\" is " "selected in left hand snapshots list." msgstr "" #: ../../qt/app.py:254 ../../qt/logviewdialog.py:75 ../../qt/qttools.py:200 #: ../../qt/snapshotsdialog.py:101 msgid "Snapshots" msgstr "Instantáneas" #: ../../qt/app.py:260 msgid "Snapshot" msgstr "" #: ../../qt/app.py:271 msgid "View" msgstr "" #: ../../qt/app.py:337 msgid "" "This folder doesn't exist\n" "in the current selected snapshot!" msgstr "" #: ../../qt/app.py:398 msgid "Add to Include" msgstr "" #: ../../qt/app.py:399 ../../qt/logviewdialog.py:175 msgid "Add to Exclude" msgstr "" #: ../../qt/app.py:471 #, python-format msgid "" "%(appName)s is not configured. Would you like to restore a previous " "configuration?" msgstr "" #: ../../qt/app.py:492 msgid "" "Can't find snapshots folder.\n" "If it is on a removable drive please plug it and then press OK" msgstr "" "No se pudo encontrar la carpeta de instantáneas.\n" "Si se encuentra en un dispositivo extraíble, por favor, conéctelo y pulse OK" #: ../../qt/app.py:527 msgid "" "If you close this window Back In Time will not be able to shutdown your " "system when the snapshot has finished.\n" "Do you really want to close?" msgstr "" #: ../../qt/app.py:667 ../../qt/app.py:719 msgid "Working:" msgstr "Trabajando:" #: ../../qt/app.py:723 msgid "Error:" msgstr "Error:" #: ../../qt/app.py:743 ../../qt/qtsystrayicon.py:188 msgid "Sent:" msgstr "" #: ../../qt/app.py:744 ../../qt/qtsystrayicon.py:189 msgid "Speed:" msgstr "" #: ../../qt/app.py:745 ../../qt/qtsystrayicon.py:190 msgid "ETA:" msgstr "" #: ../../qt/app.py:794 msgid "Global" msgstr "Global" #: ../../qt/app.py:796 msgid "Home" msgstr "Carpeta Personal" #: ../../qt/app.py:811 msgid "Backup folders" msgstr "Carpeta de copias de seguridad" #: ../../qt/app.py:1025 #, python-format msgid "" "Backup local files before overwriting or\n" "removing with trailing '%(suffix)s'." msgstr "" #: ../../qt/app.py:1028 ../../qt/settingsdialog.py:631 #, python-format msgid "" "Newer versions of files will be renamed with trailing '%(suffix)s' before " "restoring.\n" "If you don't need them anymore you can remove them with '%(cmd)s'" msgstr "" #: ../../qt/app.py:1038 msgid "" "Only restore files which do not exist or\n" "are newer than those in destination.\n" "Using \"rsync --update\" option." msgstr "" #: ../../qt/app.py:1071 msgid "Remove newer files in original folder" msgstr "" #: ../../qt/app.py:1072 msgid "" "Restore selected files or folders to the original destination and\n" "delete files/folders which are not in the snapshot.\n" "This will delete files/folders which where excluded during taking the " "snapshot!\n" "Be extremely careful!!!" msgstr "" #: ../../qt/app.py:1083 #, python-format msgid "" "Do you really want to restore this files(s)\n" "into new folder '%(path)s':" msgstr "" #: ../../qt/app.py:1086 msgid "Do you really want to restore this files(s):" msgstr "" #: ../../qt/app.py:1098 #, python-format msgid "Are you sure you want to remove all newer files in '%(path)s'?" msgstr "" #: ../../qt/app.py:1101 msgid "" "Are you sure you want to remove all newer files in your original folder?" msgstr "" #: ../../qt/app.py:1105 msgid "" "WARNING: deleting files in filesystem root could break your whole system!!!" msgstr "" #: ../../qt/app.py:1307 msgid "View the current disk content" msgstr "Ver el contenido actual del disco" #: ../../qt/app.py:1310 #, python-format msgid "Snapshot: %s" msgstr "Instantánea: %s" #: ../../qt/app.py:1311 #, python-format msgid "View the snapshot made at %s" msgstr "Ver la instantánea hecha el %s" #: ../../qt/app.py:1349 #, python-format msgid "Restore '%s'" msgstr "Recuperar '%s'" #: ../../qt/app.py:1350 #, python-format msgid "Restore '%s' to ..." msgstr "Recuperar '%s' en" #: ../../qt/app.py:1464 ../../qt/app.py:1481 msgid "Authors" msgstr "" #: ../../qt/app.py:1465 ../../qt/app.py:1484 msgid "Translations" msgstr "" #: ../../qt/app.py:1466 ../../qt/app.py:1487 msgid "License" msgstr "" #: ../../qt/logviewdialog.py:57 msgid "Last Log View" msgstr "" #: ../../qt/logviewdialog.py:59 msgid "Snapshot Log View" msgstr "" #: ../../qt/logviewdialog.py:67 ../../qt/settingsdialog.py:67 #: ../../qt/settingsdialog.py:294 ../../qt/settingsdialog.py:1968 msgid "Profile:" msgstr "Perfil:" #: ../../qt/logviewdialog.py:89 msgid "Filter:" msgstr "Filtro:" #: ../../qt/logviewdialog.py:95 ../../qt/settingsdialog.py:661 msgid "All" msgstr "Todo" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:98 #: ../../qt/settingsdialog.py:659 msgid "Errors" msgstr "Errores" #: ../../qt/logviewdialog.py:96 ../../qt/logviewdialog.py:99 msgid "Changes" msgstr "Cambios" #: ../../qt/logviewdialog.py:100 msgid "Informations" msgstr "Informaciones" #: ../../qt/logviewdialog.py:110 msgid "[E] Error, [I] Information, [C] Change" msgstr "[E] Error, [I] Información, [C] Cambiar" #: ../../qt/logviewdialog.py:113 ../../qt/qtsystrayicon.py:91 msgid "decode paths" msgstr "" #: ../../qt/logviewdialog.py:171 msgid "Copy" msgstr "" #: ../../qt/logviewdialog.py:179 msgid "Decode" msgstr "" #: ../../qt/logviewdialog.py:195 msgid "Do you want to exclude this?" msgstr "" #: ../../qt/messagebox.py:58 msgid "Error" msgstr "" #: ../../qt/messagebox.py:64 ../../qt/messagebox.py:70 msgid "Question" msgstr "" #: ../../qt/qtsystrayicon.py:98 msgid "Start BackInTime" msgstr "" #: ../../qt/qtsystrayicon.py:157 msgid "Working..." msgstr "Trabajando..." #: ../../qt/qttools.py:220 msgid "Today" msgstr "Hoy" #: ../../qt/qttools.py:224 msgid "Yesterday" msgstr "Ayer" #: ../../qt/qttools.py:229 msgid "This week" msgstr "Esta semana" #: ../../qt/qttools.py:233 msgid "Last week" msgstr "Última semana" #: ../../qt/qttools.py:352 msgid "This is NOT a snapshot but a live view of your local files" msgstr "" #: ../../qt/qttools.py:354 #, python-format msgid "Last check %s" msgstr "" #: ../../qt/restoredialog.py:64 msgid "Show full Log" msgstr "" #: ../../qt/settingsdialog.py:76 msgid "Edit" msgstr "Editar" #: ../../qt/settingsdialog.py:81 msgid "Modify for Full System Backup" msgstr "" #: ../../qt/settingsdialog.py:87 ../../qt/settingsdialog.py:464 msgid "Add" msgstr "" #: ../../qt/settingsdialog.py:91 ../../qt/settingsdialog.py:425 #: ../../qt/settingsdialog.py:480 msgid "Remove" msgstr "" #: ../../qt/settingsdialog.py:106 msgid "General" msgstr "General" #: ../../qt/settingsdialog.py:116 ../../qt/settingsdialog.py:1970 msgid "Mode:" msgstr "" #: ../../qt/settingsdialog.py:129 #, python-format msgid "" "Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. Please take a look at 'A " "NOTE ON SECURITY' in 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:155 msgid "Folder" msgstr "" #: ../../qt/settingsdialog.py:163 msgid "SSH Settings" msgstr "" #: ../../qt/settingsdialog.py:175 ../../qt/settingsdialog.py:282 msgid "Host:" msgstr "Host:" #: ../../qt/settingsdialog.py:180 msgid "Port:" msgstr "" #: ../../qt/settingsdialog.py:185 ../../qt/settingsdialog.py:288 msgid "User:" msgstr "Usuario:" #: ../../qt/settingsdialog.py:190 msgid "Path:" msgstr "" #: ../../qt/settingsdialog.py:196 msgid "Cipher:" msgstr "" #: ../../qt/settingsdialog.py:202 msgid "Private Key:" msgstr "" #: ../../qt/settingsdialog.py:211 msgid "Key File" msgstr "" #: ../../qt/settingsdialog.py:219 msgid "Create a new SSH key without Password." msgstr "" #: ../../qt/settingsdialog.py:234 ../../qt/settingsdialog.py:243 #: ../../qt/settingsdialog.py:249 msgid "Password" msgstr "" #: ../../qt/settingsdialog.py:255 msgid "Save Password to Keyring" msgstr "" #: ../../qt/settingsdialog.py:258 msgid "Cache Password for Cron (Security issue: root can read password)" msgstr "" #: ../../qt/settingsdialog.py:270 msgid "Advanced" msgstr "Avanzado" #: ../../qt/settingsdialog.py:300 ../../qt/settingsdialog.py:1690 msgid "Full snapshot path: " msgstr "" #: ../../qt/settingsdialog.py:307 msgid "Schedule" msgstr "Tareas programadas" #: ../../qt/settingsdialog.py:317 msgid "Day:" msgstr "Día:" #: ../../qt/settingsdialog.py:328 msgid "Weekday:" msgstr "Día de la semana" #: ../../qt/settingsdialog.py:339 msgid "Hour:" msgstr "Hora:" #: ../../qt/settingsdialog.py:350 msgid "Hours:" msgstr "" #: ../../qt/settingsdialog.py:359 msgid "" "Run Back In Time repeatedly. This is useful if the computer is not running " "regularly." msgstr "" #: ../../qt/settingsdialog.py:364 msgid "Every:" msgstr "" #: ../../qt/settingsdialog.py:382 msgid "" "Run Back In Time as soon as the drive is connected (only once every X " "days).\n" "You will be prompted for your sudo password." msgstr "" #: ../../qt/settingsdialog.py:395 msgid "Include" msgstr "Incluir" #: ../../qt/settingsdialog.py:401 msgid "Include files and folders" msgstr "Incluir archivos y carpetas" #: ../../qt/settingsdialog.py:431 msgid "Exclude" msgstr "Excluir" #: ../../qt/settingsdialog.py:434 msgid "" "Warning: Wildcards ('foo*', '[fF]oo', 'fo?') will be ignored with " "mode 'SSH encrypted'.\n" "Only separate asterisk are allowed ('foo/*', 'foo/**/bar')" msgstr "" #: ../../qt/settingsdialog.py:441 msgid "Exclude patterns, files or folders" msgstr "Excluir patrones, archivos o carpetas" #: ../../qt/settingsdialog.py:454 msgid "Highly recommended:" msgstr "Se recomienda:" #: ../../qt/settingsdialog.py:476 msgid "Add default" msgstr "" #: ../../qt/settingsdialog.py:487 msgid "Exclude files bigger than: " msgstr "" #: ../../qt/settingsdialog.py:488 #, python-format msgid "" "Exclude files bigger than value in %(prefix)s.\n" "With 'Full rsync mode' disabled this will only affect new files\n" "because for rsync this is a transfer option, not an exclude option.\n" "So big files that has been backed up before will remain in snapshots\n" "even if they had changed." msgstr "" #: ../../qt/settingsdialog.py:506 msgid "Auto-remove" msgstr "Auto eliminar" #: ../../qt/settingsdialog.py:513 msgid "Older than:" msgstr "Anterior a:" #: ../../qt/settingsdialog.py:528 msgid "If free space is less than:" msgstr "Si el espacio libre es menor que:" #: ../../qt/settingsdialog.py:541 msgid "If free inodes is less than:" msgstr "" #: ../../qt/settingsdialog.py:564 msgid "Run in background on remote Host." msgstr "" #: ../../qt/settingsdialog.py:567 msgid "Keep all snapshots for the last" msgstr "Mantener todas las instantáneas hasta la última" #: ../../qt/settingsdialog.py:571 ../../qt/settingsdialog.py:577 msgid "day(s)" msgstr "día(s)" #: ../../qt/settingsdialog.py:573 msgid "Keep one snapshot per day for the last" msgstr "" #: ../../qt/settingsdialog.py:579 msgid "Keep one snapshot per week for the last" msgstr "" #: ../../qt/settingsdialog.py:583 msgid "weeks(s)" msgstr "semana(s)" #: ../../qt/settingsdialog.py:585 msgid "Keep one snapshot per month for the last" msgstr "" #: ../../qt/settingsdialog.py:589 msgid "month(s)" msgstr "mes(es)" #: ../../qt/settingsdialog.py:591 msgid "Keep one snapshot per year for all years" msgstr "Mantener una instantánea por año para todos los años" #: ../../qt/settingsdialog.py:610 msgid "Options" msgstr "Opciones" #: ../../qt/settingsdialog.py:618 msgid "Disable snapshots when on battery" msgstr "Desactivar instantáneas cuando se esté con batería" #: ../../qt/settingsdialog.py:621 msgid "Power status not available from system" msgstr "El estado de la energía no está disponible en el sistema" #: ../../qt/settingsdialog.py:624 msgid "Run only one snapshot at a time" msgstr "" #: ../../qt/settingsdialog.py:625 msgid "" "Other snapshots will be blocked until the current snapshot is done.\n" "This is a global option. So it will effect all profiles for this user.\n" "But you need to activate this for all other users, too." msgstr "" #: ../../qt/settingsdialog.py:630 msgid "Backup replaced files on restore" msgstr "" #: ../../qt/settingsdialog.py:640 msgid "Continue on errors (keep incomplete snapshots)" msgstr "Continuar si hay errores (mantener imágenes incompletas)" #: ../../qt/settingsdialog.py:646 msgid "Take a new snapshot regardless of there were changes or not." msgstr "" #: ../../qt/settingsdialog.py:653 msgid "Log Level:" msgstr "Detalle del log" #: ../../qt/settingsdialog.py:658 msgid "None" msgstr "Ninguno" #: ../../qt/settingsdialog.py:660 msgid "Changes & Errors" msgstr "Cambios & Errores" #: ../../qt/settingsdialog.py:676 msgid "Change these options only if you really know what you are doing !" msgstr "¡Cambie estas opciones sólo si realmente sabe lo que está haciendo!" #: ../../qt/settingsdialog.py:680 msgid "Run 'nice':" msgstr "" #: ../../qt/settingsdialog.py:686 ../../qt/settingsdialog.py:698 msgid "as cron job" msgstr "" #: ../../qt/settingsdialog.py:689 ../../qt/settingsdialog.py:704 #: ../../qt/settingsdialog.py:718 msgid "on remote host" msgstr "" #: ../../qt/settingsdialog.py:692 msgid "Run 'ionice':" msgstr "" #: ../../qt/settingsdialog.py:701 msgid "when taking a manual snapshot" msgstr "" #: ../../qt/settingsdialog.py:708 msgid "Run 'rsync' with 'nocache':" msgstr "" #: ../../qt/settingsdialog.py:714 msgid "on local machine" msgstr "" #: ../../qt/settingsdialog.py:721 msgid "Redirect stdout to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:727 msgid "Redirect stderr to /dev/null in cronjobs." msgstr "" #: ../../qt/settingsdialog.py:736 msgid "Limit rsync bandwidth usage: " msgstr "" #: ../../qt/settingsdialog.py:739 msgid " KB/sec" msgstr "" #: ../../qt/settingsdialog.py:774 msgid "Preserve ACL" msgstr "Preservar ACL" #: ../../qt/settingsdialog.py:787 msgid "Preserve extended attributes (xattr)" msgstr "Preservar atributos extendidos (xattr)" #: ../../qt/settingsdialog.py:805 msgid "Copy unsafe links (works only with absolute links)" msgstr "Copiar vínculos incompletos (funciona solo con vínculos absolutos)" #: ../../qt/settingsdialog.py:836 msgid "Paste additional options to rsync" msgstr "" #: ../../qt/settingsdialog.py:839 msgid "" "Options must be quoted e.g. --exclude-from=\"/path/to/my exclude file\"." msgstr "" #: ../../qt/settingsdialog.py:849 msgid "Add prefix to SSH commands" msgstr "" #: ../../qt/settingsdialog.py:852 #, python-format msgid "" "Prefix to run before every command on remote host.\n" "Variables need to be escaped with \\$FOO.\n" "This doesn't touch rsync. So to add a prefix\n" "for rsync use \"%(cbRsyncOptions)s\" with\n" "%(rsync_options_value)s\n" "\n" "%(default)s: %(def_value)s" msgstr "" #: ../../qt/settingsdialog.py:860 ../../qt/settingsdialog.py:1741 msgid "default" msgstr "" #: ../../qt/settingsdialog.py:870 msgid "Check if remote host is online" msgstr "" #: ../../qt/settingsdialog.py:871 msgid "" "Warning: if disabled and the remote host\n" "is not available, this could lead to some\n" "weird errors." msgstr "" #: ../../qt/settingsdialog.py:874 msgid "Check if remote host support all necessary commands" msgstr "" #: ../../qt/settingsdialog.py:875 msgid "" "Warning: if disabled and the remote host\n" "does not support all necessary commands,\n" "this could lead to some weird errors." msgstr "" #: ../../qt/settingsdialog.py:888 msgid "Restore Config" msgstr "" #: ../../qt/settingsdialog.py:889 msgid "Edit user-callback" msgstr "" #: ../../qt/settingsdialog.py:908 msgid "" "Full system backup can only create a snapshot to be restored to the same " "physical disk(s) with the same disk partitioning as from the source; " "restoring to new physical disks or the same disks with different " "partitioning will yield a potentially broken and unusable system.\n" "\n" "Full system backup will override some settings that may have been " "customized. Continue?" msgstr "" #: ../../qt/settingsdialog.py:937 msgid "New profile" msgstr "Nuevo perfil" #: ../../qt/settingsdialog.py:953 msgid "Rename profile" msgstr "Renombrar perfil" #: ../../qt/settingsdialog.py:967 #, python-format msgid "Are you sure you want to delete the profile \"%s\" ?" msgstr "¿Está seguro de que quiere eliminar el perfil \"%s\" ?" #: ../../qt/settingsdialog.py:1201 msgid "" "Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) " "or */3 for periodic backups every 3 hours" msgstr "" #: ../../qt/settingsdialog.py:1237 msgid "" "You did not choose a private key file for SSH.\n" "Would you like to generate a new password-less public/private key pair?" msgstr "" #: ../../qt/settingsdialog.py:1242 #, python-format msgid "Private key file \"%(file)s\" does not exist." msgstr "" #: ../../qt/settingsdialog.py:1360 msgid "" "Would you like to copy your public SSH key to the\n" "remote host to enable password-less login?" msgstr "" #: ../../qt/settingsdialog.py:1376 #, python-format msgid "" "The authenticity of host \"%(host)s\" can't be established.\n" "\n" "%(keytype)s key fingerprint is:" msgstr "" #: ../../qt/settingsdialog.py:1384 msgid "" "Please verify this fingerprint! Would you like to add it to your " "'known_hosts' file?" msgstr "" #: ../../qt/settingsdialog.py:1531 msgid "Exclude pattern" msgstr "Excluir patrón" #: ../../qt/settingsdialog.py:1548 msgid "Exclude folder" msgstr "Excluir carpeta" #: ../../qt/settingsdialog.py:1567 msgid "Include file" msgstr "Incluir archivo" #: ../../qt/settingsdialog.py:1575 ../../qt/settingsdialog.py:1595 #, python-format msgid "" "\"%s\" is a symlink. The linked target will not be backed up until you " "include it, too.\n" "Would you like to include the symlinks target instead?" msgstr "" #: ../../qt/settingsdialog.py:1587 msgid "Include folder" msgstr "Incluir carpeta" #: ../../qt/settingsdialog.py:1614 msgid "Are you sure you want to change snapshots folder ?" msgstr "¿Está seguro de que desea cambiar la carpeta de instantáneas?" #: ../../qt/settingsdialog.py:1635 #, python-format msgid "Failed to create new SSH key in %(path)s" msgstr "" #: ../../qt/settingsdialog.py:1738 msgid "enabled" msgstr "" #: ../../qt/settingsdialog.py:1740 msgid "disabled" msgstr "" #: ../../qt/settingsdialog.py:1778 msgid "Restore Settings" msgstr "" #: ../../qt/settingsdialog.py:1795 msgid " and add your user to group 'fuse'" msgstr "" #: ../../qt/settingsdialog.py:1799 #, python-format msgid "" "Please navigate to the snapshot from which you want to restore %(appName)s's " "configuration. The path may look like: \n" "%(samplePath)s\n" "\n" "If your snapshots are on a remote drive or if they are encrypted you need to " "manually mount them first. If you use Mode SSH you also may need to set up " "public key login to the remote host%(addFuse)s.\n" "Take a look at 'man backintime'." msgstr "" #: ../../qt/settingsdialog.py:1857 ../../qt/settingsdialog.py:1920 msgid "No config found" msgstr "" #: ../../qt/settingsdialog.py:2096 msgid "user-callback script has no shebang (#!/bin/sh) line." msgstr "" #: ../../qt/settingsdialog.py:2100 msgid "Shebang in user-callback script is not executable." msgstr "" #: ../../qt/snapshotsdialog.py:60 msgid "Command:" msgstr "Orden:" #: ../../qt/snapshotsdialog.py:64 msgid "Parameters:" msgstr "Parámetros:" #: ../../qt/snapshotsdialog.py:111 msgid "List only different snapshots" msgstr "Listar sólo instantáneas diferentes" #: ../../qt/snapshotsdialog.py:118 msgid "List only equal snapshots to: " msgstr "" #: ../../qt/snapshotsdialog.py:128 msgid "Deep check (more accurate, but slow)" msgstr "Comprobación rigurosa (más precisa, pero lenta)" #: ../../qt/snapshotsdialog.py:149 msgid "Delete" msgstr "" #: ../../qt/snapshotsdialog.py:153 msgid "Select All" msgstr "" #: ../../qt/snapshotsdialog.py:177 msgid "Go To" msgstr "Ir a" #: ../../qt/snapshotsdialog.py:326 msgid "You can't compare a snapshot to itself" msgstr "No es posible comparar una instantánea consigo misma" #: ../../qt/snapshotsdialog.py:333 #, python-format msgid "Command not found: %s" msgstr "Orden no encontrada: %s" #: ../../qt/snapshotsdialog.py:361 #, python-format msgid "" "Do you really want to delete \"%(file)s\" in snapshot \"%(snapshot_id)s?\n" msgstr "" #: ../../qt/snapshotsdialog.py:364 #, python-format msgid "Do you really want to delete \"%(file)s\" in %(count)d snapshots?\n" msgstr "" #: ../../qt/snapshotsdialog.py:366 msgid "WARNING: This can not be revoked!" msgstr "" #: ../../qt/snapshotsdialog.py:381 #, python-format msgid "Exclude \"%s\" from future snapshots?" msgstr "" backintime-1.2.1/common/config.py0000644000175000017500000021354413530533316016257 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import datetime import gettext import socket import random import shlex try: import pwd except ImportError: import getpass pwd = None import tools import configfile import logger import mount import sshtools import encfstools import password import pluginmanager from exceptions import PermissionDeniedByPolicy, InvalidChar, InvalidCmd, LimitExceeded _=gettext.gettext gettext.bindtextdomain('backintime', os.path.join(tools.sharePath(), 'locale')) gettext.textdomain('backintime') class Config(configfile.ConfigFileWithProfiles): APP_NAME = 'Back In Time' VERSION = '1.2.1' COPYRIGHT = 'Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze' CONFIG_VERSION = 6 NONE = 0 AT_EVERY_BOOT = 1 _5_MIN = 2 _10_MIN = 4 _30_MIN = 7 HOUR = 10 _1_HOUR = 10 _2_HOURS = 12 _4_HOURS = 14 _6_HOURS = 16 _12_HOURS = 18 CUSTOM_HOUR = 19 DAY = 20 REPEATEDLY = 25 UDEV = 27 WEEK = 30 MONTH = 40 YEAR = 80 DISK_UNIT_MB = 10 DISK_UNIT_GB = 20 SCHEDULE_MODES = { NONE : _('Disabled'), AT_EVERY_BOOT : _('At every boot/reboot'), _5_MIN: _('Every 5 minutes'), _10_MIN: _('Every 10 minutes'), _30_MIN: _('Every 30 minutes'), _1_HOUR : _('Every hour'), _2_HOURS : _('Every 2 hours'), _4_HOURS : _('Every 4 hours'), _6_HOURS : _('Every 6 hours'), _12_HOURS : _('Every 12 hours'), CUSTOM_HOUR : _('Custom Hours'), DAY : _('Every Day'), REPEATEDLY : _('Repeatedly (anacron)'), UDEV : _('When drive get connected (udev)'), WEEK : _('Every Week'), MONTH : _('Every Month') } REMOVE_OLD_BACKUP_UNITS = { DAY : _('Day(s)'), WEEK : _('Week(s)'), YEAR : _('Year(s)') } REPEATEDLY_UNITS = { HOUR : _('Hour(s)'), DAY : _('Day(s)'), WEEK : _('Week(s)'), MONTH : _('Month(s)') } MIN_FREE_SPACE_UNITS = { DISK_UNIT_MB : 'MiB', DISK_UNIT_GB : 'GiB' } DEFAULT_EXCLUDE = [ '.gvfs', '.cache/*', '.thumbnails*', '.local/share/[Tt]rash*', '*.backup*', '*~', '.dropbox*', '/proc/*', '/sys/*', '/dev/*', '/run/*', '/etc/mtab', '/var/cache/apt/archives/*.deb', 'lost+found/*', '/tmp/*', '/var/tmp/*', '/var/backups/*', '.Private' ] DEFAULT_RUN_NICE_FROM_CRON = True DEFAULT_RUN_NICE_ON_REMOTE = False DEFAULT_RUN_IONICE_FROM_CRON = True DEFAULT_RUN_IONICE_FROM_USER = False DEFAULT_RUN_IONICE_ON_REMOTE = False DEFAULT_RUN_NOCACHE_ON_LOCAL = False DEFAULT_RUN_NOCACHE_ON_REMOTE = False DEFAULT_SSH_PREFIX = 'PATH=/opt/bin:/opt/sbin:\$PATH' DEFAULT_REDIRECT_STDOUT_IN_CRON = True DEFAULT_REDIRECT_STDERR_IN_CRON = False exp = _(' EXPERIMENTAL!') SNAPSHOT_MODES = { #mode : (, 'ComboBox Text', need_pw|lbl_pw_1, need_2_pw|lbl_pw_2), 'local' : (None, _('Local'), False, False), 'ssh' : (sshtools.SSH, _('SSH'), _('SSH private key'), False), 'local_encfs' : (encfstools.EncFS_mount, _('Local encrypted'), _('Encryption'), False), 'ssh_encfs' : (encfstools.EncFS_SSH, _('SSH encrypted'), _('SSH private key'), _('Encryption')) } SSH_CIPHERS = {'default': _('Default'), 'aes128-ctr': _('AES128-CTR'), 'aes192-ctr': _('AES192-CTR'), 'aes256-ctr': _('AES256-CTR'), 'arcfour256': _('ARCFOUR256'), 'arcfour128': _('ARCFOUR128'), 'aes128-cbc': _('AES128-CBC'), '3des-cbc': _('3DES-CBC'), 'blowfish-cbc': _('Blowfish-CBC'), 'cast128-cbc': _('Cast128-CBC'), 'aes192-cbc': _('AES192-CBC'), 'aes256-cbc': _('AES256-CBC'), 'arcfour': _('ARCFOUR') } ENCODE = encfstools.Bounce() PLUGIN_MANAGER = pluginmanager.PluginManager() def __init__(self, config_path = None, data_path = None): configfile.ConfigFileWithProfiles.__init__(self, _('Main profile')) self._APP_PATH = tools.backintimePath() self._DOC_PATH = os.path.join(tools.sharePath(), 'doc', 'backintime-common') if os.path.exists(os.path.join(self._APP_PATH, 'LICENSE')): self._DOC_PATH = self._APP_PATH self._GLOBAL_CONFIG_PATH = '/etc/backintime/config' HOME_FOLDER = os.path.expanduser('~') DATA_FOLDER = '.local/share' CONFIG_FOLDER = '.config' BIT_FOLDER = 'backintime' self._DEFAULT_LOCAL_DATA_FOLDER = os.path.join(HOME_FOLDER, DATA_FOLDER, BIT_FOLDER) self._LOCAL_CONFIG_FOLDER = os.path.join(HOME_FOLDER, CONFIG_FOLDER, BIT_FOLDER) self._MOUNT_ROOT = os.path.join(DATA_FOLDER, BIT_FOLDER, 'mnt') if data_path: self.DATA_FOLDER_ROOT = data_path self._LOCAL_DATA_FOLDER = os.path.join(data_path, DATA_FOLDER, BIT_FOLDER) self._LOCAL_MOUNT_ROOT = os.path.join(data_path, self._MOUNT_ROOT) else: self.DATA_FOLDER_ROOT = HOME_FOLDER self._LOCAL_DATA_FOLDER = self._DEFAULT_LOCAL_DATA_FOLDER self._LOCAL_MOUNT_ROOT = os.path.join(HOME_FOLDER, self._MOUNT_ROOT) tools.makeDirs(self._LOCAL_CONFIG_FOLDER) tools.makeDirs(self._LOCAL_DATA_FOLDER) tools.makeDirs(self._LOCAL_MOUNT_ROOT) self._DEFAULT_CONFIG_PATH = os.path.join(self._LOCAL_CONFIG_FOLDER, 'config') if config_path is None: self._LOCAL_CONFIG_PATH = self._DEFAULT_CONFIG_PATH else: self._LOCAL_CONFIG_PATH = os.path.abspath(config_path) self._LOCAL_CONFIG_FOLDER = os.path.dirname(self._LOCAL_CONFIG_PATH) old_path = os.path.join(self._LOCAL_CONFIG_FOLDER, 'config2') if os.path.exists(old_path): if os.path.exists(self._LOCAL_CONFIG_PATH): os.remove(old_path) else: os.rename(old_path, self._LOCAL_CONFIG_PATH) self.load(self._GLOBAL_CONFIG_PATH) self.append(self._LOCAL_CONFIG_PATH) #?Internal version of current config;;self.CONFIG_VERSION currentConfigVersion = self.intValue('config.version', 5) if currentConfigVersion < self.CONFIG_VERSION: # config.version value wasn't stored since BiT version 0.9.99.22 # until version 1.2.0 because of a bug. So we can't really tell # which version the config is. But most likely it is version > 4 if currentConfigVersion < 4: #update from BackInTime version < 1.0 is deprecated logger.error("config.version is < 4. This config was made with "\ "BackInTime version < 1.0. This version ({}) " \ "doesn't support upgrading config from version " \ "< 1.0 anymore. Please use BackInTime version " \ "<= 1.1.12 to upgrade the config to a more recent "\ "version.".format(self.VERSION)) #TODO: add popup warning sys.exit(2) if currentConfigVersion < 5: logger.info("Update to config version 5: other snapshot locations", self) profiles = self.profiles() for profile_id in profiles: #change include old_values = self.includeV4(profile_id) values = [] for value in old_values: values.append((value, 0)) self.setInclude(values, profile_id) #change exclude old_values = self.excludeV4(profile_id) self.setExclude(old_values, profile_id) #remove keys self.removeProfileKey('snapshots.include_folders', profile_id) self.removeProfileKey('snapshots.exclude_patterns', profile_id) if currentConfigVersion < 6: logger.info('Update to config version 6', self) # remap some keys for profile in self.profiles(): # make a 'schedule' domain for everything relating schedules self.remapProfileKey('snapshots.automatic_backup_anacron_period', 'schedule.repeatedly.period', profile) self.remapProfileKey('snapshots.automatic_backup_anacron_unit', 'schedule.repeatedly.unit', profile) self.remapProfileKey('snapshots.automatic_backup_day', 'schedule.day', profile) self.remapProfileKey('snapshots.automatic_backup_mode', 'schedule.mode', profile) self.remapProfileKey('snapshots.automatic_backup_time', 'schedule.time', profile) self.remapProfileKey('snapshots.automatic_backup_weekday', 'schedule.weekday', profile) self.remapProfileKey('snapshots.custom_backup_time', 'schedule.custom_time', profile) # we don't have 'full rsync mode' anymore self.remapProfileKey('snapshots.full_rsync.take_snapshot_regardless_of_changes', 'snapshots.take_snapshot_regardless_of_changes', profile) # remap 'qt4' keys self.remapKeyRegex(r'qt4', 'qt') # remove old gnome and kde keys self.removeKeysStartsWith('gnome') self.removeKeysStartsWith('kde') self.save() self.current_hash_id = 'local' self.pw = None self.forceUseChecksum = False self.xWindowId = None self.inhibitCookie = None self.setupUdev = tools.SetupUdev() def save(self): self.setIntValue('config.version', self.CONFIG_VERSION) return super(Config, self).save(self._LOCAL_CONFIG_PATH) def checkConfig(self): profiles = self.profiles() for profile_id in profiles: profile_name = self.profileName(profile_id) snapshots_path = self.snapshotsPath(profile_id) logger.debug('Check profile %s' %profile_name, self) #check snapshots path if not snapshots_path: self.notifyError(_('Profile: "%s"') % profile_name + '\n' + _('Snapshots folder is not valid !')) return False #check include include_list = self.include(profile_id) if not include_list: self.notifyError(_('Profile: "%s"') % profile_name + '\n' + _('You must select at least one folder to backup !')) return False snapshots_path2 = snapshots_path + '/' for item in include_list: if item[1] != 0: continue path = item[0] if path == snapshots_path: self.notifyError(_('Profile: "%s"') % profile_name + '\n' + _('You can\'t include backup folder !')) return False if len(path) >= len(snapshots_path2): if path[: len(snapshots_path2)] == snapshots_path2: self.notifyError(_('Profile: "%s"') % self.currentProfile() + '\n' + _('You can\'t include a backup sub-folder !')) return False return True def user(self): """ portable way to get username cc by-sa 3.0 http://stackoverflow.com/a/19865396/1139841 author: techtonik http://stackoverflow.com/users/239247/techtonik """ if pwd: return pwd.getpwuid(os.geteuid()).pw_name else: return getpass.getuser() def pid(self): return str(os.getpid()) def host(self): return socket.gethostname() def snapshotsPath(self, profile_id = None, mode = None, tmp_mount = False): if mode is None: mode = self.snapshotsMode(profile_id) if self.SNAPSHOT_MODES[mode][0] == None: #no mount needed #?Where to save snapshots in mode 'local'. This path must contain a #?folderstructure like 'backintime///';absolute path return self.profileStrValue('snapshots.path', '', profile_id) else: #mode need to be mounted; return mountpoint symlink = self.snapshotsSymlink(profile_id = profile_id, tmp_mount = tmp_mount) return os.path.join(self._LOCAL_MOUNT_ROOT, symlink) def snapshotsFullPath(self, profile_id = None): """ Returns the full path for the snapshots: .../backintime/machine/user/profile_id/ """ host, user, profile = self.hostUserProfile(profile_id) return os.path.join(self.snapshotsPath(profile_id), 'backintime', host, user, profile) def setSnapshotsPath(self, value, profile_id = None, mode = None): """ Sets the snapshot path to value, initializes, and checks it """ if not value: return False if profile_id == None: profile_id = self.currentProfile() if mode is None: mode = self.snapshotsMode(profile_id) if not os.path.isdir(value): self.notifyError(_('%s is not a folder !') % value) return False #Initialize the snapshots folder logger.debug("Check snapshot folder: %s" %value, self) host, user, profile = self.hostUserProfile(profile_id) if not all((host, user, profile)): self.notifyError(_('Host/User/Profile-ID must not be empty!')) return False full_path = os.path.join(value, 'backintime', host, user, profile) if not os.path.isdir(full_path): logger.debug("Create folder: %s" %full_path, self) tools.makeDirs(full_path) if not os.path.isdir(full_path): self.notifyError(_('Can\'t write to: %s\nAre you sure you have write access ?' % value)) return False for p in (os.path.join(value, 'backintime'), os.path.join(value, 'backintime', host)): try: os.chmod(p, 0o777) except PermissionError as e: msg = "Failed to change permissions world writeable for '{}': {}" logger.warning(msg.format(p, str(e)), self) #Test filesystem fs = tools.filesystem(full_path) if fs == 'vfat': self.notifyError(_("Destination filesystem for '%(path)s' is formatted with FAT which doesn't support hard-links. " "Please use a native Linux filesystem.") % {'path': value}) return False elif fs == 'cifs' and not self.copyLinks(): self.notifyError(_("Destination filsystem for '%(path)s' is a SMB mounted share. Please make sure " "the remote SMB server supports symlinks or activate '%(copyLinks)s' in '%(expertOptions)s'.") % {'path': value, 'copyLinks': _('Copy links (dereference symbolic links)'), 'expertOptions': _('Expert Options')}) elif fs == 'fuse.sshfs' and mode not in ('ssh', 'ssh_encfs'): self.notifyError(_("Destination filesystem for '%(path)s is a sshfs mounted share. sshfs doesn't support hard-links. " "Please use mode 'SSH' instead.") % {'path': value}) return False #Test write access for the folder check_path = os.path.join(full_path, 'check') tools.makeDirs(check_path) if not os.path.isdir(check_path): self.notifyError(_('Can\'t write to: %s\nAre you sure you have write access ?' % full_path)) return False os.rmdir(check_path) if self.SNAPSHOT_MODES[mode][0] is None: self.setProfileStrValue('snapshots.path', value, profile_id) return True def snapshotsMode(self, profile_id = None): #?Use mode (or backend) for this snapshot. Look at 'man backintime' #?section 'Modes'.;local|local_encfs|ssh|ssh_encfs return self.profileStrValue('snapshots.mode', 'local', profile_id) def setSnapshotsMode(self, value, profile_id = None): self.setProfileStrValue('snapshots.mode', value, profile_id) def snapshotsSymlink(self, profile_id = None, tmp_mount = False): if profile_id is None: profile_id = self.current_profile_id symlink = '%s_%s' % (profile_id, self.pid()) if tmp_mount: symlink = 'tmp_%s' % symlink return symlink def setCurrentHashId(self, hash_id): self.current_hash_id = hash_id def hashCollision(self): #?Internal value used to prevent hash collisions on mountpoints. Do not change this. return self.intValue('global.hash_collision', 0) def incrementHashCollision(self): value = self.hashCollision() + 1 self.setIntValue('global.hash_collision', value) # SSH def sshSnapshotsPath(self, profile_id = None): #?Snapshot path on remote host. If the path is relative (no leading '/') #?it will start from remote Users homedir. An empty path will be replaced #?with './'.;absolute or relative path return self.profileStrValue('snapshots.ssh.path', '', profile_id) def sshSnapshotsFullPath(self, profile_id = None): """ Returns the full path for the snapshots: .../backintime/machine/user/profile_id/ """ path = self.sshSnapshotsPath(profile_id) if not path: path = './' host, user, profile = self.hostUserProfile(profile_id) return os.path.join(path, 'backintime', host, user, profile) def setSshSnapshotsPath(self, value, profile_id = None): self.setProfileStrValue('snapshots.ssh.path', value, profile_id) return True def sshHost(self, profile_id = None): #?Remote host used for mode 'ssh' and 'ssh_encfs'.;IP or domain address return self.profileStrValue('snapshots.ssh.host', '', profile_id) def setSshHost(self, value, profile_id = None): self.setProfileStrValue('snapshots.ssh.host', value, profile_id) def sshPort(self, profile_id = None): #?SSH Port on remote host.;0-65535 return self.profileIntValue('snapshots.ssh.port', '22', profile_id) def setSshPort(self, value, profile_id = None): self.setProfileIntValue('snapshots.ssh.port', value, profile_id) def sshCipher(self, profile_id = None): #?Cipher that is used for encrypting the SSH tunnel. Depending on the #?environment (network bandwidth, cpu and hdd performance) a different #?cipher might be faster.;default | aes192-cbc | aes256-cbc | aes128-ctr | #? aes192-ctr | aes256-ctr | arcfour | arcfour256 | arcfour128 | aes128-cbc | #? 3des-cbc | blowfish-cbc | cast128-cbc return self.profileStrValue('snapshots.ssh.cipher', 'default', profile_id) def setSshCipher(self, value, profile_id = None): self.setProfileStrValue('snapshots.ssh.cipher', value, profile_id) def sshUser(self, profile_id = None): #?Remote SSH user;;local users name return self.profileStrValue('snapshots.ssh.user', self.user(), profile_id) def setSshUser(self, value, profile_id = None): self.setProfileStrValue('snapshots.ssh.user', value, profile_id) def sshHostUserPortPathCipher(self, profile_id = None): host = self.sshHost(profile_id) port = self.sshPort(profile_id) user = self.sshUser(profile_id) path = self.sshSnapshotsPath(profile_id) cipher = self.sshCipher(profile_id) if not path: path = './' return (host, port, user, path, cipher) def sshPrivateKeyFile(self, profile_id = None): ssh = self.sshPrivateKeyFolder() default = '' for f in ['id_dsa', 'id_rsa', 'identity']: private_key = os.path.join(ssh, f) if os.path.isfile(private_key): default = private_key break #?Private key file used for password-less authentication on remote host. #?;absolute path to private key file;~/.ssh/id_dsa f = self.profileStrValue('snapshots.ssh.private_key_file', default, profile_id) if f: return f return default def sshPrivateKeyFolder(self): return os.path.join(os.path.expanduser('~'), '.ssh') def setSshPrivateKeyFile(self, value, profile_id = None): self.setProfileStrValue('snapshots.ssh.private_key_file', value, profile_id) def sshMaxArgLength(self, profile_id = None): #?Maximum argument length of commands run on remote host. This can be tested #?with 'python3 /usr/share/backintime/common/sshMaxArg.py USER@HOST'.\n #?0 = unlimited;0, >700 value = self.profileIntValue('snapshots.ssh.max_arg_length', 0, profile_id) if value and value < 700: raise ValueError('SSH max arg length %s is to low to run commands' % value) return value def setSshMaxArgLength(self, value, profile_id = None): self.setProfileIntValue('snapshots.ssh.max_arg_length', value, profile_id) def sshCheckCommands(self, profile_id = None): #?Check if all commands (used during takeSnapshot) work like expected #?on the remote host. return self.profileBoolValue('snapshots.ssh.check_commands', True, profile_id) def setSshCheckCommands(self, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.check_commands', value, profile_id) def sshCheckPingHost(self, profile_id = None): #?Check if the remote host is available before trying to mount. return self.profileBoolValue('snapshots.ssh.check_ping', True, profile_id) def setSshCheckPingHost(self, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.check_ping', value, profile_id) def sshDefaultArgs(self, profile_id = None): """ Default arguments used for ``ssh`` and ``sshfs`` commands. Returns: list: arguments for ssh """ # keep connection alive args = ['-o', 'ServerAliveInterval=240'] # disable ssh banner args += ['-o', 'LogLevel=Error'] # specifying key file here allows to override for potentially # conflicting .ssh/config key entry args += ['-o', 'IdentityFile={}'.format(self.sshPrivateKeyFile(profile_id))] return args def sshCommand(self, cmd = None, custom_args = None, port = True, cipher = True, user_host = True, ionice = True, nice = True, quote = False, prefix = True, profile_id = None): """ Return SSH command with all arguments. Args: cmd (list): command that should run on remote host custom_args (list): additional arguments paste to the command port (bool): use port from config cipher (bool): use cipher from config user_host (bool): use user@host from config ionice (bool): use ionice if configured nice (bool): use nice if configured quote (bool): quote remote command prefix (bool): use prefix from config before remote command profile_id (str): profile ID that should be used in config Returns: list: ssh command with chosen arguments """ assert cmd is None or isinstance(cmd, list), "cmd '{}' is not list instance".format(cmd) assert custom_args is None or isinstance(custom_args, list), "custom_args '{}' is not list instance".format(custom_args) ssh = ['ssh'] ssh += self.sshDefaultArgs(profile_id) # remote port if port: ssh += ['-p', str(self.sshPort(profile_id))] # cipher used to transfer data c = self.sshCipher(profile_id) if cipher and c != 'default': ssh += ['-o', 'Ciphers={}'.format(c)] # custom arguments if custom_args: ssh += custom_args # user@host if user_host: ssh.append('{}@{}'.format(self.sshUser(profile_id), self.sshHost(profile_id))) # quote the command running on remote host if quote and cmd: ssh.append("'") # run 'ionice' on remote host if ionice and self.ioniceOnRemote(profile_id) and cmd: ssh += ['ionice', '-c2', '-n7'] # run 'nice' on remote host if nice and self.niceOnRemote(profile_id) and cmd: ssh += ['nice', '-n19'] # run prefix on remote host if prefix and cmd and self.sshPrefixEnabled(profile_id): ssh += self.sshPrefixCmd(profile_id, cmd_type = list) # add the command if cmd: ssh += cmd # close quote if quote and cmd: ssh.append("'") return ssh #ENCFS def localEncfsPath(self, profile_id = None): #?Where to save snapshots in mode 'local_encfs'.;absolute path return self.profileStrValue('snapshots.local_encfs.path', '', profile_id) def setLocalEncfsPath(self, value, profile_id = None): self.setProfileStrValue('snapshots.local_encfs.path', value, profile_id) def passwordSave(self, profile_id = None, mode = None): if mode is None: mode = self.snapshotsMode(profile_id) #?Save password to system keyring (gnome-keyring or kwallet). #? must be the same as \fIprofile.snapshots.mode\fR return self.profileBoolValue('snapshots.%s.password.save' % mode, False, profile_id) def setPasswordSave(self, value, profile_id = None, mode = None): if mode is None: mode = self.snapshotsMode(profile_id) self.setProfileBoolValue('snapshots.%s.password.save' % mode, value, profile_id) def passwordUseCache(self, profile_id = None, mode = None): if mode is None: mode = self.snapshotsMode(profile_id) default = not tools.checkHomeEncrypt() #?Cache password in RAM so it can be read by cronjobs. #?Security issue: root might be able to read that password, too. #? must be the same as \fIprofile.snapshots.mode\fR;;true if home is not encrypted return self.profileBoolValue('snapshots.%s.password.use_cache' % mode, default, profile_id) def setPasswordUseCache(self, value, profile_id = None, mode = None): if mode is None: mode = self.snapshotsMode(profile_id) self.setProfileBoolValue('snapshots.%s.password.use_cache' % mode, value, profile_id) def password(self, parent = None, profile_id = None, mode = None, pw_id = 1, only_from_keyring = False): if self.pw is None: self.pw = password.Password(self) if profile_id is None: profile_id = self.currentProfile() if mode is None: mode = self.snapshotsMode(profile_id) return self.pw.password(parent, profile_id, mode, pw_id, only_from_keyring) def setPassword(self, password, profile_id = None, mode = None, pw_id = 1): if self.pw is None: self.pw = password.Password(self) if profile_id is None: profile_id = self.currentProfile() if mode is None: mode = self.snapshotsMode(profile_id) self.pw.setPassword(password, profile_id, mode, pw_id) def modeNeedPassword(self, mode, pw_id = 1): need_pw = self.SNAPSHOT_MODES[mode][pw_id + 1] if need_pw is False: return False return True def keyringServiceName(self, profile_id = None, mode = None, pw_id = 1): if mode is None: mode = self.snapshotsMode(profile_id) if pw_id > 1: return 'backintime/%s_%s' % (mode, pw_id) return 'backintime/%s' % mode def keyringUserName(self, profile_id = None): if profile_id is None: profile_id = self.currentProfile() return 'profile_id_%s' % profile_id def hostUserProfileDefault(self, profile_id = None): host = socket.gethostname() user = self.user() profile = profile_id if profile is None: profile = self.currentProfile() return (host, user, profile) def hostUserProfile(self, profile_id = None): default_host, default_user, default_profile = self.hostUserProfileDefault(profile_id) #?Set Host for snapshot path;;local hostname host = self.profileStrValue('snapshots.path.host', default_host, profile_id) #?Set User for snapshot path;;local username user = self.profileStrValue('snapshots.path.user', default_user, profile_id) #?Set Profile-ID for snapshot path;1-99999;current Profile-ID profile = self.profileStrValue('snapshots.path.profile', default_profile, profile_id) return (host, user, profile) def setHostUserProfile(self, host, user, profile, profile_id = None): self.setProfileStrValue('snapshots.path.host', host, profile_id) self.setProfileStrValue('snapshots.path.user', user, profile_id) self.setProfileStrValue('snapshots.path.profile', profile, profile_id) def includeV4(self, profile_id = None): #?!ignore this in manpage value = self.profileStrValue('snapshots.include_folders', '', profile_id) if not value: return [] paths = [] for item in value.split(':'): fields = item.split('|') path = os.path.expanduser(fields[0]) path = os.path.abspath(path) paths.append(path) return paths def include(self, profile_id = None): #?Include this file or folder. must be a counter starting with 1;absolute path:: #?Specify if \fIprofile.snapshots.include..value\fR is a folder (0) or a file (1).;0|1;0 return self.profileListValue('snapshots.include', ('str:value', 'int:type'), [], profile_id) def setInclude(self, values, profile_id = None): self.setProfileListValue('snapshots.include', ('str:value', 'int:type'), values, profile_id) def excludeV4(self, profile_id = None): """ Gets the exclude patterns: conf version 4 """ #?!ignore this in manpage value = self.profileStrValue('snapshots.exclude_patterns', '.gvfs:.cache*:[Cc]ache*:.thumbnails*:[Tt]rash*:*.backup*:*~', profile_id) if not value: return [] return value.split(':') def exclude(self, profile_id = None): """ Gets the exclude patterns """ #?Exclude this file or folder. must be a counter #?starting with 1;file, folder or pattern (relative or absolute) return self.profileListValue('snapshots.exclude', 'str:value', self.DEFAULT_EXCLUDE, profile_id) def setExclude(self, values, profile_id = None): self.setProfileListValue('snapshots.exclude', 'str:value', values, profile_id) def excludeBySizeEnabled(self, profile_id = None): #?Enable exclude files by size. return self.profileBoolValue('snapshots.exclude.bysize.enabled', False, profile_id) def excludeBySize(self, profile_id = None): #?Exclude files bigger than value in MiB. #?With 'Full rsync mode' disabled this will only affect new files #?because for rsync this is a transfer option, not an exclude option. #?So big files that has been backed up before will remain in snapshots #?even if they had changed. return self.profileIntValue('snapshots.exclude.bysize.value', 500, profile_id) def setExcludeBySize(self, enabled, value, profile_id = None): self.setProfileBoolValue('snapshots.exclude.bysize.enabled', enabled, profile_id) self.setProfileIntValue('snapshots.exclude.bysize.value', value, profile_id) def tag(self, profile_id = None): #?!ignore this in manpage return self.profileStrValue('snapshots.tag', str(random.randint(100, 999)), profile_id) def scheduleMode(self, profile_id = None): #?Which schedule used for crontab. The crontab entry will be #?generated with 'backintime check-config'.\n #? 0 = Disabled\n 1 = at every boot\n 2 = every 5 minute\n #? 4 = every 10 minute\n 7 = every 30 minute\n10 = every hour\n #?12 = every 2 hours\n14 = every 4 hours\n16 = every 6 hours\n #?18 = every 12 hours\n19 = custom defined hours\n20 = every day\n #?25 = daily anacron\n27 = when drive get connected\n30 = every week\n #?40 = every month\n80 = every year #?;0|1|2|4|7|10|12|14|16|18|19|20|25|27|30|40|80;0 return self.profileIntValue('schedule.mode', self.NONE, profile_id) def setScheduleMode(self, value, profile_id = None): self.setProfileIntValue('schedule.mode', value, profile_id) def scheduleTime(self, profile_id = None): #?What time the cronjob should run? Only valid for #?\fIprofile.schedule.mode\fR >= 20;0-24 return self.profileIntValue('schedule.time', 0, profile_id) def setScheduleTime(self, value, profile_id = None): self.setProfileIntValue('schedule.time', value, profile_id) def scheduleDay(self, profile_id = None): #?Which day of month the cronjob should run? Only valid for #?\fIprofile.schedule.mode\fR >= 40;1-28 return self.profileIntValue('schedule.day', 1, profile_id) def setScheduleDay(self, value, profile_id = None): self.setProfileIntValue('schedule.day', value, profile_id) def scheduleWeekday(self, profile_id = None): #?Which day of week the cronjob should run? Only valid for #?\fIprofile.schedule.mode\fR = 30;1 = monday \- 7 = sunday return self.profileIntValue('schedule.weekday', 7, profile_id) def setScheduleWeekday(self, value, profile_id = None): self.setProfileIntValue('schedule.weekday', value, profile_id) def customBackupTime(self, profile_id = None): #?Custom hours for cronjob. Only valid for #?\fIprofile.schedule.mode\fR = 19 #?;comma separated int (8,12,18,23) or */3;8,12,18,23 return self.profileStrValue('schedule.custom_time', '8,12,18,23', profile_id) def setCustomBackupTime(self, value, profile_id = None): self.setProfileStrValue('schedule.custom_time', value, profile_id) def scheduleRepeatedPeriod(self, profile_id = None): #?How many units to wait between new snapshots with anacron? Only valid #?for \fIprofile.schedule.mode\fR = 25|27 return self.profileIntValue('schedule.repeatedly.period', 1, profile_id) def setScheduleRepeatedPeriod(self, value, profile_id = None): self.setProfileIntValue('schedule.repeatedly.period', value, profile_id) def scheduleRepeatedUnit(self, profile_id = None): #?Units to wait between new snapshots with anacron.\n #?10 = hours\n20 = days\n30 = weeks\n40 = months\n #?Only valid for \fIprofile.schedule.mode\fR = 25|27; #?10|20|30|40;20 return self.profileIntValue('schedule.repeatedly.unit', self.DAY, profile_id) def setScheduleRepeatedUnit(self, value, profile_id = None): self.setProfileIntValue('schedule.repeatedly.unit', value, profile_id) def removeOldSnapshots(self, profile_id = None): #?Remove all snapshots older than value + unit return (self.profileBoolValue('snapshots.remove_old_snapshots.enabled', True, profile_id), #?Snapshots older than this times units will be removed self.profileIntValue('snapshots.remove_old_snapshots.value', 10, profile_id), #?20 = days\n30 = weeks\n80 = years;20|30|80;80 self.profileIntValue('snapshots.remove_old_snapshots.unit', self.YEAR, profile_id)) def keepOnlyOneSnapshot(self, profile_id = None): #?NOT YET IMPLEMENTED. Remove all snapshots but one. return self.profileBoolValue('snapshots.keep_only_one_snapshot.enabled', False, profile_id) def setKeepOnlyOneSnapshot(self, value, profile_id = None): self.setProfileBoolValue('snapshots.keep_only_one_snapshot.enabled', value, profile_id) def removeOldSnapshotsEnabled(self, profile_id = None): return self.profileBoolValue('snapshots.remove_old_snapshots.enabled', True, profile_id) def removeOldSnapshotsDate(self, profile_id = None): enabled, value, unit = self.removeOldSnapshots(profile_id) if not enabled: return datetime.date(1, 1, 1) if unit == self.DAY: date = datetime.date.today() date = date - datetime.timedelta(days = value) return date if unit == self.WEEK: date = datetime.date.today() date = date - datetime.timedelta(days = date.weekday() + 7 * value) return date if unit == self.YEAR: date = datetime.date.today() return date.replace(day = 1, year = date.year - value) return datetime.date(1, 1, 1) def setRemoveOldSnapshots(self, enabled, value, unit, profile_id = None): self.setProfileBoolValue('snapshots.remove_old_snapshots.enabled', enabled, profile_id) self.setProfileIntValue('snapshots.remove_old_snapshots.value', value, profile_id) self.setProfileIntValue('snapshots.remove_old_snapshots.unit', unit, profile_id) def minFreeSpace(self, profile_id = None): #?Remove snapshots until \fIprofile.snapshots.min_free_space.value\fR #?free space is reached. return (self.profileBoolValue('snapshots.min_free_space.enabled', True, profile_id), #?Keep at least value + unit free space.;1-99999 self.profileIntValue('snapshots.min_free_space.value', 1, profile_id), #?10 = MB\n20 = GB;10|20;20 self.profileIntValue('snapshots.min_free_space.unit', self.DISK_UNIT_GB, profile_id)) def minFreeSpaceEnabled(self, profile_id = None): return self.profileBoolValue('snapshots.min_free_space.enabled', True, profile_id) def minFreeSpaceMib(self, profile_id = None): enabled, value, unit = self.minFreeSpace(profile_id) if not enabled: return 0 if self.DISK_UNIT_MB == unit: return value value *= 1024 #Gb if self.DISK_UNIT_GB == unit: return value return 0 def setMinFreeSpace(self, enabled, value, unit, profile_id = None): self.setProfileBoolValue('snapshots.min_free_space.enabled', enabled, profile_id) self.setProfileIntValue('snapshots.min_free_space.value', value, profile_id) self.setProfileIntValue('snapshots.min_free_space.unit', unit, profile_id) def minFreeInodes(self, profile_id = None): #?Keep at least value % free inodes.;1-15 return self.profileIntValue('snapshots.min_free_inodes.value', 2, profile_id) def minFreeInodesEnabled(self, profile_id = None): #?Remove snapshots until \fIprofile.snapshots.min_free_inodes.value\fR #?free inodes in % is reached. return self.profileBoolValue('snapshots.min_free_inodes.enabled', True, profile_id) def setMinFreeInodes(self, enabled, value, profile_id = None): self.setProfileBoolValue('snapshots.min_free_inodes.enabled', enabled, profile_id) self.setProfileIntValue('snapshots.min_free_inodes.value', value, profile_id) def dontRemoveNamedSnapshots(self, profile_id = None): #?Keep snapshots with names during smart_remove. return self.profileBoolValue('snapshots.dont_remove_named_snapshots', True, profile_id) def setDontRemoveNamedSnapshots(self, value, profile_id = None): self.setProfileBoolValue('snapshots.dont_remove_named_snapshots', value, profile_id) def smartRemove(self, profile_id = None): #?Run smart_remove to clean up old snapshots after a new snapshot was created. return (self.profileBoolValue('snapshots.smart_remove', False, profile_id), #?Keep all snapshots for X days. self.profileIntValue('snapshots.smart_remove.keep_all', 2, profile_id), #?Keep one snapshot per day for X days. self.profileIntValue('snapshots.smart_remove.keep_one_per_day', 7, profile_id), #?Keep one snapshot per week for X weeks. self.profileIntValue('snapshots.smart_remove.keep_one_per_week', 4, profile_id), #?Keep one snapshot per month for X month. self.profileIntValue('snapshots.smart_remove.keep_one_per_month', 24, profile_id)) def setSmartRemove(self, value, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month, profile_id = None): self.setProfileBoolValue('snapshots.smart_remove', value, profile_id) self.setProfileIntValue('snapshots.smart_remove.keep_all', keep_all, profile_id) self.setProfileIntValue('snapshots.smart_remove.keep_one_per_day', keep_one_per_day, profile_id) self.setProfileIntValue('snapshots.smart_remove.keep_one_per_week', keep_one_per_week, profile_id) self.setProfileIntValue('snapshots.smart_remove.keep_one_per_month', keep_one_per_month, profile_id) def smartRemoveRunRemoteInBackground(self, profile_id = None): #?If using mode SSH or SSH-encrypted, run smart_remove in background on remote machine return self.profileBoolValue('snapshots.smart_remove.run_remote_in_background', False, profile_id) def setSmartRemoveRunRemoteInBackground(self, value, profile_id = None): self.setProfileBoolValue('snapshots.smart_remove.run_remote_in_background', value, profile_id) def notify(self, profile_id = None): #?Display notifications (errors, warnings) through libnotify. return self.profileBoolValue('snapshots.notify.enabled', True, profile_id) def setNotify(self, value, profile_id = None): self.setProfileBoolValue('snapshots.notify.enabled', value, profile_id) def backupOnRestore(self, profile_id = None): #?Rename existing files before restore into FILE.backup.YYYYMMDD return self.profileBoolValue('snapshots.backup_on_restore.enabled', True, profile_id) def setBackupOnRestore(self, value, profile_id = None): self.setProfileBoolValue('snapshots.backup_on_restore.enabled', value, profile_id) def niceOnCron(self, profile_id = None): #?Run cronjobs with 'nice \-n19'. This will give BackInTime the #?lowest CPU priority to not interrupt any other working process. return self.profileBoolValue('snapshots.cron.nice', self.DEFAULT_RUN_NICE_FROM_CRON, profile_id) def setNiceOnCron(self, value, profile_id = None): self.setProfileBoolValue('snapshots.cron.nice', value, profile_id) def ioniceOnCron(self, profile_id = None): #?Run cronjobs with 'ionice \-c2 \-n7'. This will give BackInTime the #?lowest IO bandwidth priority to not interrupt any other working process. return self.profileBoolValue('snapshots.cron.ionice', self.DEFAULT_RUN_IONICE_FROM_CRON, profile_id) def setIoniceOnCron(self, value, profile_id = None): self.setProfileBoolValue('snapshots.cron.ionice', value, profile_id) def ioniceOnUser(self, profile_id = None): #?Run BackInTime with 'ionice \-c2 \-n7' when taking a manual snapshot. #?This will give BackInTime the lowest IO bandwidth priority to not #?interrupt any other working process. return self.profileBoolValue('snapshots.user_backup.ionice', self.DEFAULT_RUN_IONICE_FROM_USER, profile_id) def setIoniceOnUser(self, value, profile_id = None): self.setProfileBoolValue('snapshots.user_backup.ionice', value, profile_id) def niceOnRemote(self, profile_id = None): #?Run rsync and other commands on remote host with 'nice \-n19' return self.profileBoolValue('snapshots.ssh.nice', self.DEFAULT_RUN_NICE_ON_REMOTE, profile_id) def setNiceOnRemote(self, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.nice', value, profile_id) def ioniceOnRemote(self, profile_id = None): #?Run rsync and other commands on remote host with 'ionice \-c2 \-n7' return self.profileBoolValue('snapshots.ssh.ionice', self.DEFAULT_RUN_IONICE_ON_REMOTE, profile_id) def setIoniceOnRemote(self, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.ionice', value, profile_id) def nocacheOnLocal(self, profile_id = None): #?Run rsync on local machine with 'nocache'. #?This will prevent files from being cached in memory. return self.profileBoolValue('snapshots.local.nocache', self.DEFAULT_RUN_NOCACHE_ON_LOCAL, profile_id) def setNocacheOnLocal(self, value, profile_id = None): self.setProfileBoolValue('snapshots.local.nocache', value, profile_id) def nocacheOnRemote(self, profile_id = None): #?Run rsync on remote host with 'nocache'. #?This will prevent files from being cached in memory. return self.profileBoolValue('snapshots.ssh.nocache', self.DEFAULT_RUN_NOCACHE_ON_REMOTE, profile_id) def setNocacheOnRemote(self, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.nocache', value, profile_id) def redirectStdoutInCron(self, profile_id = None): #?redirect stdout to /dev/null in cronjobs return self.profileBoolValue('snapshots.cron.redirect_stdout', self.DEFAULT_REDIRECT_STDOUT_IN_CRON, profile_id) def redirectStderrInCron(self, profile_id = None): #?redirect stderr to /dev/null in cronjobs;;self.DEFAULT_REDIRECT_STDERR_IN_CRON if self.isConfigured(profile_id): default = True else: default = self.DEFAULT_REDIRECT_STDERR_IN_CRON return self.profileBoolValue('snapshots.cron.redirect_stderr', default, profile_id) def setRedirectStdoutInCron(self, value, profile_id = None): self.setProfileBoolValue('snapshots.cron.redirect_stdout', value, profile_id) def setRedirectStderrInCron(self, value, profile_id = None): self.setProfileBoolValue('snapshots.cron.redirect_stderr', value, profile_id) def bwlimitEnabled(self, profile_id = None): #?Limit rsync bandwidth usage over network. Use this with mode SSH. #?For mode Local you should rather use ionice. return self.profileBoolValue('snapshots.bwlimit.enabled', False, profile_id) def bwlimit(self, profile_id = None): #?Bandwidth limit in KB/sec. return self.profileIntValue('snapshots.bwlimit.value', 3000, profile_id) def setBwlimit(self, enabled, value, profile_id = None): self.setProfileBoolValue('snapshots.bwlimit.enabled', enabled, profile_id) self.setProfileIntValue('snapshots.bwlimit.value', value, profile_id) def noSnapshotOnBattery(self, profile_id = None): #?Don't take snapshots if the Computer runs on battery. return self.profileBoolValue('snapshots.no_on_battery', False, profile_id) def setNoSnapshotOnBattery(self, value, profile_id = None): self.setProfileBoolValue('snapshots.no_on_battery', value, profile_id) def preserveAcl(self, profile_id = None): #?Preserve ACL. The source and destination systems must have #?compatible ACL entries for this option to work properly. return self.profileBoolValue('snapshots.preserve_acl', False, profile_id) def setPreserveAcl(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.preserve_acl', value, profile_id) def preserveXattr(self, profile_id = None): #?Preserve extended attributes (xattr). return self.profileBoolValue('snapshots.preserve_xattr', False, profile_id) def setPreserveXattr(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.preserve_xattr', value, profile_id) def copyUnsafeLinks(self, profile_id = None): #?This tells rsync to copy the referent of symbolic links that point #?outside the copied tree. Absolute symlinks are also treated like #?ordinary files. return self.profileBoolValue('snapshots.copy_unsafe_links', False, profile_id) def setCopyUnsafeLinks(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.copy_unsafe_links', value, profile_id) def copyLinks(self, profile_id = None): #?When symlinks are encountered, the item that they point to #?(the reference) is copied, rather than the symlink. return self.profileBoolValue('snapshots.copy_links', False, profile_id) def setCopyLinks(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.copy_links', value, profile_id) def rsyncOptionsEnabled(self, profile_id = None): #?Past additional options to rsync return self.profileBoolValue('snapshots.rsync_options.enabled', False, profile_id) def rsyncOptions(self, profile_id = None): #?rsync options. Options must be quoted e.g. \-\-exclude-from="/path/to/my exclude file" return self.profileStrValue('snapshots.rsync_options.value', '', profile_id) def setRsyncOptions(self, enabled, value, profile_id = None): self.setProfileBoolValue('snapshots.rsync_options.enabled', enabled, profile_id) self.setProfileStrValue('snapshots.rsync_options.value', value, profile_id) def sshPrefixEnabled(self, profile_id = None): #?Add prefix to every command which run through SSH on remote host. return self.profileBoolValue('snapshots.ssh.prefix.enabled', False, profile_id) def sshPrefix(self, profile_id = None): #?Prefix to run before every command on remote host. Variables need to be escaped with \\$FOO. #?This doesn't touch rsync. So to add a prefix for rsync use #?\fIprofile.snapshots.rsync_options.value\fR with #?--rsync-path="FOO=bar:\\$FOO /usr/bin/rsync" return self.profileStrValue('snapshots.ssh.prefix.value', self.DEFAULT_SSH_PREFIX, profile_id) def setSshPrefix(self, enabled, value, profile_id = None): self.setProfileBoolValue('snapshots.ssh.prefix.enabled', enabled, profile_id) self.setProfileStrValue('snapshots.ssh.prefix.value', value, profile_id) def sshPrefixCmd(self, profile_id = None, cmd_type = str): if cmd_type == list: if self.sshPrefixEnabled(profile_id): return shlex.split(self.sshPrefix(profile_id)) else: return [] if cmd_type == str: if self.sshPrefixEnabled(profile_id): return self.sshPrefix(profile_id).strip() + ' ' else: return '' def continueOnErrors(self, profile_id = None): #?Continue on errors. This will keep incomplete snapshots rather than #?deleting and start over again. return self.profileBoolValue('snapshots.continue_on_errors', True, profile_id) def setContinueOnErrors(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.continue_on_errors', value, profile_id) def useChecksum(self, profile_id = None): #?Use checksum to detect changes rather than size + time. return self.profileBoolValue('snapshots.use_checksum', False, profile_id) def setUseChecksum(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.use_checksum', value, profile_id) def logLevel(self, profile_id = None): #?Log level used during takeSnapshot.\n1 = Error\n2 = Changes\n3 = Info;1-3 return self.profileIntValue('snapshots.log_level', 3, profile_id) def setLogLevel(self, value, profile_id = None): return self.setProfileIntValue('snapshots.log_level', value, profile_id) def takeSnapshotRegardlessOfChanges(self, profile_id = None): #?Create a new snapshot regardless if there were changes or not. return self.profileBoolValue('snapshots.take_snapshot_regardless_of_changes', False, profile_id) def setTakeSnapshotRegardlessOfChanges(self, value, profile_id = None): return self.setProfileBoolValue('snapshots.take_snapshot_regardless_of_changes', value, profile_id) def userCallbackNoLogging(self, profile_id = None): #?Do not catch std{out|err} from user-callback script. #?The script will only write to current TTY. #?Default is to catch std{out|err} and write it to #?syslog and TTY again. return self.profileBoolValue('user_callback.no_logging', False, profile_id) def globalFlock(self): #?Prevent multiple snapshots (from different profiles or users) to be run at the same time return self.boolValue('global.use_flock', False) def setGlobalFlock(self, value): self.setBoolValue('global.use_flock', value) def appPath(self): return self._APP_PATH def docPath(self): return self._DOC_PATH def appInstanceFile(self): return os.path.join(self._LOCAL_DATA_FOLDER, 'app.lock') def fileId(self, profile_id = None): if profile_id is None: profile_id = self.currentProfile() if profile_id == '1': return '' return profile_id def takeSnapshotLogFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "takesnapshot_%s.log" % self.fileId(profile_id)) def takeSnapshotMessageFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "worker%s.message" % self.fileId(profile_id)) def takeSnapshotProgressFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "worker%s.progress" % self.fileId(profile_id)) def takeSnapshotInstanceFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "worker%s.lock" % self.fileId(profile_id)) def takeSnapshotUserCallback(self): return os.path.join(self._LOCAL_CONFIG_FOLDER, "user-callback") def passwordCacheFolder(self): return os.path.join(self._LOCAL_DATA_FOLDER, "password_cache") def passwordCachePid(self): return os.path.join(self.passwordCacheFolder(), "PID") def passwordCacheFifo(self): return os.path.join(self.passwordCacheFolder(), "FIFO") def passwordCacheInfo(self): return os.path.join(self.passwordCacheFolder(), "info") def cronEnvFile(self): return os.path.join(self._LOCAL_DATA_FOLDER, "cron_env") def anacrontab(self, suffix = ''): """ Deprecated since 1.1. Just keep this to delete old anacrontab files """ return os.path.join(self._LOCAL_CONFIG_FOLDER, 'anacrontab' + suffix) def anacrontabFiles(self): """ list existing old anacrontab files """ dirname, basename = os.path.split(self.anacrontab()) for f in os.listdir(dirname): if f.startswith(basename): yield os.path.join(dirname, f) def anacronSpool(self): return os.path.join(self._LOCAL_DATA_FOLDER, 'anacron') def anacronSpoolFile(self, profile_id = None): return os.path.join(self.anacronSpool(), self.anacronJobIdentify(profile_id)) def anacronJobIdentify(self, profile_id = None): if not profile_id: profile_id = self.currentProfile() profile_name = self.profileName(profile_id) return profile_id + '_' + profile_name.replace(' ', '_') def udevRulesPath(self): return os.path.join('/etc/udev/rules.d', '99-backintime-%s.rules' % self.user()) def restoreLogFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "restore_%s.log" % self.fileId(profile_id)) def restoreInstanceFile(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, "restore%s.lock" % self.fileId(profile_id)) def lastSnapshotSymlink(self, profile_id = None): return os.path.join(self.snapshotsFullPath(profile_id), 'last_snapshot') def encfsconfigBackupFolder(self, profile_id = None): return os.path.join(self._LOCAL_DATA_FOLDER, 'encfsconfig_backup_%s' % self.fileId(profile_id)) def license(self): return tools.readFile(os.path.join(self.docPath(), 'LICENSE'), '') def translations(self): return tools.readFile(os.path.join(self.docPath(), 'TRANSLATIONS'), '') def authors(self): return tools.readFile(os.path.join(self.docPath(), 'AUTHORS'), '') def changelog(self): for i in ('CHANGES', 'changelog'): f = os.path.join(self.docPath(), i) clog = tools.readFile(f, '') if clog: return clog return '' def preparePath(self, path): if len(path) > 1: if path[-1] == os.sep: path = path[: -1] return path def isConfigured(self, profile_id = None): """ Checks if the program is configured """ return bool(self.snapshotsPath(profile_id) and self.include(profile_id)) def canBackup(self, profile_id = None): """ Checks if snapshots_path exists """ if not self.isConfigured(profile_id): return False if not os.path.isdir(self.snapshotsFullPath(profile_id)): logger.error("%s does not exist" %self.snapshotsFullPath(profile_id), self) return False return True def backupScheduled(self, profile_id = None): """ check if profile is supposed to be run this time """ if self.scheduleMode(profile_id) not in (self.REPEATEDLY, self.UDEV): return True #if crontab wasn't updated since upgrading BIT to version without anacron #we are most likely started by anacron and should run this task without asking. if list(self.anacrontabFiles()): return True last_time = tools.readTimeStamp(self.anacronSpoolFile(profile_id)) if not last_time: return True value = self.scheduleRepeatedPeriod(profile_id) unit = self.scheduleRepeatedUnit(profile_id) return self.olderThan(last_time, value, unit) def olderThan(self, time, value, unit): """ return True if time is older than months, weeks, days or hours """ assert isinstance(time, datetime.datetime), 'time is not datetime.datetime type: %s' % time now = datetime.datetime.now() if unit <= self.HOUR: return time < now - datetime.timedelta(hours = value) elif unit <= self.DAY: return time.date() <= now.date() - datetime.timedelta(days = value) elif unit <= self.WEEK: return time.date() < now.date() \ - datetime.timedelta(days = now.date().weekday()) \ - datetime.timedelta(weeks = value - 1) elif unit <= self.MONTH: firstDay = now.date() - datetime.timedelta(days = now.date().day + 1) for i in range(value - 1): if firstDay.month == 1: firstDay = firstDay.replace(month = 12, year = firstDay.year - 1) else: firstDay = firstDay.replace(month = firstDay.month - 1) return time.date() < firstDay else: return True SYSTEM_ENTRY_MESSAGE = "#Back In Time system entry, this will be edited by the gui:" def setupCron(self): for f in self.anacrontabFiles(): logger.debug("Clearing anacrontab %s" %f, self) os.remove(f) self.setupUdev.clean() oldCrontab = tools.readCrontab() strippedCrontab = self.removeOldCrontab(oldCrontab) newCrontab = self.createNewCrontab(strippedCrontab) if not isinstance(newCrontab, (list, tuple)): return newCrontab #save Udev rules try: if self.setupUdev.isReady and self.setupUdev.save(): logger.debug('Udev rules added successfully', self) except PermissionDeniedByPolicy as e: logger.error(str(e), self) self.notifyError(str(e)) return False if not newCrontab == oldCrontab: if not tools.checkCommand('crontab'): if self.scheduleMode() is self.NONE: return True else: logger.error('crontab not found.', self) self.notifyError(_('Can\'t find crontab.\nAre you sure cron is installed ?\n' 'If not you should disable all automatic backups.')) return False if not tools.writeCrontab(newCrontab): self.notifyError(_('Failed to write new crontab.')) return False else: logger.debug("Crontab didn't change. Skip writing.") return True def removeOldCrontab(self, crontab): #We have to check if the self.SYSTEM_ENTRY_MESSAGE is in use, #if not then the entries are most likely from Back In Time 0.9.26 #or earlier. if not self.SYSTEM_ENTRY_MESSAGE in crontab: #Then the system entry message has not yet been used in this crontab #therefore we assume all entries are system entries and clear them all. #This is the old behaviour logger.debug("Clearing all Back In Time entries", self) return [x for x in crontab if not 'backintime' in x] else: #clear all line peers which have a SYSTEM_ENTRY_MESSAGE followed by #one backintime command line logger.debug("Clearing system Back In Time entries", self) delLines = [] for i, line in enumerate(crontab): if self.SYSTEM_ENTRY_MESSAGE in line and \ len(crontab) > i + 1 and \ 'backintime' in crontab[i + 1]: delLines.extend((i, i + 1)) return [line for i, line in enumerate(crontab) if i not in delLines] def createNewCrontab(self, oldCrontab): newCrontab = oldCrontab[:] if not tools.checkCommand('backintime'): logger.error("Command 'backintime' not found", self) return newCrontab for profile_id in self.profiles(): cronLine = self.cronLine(profile_id) if not isinstance(cronLine, str): return cronLine if cronLine: newCrontab.append(self.SYSTEM_ENTRY_MESSAGE) newCrontab.append(cronLine.replace('{cmd}', self.cronCmd(profile_id))) if newCrontab == oldCrontab: # Leave one self.SYSTEM_ENTRY_MESSAGE in to prevent deleting of manual # entries if there is no automatic entry. newCrontab.append(self.SYSTEM_ENTRY_MESSAGE) newCrontab.append("#Please don't delete these two lines, or all custom backintime " "entries are going to be deleted next time you call the gui options!") return newCrontab def cronLine(self, profile_id): cron_line = '' profile_name = self.profileName(profile_id) backup_mode = self.scheduleMode(profile_id) logger.debug("Profile: %s | Automatic backup: %s" %(profile_name, self.SCHEDULE_MODES[backup_mode]), self) if self.NONE == backup_mode: return cron_line hour = self.scheduleTime(profile_id) // 100 minute = self.scheduleTime(profile_id) % 100 day = self.scheduleDay(profile_id) weekday = self.scheduleWeekday(profile_id) if self.AT_EVERY_BOOT == backup_mode: cron_line = '@reboot {cmd}' elif self._5_MIN == backup_mode: cron_line = '*/5 * * * * {cmd}' elif self._10_MIN == backup_mode: cron_line = '*/10 * * * * {cmd}' elif self._30_MIN == backup_mode: cron_line = '*/30 * * * * {cmd}' elif self._1_HOUR == backup_mode: cron_line = '0 * * * * {cmd}' elif self._2_HOURS == backup_mode: cron_line = '0 */2 * * * {cmd}' elif self._4_HOURS == backup_mode: cron_line = '0 */4 * * * {cmd}' elif self._6_HOURS == backup_mode: cron_line = '0 */6 * * * {cmd}' elif self._12_HOURS == backup_mode: cron_line = '0 */12 * * * {cmd}' elif self.CUSTOM_HOUR == backup_mode: cron_line = '0 ' + self.customBackupTime(profile_id) + ' * * * {cmd}' elif self.DAY == backup_mode: cron_line = '%s %s * * * {cmd}' % (minute, hour) elif self.REPEATEDLY == backup_mode: if self.scheduleRepeatedUnit(profile_id) <= self.DAY: cron_line = '*/15 * * * * {cmd}' else: cron_line = '0 * * * * {cmd}' elif self.UDEV == backup_mode: if not self.setupUdev.isReady: logger.error("Failed to install Udev rule for profile %s. " "DBus Service 'net.launchpad.backintime.serviceHelper' not available" %profile_id, self) self.notifyError(_('Could not install Udev rule for profile %(profile_id)s. ' 'DBus Service \'%(dbus_interface)s\' ' 'wasn\'t available') %{'profile_id': profile_id, 'dbus_interface': 'net.launchpad.backintime.serviceHelper'}) mode = self.snapshotsMode(profile_id) if mode == 'local': dest_path = self.snapshotsFullPath(profile_id) elif mode == 'local_encfs': dest_path = self.localEncfsPath(profile_id) else: logger.error('Schedule udev doesn\'t work with mode %s' %mode, self) self.notifyError(_('Schedule udev doesn\'t work with mode %s') % mode) return False uuid = tools.uuidFromPath(dest_path) if uuid is None: #try using cached uuid #?Devices uuid used to automatically set up udev rule if the drive is not connected. uuid = self.profileStrValue('snapshots.path.uuid', '', profile_id) if not uuid: logger.error('Couldn\'t find UUID for "%s"' %dest_path, self) self.notifyError(_('Couldn\'t find UUID for "%s"') % dest_path) return False else: #cache uuid in config self.setProfileStrValue('snapshots.path.uuid', uuid, profile_id) try: self.setupUdev.addRule(self.cronCmd(profile_id), uuid) except (InvalidChar, InvalidCmd, LimitExceeded) as e: logger.error(str(e), self) self.notifyError(str(e)) return False elif self.WEEK == backup_mode: cron_line = '%s %s * * %s {cmd}' %(minute, hour, weekday) elif self.MONTH == backup_mode: cron_line = '%s %s %s * * {cmd}' %(minute, hour, day) return cron_line def cronCmd(self, profile_id): if not tools.checkCommand('backintime'): logger.error("Command 'backintime' not found", self) return cmd = tools.which('backintime') + ' ' if profile_id != '1': cmd += '--profile-id %s ' % profile_id if not self._LOCAL_CONFIG_PATH is self._DEFAULT_CONFIG_PATH: cmd += '--config %s ' % self._LOCAL_CONFIG_PATH if logger.DEBUG: cmd += '--debug ' cmd += 'backup-job' if self.redirectStdoutInCron(profile_id): cmd += ' >/dev/null' if self.redirectStderrInCron(profile_id): if self.redirectStdoutInCron(profile_id): cmd += ' 2>&1' else: cmd += ' 2>/dev/null' if self.ioniceOnCron(profile_id) and tools.checkCommand('ionice'): cmd = tools.which('ionice') + ' -c2 -n7 ' + cmd if self.niceOnCron(profile_id) and tools.checkCommand('nice'): cmd = tools.which('nice') + ' -n19 ' + cmd return cmd if __name__ == '__main__': config = Config() print("snapshots path = %s" % config.snapshotsFullPath()) backintime-1.2.1/common/sshMaxArg.py0000644000175000017500000000550313530533316016701 0ustar germargermar#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2015-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import random import string import subprocess import socket import argparse def randomId(size=6, chars=string.ascii_uppercase + string.digits): return ''.join(random.choice(chars) for x in range(size)) def maxArgLength(config, mid = 1048320): r = round(mid / 2) while r > 0: ssh = config.sshCommand(cmd = ['printf', randomId(mid)], nice = False, ionice = False, prefix = False) try: proc = subprocess.Popen(ssh, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True) out, err = proc.communicate() except OSError as e: if e.errno == 7: reportTest(mid, 'python exception: %s' % e.strerror) mid -= r else: raise else: l = len(out) if l == mid: reportTest(mid, 'can be longer') mid += r else: reportTest(mid, 'is to long') mid -= r r = round(r / 2) return mid + 6 def reportTest(mid, msg): print('Check length %s:\t%s' % (mid, msg)) def reportResult(host, mid): print('Maximum SSH argument length between "%s" and "%s" is %s' % (socket.gethostname(), host, mid)) if __name__ == '__main__': parser = argparse.ArgumentParser(description = 'Check maximal argument length on SSH connection', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('MID', type = int, nargs = '?', default = 1048320, help = 'Start checking with MID arg length') args = parser.parse_args() import config cfg = config.Config() mid = maxArgLength(cfg, args.MID) reportResult(cfg.sshHost(), mid) backintime-1.2.1/common/askpass.py0000644000175000017500000000317613530533316016455 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys try: import gtk except: pass import password import password_ipc import tools import config if __name__ == '__main__': """ return password. """ cfg = config.Config() tools.envLoad(cfg.cronEnvFile()) profile_id = os.getenv('ASKPASS_PROFILE_ID', '1') mode = os.getenv('ASKPASS_MODE', 'local') if mode == 'USER': prompt = os.getenv('ASKPASS_PROMPT', None) pw = password.Password(cfg) print(pw.passwordFromUser(None, prompt = prompt)) sys.exit(0) temp_file = os.getenv('ASKPASS_TEMP') if temp_file is None: #normal mode, get password from module password pw = password.Password(cfg) print(pw.password(None, profile_id, mode)) sys.exit(0) #temp mode fifo = password_ipc.FIFO(temp_file) pw = fifo.read(5) if pw: print(pw) backintime-1.2.1/common/configure0000755000175000017500000002345313530533316016345 0ustar germargermar#!/bin/sh #clean up if [ -e Makefile ]; then rm Makefile; fi #tmp files MAKEFILE="$(mktemp)" UNINSTALL_FILES="$(mktemp)" UNINSTALL_DIRS="$(mktemp)" #set default options PYTHON="--python3" FUSE_GROUP="--no-fuse-group" USR_BIN_FILES="backintime backintime-askpass" FUSE_FILES="mount.py" usage () { echo "Usage:" echo "$0 [--python | --python3], [--fuse-group | --no-fuse-group]" echo "" echo "--python" echo "\tuse 'python' to start Python3" echo "--python3" echo "\tuse 'python3' to start Python3" echo "--no-fuse-group" echo "\tdo not check for 'fuse' group membership (if not necessary on destination platform)" echo "--fuse-group" echo "\tmake sure user is in group 'fuse' to be able to use fuse-based file-systems" } addInstallFiles () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi for i in $(ls $file); do addInstallFile "$i" "$dest" "$mode" done } addInstallFile () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi printf "\tinstall --mode=$mode $file \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallFile "$file" "$dest" } addSymlink () { dst=$1 src=$2 printf "\tln -s $dst \$(DEST)$src\n" >> ${MAKEFILE} addUninstallFile "$src" } addInstallFileRename () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi printf "\tinstall --mode=$mode $file \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallFileRename "$dest" } addUninstallFile () { if [ $# -eq 2 ]; then file=$(basename "$1") dest=$2 path="\$(DEST)$dest/$file" else path="\$(DEST)$1" fi printf "\trm -f $path\n" >> ${UNINSTALL_FILES} } addUninstallFileRename () { file=$1 printf "\trm -f \$(DEST)$file\n" >> ${UNINSTALL_FILES} } addInstallDir () { dest=$1 printf "\tinstall -d \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallDir "$dest" } addUninstallDir () { dest=$1 printf "\tif [ -d \$(DEST)$dest ]; then rmdir --ignore-fail-on-non-empty \$(DEST)$dest; fi\n" >> ${UNINSTALL_DIRS} } addComment () { printf "\t#install $1\n" >> ${MAKEFILE} printf "\t#uninstall files $1\n" >> ${UNINSTALL_FILES} printf "\t#uninstall directory $1\n" >> ${UNINSTALL_DIRS} } addNewline () { printf "\n" >> ${MAKEFILE} printf "\n" >> ${UNINSTALL_FILES} printf "\n" >> ${UNINSTALL_DIRS} } onTravis () { [ "${TRAVIS}" = "true" ] } #get commandline arguments unknown_args="" for arg in $*; do case $arg in --python | --python3) PYTHON=$arg;; --fuse-group | --no-fuse-group) FUSE_GROUP=$arg;; --help | -h) usage; exit 0;; *) unknown_args="$unknown_args $arg";; esac done if [ -n "$unknown_args" ]; then echo "Unknown Arguments: $unknown_args" fi #patch python command #use 'python' or 'python3' to start Python Version 3.x case $PYTHON in --python) PYVERSION="" ;; --python3) PYVERSION="3";; esac sed -e "s/^python3\? /python${PYVERSION} /g" \ -e "s/^ssh-agent python3\? /ssh-agent python${PYVERSION} /g" \ -i $USR_BIN_FILES #patch check for 'fuse' group #Some distributions require user to be in group 'fuse' to use sshfs and encfs case $FUSE_GROUP in --fuse-group) CHECKFUSE="True" ;; --no-fuse-group) CHECKFUSE="False";; esac sed -e "s/CHECK_FUSE_GROUP = \(True\|False\)/CHECK_FUSE_GROUP = ${CHECKFUSE}/" \ -i $FUSE_FILES #check languages mos="" langs="" for langfile in `ls po/*.po`; do lang=`echo $langfile | cut -d/ -f2 | cut -d. -f1` mos="po/$lang.mo $mos" langs="$lang $langs" done #start Makefile printf "LANGS=$langs\n\n" >> ${MAKEFILE} printf "PREFIX=/usr\n" >> ${MAKEFILE} printf "DEST=\$(DESTDIR)\$(PREFIX)\n\n" >> ${MAKEFILE} printf "all:\tbuild\n\n" >> ${MAKEFILE} printf "build:\ttranslate compress\n\n" >> ${MAKEFILE} printf "clean:\n" >> ${MAKEFILE} printf "\trm -f po/*.mo\n" >> ${MAKEFILE} printf "\trm -f man/C/*.gz\n" >> ${MAKEFILE} printf "\trm -f config-example-*.gz\n" >> ${MAKEFILE} printf "\trm -rf doc-dev/_build/*\n\n" >> ${MAKEFILE} #create install and uninstall target printf "install:\tinstall_translations\n" >> ${MAKEFILE} addComment "python" addUninstallDir "/share/backintime/common/__pycache__" addUninstallFile "*.pyc" "/share/backintime/common/__pycache__" addInstallDir "/share/backintime/common" addInstallFiles "*.py" "/share/backintime/common" addNewline addComment "plugins" addUninstallDir "/share/backintime/plugins/__pycache__" addUninstallFile "*.pyc" "/share/backintime/plugins/__pycache__" addInstallDir "/share/backintime/plugins" addInstallFiles "plugins/*.py" "/share/backintime/plugins" addUninstallDir "/share/backintime" addNewline addComment "documentation" addInstallDir "/share/doc/backintime-common" addInstallFile "../debian/copyright" "/share/doc/backintime-common" addInstallFile "../AUTHORS" "/share/doc/backintime-common" addInstallFile "../LICENSE" "/share/doc/backintime-common" addInstallFile "../README.md" "/share/doc/backintime-common" addInstallFile "../TRANSLATIONS" "/share/doc/backintime-common" addInstallFile "../VERSION" "/share/doc/backintime-common" addInstallFile "../CHANGES" "/share/doc/backintime-common" addNewline addComment "config-examples" addInstallDir "/share/doc/backintime-common/examples" addInstallFile "config-example-local.gz" "/share/doc/backintime-common/examples" addInstallFile "config-example-ssh.gz" "/share/doc/backintime-common/examples" addUninstallDir "/share/doc/backintime-common" addUninstallDir "/share/doc" addNewline addComment "man" addInstallDir "/share/man/man1" addInstallFile "man/C/backintime.1.gz" "/share/man/man1" addInstallFile "man/C/backintime-askpass.1.gz" "/share/man/man1" addInstallFile "man/C/backintime-config.1.gz" "/share/man/man1" addUninstallDir "/share/man" addNewline addComment "application" addInstallDir "/bin" addInstallFile "backintime" "/bin" "755" addInstallFile "backintime-askpass" "/bin" "755" addNewline addComment "autostart" addInstallDir "/../etc/xdg/autostart" addInstallFile "backintime.desktop" "/../etc/xdg/autostart" addUninstallDir "/../etc/xdg" addUninstallDir "/../etc" addNewline addComment "bash-completion" addInstallDir "/share/bash-completion/completions" addInstallFiles "bash-completion/*" "/share/bash-completion/completions" addSymlink "backintime" "/share/bash-completion/completions/backintime-qt" addUninstallDir "/share/bash-completion" addNewline #compress printf "compress:\n" >> ${MAKEFILE} printf "\t#man pages\n" >> ${MAKEFILE} printf "\tfor i in \$\$(ls -1 man/C/); do case \$\$i in *.gz|*~) continue;; *) gzip -n --best -c man/C/\$\$i > man/C/\$\${i}.gz;; esac; done\n\n" >> ${MAKEFILE} printf "\t#config-examples\n" >> ${MAKEFILE} printf "\tgzip -n --best -c config-example-local > config-example-local.gz\n" >> ${MAKEFILE} printf "\tgzip -n --best -c config-example-ssh > config-example-ssh.gz\n\n" >> ${MAKEFILE} #translate printf "translate:\t$mos\n\n" >> ${MAKEFILE} for lang in $langs; do printf "po/$lang.mo: po/$lang.po\n" >> ${MAKEFILE} printf "\tmsgfmt -o po/$lang.mo po/$lang.po\n\n" >> ${MAKEFILE} done #common langs printf "install_translations:\n" >> ${MAKEFILE} addComment "translations" for lang in $langs; do addInstallDir "/share/locale/$lang/LC_MESSAGES" addInstallFileRename "po/$lang.mo" "/share/locale/$lang/LC_MESSAGES/backintime.mo" addUninstallDir "/share/locale/$lang" done addUninstallDir "/share/locale" addUninstallDir "/share" addNewline #uninstall printf "uninstall:\tuninstall_files uninstall_dirs\n\n" >> ${MAKEFILE} printf "uninstall_files:\n" >> ${MAKEFILE} cat ${UNINSTALL_FILES} >> ${MAKEFILE} printf "uninstall_dirs:\n" >> ${MAKEFILE} cat ${UNINSTALL_DIRS} >> ${MAKEFILE} #test for i in "py.test-3" "py.test-3.6" "py.test-3.5" "py.test-3.4"; do PYTEST=$(which $i 2>/dev/null) if [ -n "${PYTEST}" ]; then break fi done COVERAGE=$(which coverage 2>/dev/null) #use "coverage run" only on travis-ci.org and if it is available #this will pass informations to coveralls.io. #otherwise use "python", "python3" or if available "py.test-3" if onTravis && [ -n "${COVERAGE}" ]; then CMD="coverage run -p" else CMD="python${PYVERSION}" fi printf "test:\tunittest\n\n" >> ${MAKEFILE} printf "test-v:\tunittest-v\n\n" >> ${MAKEFILE} for v in "" "-v"; do #provide unittests with and without verbosity -v printf "unittest${v}:\n" >> ${MAKEFILE} if onTravis || [ -z "${PYTEST}" ]; then #if running on travis-ci.org or if py.test-3 is not available #call every test/test_*.py with $CMD from above for i in $(ls -1 test/test_*.py); do printf "\t${CMD} -m unittest ${v} -b $i\n" >> ${MAKEFILE} done else #else just call py.test-3 which will find test/test_*.py by itself #py.test-3 has a nicer output so this is prefered over simple python3 printf "\t${PYTEST} ${v}\n" >> ${MAKEFILE} fi printf "\n" >> ${MAKEFILE} done printf "integrationtest:\n" >> ${MAKEFILE} printf "\ttest/test.sh\n" >> ${MAKEFILE} #copy Makefile mv ${MAKEFILE} Makefile chmod 644 Makefile #clean up for i in "${UNINSTALL_FILES}" "${UNINSTALL_DIRS}"; do if [ -e "$i" ]; then rm "$i" fi done #check python version if [ $(python${PYVERSION} --version 2>&1 | grep -c "^Python 3") -ne 1 ]; then printf "Warning: Wrong Python version.\n" printf "Please make sure Python 3.x is used by adding '--python' or '--python3'.\n" exit 1 fi printf "All OK. Now run:\n" printf " make\n" printf " sudo make install\n" backintime-1.2.1/common/guiapplicationinstance.py0000644000175000017500000000515013530533316021537 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import logger from applicationinstance import ApplicationInstance class GUIApplicationInstance(ApplicationInstance): """ class used to handle one application instance mechanism """ def __init__(self, baseControlFile, raiseCmd = ''): """ specify the base for control files """ self.raiseFile = baseControlFile + '.raise' self.raiseCmd = raiseCmd super(GUIApplicationInstance, self).__init__(baseControlFile + '.pid', False, False) #remove raiseFile is already exists if os.path.exists(self.raiseFile): os.remove(self.raiseFile) self.check(raiseCmd) self.startApplication() def check(self, raiseCmd): """ check if the current application is already running """ ret = super(GUIApplicationInstance, self).check(False) if not ret: print("The application is already running! (pid: %s)" % self.pid) #notify raise try: with open(self.raiseFile, 'wt') as f: f.write(raiseCmd) except OSError as e: logger.error('Failed to write raise file %s: [%s] %s' %(e.filename, e.errno, e.strerror)) exit(0) #exit raise an exception so don't put it in a try/except block else: return ret def raiseCommand(self): """ check if the application must to be raised return None if no raise needed, or a string command to raise """ ret_val = None try: if os.path.isfile(self.raiseFile): with open(self.raiseFile, 'rt') as f: ret_val = f.read() os.remove(self.raiseFile) except: pass return ret_val backintime-1.2.1/common/password_ipc.py0000644000175000017500000001004413530533316017475 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import stat import tools import threading import tempfile from contextlib import contextmanager import logger class FIFO(object): """ interprocess-communication with named pipes """ def __init__(self, fname): self.fifo = fname self.alarm = tools.Alarm() def delfifo(self): """ remove FIFO """ try: os.remove(self.fifo) except: pass def create(self): """ create the FIFO in a way that only the current user can access it. """ if os.path.exists(self.fifo): self.delfifo() try: os.mkfifo(self.fifo, 0o600) except OSError as e: logger.error('Failed to create FIFO: %s' % str(e), self) sys.exit(1) def read(self, timeout = 0): """ read from fifo untill timeout. If timeout is 0 it will wait forever for input. """ #sys.stdout.write('read fifo\n') if not self.isFifo(): sys.exit(1) self.alarm.start(timeout) with open(self.fifo, 'r') as fifo: ret = fifo.read() self.alarm.stop() return ret def write(self, string, timeout = 0): """ write to fifo untill timeout. If timeout is 0 it will wait forever for an other process that will read this. """ #sys.stdout.write('write fifo\n') if not self.isFifo(): sys.exit(1) self.alarm.start(timeout) with open(self.fifo, 'w') as fifo: fifo.write(string) self.alarm.stop() def isFifo(self): """ make sure file is still a FIFO and has correct permissions """ try: s = os.stat(self.fifo) except OSError: return False if not s.st_uid == os.getuid(): logger.error('%s is not owned by user' % self.fifo, self) return False mode = s.st_mode if not stat.S_ISFIFO(mode): logger.error('%s is not a FIFO' % self.fifo, self) return False forbidden_perm = stat.S_IXUSR + stat.S_IRWXG + stat.S_IRWXO if mode & forbidden_perm > 0: logger.error('%s has wrong permissions' % self.fifo, self) return False return True class TempPasswordThread(threading.Thread): """ in case BIT is not configured yet provide password through temp FIFO to backintime-askpass. """ def __init__(self, string): super(TempPasswordThread, self).__init__() self.pw = string self.temp_file = os.path.join(tempfile.mkdtemp(), 'FIFO') self.fifo = FIFO(self.temp_file) @contextmanager def starter(self): self.start() yield self.stop() def run(self): self.fifo.create() self.fifo.write(self.pw) self.fifo.delfifo() def read(self): """ read fifo to end the blocking fifo.write use only if thread timeout. """ self.fifo.read() def stop(self): self.join(5) if self.isAlive(): #threading does not support signal.alarm self.read() try: os.rmdir(os.path.dirname(self.temp_file)) except OSError: pass backintime-1.2.1/common/snapshotlog.py0000644000175000017500000001632513530533316017351 0ustar germargermar# Back In Time # Copyright (C) 2016-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import re import gettext import logger import snapshots import tools _=gettext.gettext class LogFilter(object): """ A Filter for snapshot logs which will both decode log lines and filter them for the requested ``mode``. Args: mode (int): which filter should be used. Possible values: :py:data:`NO_FILTER`, :py:data:`ERROR`, :py:data:`CHANGES`, :py:data:`INFORMATION` or :py:data:`ERROR_AND_CHANGES` decode (encfstools.Decode): instance used for decoding lines or ``None`` """ NO_FILTER = 0 ERROR = 1 CHANGES = 2 INFORMATION = 3 ERROR_AND_CHANGES = 4 REGEX = {None: None, NO_FILTER: None, ERROR: re.compile(r'^(?:\[E\]|[^\[])'), CHANGES: re.compile(r'^(?:\[C\]|[^\[])'), INFORMATION: re.compile(r'^(?:\[I\]|[^\[])'), ERROR_AND_CHANGES: re.compile(r'^(?:\[E\]|\[C\]|[^\[])')} def __init__(self, mode = 0, decode = None): self.regex = self.REGEX[mode] self.decode = decode if decode: self.header = _('### This log has been decoded with automatic search pattern\n'\ '### If some paths are not decoded you can manually decode them with:\n') self.header += '### \'backintime --quiet ' if int(decode.config.currentProfile()) > 1: self.header += '--profile "%s" ' %decode.config.profileName() self.header += '--decode \'\n\n' else: self.header = '' def filter(self, line): """ Filter and decode ``line`` with predefined ``mode`` and ``decode`` instance. Args: line (str): log line read from disk Returns: str: decoded ``line`` or ``None`` if the line was filtered """ if not line: #keep empty lines return line if self.regex and not self.regex.match(line): return if self.decode: return self.decode.log(line) else: return line class SnapshotLog(object): """ Read and write Snapshot log to "~/.local/share/backintime/takesnapshot_.log". Where is the profile ID ``profile``. Args: cfg (config.Config): current config profile (int): profile that should be used to indentify the log """ NONE = 0 ERRORS = 1 CHANGES_AND_ERRORS = 2 ALL = 3 def __init__(self, cfg, profile = None): self.config = cfg if profile: self.profile = profile else: self.profile = cfg.currentProfile() self.logLevel = cfg.logLevel() self.logFileName = cfg.takeSnapshotLogFile(self.profile) self.logFile = None self.timer = tools.Alarm(self.flush, overwrite = False) def __del__(self): if self.logFile: self.logFile.close() def get(self, mode = None, decode = None, skipLines = 0): """ Read the log, filter and decode it and yield its lines. Args: mode (int): Mode used for filtering. Take a look at :py:class:`snapshotlog.LogFilter` decode (encfstools.Decode): instance used for decoding lines or ``None`` skipLines (int): skip ``n`` lines before yielding lines. This is used to append only new lines to LogView Yields: str: filtered and decoded log lines """ logFilter = LogFilter(mode, decode) count = logFilter.header.count('\n') try: with open(self.logFileName, 'rt') as f: if logFilter.header and not skipLines: yield logFilter.header for line in f.readlines(): line = logFilter.filter(line.rstrip('\n')) if not line is None: count += 1 if count <= skipLines: continue yield line except Exception as e: msg = ('Failed to get take_snapshot log from {}:'.format(self.logFile), str(e)) logger.debug(' '.join(msg), self) for line in msg: yield line def new(self, date): """ Create a new log file or - if the last new_snapshot can be continued - add a note to the current log. Args: date (datetime.datetime): current date """ if snapshots.NewSnapshot(self.config).saveToContinue: msg = "Last snapshot didn't finish but can be continued.\n\n" msg += "======== continue snapshot (profile %s): %s ========\n" else: if os.path.exists(self.logFileName): if self.logFile: self.logFile.close() self.logFile = None os.remove(self.logFileName) msg = "========== Take snapshot (profile %s): %s ==========\n" self.append(msg %(self.profile, date.strftime('%c')), 1) def append(self, msg, level): """ Append ``msg`` to the log if ``level`` is lower than configured log level. Args: msg (str): message line that should be added to the log level (int): verbosity level of current line. msg will only be added to log if level is lower than configured log level :py:func:`config.Config.logLevel`. Posible Values: :py:data:`SnapshotLog.ERRORS`, :py:data:`SnapshotLog.CHANGES_AND_ERRORS` or :py:data:`SnapshotLog.ALL` """ if level > self.logLevel: return if not self.logFile: self.logFile = open(self.logFileName, 'at') self.logFile.write(msg + '\n') self.timer.start(5) def flush(self): """ Force write log to file. """ if self.logFile: self.logFile.flush() backintime-1.2.1/common/bash-completion/0000755000175000017500000000000013530533316017513 5ustar germargermarbackintime-1.2.1/common/bash-completion/backintime0000644000175000017500000000663713530533316021560 0ustar germargermar#extract profile and config arguments _bit_extr_opts() { local c=0 last="" opts="" while [[ $c -le ${COMP_CWORD} ]]; do case "${last}" in --profile|--profile-id|--config) if [[ ${COMP_WORDS[$c]} != -* ]]; then opts="${opts} ${last} ${COMP_WORDS[$c]}" fi ;; esac last=${COMP_WORDS[$c]} c=$[$c+1] done echo "${opts}" } #return a list of all snapshots _bit_snapshots_list() { backintime$(_bit_extr_opts) --quiet snapshots-list | awk '{print $2}' } _backintime() { local cur prev actions opts pw_cache_commands local cur_action='' pos_action=0 c=0 COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--profile --profile-id --quiet --config --version --license \ --help --debug --checksum --no-crontab --keep-mount --delete \ --local-backup --no-local-backup --only-new --share-path" actions="backup backup-job snapshots-path snapshots-list \ snapshots-list-path last-snapshot last-snapshot-path unmount \ benchmark-cipher pw-cache decode remove restore check-config \ smart-remove shutdown" pw_cache_commands="start stop restart reload status" #extract the current action while [[ $c -le $[${COMP_CWORD} - 1] ]]; do case ${actions} in *"${COMP_WORDS[$c]}"*) cur_action="${COMP_WORDS[$c]}" pos_action=${c} break ;; esac c=$[${c}+1] done case "${cur_action}" in restore) if [[ ${cur} != -* ]]; then #which positional argument is $cur? case $[${COMP_CWORD}-${pos_action}] in #first arg is a filename 1) _filedir return 0 ;; #second arg is a dirname 2) _filedir -d return 0 ;; #third arg is snapshot-id 3) COMPREPLY=( $(compgen -W "$(_bit_snapshots_list)" -- ${cur}) ) return 0 ;; esac fi ;; remove|remove-and-do-not-ask-again) if [[ ${cur} != -* ]]; then #snapshot-ids COMPREPLY=( $(compgen -W "$(_bit_snapshots_list)" -- ${cur}) ) return 0 else #other args COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi ;; esac case "${prev}" in --config|decode|restore|--share-path) if [[ ${cur} != -* ]]; then _filedir return 0 fi ;; pw-cache) if [[ ${cur} != -* ]]; then COMPREPLY=( $(compgen -W "${pw_cache_commands}" -- ${cur}) ) return 0 fi ;; *) if [[ -z "${cur_action}" ]]; then opts="${opts} ${actions}" fi COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 ;; esac } complete -F _backintime backintime complete -F _backintime backintime-qt backintime-1.2.1/common/backintime-askpass0000755000175000017500000000221613530533316020127 0ustar germargermar#!/bin/sh # Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #fixing gray window error #https://launchpad.net/bugs/1493020 export QT_GRAPHICSSYSTEM="native" CUR_PATH="$(dirname $(readlink -m $0))" if [ -f "${CUR_PATH}/askpass.py" ]; then APP_PATH=$CUR_PATH else APP_PATH=$(readlink -m "${CUR_PATH}/../share/backintime/common") fi python3 -Es $APP_PATH/askpass.py "$@" backintime-1.2.1/qt/0000755000175000017500000000000013530533316013563 5ustar germargermarbackintime-1.2.1/qt/man/0000755000175000017500000000000013530533316014336 5ustar germargermarbackintime-1.2.1/qt/man/C/0000755000175000017500000000000013530533316014520 5ustar germargermarbackintime-1.2.1/qt/man/C/backintime-qt.10000644000175000017500000001143513530533316017336 0ustar germargermar.TH backintime-qt 1 "Aug 2016" "version 1.2.1" "USER COMMANDS" .SH NAME backintime-qt \- a simple backup tool. .SH SYNOPSIS .B backintime-qt [\-\-checksum] [\-\-config PATH] [\-\-debug] [\-\-delete] [\-\-help | \-h] [\-\-keep\-mount] [\-\-license] [\-\-local\-backup | \-\-no\-local\-backup] [\-\-no\-crontab] [\-\-only\-new] [\-\-profile NAME | \-\-profile\-id ID] [\-\-quiet] [\-\-share\-path PATH] [\-\-version] { backup | backup\-job | benchmark-cipher [FILE-SIZE] | check-config | decode [PATH] | last\-snapshot | last\-snapshot\-path | pw\-cache [start|stop|restart|reload|status] | remove[\-and\-do\-not\-ask\-again] [SNAPSHOT_ID] | restore [WHAT [WHERE [SNAPSHOT_ID]]] | shutdown | smart\-remove | snapshots\-list | snapshots\-list\-path | snapshots\-path | unmount } .SH DESCRIPTION Back In Time is a simple backup tool for Linux. This is the Qt5 version. For more information about Back In Time see backintime man page. .PP If you want to run it as root you need to use 'backintime-qt_polkit'. .SH OPTIONS .TP \-\-checksum Force to use checksum for checking if files have been changed. This is the same as 'Use checksum to detect changes' in Options. But you can use this to periodically run checksums from cronjobs. Only valid with \fIbackup\fR, \fIbackup-job\fR and \fIrestore\fR. .TP \-\-config PATH Read config from PATH. Default = ~/.config/backintime/config .TP --debug Show debug messages. .TP --delete Restore and delete newer files which are not in the snapshot. WARNING: deleting files in filesystem root could break your whole system!!! Only valid with \fIrestore\fR. .TP \-h, \-\-help Display a short help .TP \-\-keep\-mount Don't unmount on exit. Only valid with \fIsnapshots\-path\fR, \fIsnapshots\-list\-path\fR and \fIlast\-snapshot\-path\fR. .TP \-\-license Show license .TP --local-backup Create backup files before changing local files. Only valid with \fIrestore\fR. .TP --no-crontab Do not install crontab entries. Only valid with \fIcheck-config\fR. .TP --no-local-backup Temporary disable creation of backup files before changing local files. Only valid with \fIrestore\fR. .TP --only-new Only restore files which does not exist or are newer than those in destination. Using "rsync --update" option. Only valid with \fIrestore\fR. .TP \-\-profile NAME Select profile by name .TP \-\-profile\-id ID Select profile by id .TP \-\-quiet Suppress status messages on standard output. .TP \-\-share\-path PATH Write runtime data (locks, messages, log and mountpoints) to PATH. .TP \-v, \-\-version Show version .SH COMMANDS .TP backup | \-b | \-\-backup Take a snapshot now. .TP backup\-job | \-\-backup\-job Take a snapshot (if needed) depending on schedule rules (used for cron jobs). Back In Time will run in background for this. .TP benchmark-cipher | \-\-benchmark-cipher [FILE-SIZE] Show a benchmark of all ciphers for ssh transfer. .TP check-config Verify the profile in config, create snapshot path and crontab entries. .TP decode | \-\-decode [PATH] Decode encrypted PATH. If no PATH is given Back In Time will read paths from standard input. .TP last\-snapshot | \-\-last\-snapshot Display last snapshot ID (if any) .TP last\-snapshot\-path | \-\-last\-snapshot\-path Display the path to the last snapshot (if any) .TP pw\-cache | \-\-pw\-cache [start|stop|restart|reload|status] Control the Password Cache Daemon. If no argument is given the Password Cache will start in foreground. .TP remove[\-and\-do\-not\-ask\-again] | \-\-remove[\-and\-do\-not\-ask\-again] [SNAPSHOT_ID] Remove the snapshot. If SNAPSHOT_ID is missing it will be prompted. SNAPSHOT_ID can be an index (starting with 0 for the last snapshot) or the exact SnapshotID (19 characters like '20130606-230501-984'). \fIremove\-and\-do\-not\-ask\-again\fR will remove the snapshot immediately. Be careful with this! .TP restore | \-\-restore [WHAT [WHERE [SNAPSHOT_ID]]] Restore file WHAT to path WHERE from snapshot SNAPSHOT_ID. If arguments are missing they will be prompted. To restore to the original path WHERE can be an empty string '' or just press Enter at the prompt. SNAPSHOT_ID can be an index (starting with 0 for the last snapshot) or the exact SnapshotID (19 characters like '20130606-230501-984') .TP shutdown Shutdown the computer after the snapshot is done. .TP smart\-remove Remove snapshots based on the configured Smart-Remove pattern. .TP snapshots\-list | \-\-snapshots\-list Display the list of snapshot IDs (if any) .TP snapshots\-list\-path | \-\-snapshots\-list\-path Display the paths to snapshots (if any) .TP snapshots\-path | \-\-snapshots\-path Display path where is saves the snapshots (if configured) .TP unmount | \-\-unmount Unmount the profile. .SH SEE ALSO backintime, backintime-config. .PP Back In Time also has a website: https://github.com/bit-team/backintime .SH AUTHOR This manual page was written by BIT Team(). backintime-1.2.1/qt/messagebox.py0000644000175000017500000000652513530533316016302 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import gettext from PyQt5.QtCore import QTimer, Qt from PyQt5.QtWidgets import QApplication, QMessageBox, QInputDialog, QLineEdit,\ QDialog, QVBoxLayout, QLabel, QDialogButtonBox, QScrollArea import qttools _ = gettext.gettext def askPasswordDialog(parent, title, prompt, timeout = None): if parent is None: app = qttools.createQApplication() translator = qttools.translator() app.installTranslator(translator) import icon dialog = QInputDialog() timer = QTimer() if not timeout is None: timer.timeout.connect(dialog.reject) timer.setInterval(timeout * 1000) timer.start() dialog.setWindowIcon(icon.BIT_LOGO) dialog.setWindowTitle(title) dialog.setLabelText(prompt) dialog.setTextEchoMode(QLineEdit.Password) QApplication.processEvents() ret = dialog.exec_() timer.stop() if ret: password = dialog.textValue() else: password = '' del(dialog) return(password) def critical(parent, msg): return QMessageBox.critical(parent, _('Error'), msg, buttons = QMessageBox.Ok, defaultButton = QMessageBox.Ok) def warningYesNo(parent, msg): return QMessageBox.question(parent, _('Question'), msg, buttons = QMessageBox.Yes | QMessageBox.No, defaultButton = QMessageBox.No) def warningYesNoOptions(parent, msg, options = ()): dlg = QDialog(parent) dlg.setWindowTitle(_('Question')) layout = QVBoxLayout() dlg.setLayout(layout) label = QLabel(msg) layout.addWidget(label) for opt in options: layout.addWidget(opt['widget']) buttonBox = QDialogButtonBox(QDialogButtonBox.Yes | QDialogButtonBox.No) buttonBox.button(QDialogButtonBox.No).setDefault(True) layout.addWidget(buttonBox) buttonBox.accepted.connect(dlg.accept) buttonBox.rejected.connect(dlg.reject) ret = dlg.exec_() return (ret, {opt['id']:opt['retFunc']() for opt in options if opt['retFunc'] is not None}) def showInfo(parent, title, msg): dlg = QDialog(parent) dlg.setWindowTitle(title) vlayout = QVBoxLayout(dlg) label = QLabel(msg) label.setTextInteractionFlags(Qt.LinksAccessibleByMouse) label.setOpenExternalLinks(True) scroll_area = QScrollArea() scroll_area.setWidget(label) buttonBox = QDialogButtonBox(QDialogButtonBox.Ok) buttonBox.accepted.connect(dlg.accept) vlayout.addWidget(scroll_area) vlayout.addWidget(buttonBox) return dlg.exec_() backintime-1.2.1/qt/backintime-qt-root.desktop0000644000175000017500000000071613530533316020673 0ustar germargermar[Desktop Entry] Name=Back In Time (root) GenericName=Backup Exec=/usr/bin/backintime-qt_polkit %f Icon=document-save Terminal=false X-MultipleArgs=false Type=Application StartupNotify=true Categories=Qt;System; Comment=Simple backup system Comment[de]=Ein simples Backup-Programm inspiriert von »Time Machine«, »TimeVault« und dem »flyback project«. Comment[sl]=Enostaven sistem ustvarjanja varnostnih kopij Keywords=automatic;snapshot;restore;rsync;root; backintime-1.2.1/qt/plugins/0000755000175000017500000000000013530533316015244 5ustar germargermarbackintime-1.2.1/qt/plugins/notifyplugin.py0000644000175000017500000000357313530533316020355 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import pluginmanager import subprocess class NotifyPlugin(pluginmanager.Plugin): def __init__(self): self.user = '' try: self.user = os.getlogin() except: pass if not self.user: try: user = os.environ['USER'] except: pass if not self.user: try: user = os.environ['LOGNAME'] except: pass def isGui(self): return True def message(self, profile_id, profile_name, level, message, timeout): if 1 == level: cmd = ['notify-send'] if timeout > 0: cmd.extend(['-t', str(1000 * timeout)]) title = "Back In Time (%s) : %s" % (self.user, profile_name) message = message.replace("\n", ' ') message = message.replace("\r", '') cmd.append(title) cmd.append(message) print(' '.join(cmd)) subprocess.Popen(cmd).communicate() return backintime-1.2.1/qt/plugins/qt4plugin.py0000644000175000017500000000344213530533316017550 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys import os import pluginmanager import tools import logger import time import gettext import _thread import subprocess _=gettext.gettext if not os.getenv('DISPLAY', ''): os.putenv('DISPLAY', ':0.0') class QtPlugin(pluginmanager.Plugin): def __init__(self): self.process = None self.snapshots = None def init(self, snapshots): self.snapshots = snapshots if not tools.checkXServer(): return False return True def isGui(self): return True def processBegin(self): try: path = os.path.join(tools.backintimePath('qt'), 'qtsystrayicon.py') self.process = subprocess.Popen([sys.executable, path, self.snapshots.config.currentProfile()]) except: pass def processEnd(self): if not self.process is None: try: #self.process.terminate() return except: pass backintime-1.2.1/qt/backintime-qt.desktop0000644000175000017500000000067113530533316017712 0ustar germargermar[Desktop Entry] Name=Back In Time GenericName=Backup Exec=backintime-qt Icon=document-save Terminal=false X-MultipleArgs=false Type=Application StartupNotify=true Categories=Qt;KDE;GNOME;System; Comment=Simple backup system Comment[sl]=Enostaven sistem ustvarjanja varnostnih kopij Comment[de]=Ein simples Backup-Programm inspiriert von »Time Machine«, »TimeVault« und dem »flyback project«. Keywords=automatic;snapshot;restore;rsync; backintime-1.2.1/qt/qtsystrayicon.py0000644000175000017500000002014113530533316017067 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys import os import gettext import subprocess import signal _=gettext.gettext if not os.getenv('DISPLAY', ''): os.putenv('DISPLAY', ':0.0') import qttools qttools.registerBackintimePath('common') import tools import logger import snapshots import progress import logviewdialog import encfstools from PyQt5.QtCore import QObject, QTimer from PyQt5.QtWidgets import QSystemTrayIcon, QMenu, QProgressBar, QWidget from PyQt5.QtGui import QIcon, QRegion class QtSysTrayIcon: def __init__(self): self.snapshots = snapshots.Snapshots() self.config = self.snapshots.config self.decode = None if len(sys.argv) > 1: if not self.config.setCurrentProfile(sys.argv[1]): logger.warning("Failed to change Profile_ID %s" %sys.argv[1], self) self.qapp = qttools.createQApplication(self.config.APP_NAME) translator = qttools.translator() self.qapp.installTranslator(translator) self.qapp.setQuitOnLastWindowClosed(False) import icon self.icon = icon self.qapp.setWindowIcon(icon.BIT_LOGO) self.status_icon = QSystemTrayIcon(icon.BIT_LOGO) #self.status_icon.actionCollection().clear() self.contextMenu = QMenu() self.menuProfileName = self.contextMenu.addAction(_('Profile: "%s"') % self.config.profileName()) qttools.setFontBold(self.menuProfileName) self.contextMenu.addSeparator() self.menuStatusMessage = self.contextMenu.addAction(_('Done')) self.menuProgress = self.contextMenu.addAction('') self.menuProgress.setVisible(False) self.contextMenu.addSeparator() self.btnPause = self.contextMenu.addAction(icon.PAUSE, _('Pause snapshot process')) action = lambda: os.kill(self.snapshots.pid(), signal.SIGSTOP) self.btnPause.triggered.connect(action) self.btnResume = self.contextMenu.addAction(icon.RESUME, _('Resume snapshot process')) action = lambda: os.kill(self.snapshots.pid(), signal.SIGCONT) self.btnResume.triggered.connect(action) self.btnResume.setVisible(False) self.btnStop = self.contextMenu.addAction(icon.STOP, _('Stop snapshot process')) self.btnStop.triggered.connect(self.onBtnStop) self.contextMenu.addSeparator() self.btnDecode = self.contextMenu.addAction(icon.VIEW_SNAPSHOT_LOG, _('decode paths')) self.btnDecode.setCheckable(True) self.btnDecode.setVisible(self.config.snapshotsMode() == 'ssh_encfs') self.btnDecode.toggled.connect(self.onBtnDecode) self.openLog = self.contextMenu.addAction(icon.VIEW_LAST_LOG, _('View Last Log')) self.openLog.triggered.connect(self.onOpenLog) self.startBIT = self.contextMenu.addAction(icon.BIT_LOGO, _('Start BackInTime')) self.startBIT.triggered.connect(self.onStartBIT) self.status_icon.setContextMenu(self.contextMenu) self.pixmap = icon.BIT_LOGO.pixmap(24) self.progressBar = QProgressBar() self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) self.progressBar.setValue(0) self.progressBar.setTextVisible(False) self.progressBar.resize(24, 6) self.progressBar.render(self.pixmap, sourceRegion = QRegion(0, -14, 24, 6), flags = QWidget.RenderFlags(QWidget.DrawChildren)) self.first_error = self.config.notify() self.popup = None self.last_message = None self.timer = QTimer() self.timer.timeout.connect(self.updateInfo) def prepairExit(self): self.timer.stop() if not self.status_icon is None: self.status_icon.hide() self.status_icon = None if not self.popup is None: self.popup.deleteLater() self.popup = None self.qapp.processEvents() def run(self): if not self.snapshots.busy(): sys.exit() self.status_icon.show() self.timer.start(500) logger.debug("begin loop", self) self.qapp.exec_() logger.debug("end loop", self) self.prepairExit() def updateInfo(self): if not self.snapshots.busy(): self.prepairExit() self.qapp.exit(0) return paused = tools.processPaused(self.snapshots.pid()) self.btnPause.setVisible(not paused) self.btnResume.setVisible(paused) message = self.snapshots.takeSnapshotMessage() if message is None and self.last_message is None: message = (0, _('Working...')) if not message is None: if message != self.last_message: self.last_message = message if self.decode: message = (message[0], self.decode.log(message[1])) self.menuStatusMessage.setText('\n'.join(tools.wrapLine(message[1],\ size = 80,\ delimiters = '',\ new_line_indicator = '') \ )) self.status_icon.setToolTip(message[1]) pg = progress.ProgressFile(self.config) if pg.fileReadable(): pg.load() percent = pg.intValue('percent') ## disable progressbar in icon until BiT has it's own icon ## fixes bug #902 # if percent != self.progressBar.value(): # self.progressBar.setValue(percent) # self.progressBar.render(self.pixmap, sourceRegion = QRegion(0, -14, 24, 6), flags = QWidget.RenderFlags(QWidget.DrawChildren)) # self.status_icon.setIcon(QIcon(self.pixmap)) self.menuProgress.setText(' | '.join(self.getMenuProgress(pg))) self.menuProgress.setVisible(True) else: # self.status_icon.setIcon(self.icon.BIT_LOGO) self.menuProgress.setVisible(False) def getMenuProgress(self, pg): d = (('sent', _('Sent:')), \ ('speed', _('Speed:')),\ ('eta', _('ETA:'))) for key, txt in d: value = pg.strValue(key, '') if not value: continue yield txt + ' ' + value def onStartBIT(self): profileID = self.config.currentProfile() cmd = ['backintime-qt',] if not profileID == '1': cmd += ['--profile-id', profileID] proc = subprocess.Popen(cmd) def onOpenLog(self): dlg = logviewdialog.LogViewDialog(self, systray = True) dlg.decode = self.decode dlg.cbDecode.setChecked(self.btnDecode.isChecked()) dlg.exec_() def onBtnDecode(self, checked): if checked: self.decode = encfstools.Decode(self.config) self.last_message = None self.updateInfo() else: self.decode = None def onBtnStop(self): os.kill(self.snapshots.pid(), signal.SIGKILL) self.btnStop.setEnabled(False) self.btnPause.setEnabled(False) self.btnResume.setEnabled(False) self.snapshots.setTakeSnapshotMessage(0, 'Snapshot terminated') if __name__ == '__main__': QtSysTrayIcon().run() backintime-1.2.1/qt/net.launchpad.backintime.serviceHelper.service0000644000175000017500000000021213530533316024570 0ustar germargermar[D-BUS Service] Name=net.launchpad.backintime.serviceHelper Exec=/usr/bin/python3 -Es /usr/share/backintime/qt/serviceHelper.py User=root backintime-1.2.1/qt/docbook/0000755000175000017500000000000013530533316015203 5ustar germargermarbackintime-1.2.1/qt/docbook/en/0000755000175000017500000000000013530533316015605 5ustar germargermarbackintime-1.2.1/qt/docbook/en/legal.xml0000644000175000017500000000712713530533316017422 0ustar germargermar Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. backintime-1.2.1/qt/docbook/en/index.docbook0000644000175000017500000001356513530533316020270 0ustar germargermar &appname;"> ]>
&app; Manual &app; is a simple backup tool for KDE4 desktop. 2008-2009 Oprea Dan, Bart de Koning, Richard Bailey This manual describes version &appversion; of Back In Time. Feedback To report a bug or make a suggestion regarding the &app; application or this manual, send an email to: bit-team@lists.launchpad.net. Introduction &app; is a simple backup tool for Linux (this is KDE4 version). The backup is done by taking snapshots of a specified set of folders. All you have to do is: configure where to save snapshots cofigure what folders to backup schedule automatic backup: disabled, every 5 minutes, every 10 minutes, every hour, every day, every week, every month &app; acts as a "user mode" backup tool. This means that you can backup/restore only folders you have write access to (actually you can backup read-only folders, but you can't restore them). If you want to run it as root you need to use "sudo -i backintime" (command line) or "backintime-qt_polkit" (GUI). A new snapshot is created only if something changed since the last snapshot (if any). A snapshot contains all the files from the selected folders (except for exclude patterns). In order to reduce disk space it use hard-links (if possible) between snapshots for unchanged files. This way a file of 10MiB, unchanged for 10 snapshots, will use only 10Mb on the disk. When you restore a file 'A', if it already exists on the file system it will be renamed to 'A.backup.currentdate'. This documentation is not maintained (at least for the moment), please use the man-page 'man backintime' About &app; &app; was written by Oprea Dan (dan@le-web.org), Bart de Koning (bratdaking@gmail.com), Richard Bailey (rmjb@mail.com). To find more information about &app;, please visit the Back In Time Web page. To report a bug or make a suggestion regarding this application or this manual, sent a mail to bit-team@lists.launchpad.net. This program is distributed under the terms of the GNU General Public license version 2 as published by the Free Software Foundation. A copy of this license can be found in the file LICENSE included with the source code of this program.
backintime-1.2.1/qt/backintime-qt_polkit0000755000175000017500000000034513530533316017625 0ustar germargermar#!/bin/sh if [ "x$XDG_SESSION_TYPE" = "xwayland" ]; then PREFIX="env QT_QPA_PLATFORM=wayland-egl XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR" else PREFIX="" fi pkexec --disable-internal-agent $PREFIX "/usr/bin/backintime-qt" "$@" backintime-1.2.1/qt/app.py0000644000175000017500000017650313530533316014731 0ustar germargermar# -*- coding: UTF-8 -*- # Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys if not os.getenv('DISPLAY', ''): os.putenv('DISPLAY', ':0.0') import datetime import gettext import re import subprocess import shutil import signal from contextlib import contextmanager from tempfile import TemporaryDirectory import qttools qttools.registerBackintimePath('common') import backintime import tools import logger import snapshots import guiapplicationinstance import mount import progress from exceptions import MountException from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import settingsdialog import snapshotsdialog import logviewdialog from restoredialog import RestoreDialog import messagebox _=gettext.gettext class MainWindow(QMainWindow): def __init__(self, config, appInstance, qapp): QMainWindow.__init__(self) self.config = config self.appInstance = appInstance self.qapp = qapp self.snapshots = snapshots.Snapshots(config) self.lastTakeSnapshotMessage = None self.tmpDirs = [] #main toolbar self.mainToolbar = self.addToolBar('main') self.mainToolbar.setFloatable(False) #window icon import icon self.qapp.setWindowIcon(icon.BIT_LOGO) #profiles self.firstUpdateAll = True self.disableProfileChanged = False self.comboProfiles = qttools.ProfileCombo(self) self.comboProfilesAction = self.mainToolbar.addWidget(self.comboProfiles) # take_snapshot button self.btnTakeSnapshot = self.mainToolbar.addAction(icon.TAKE_SNAPSHOT, _('Take snapshot')) self.btnTakeSnapshot.triggered.connect(self.btnTakeSnapshotClicked) takeSnapshotMenu = qttools.Menu() action = takeSnapshotMenu.addAction(icon.TAKE_SNAPSHOT, _('Take snapshot')) action.triggered.connect(self.btnTakeSnapshotClicked) self.btnTakeSnapshotChecksum = takeSnapshotMenu.addAction(icon.TAKE_SNAPSHOT, _('Take snapshot with checksums')) self.btnTakeSnapshotChecksum.setToolTip(_('Use checksum to detect changes')) self.btnTakeSnapshotChecksum.triggered.connect(self.btnTakeSnapshotChecksumClicked) self.btnTakeSnapshot.setMenu(takeSnapshotMenu) for action in takeSnapshotMenu.actions(): action.setIconVisibleInMenu(True) #pause snapshot button self.btnPauseTakeSnapshot = self.mainToolbar.addAction(icon.PAUSE, _('Pause snapshot process')) action = lambda: os.kill(self.snapshots.pid(), signal.SIGSTOP) self.btnPauseTakeSnapshot.triggered.connect(action) self.btnPauseTakeSnapshot.setVisible(False) #resume snapshot button self.btnResumeTakeSnapshot = self.mainToolbar.addAction(icon.RESUME, _('Resume snapshot process')) action = lambda: os.kill(self.snapshots.pid(), signal.SIGCONT) self.btnResumeTakeSnapshot.triggered.connect(action) self.btnResumeTakeSnapshot.setVisible(False) #stop snapshot button self.btnStopTakeSnapshot = self.mainToolbar.addAction(icon.STOP, _('Stop snapshot process')) self.btnStopTakeSnapshot.triggered.connect(self.btnStopTakeSnapshotClicked) self.btnStopTakeSnapshot.setVisible(False) # update snapshots button self.btnUpdateSnapshots = self.mainToolbar.addAction(icon.REFRESH_SNAPSHOT, _('Refresh snapshots list')) self.btnUpdateSnapshots.setShortcuts([Qt.Key_F5, QKeySequence(Qt.CTRL + Qt.Key_R)]) self.btnUpdateSnapshots.triggered.connect(self.btnUpdateSnapshotsClicked) self.btnNameSnapshot = self.mainToolbar.addAction(icon.SNAPSHOT_NAME, _('Snapshot Name')) self.btnNameSnapshot.triggered.connect(self.btnNameSnapshotClicked) self.btnRemoveSnapshot = self.mainToolbar.addAction(icon.REMOVE_SNAPSHOT, _('Remove Snapshot')) self.btnRemoveSnapshot.triggered.connect(self.btnRemoveSnapshotClicked) self.btnSnapshotLogView = self.mainToolbar.addAction(icon.VIEW_SNAPSHOT_LOG, _('View Snapshot Log')) self.btnSnapshotLogView.triggered.connect(self.btnSnapshotLogViewClicked) self.btnLastLogView = self.mainToolbar.addAction(icon.VIEW_LAST_LOG, _('View Last Log')) self.btnLastLogView.triggered.connect(self.btnLastLogViewClicked) self.mainToolbar.addSeparator() self.btnSettings = self.mainToolbar.addAction(icon.SETTINGS, _('Settings')) self.btnSettings.triggered.connect(self.btnSettingsClicked) self.mainToolbar.addSeparator() self.btnShutdown = self.mainToolbar.addAction(icon.SHUTDOWN, _('Shutdown')) self.btnShutdown.setToolTip(_('Shutdown system after snapshot has finished.')) self.btnShutdown.setCheckable(True) self.shutdown = tools.ShutDown() self.btnShutdown.setEnabled(self.shutdown.canShutdown()) self.btnShutdown.toggled.connect(self.btnShutdownToggled) self.btnQuit = self.mainToolbar.addAction(icon.EXIT, _('Exit')) self.btnQuit.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_W)) self.btnQuit.triggered.connect(self.close) empty = QWidget(self) empty.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) self.mainToolbar.addWidget(empty) menuHelp = QMenu(self) self.btnHelp = menuHelp.addAction(icon.HELP, _('Help')) self.btnHelp.triggered.connect(self.btnHelpClicked) self.btnHelpConfig = menuHelp.addAction(icon.HELP, _('Config File Help')) self.btnHelpConfig.triggered.connect(self.btnHelpConfigClicked) menuHelp.addSeparator() self.btnWebsite = menuHelp.addAction(icon.WEBSITE, _('Website')) self.btnWebsite.triggered.connect(self.btnWebsiteClicked) self.btnChangelog = menuHelp.addAction(icon.CHANGELOG, _('Changelog')) self.btnChangelog.triggered.connect(self.btnChangelogClicked) self.btnFaq = menuHelp.addAction(icon.FAQ, _('FAQ')) self.btnFaq.triggered.connect(self.btnFaqClicked) self.btnAskQuestion = menuHelp.addAction(icon.QUESTION, _('Ask a question')) self.btnAskQuestion.triggered.connect(self.btnAskQuestionClicked) self.btnReportBug = menuHelp.addAction(icon.BUG, _('Report a bug')) self.btnReportBug.triggered.connect(self.btnReportBugClicked) menuHelp.addSeparator() self.btnAbout = menuHelp.addAction(icon.ABOUT, _('About')) self.btnAbout.triggered.connect(self.btnAboutClicked) action = self.mainToolbar.addAction(icon.HELP, _('Help')) action.triggered.connect(self.btnHelpClicked) action.setMenu(menuHelp) for action in menuHelp.actions(): action.setIconVisibleInMenu(True) #main splitter self.mainSplitter = QSplitter(self) self.mainSplitter.setOrientation(Qt.Horizontal) #timeline self.timeLine = qttools.TimeLine(self) self.mainSplitter.addWidget(self.timeLine) self.timeLine.updateFilesView.connect(self.updateFilesView) #right widget self.filesWidget = QGroupBox(self) self.mainSplitter.addWidget(self.filesWidget) filesLayout = QVBoxLayout(self.filesWidget) left, top, right, bottom = filesLayout.getContentsMargins() filesLayout.setContentsMargins(0, 0, right, 0) #files toolbar self.filesViewToolbar = QToolBar(self) self.filesViewToolbar.setFloatable(False) self.btnFolderUp = self.filesViewToolbar.addAction(icon.UP, _('Up')) self.btnFolderUp.setShortcuts([QKeySequence(Qt.ALT + Qt.Key_Up), Qt.Key_Backspace]) self.btnFolderUp.triggered.connect(self.btnFolderUpClicked) self.editCurrentPath = QLineEdit(self) self.editCurrentPath.setReadOnly(True) self.filesViewToolbar.addWidget(self.editCurrentPath) #show hidden files self.showHiddenFiles = self.config.boolValue('qt.show_hidden_files', False) self.btnShowHiddenFiles = self.filesViewToolbar.addAction(icon.SHOW_HIDDEN, _('Show hidden files')) self.btnShowHiddenFiles.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_H)) self.btnShowHiddenFiles.setCheckable(True) self.btnShowHiddenFiles.setChecked(self.showHiddenFiles) self.btnShowHiddenFiles.toggled.connect(self.btnShowHiddenFilesToggled) self.filesViewToolbar.addSeparator() #restore menu self.menuRestore = qttools.Menu(self) self.btnRestore = self.menuRestore.addAction(icon.RESTORE, _('Restore')) self.btnRestore.setToolTip(_('Restore the selected files or folders ' 'to the original destination.')) self.btnRestore.triggered.connect(self.restoreThis) self.btnRestoreTo = self.menuRestore.addAction(icon.RESTORE_TO, _('Restore to ...')) self.btnRestoreTo.setToolTip(_('Restore the selected files or ' 'folders to a new destination.')) self.btnRestoreTo.triggered.connect(self.restoreThisTo) self.menuRestore.addSeparator() self.btnRestoreParent = self.menuRestore.addAction(icon.RESTORE, '') self.btnRestoreParent.setToolTip(_('Restore the currently shown ' 'folder and all its content to ' 'the original destination.')) self.btnRestoreParent.triggered.connect(self.restoreParent) self.btnRestoreParentTo = self.menuRestore.addAction(icon.RESTORE_TO, '') self.btnRestoreParentTo.setToolTip(_('Restore the currently shown ' 'folder and all its content ' 'to a new destination.')) self.btnRestoreParentTo.triggered.connect(self.restoreParentTo) self.menuRestore.addSeparator() for action in self.menuRestore.actions(): action.setIconVisibleInMenu(True) self.btnRestoreMenu = self.filesViewToolbar.addAction(icon.RESTORE, _('Restore')) self.btnRestoreMenu.setMenu(self.menuRestore) self.btnRestoreMenu.setToolTip(_('Restore selected file or folder.\n' 'If this button is grayed out this is most likely ' 'because "%(now)s" is selected in left hand snapshots list.') % {'now': _('Now')}) self.btnRestoreMenu.triggered.connect(self.restoreThis) self.btnSnapshots = self.filesViewToolbar.addAction(icon.SNAPSHOTS, _('Snapshots')) self.btnSnapshots.triggered.connect(self.btnSnapshotsClicked) filesLayout.addWidget(self.filesViewToolbar) #menubar self.menuSnapshot = self.menuBar().addMenu(_('Snapshot')) self.menuSnapshot.addAction(self.btnTakeSnapshot) self.menuSnapshot.addAction(self.btnUpdateSnapshots) self.menuSnapshot.addAction(self.btnNameSnapshot) self.menuSnapshot.addAction(self.btnRemoveSnapshot) self.menuSnapshot.addSeparator() self.menuSnapshot.addAction(self.btnSettings) self.menuSnapshot.addSeparator() self.menuSnapshot.addAction(self.btnShutdown) self.menuSnapshot.addAction(self.btnQuit) self.menuView = self.menuBar().addMenu(_('View')) self.menuView.addAction(self.btnFolderUp) self.menuView.addAction(self.btnShowHiddenFiles) self.menuView.addSeparator() self.menuView.addAction(self.btnSnapshotLogView) self.menuView.addAction(self.btnLastLogView) self.menuView.addSeparator() self.menuView.addAction(self.btnSnapshots) self.menuRestore = self.menuBar().addMenu(_('Restore')) self.menuRestore.addAction(self.btnRestore) self.menuRestore.addAction(self.btnRestoreTo) self.menuRestore.addSeparator() self.menuRestore.addAction(self.btnRestoreParent) self.menuRestore.addAction(self.btnRestoreParentTo) self.menuHelp = self.menuBar().addMenu(_('Help')) self.menuHelp.addAction(self.btnHelp) self.menuHelp.addAction(self.btnHelpConfig) self.menuHelp.addSeparator() self.menuHelp.addAction(self.btnWebsite) self.menuHelp.addAction(self.btnChangelog) self.menuHelp.addAction(self.btnFaq) self.menuHelp.addAction(self.btnAskQuestion) self.menuHelp.addAction(self.btnReportBug) self.menuHelp.addSeparator() self.menuHelp.addAction(self.btnAbout) #shortcuts without buttons self.shortcutPreviousFolder = QShortcut(QKeySequence(Qt.ALT + Qt.Key_Left), self) self.shortcutPreviousFolder.activated.connect(self.btnFolderHistoryPreviousClicked) self.shortcutNextFolder = QShortcut(QKeySequence(Qt.ALT + Qt.Key_Right), self) self.shortcutNextFolder.activated.connect(self.btnFolderHistoryNextClicked) self.shortcutOpenFolder = QShortcut(QKeySequence(Qt.ALT + Qt.Key_Down), self) self.shortcutOpenFolder.activated.connect(self.btnOpenCurrentItemClicked) #mouse button navigation self.mouseButtonEventFilter = ExtraMouseButtonEventFilter(self) self.setMouseButtonNavigation() #second spliter self.secondSplitter = QSplitter(self) self.secondSplitter.setOrientation(Qt.Horizontal) self.secondSplitter.setContentsMargins(0, 0, 0, 0) filesLayout.addWidget(self.secondSplitter) #places self.places = QTreeWidget(self) self.places.setRootIsDecorated(False) self.places.setEditTriggers(QAbstractItemView.NoEditTriggers) self.places.setHeaderLabel(_('Shortcuts')) self.places.header().setSectionsClickable(True) self.places.header().setSortIndicatorShown(True) self.places.header().setSectionHidden(1, True) self.places.header().setSortIndicator(int(self.config.profileIntValue('qt.places.SortColumn', 1)), int(self.config.profileIntValue('qt.places.SortOrder', Qt.AscendingOrder))) self.placesSortLoop = {self.config.currentProfile(): False} self.secondSplitter.addWidget(self.places) self.places.header().sortIndicatorChanged.connect(self.sortPlaces) #files view stacked layout widget = QWidget(self) self.stackFilesView = QStackedLayout(widget) self.secondSplitter.addWidget(widget) #folder don't exist label self.lblFolderDontExists = QLabel(_('This folder doesn\'t exist\nin the current selected snapshot!'), self) qttools.setFontBold(self.lblFolderDontExists) self.lblFolderDontExists.setFrameShadow(QFrame.Sunken) self.lblFolderDontExists.setFrameShape(QFrame.Panel) self.lblFolderDontExists.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.stackFilesView.addWidget(self.lblFolderDontExists) #list files view self.filesView = QTreeView(self) self.stackFilesView.addWidget(self.filesView) self.filesView.setRootIsDecorated(False) self.filesView.setAlternatingRowColors(True) self.filesView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.filesView.setItemsExpandable(False) self.filesView.setDragEnabled(False) self.filesView.setSelectionMode(QAbstractItemView.ExtendedSelection) self.filesView.header().setSectionsClickable(True) self.filesView.header().setSectionsMovable(False) self.filesView.header().setSortIndicatorShown(True) self.filesViewModel = QFileSystemModel(self) self.filesViewModel.setRootPath(QDir().rootPath()) self.filesViewModel.setReadOnly(True) self.filesViewModel.setFilter(QDir.AllDirs | QDir.AllEntries | QDir.NoDotAndDotDot | QDir.Hidden) self.filesViewProxyModel = QSortFilterProxyModel(self) self.filesViewProxyModel.setDynamicSortFilter(True) self.filesViewProxyModel.setSourceModel(self.filesViewModel) self.filesView.setModel(self.filesViewProxyModel) self.filesViewDelegate = QStyledItemDelegate(self) self.filesView.setItemDelegate(self.filesViewDelegate) sortColumn = self.config.intValue('qt.main_window.files_view.sort.column', 0) sortOrder = self.config.boolValue('qt.main_window.files_view.sort.ascending', True) if sortOrder: sortOrder = Qt.AscendingOrder else: sortOrder = Qt.DescendingOrder self.filesView.header().setSortIndicator(sortColumn, sortOrder) self.filesViewModel.sort(self.filesView.header().sortIndicatorSection(), self.filesView.header().sortIndicatorOrder()) self.filesView.header().sortIndicatorChanged.connect(self.filesViewModel.sort) self.stackFilesView.setCurrentWidget(self.filesView) # self.setCentralWidget(self.mainSplitter) #context menu self.filesView.setContextMenuPolicy(Qt.CustomContextMenu) self.filesView.customContextMenuRequested.connect(self.contextMenuClicked) self.contextMenu = QMenu(self) self.contextMenu.addAction(self.btnRestore) self.contextMenu.addAction(self.btnRestoreTo) self.contextMenu.addAction(self.btnSnapshots) self.contextMenu.addSeparator() self.btnAddInclude = self.contextMenu.addAction(icon.ADD, _('Add to Include')) self.btnAddExclude = self.contextMenu.addAction(icon.ADD, _('Add to Exclude')) self.btnAddInclude.triggered.connect(self.btnAddIncludeClicked) self.btnAddExclude.triggered.connect(self.btnAddExcludeClicked) self.contextMenu.addSeparator() self.contextMenu.addAction(self.btnShowHiddenFiles) #ProgressBar layoutWidget = QWidget() layout = QVBoxLayout(layoutWidget) layout.setContentsMargins(0, 0, 0, 0) layoutWidget.setContentsMargins(0, 0, 0, 0) layoutWidget.setLayout(layout) self.progressBar = QProgressBar(self) self.progressBar.setMinimum(0) self.progressBar.setMaximum(100) self.progressBar.setValue(0) self.progressBar.setTextVisible(False) self.progressBar.setContentsMargins(0, 0, 0, 0) self.progressBar.setFixedHeight(5) self.progressBar.setVisible(False) self.progressBarDummy = QWidget() self.progressBarDummy.setContentsMargins(0, 0, 0, 0) self.progressBarDummy.setFixedHeight(5) self.status = QLabel(self) self.status.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.status) layout.addWidget(self.progressBar) layout.addWidget(self.progressBarDummy) self.statusBar().addWidget(layoutWidget, 100) self.status.setText(_('Done')) self.snapshotsList = [] self.sid = snapshots.RootSnapshot(self.config) self.path = self.config.profileStrValue('qt.last_path', self.config.strValue('qt.last_path', '/')) self.editCurrentPath.setText(self.path) self.path_history = tools.PathHistory(self.path) #restore size and position x = self.config.intValue('qt.main_window.x', -1) y = self.config.intValue('qt.main_window.y', -1) if x >= 0 and y >= 0: self.move(x, y) w = self.config.intValue('qt.main_window.width', 800) h = self.config.intValue('qt.main_window.height', 500) self.resize(w, h) mainSplitterLeftWidth = self.config.intValue('qt.main_window.main_splitter_left_w', 150) mainSplitterRightWidth = self.config.intValue('qt.main_window.main_splitter_right_w', 450) sizes = [mainSplitterLeftWidth, mainSplitterRightWidth] self.mainSplitter.setSizes(sizes) secondSplitterLeftWidth = self.config.intValue('qt.main_window.second_splitter_left_w', 150) secondSplitterRightWidth = self.config.intValue('qt.main_window.second_splitter_right_w', 300) sizes = [secondSplitterLeftWidth, secondSplitterRightWidth] self.secondSplitter.setSizes(sizes) filesViewColumnNameWidth = self.config.intValue('qt.main_window.files_view.name_width', -1) filesViewColumnSizeWidth = self.config.intValue('qt.main_window.files_view.size_width', -1) filesViewColumnDateWidth = self.config.intValue('qt.main_window.files_view.date_width', -1) if filesViewColumnNameWidth > 0 and filesViewColumnSizeWidth > 0 and filesViewColumnDateWidth > 0: self.filesView.header().resizeSection(0, filesViewColumnNameWidth) self.filesView.header().resizeSection(1, filesViewColumnSizeWidth) self.filesView.header().resizeSection(2, filesViewColumnDateWidth) #force settingdialog if it is not configured if not config.isConfigured(): message = _('%(appName)s is not configured. Would you like ' 'to restore a previous configuration?' % {'appName': self.config.APP_NAME}) if QMessageBox.Yes == messagebox.warningYesNo(self, message): settingsdialog.RestoreConfigDialog(self).exec_() settingsdialog.SettingsDialog(self).exec_() if not config.isConfigured(): return profile_id = config.currentProfile() #mount try: mnt = mount.Mount(cfg = self.config, profile_id = profile_id, parent = self) hash_id = mnt.mount() except MountException as ex: messagebox.critical(self, str(ex)) else: self.config.setCurrentHashId(hash_id) if not config.canBackup(profile_id): messagebox.critical(self, _('Can\'t find snapshots folder.\nIf it is on a removable drive please plug it and then press OK')) self.filesViewProxyModel.layoutChanged.connect(self.dirListerCompleted) #populate lists self.updateProfiles() self.comboProfiles.currentIndexChanged.connect(self.comboProfileChanged) self.filesView.setFocus() self.updateSnapshotActions() #signals self.timeLine.itemSelectionChanged.connect(self.timeLineChanged) self.places.currentItemChanged.connect(self.placesChanged) self.filesView.activated.connect(self.filesViewItemActivated) self.forceWaitLockCounter = 0 self.timerRaiseApplication = QTimer(self) self.timerRaiseApplication.setInterval(1000) self.timerRaiseApplication.setSingleShot(False) self.timerRaiseApplication.timeout.connect(self.raiseApplication) self.timerRaiseApplication.start() self.timerUpdateTakeSnapshot = QTimer(self) self.timerUpdateTakeSnapshot.setInterval(1000) self.timerUpdateTakeSnapshot.setSingleShot(False) self.timerUpdateTakeSnapshot.timeout.connect(self.updateTakeSnapshot) self.timerUpdateTakeSnapshot.start() SetupCron(self).start() def closeEvent(self, event): if self.shutdown.askBeforeQuit(): if QMessageBox.Yes != messagebox.warningYesNo(self, _('If you close this window Back In Time will not be able to shutdown your system when the snapshot has finished.\nDo you really want to close?')): return event.ignore() self.config.setStrValue('qt.last_path', self.path) self.config.setProfileStrValue('qt.last_path', self.path) self.config.setProfileIntValue('qt.places.SortColumn', self.places.header().sortIndicatorSection()) self.config.setProfileIntValue('qt.places.SortOrder', self.places.header().sortIndicatorOrder()) self.config.setIntValue('qt.main_window.x', self.x()) self.config.setIntValue('qt.main_window.y', self.y()) self.config.setIntValue('qt.main_window.width', self.width()) self.config.setIntValue('qt.main_window.height', self.height()) sizes = self.mainSplitter.sizes() self.config.setIntValue('qt.main_window.main_splitter_left_w', sizes[0]) self.config.setIntValue('qt.main_window.main_splitter_right_w', sizes[1]) sizes = self.secondSplitter.sizes() self.config.setIntValue('qt.main_window.second_splitter_left_w', sizes[0]) self.config.setIntValue('qt.main_window.second_splitter_right_w', sizes[1]) self.config.setIntValue('qt.main_window.files_view.name_width', self.filesView.header().sectionSize(0)) self.config.setIntValue('qt.main_window.files_view.size_width', self.filesView.header().sectionSize(1)) self.config.setIntValue('qt.main_window.files_view.date_width', self.filesView.header().sectionSize(2)) self.config.setBoolValue('qt.show_hidden_files', self.showHiddenFiles) self.config.setIntValue('qt.main_window.files_view.sort.column', self.filesView.header().sortIndicatorSection()) self.config.setBoolValue('qt.main_window.files_view.sort.ascending', self.filesView.header().sortIndicatorOrder() == Qt.AscendingOrder) self.filesViewModel.deleteLater() #umount try: mnt = mount.Mount(cfg = self.config, parent = self) mnt.umount(self.config.current_hash_id) except MountException as ex: messagebox.critical(self, str(ex)) self.config.save() # cleanup temporary local copies of files which were opened in GUI for d in self.tmpDirs: d.cleanup() event.accept() def updateProfiles(self): if self.disableProfileChanged: return self.disableProfileChanged = True self.comboProfiles.clear() profiles = self.config.profilesSortedByName() for profile_id in profiles: self.comboProfiles.addProfileID(profile_id) if profile_id == self.config.currentProfile(): self.comboProfiles.setCurrentProfileID(profile_id) self.comboProfilesAction.setVisible(len(profiles) > 1) self.updateProfile() self.disableProfileChanged = False def updateProfile(self): self.updateTimeLine() self.updatePlaces() self.updateFilesView(0) def comboProfileChanged(self, index): if self.disableProfileChanged: return profile_id = self.comboProfiles.currentProfileID() if not profile_id: return old_profile_id = self.config.currentProfile() if profile_id != old_profile_id: self.remount(profile_id, old_profile_id) self.config.setCurrentProfile(profile_id) self.config.setProfileIntValue('qt.places.SortColumn', self.places.header().sortIndicatorSection(), old_profile_id) self.config.setProfileIntValue('qt.places.SortOrder', self.places.header().sortIndicatorOrder(), old_profile_id) self.placesSortLoop[old_profile_id] = False self.places.header().setSortIndicator(int(self.config.profileIntValue('qt.places.SortColumn', 1, profile_id)), int(self.config.profileIntValue('qt.places.SortOrder', Qt.AscendingOrder, profile_id))) self.config.setProfileStrValue('qt.last_path', self.path, old_profile_id) path = self.config.profileStrValue('qt.last_path', self.path, profile_id) if not path == self.path: self.path = path self.path_history.reset(self.path) self.editCurrentPath.setText(self.path) self.updateProfile() def remount(self, new_profile_id, old_profile_id): try: mnt = mount.Mount(cfg = self.config, profile_id = old_profile_id, parent = self) hash_id = mnt.remount(new_profile_id) except MountException as ex: messagebox.critical(self, str(ex)) else: self.config.setCurrentHashId(hash_id) def raiseApplication(self): raiseCmd = self.appInstance.raiseCommand() if raiseCmd is None: return logger.debug("Raise cmd: %s" %raiseCmd, self) self.qapp.alert(self) def updateTakeSnapshot(self, force_wait_lock = False): if force_wait_lock: self.forceWaitLockCounter = 10 busy = self.snapshots.busy() if busy: self.forceWaitLockCounter = 0 paused = tools.processPaused(self.snapshots.pid()) else: paused = False if self.forceWaitLockCounter > 0: self.forceWaitLockCounter = self.forceWaitLockCounter - 1 fake_busy = busy or self.forceWaitLockCounter > 0 message = _('Working:') takeSnapshotMessage = self.snapshots.takeSnapshotMessage() if fake_busy: if takeSnapshotMessage is None: takeSnapshotMessage = (0, '...') elif takeSnapshotMessage is None: takeSnapshotMessage = self.lastTakeSnapshotMessage if takeSnapshotMessage is None: takeSnapshotMessage = (0, _('Done')) force_update = False if fake_busy: if self.btnTakeSnapshot.isEnabled(): self.btnTakeSnapshot.setEnabled(False) if not self.btnStopTakeSnapshot.isVisible(): for btn in (self.btnPauseTakeSnapshot, self.btnResumeTakeSnapshot, self.btnStopTakeSnapshot): btn.setEnabled(True) self.btnTakeSnapshot.setVisible(False) self.btnPauseTakeSnapshot.setVisible(not paused) self.btnResumeTakeSnapshot.setVisible(paused) self.btnStopTakeSnapshot.setVisible(True) elif not self.btnTakeSnapshot.isEnabled(): force_update = True self.btnTakeSnapshot.setEnabled(True) self.btnTakeSnapshot.setVisible(True) for btn in (self.btnPauseTakeSnapshot, self.btnResumeTakeSnapshot, self.btnStopTakeSnapshot): btn.setVisible(False) #TODO: check if there is a more elegant way than always get a new snapshot list which is very expensive (time) snapshotsList = snapshots.listSnapshots(self.config) if snapshotsList != self.snapshotsList: self.snapshotsList = snapshotsList self.updateTimeLine(False) takeSnapshotMessage = (0, _('Done')) else: if takeSnapshotMessage[0] == 0: takeSnapshotMessage = (0, _('Done, no backup needed')) self.shutdown.shutdown() if takeSnapshotMessage != self.lastTakeSnapshotMessage or force_update: self.lastTakeSnapshotMessage = takeSnapshotMessage if fake_busy: message = _('Working:') + ' ' + self.lastTakeSnapshotMessage[1].replace('\n', ' ') elif takeSnapshotMessage[0] == 0: message = self.lastTakeSnapshotMessage[1].replace('\n', ' ') else: message = _('Error:') + ' ' + self.lastTakeSnapshotMessage[1].replace('\n', ' ') self.status.setText(message) pg = progress.ProgressFile(self.config) if pg.fileReadable(): self.progressBar.setVisible(True) self.progressBarDummy.setVisible(False) pg.load() self.progressBar.setValue(pg.intValue('percent')) message = ' | '.join(self.getProgressBarFormat(pg, message)) self.status.setText(message) else: self.progressBar.setVisible(False) self.progressBarDummy.setVisible(True) #if not fake_busy: # self.lastTakeSnapshotMessage = None def getProgressBarFormat(self, pg, message): d = (('sent', _('Sent:')), \ ('speed', _('Speed:')),\ ('eta', _('ETA:'))) yield '{}%'.format(pg.intValue('percent')) for key, txt in d: value = pg.strValue(key, '') if not value: continue yield txt + ' ' + value yield message def placesChanged(self, item, previous): if item is None: return path = str(item.data(0, Qt.UserRole)) if not path: return if path == self.path: return self.path = path self.path_history.append(path) self.updateFilesView(3) def addPlace(self, name, path, icon): item = QTreeWidgetItem() item.setText(0, name) if icon: item.setIcon(0, QIcon.fromTheme(icon)) item.setData(0, Qt.UserRole, path) if not path: item.setFont(0, qttools.fontBold(item.font(0))) item.setFlags(Qt.ItemIsEnabled) item.setBackground(0, QColor(196, 196, 196)) item.setForeground(0, QColor(60, 60, 60)) self.places.addTopLevelItem(item) if path == self.path: self.places.setCurrentItem(item) return item def updatePlaces(self): self.places.clear() self.addPlace(_('Global'), '', '') self.addPlace(_('Root'), '/', 'computer') self.addPlace(_('Home'), os.path.expanduser('~'), 'user-home') #add backup folders include_folders = self.config.include() if include_folders: folders = [] for item in include_folders: if item[1] == 0: folders.append(item[0]) if folders: sortColumn = self.places.header().sortIndicatorSection() sortOrder = self.places.header().sortIndicatorOrder() if not sortColumn: folders.sort(key = lambda v: (v.upper(), v[0].islower()), reverse = sortOrder) self.addPlace(_('Backup folders'), '', '') for folder in folders: self.addPlace(folder, folder, 'document-save') def sortPlaces(self, newColumn, newOrder, force = False): profile_id = self.config.currentProfile() if newColumn == 0 and newOrder == Qt.AscendingOrder: if profile_id in self.placesSortLoop and self.placesSortLoop[profile_id]: newColumn, newOrder = 1, Qt.AscendingOrder self.places.header().setSortIndicator(newColumn, newOrder) self.placesSortLoop[profile_id] = False else: self.placesSortLoop[profile_id] = True self.updatePlaces() def updateSnapshotActions(self, item = None): enabled = False if item is None: item = self.timeLine.currentItem() if not item is None: if not item.snapshotID().isRoot: enabled = True #update remove/name snapshot buttons self.btnNameSnapshot.setEnabled(enabled) self.btnRemoveSnapshot.setEnabled(enabled) self.btnSnapshotLogView.setEnabled(enabled) def timeLineChanged(self): item = self.timeLine.currentItem() self.updateSnapshotActions(item) if item is None: return sid = item.snapshotID() if not sid or sid == self.sid: return self.sid = sid self.updateFilesView(2) def updateTimeLine(self, refreshSnapshotsList = True): self.timeLine.clear() self.timeLine.addRoot(snapshots.RootSnapshot(self.config)) if refreshSnapshotsList: self.snapshotsList = [] thread = FillTimeLineThread(self) thread.addSnapshot.connect(self.timeLine.addSnapshot) thread.finished.connect(self.timeLine.checkSelection) thread.start() else: for sid in self.snapshotsList: item = self.timeLine.addSnapshot(sid) self.timeLine.checkSelection() def btnTakeSnapshotClicked(self): backintime.takeSnapshotAsync(self.config) self.updateTakeSnapshot(True) def btnTakeSnapshotChecksumClicked(self): backintime.takeSnapshotAsync(self.config, checksum = True) self.updateTakeSnapshot(True) def btnStopTakeSnapshotClicked(self): os.kill(self.snapshots.pid(), signal.SIGKILL) self.btnStopTakeSnapshot.setEnabled(False) self.btnPauseTakeSnapshot.setEnabled(False) self.btnResumeTakeSnapshot.setEnabled(False) self.snapshots.setTakeSnapshotMessage(0, 'Snapshot terminated') def btnUpdateSnapshotsClicked(self): self.updateTimeLine() self.updateFilesView(2) def btnNameSnapshotClicked(self): item = self.timeLine.currentItem() if item is None: return sid = item.snapshotID() if sid.isRoot: return name = sid.name new_name, accept = QInputDialog.getText(self, _('Snapshot Name'), '', text = name) if not accept: return new_name = new_name.strip() if name == new_name: return sid.name = new_name item.updateText() def btnLastLogViewClicked (self): with self.suspendMouseButtonNavigation(): logviewdialog.LogViewDialog(self).show() def btnSnapshotLogViewClicked (self): item = self.timeLine.currentItem() if item is None: return sid = item.snapshotID() if sid.isRoot: return with self.suspendMouseButtonNavigation(): dlg = logviewdialog.LogViewDialog(self, sid) dlg.show() if sid != dlg.sid: self.timeLine.setCurrentSnapshotID(dlg.sid) def btnRemoveSnapshotClicked (self): def hideItem(item): try: item.setHidden(True) except RuntimeError: #item has been deleted #probably because user pressed refresh pass items = [item for item in self.timeLine.selectedItems() if not isinstance(item, snapshots.RootSnapshot)] if not items: return if QMessageBox.Yes != messagebox.warningYesNo(self, \ _('Are you sure you want to remove the snapshot:\n%s') \ %'\n'.join([item.snapshotID().displayName for item in items])): return for item in items: item.setDisabled(True) if item is self.timeLine.currentItem(): self.timeLine.selectRootItem() thread = RemoveSnapshotThread(self, items) thread.refreshSnapshotList.connect(self.updateTimeLine) thread.hideTimelineItem.connect(hideItem) thread.start() def btnSettingsClicked(self): with self.suspendMouseButtonNavigation(): settingsdialog.SettingsDialog(self).show() def btnShutdownToggled(self, checked): self.shutdown.activate_shutdown = checked def contextMenuClicked(self, point): self.contextMenu.exec_(self.filesView.mapToGlobal(point)) def btnAboutClicked(self): with self.suspendMouseButtonNavigation(): dlg = About(self) dlg.exec_() def btnHelpClicked(self): self.openManPage('backintime') def btnHelpConfigClicked(self): self.openManPage('backintime-config') def btnWebsiteClicked(self): self.openUrl('https://github.com/bit-team/backintime') def btnChangelogClicked(self): def aHref(m): if m.group(0).count('@'): return '%(url)s' % {'url': m.group(0)} else: return '%(url)s' % {'url': m.group(0)} def aHref_lp(m): return '%(txt)s' % {'txt': m.group(0), 'id': m.group(1)} msg = self.config.changelog() msg = re.sub(r'https?://[^) \n]*', aHref, msg) msg = re.sub(r'(?:LP:|bug) ?#?(\d+)', aHref_lp, msg) msg = re.sub(r'\n', '
', msg) messagebox.showInfo(self, _('Changelog'), msg) def btnFaqClicked(self): self.openUrl('https://github.com/bit-team/backintime/wiki/FAQ') def btnAskQuestionClicked(self): self.openUrl('https://github.com/bit-team/backintime/issues') def btnReportBugClicked(self): self.openUrl('https://github.com/bit-team/backintime/issues/new') def openUrl(self, url): return QDesktopServices.openUrl(QUrl(url)) def openManPage(self, man_page): if not tools.checkCommand('man'): messagebox.critical(self, "Couldn't find 'man' to show the help page. Please install 'man'") return env = os.environ env['MANWIDTH'] = '80' proc = subprocess.Popen(['man', man_page], stdout = subprocess.PIPE, universal_newlines = True, env = env) out, err = proc.communicate() messagebox.showInfo(self, 'Manual Page {}'.format(man_page), out) def btnShowHiddenFilesToggled(self, checked): self.showHiddenFiles = checked self.updateFilesView(1) def backupOnRestore(self): cb = QCheckBox(_("Backup local files before overwriting or\nremoving with trailing '%(suffix)s'.") % {'suffix': self.snapshots.backupSuffix()}) cb.setChecked(self.config.backupOnRestore()) cb.setToolTip(_("Newer versions of files will be " "renamed with trailing '%(suffix)s' " "before restoring.\n" "If you don't need them anymore " "you can remove them with '%(cmd)s'") %{'suffix': self.snapshots.backupSuffix(), 'cmd': 'find ./ -name "*%s" -delete' % self.snapshots.backupSuffix() }) return {'widget': cb, 'retFunc': cb.isChecked, 'id': 'backup'} def restoreOnlyNew(self): cb = QCheckBox(_('Only restore files which do not exist or\n' +\ 'are newer than those in destination.\n' +\ 'Using "rsync --update" option.')) cb.setToolTip("""From 'man rsync': This forces rsync to skip any files which exist on the destination and have a modified time that is newer than the source file. (If an existing destination file has a modification time equal to the source file’s, it will be updated if the sizes are different.) Note that this does not affect the copying of dirs, symlinks, or other special files. Also, a difference of file format between the sender and receiver is always considered to be important enough for an update, no matter what date is on the objects. In other words, if the source has a directory where the destination has a file, the transfer would occur regardless of the timestamps. This option is a transfer rule, not an exclude, so it doesn’t affect the data that goes into the file-lists, and thus it doesn’t affect deletions. It just limits the files that the receiver requests to be transferred.""") return {'widget': cb, 'retFunc': cb.isChecked, 'id': 'only_new'} def listRestorePaths(self, paths): fileList = QListWidget() fileList.addItems(paths) fileList.setSelectionMode(QAbstractItemView.NoSelection) return {'widget': fileList, 'retFunc': None} def deleteOnRestore(self): cb = QCheckBox(_('Remove newer files in original folder')) cb.setToolTip(_('Restore selected files or folders ' 'to the original destination and\n' 'delete files/folders which are ' 'not in the snapshot.\n' 'This will delete files/folders which where ' 'excluded during taking the snapshot!\n' 'Be extremely careful!!!')) return {'widget': cb, 'retFunc': cb.isChecked, 'id': 'delete'} def confirmRestore(self, paths, restoreTo = None): if restoreTo: msg = _("Do you really want to restore this files(s)\ninto new folder '%(path)s':") \ %{'path': restoreTo} else: msg = _('Do you really want to restore this files(s):') confirm, opt = messagebox.warningYesNoOptions(self, msg, (self.listRestorePaths(paths), self.backupOnRestore(), self.restoreOnlyNew(), self.deleteOnRestore())) return (confirm, opt) def confirmDelete(self, warnRoot = False, restoreTo = None): if restoreTo: msg = _("Are you sure you want to remove all newer files " "in '%(path)s'?") %{'path': restoreTo} else: msg = _('Are you sure you want to remove all newer files in your ' 'original folder?') if warnRoot: msg += '\n\n' msg += _('WARNING: deleting files in filesystem root could break your whole system!!!') return QMessageBox.Yes == messagebox.warningYesNo(self, msg) def restoreThis(self): if self.sid.isRoot: return paths = [f for f, idx in self.multiFileSelected(fullPath = True)] with self.suspendMouseButtonNavigation(): confirm, opt = self.confirmRestore(paths) if not confirm: return if opt['delete'] and not self.confirmDelete(warnRoot = '/' in paths): return rd = RestoreDialog(self, self.sid, paths, **opt) rd.exec() def restoreThisTo(self): if self.sid.isRoot: return paths = [f for f, idx in self.multiFileSelected(fullPath = True)] with self.suspendMouseButtonNavigation(): restoreTo = qttools.getExistingDirectory(self, _('Restore to ...')) if not restoreTo: return restoreTo = self.config.preparePath(restoreTo) confirm, opt = self.confirmRestore(paths, restoreTo) if not confirm: return if opt['delete'] and not self.confirmDelete(warnRoot = '/' in paths, restoreTo = restoreTo): return rd = RestoreDialog(self, self.sid, paths, restoreTo, **opt) rd.exec() def restoreParent(self): if self.sid.isRoot: return with self.suspendMouseButtonNavigation(): confirm, opt = self.confirmRestore((self.path,)) if not confirm: return if opt['delete'] and not self.confirmDelete(warnRoot = self.path == '/'): return rd = RestoreDialog(self, self.sid, self.path, **opt) rd.exec() def restoreParentTo(self): if self.sid.isRoot: return with self.suspendMouseButtonNavigation(): restoreTo = qttools.getExistingDirectory(self, _('Restore to ...')) if not restoreTo: return restoreTo = self.config.preparePath(restoreTo) confirm, opt = self.confirmRestore((self.path,), restoreTo) if not confirm: return if opt['delete'] and not self.confirmDelete(warnRoot = self.path == '/', restoreTo = restoreTo): return rd = RestoreDialog(self, self.sid, self.path, restoreTo, **opt) rd.exec() def btnSnapshotsClicked(self): path, idx = self.fileSelected(fullPath = True) with self.suspendMouseButtonNavigation(): dlg = snapshotsdialog.SnapshotsDialog(self, self.sid, path) if QDialog.Accepted == dlg.exec_(): if dlg.sid != self.sid: self.timeLine.setCurrentSnapshotID(dlg.sid) def btnFolderUpClicked(self): if len(self.path) <= 1: return path = os.path.dirname(self.path) if self.path == path: return self.path = path self.path_history.append(self.path) self.updateFilesView(0) def btnFolderHistoryPreviousClicked(self): path = self.path_history.previous() full_path = self.sid.pathBackup(path) if os.path.isdir(full_path) and self.sid.canOpenPath(path): self.path = path self.updateFilesView(0) def btnFolderHistoryNextClicked(self): path = self.path_history.next() full_path = self.sid.pathBackup(path) if os.path.isdir(full_path) and self.sid.canOpenPath(path): self.path = path self.updateFilesView(0) def btnOpenCurrentItemClicked(self): path, idx = self.fileSelected() if not path: return self.openPath(path) def btnAddIncludeClicked(self): paths = [f for f, idx in self.multiFileSelected(fullPath = True)] include = self.config.include() updatePlaces = False for item in paths: if os.path.isdir(item): include.append((item, 0)) updatePlaces = True else: include.append((item, 1)) self.config.setInclude(include) if updatePlaces: self.updatePlaces() def btnAddExcludeClicked(self): paths = [f for f, idx in self.multiFileSelected(fullPath = True)] exclude = self.config.exclude() exclude.extend(paths) self.config.setExclude(exclude) def filesViewItemActivated(self, model_index): if self.qapp.keyboardModifiers() and Qt.ControlModifier: return if model_index is None: return rel_path = str(self.filesViewProxyModel.data(model_index)) if not rel_path: return self.openPath(rel_path) def tmpCopy(self, full_path, sid = None): """ Create a temporary local copy of the file ``full_path`` and add the temp folder to ``self.tmpDirs`` which will remove them on exit. Args: full_path (str): path to original file sid (snapshots.SID): snapshot ID used as temp folder suffix Returns: str: temporary path to file """ if sid: sid = '_' + sid.sid d = TemporaryDirectory(suffix = sid) tmp_file = os.path.join(d.name, os.path.basename(full_path)) if os.path.isdir(full_path): shutil.copytree(full_path, tmp_file) else: shutil.copy(full_path, d.name) self.tmpDirs.append(d) return tmp_file def openPath(self, rel_path): rel_path = os.path.join(self.path, rel_path) full_path = self.sid.pathBackup(rel_path) if os.path.exists(full_path) and self.sid.canOpenPath(rel_path): if os.path.isdir(full_path): self.path = rel_path self.path_history.append(rel_path) self.updateFilesView(0) else: # prevent backup data from being accidentally overwritten # by create a temporary local copy and only open that one if not isinstance(self.sid, snapshots.RootSnapshot): full_path = self.tmpCopy(full_path, self.sid) self.run = QDesktopServices.openUrl(QUrl('file://' + full_path)) @pyqtSlot(int) def updateFilesView(self, changed_from, selected_file = None, show_snapshots = False): #0 - files view change directory, 1 - files view, 2 - time_line, 3 - places if 0 == changed_from or 3 == changed_from: selected_file = '' if 0 == changed_from: #update places self.places.setCurrentItem(None) for place_index in range(self.places.topLevelItemCount()): item = self.places.topLevelItem(place_index) if self.path == str(item.data(0, Qt.UserRole)): self.places.setCurrentItem(item) break tooltip = '' text = '' if self.sid.isRoot: text = _('Now') tooltip = _('View the current disk content') else: name = self.sid.displayName text = _('Snapshot: %s') % name tooltip = _('View the snapshot made at %s') % name self.filesWidget.setTitle(text) self.filesWidget.setToolTip(tooltip) #try to keep old selected file if selected_file is None: selected_file, idx = self.fileSelected() self.selected_file = selected_file #update files view full_path = self.sid.pathBackup(self.path) if os.path.isdir(full_path): if self.showHiddenFiles: self.filesViewProxyModel.setFilterRegExp(r'') else: self.filesViewProxyModel.setFilterRegExp(r'^[^\.]') model_index = self.filesViewModel.setRootPath(full_path) proxy_model_index = self.filesViewProxyModel.mapFromSource(model_index) self.filesView.setRootIndex(proxy_model_index) self.filesViewToolbar.setEnabled(False) self.stackFilesView.setCurrentWidget(self.filesView) #TODO: find a signal for this self.dirListerCompleted() else: self.btnRestoreMenu.setEnabled(False) self.menuRestore.setEnabled(False) self.btnRestore.setEnabled(False) self.btnRestoreTo.setEnabled(False) self.btnSnapshots.setEnabled(False) self.stackFilesView.setCurrentWidget(self.lblFolderDontExists) #show current path self.editCurrentPath.setText(self.path) self.btnRestoreParent.setText(_("Restore '%s'") % self.path) self.btnRestoreParentTo.setText(_("Restore '%s' to ...") % self.path) #update folder_up button state self.btnFolderUp.setEnabled(len(self.path) > 1) def dirListerCompleted(self): has_files = (self.filesViewProxyModel.rowCount(self.filesView.rootIndex()) > 0) #update restore button state enable = not self.sid.isRoot and has_files self.btnRestoreMenu.setEnabled(enable) self.menuRestore.setEnabled(enable) self.btnRestore.setEnabled(enable) self.btnRestoreTo.setEnabled(enable) #update snapshots button state self.btnSnapshots.setEnabled(has_files) #enable files toolbar self.filesViewToolbar.setEnabled(True) #select selected_file found = False if self.selected_file: index = self.filesView.indexAt(QPoint(0,0)) if not index.isValid(): return while index.isValid(): file_name = (str(self.filesViewProxyModel.data(index))) if file_name == self.selected_file: #TODO: doesn't work reliable self.filesView.setCurrentIndex(index) found = True break index = self.filesView.indexBelow(index) self.selected_file = '' if not found and has_files: self.filesView.setCurrentIndex(self.filesViewProxyModel.index(0, 0)) def fileSelected(self, fullPath = False): idx = qttools.indexFirstColumn(self.filesView.currentIndex()) selected_file = str(self.filesViewProxyModel.data(idx)) if selected_file == '/': #nothing is selected selected_file = '' idx = self.filesViewProxyModel.mapFromSource(self.filesViewModel.index(self.path, 0)) if fullPath: selected_file = os.path.join(self.path, selected_file) return(selected_file, idx) def multiFileSelected(self, fullPath = False): count = 0 for idx in self.filesView.selectedIndexes(): if idx.column() > 0: continue selected_file = str(self.filesViewProxyModel.data(idx)) if selected_file == '/': continue count += 1 if fullPath: selected_file = os.path.join(self.path, selected_file) yield (selected_file, idx) if not count: #nothing is selected idx = self.filesViewProxyModel.mapFromSource(self.filesViewModel.index(self.path, 0)) if fullPath: selected_file = self.path else: selected_file = '' yield (selected_file, idx) def setMouseButtonNavigation(self): self.qapp.installEventFilter(self.mouseButtonEventFilter) @contextmanager def suspendMouseButtonNavigation(self): self.qapp.removeEventFilter(self.mouseButtonEventFilter) yield self.setMouseButtonNavigation() class About(QDialog): def __init__(self, parent = None): super(About, self).__init__(parent) self.parent = parent self.config = parent.config import icon self.setWindowTitle(_('About') + ' ' + self.config.APP_NAME) logo = QLabel('Icon') logo.setPixmap(icon.BIT_LOGO.pixmap(QSize(48, 48))) version = self.config.VERSION ref, hashid = tools.gitRevisionAndHash() git_version = '' if ref: git_version = " git branch '{}' hash '{}'".format(ref, hashid) name = QLabel('

' + self.config.APP_NAME + ' ' + version + '

' + git_version) name.setAlignment(Qt.AlignLeft | Qt.AlignTop) homepage = QLabel(self.mkurl('')) homepage.setTextInteractionFlags(Qt.LinksAccessibleByMouse) homepage.setOpenExternalLinks(True) bit_copyright = QLabel(self.config.COPYRIGHT + '\n') vlayout = QVBoxLayout(self) hlayout = QHBoxLayout() hlayout.addWidget(logo) hlayout.addWidget(name) hlayout.addStretch() vlayout.addLayout(hlayout) vlayout.addWidget(homepage) vlayout.addWidget(bit_copyright) buttonBoxLeft = QDialogButtonBox(self) btn_authors = buttonBoxLeft.addButton(_('Authors'), QDialogButtonBox.ActionRole) btn_translations = buttonBoxLeft.addButton(_('Translations'), QDialogButtonBox.ActionRole) btn_license = buttonBoxLeft.addButton(_('License'), QDialogButtonBox.ActionRole) buttonBoxRight = QDialogButtonBox(QDialogButtonBox.Ok) hlayout = QHBoxLayout() hlayout.addWidget(buttonBoxLeft) hlayout.addWidget(buttonBoxRight) vlayout.addLayout(hlayout) btn_authors.clicked.connect(self.authors) btn_translations.clicked.connect(self.translations) btn_license.clicked.connect(self.license) buttonBoxRight.accepted.connect(self.accept) def authors(self): return messagebox.showInfo(self, _('Authors'), self.mkurl(self.config.authors())) def translations(self): return messagebox.showInfo(self, _('Translations'), self.mkurl(self.config.translations())) def license(self): return messagebox.showInfo(self, _('License'), self.config.license()) def mkurl(self, msg): msg = re.sub(r'<(.*?)>', self.aHref, msg) msg = re.sub(r'\n', '
', msg) return msg def aHref(self, m): if m.group(1).count('@'): return '%(url)s' % {'url': m.group(1)} else: return '%(url)s' % {'url': m.group(1)} class ExtraMouseButtonEventFilter(QObject): """ globally catch mouse buttons 4 and 5 (mostly used as back and forward) and assign it to browse in file history. When updating to Qt5 use Qt.BackButton and Qt.ForwardButton instead. """ def __init__(self, mainWindow): self.mainWindow = mainWindow super(ExtraMouseButtonEventFilter, self).__init__() def eventFilter(self, receiver, event): if event.type() == QEvent.MouseButtonPress and event.button() in (Qt.XButton1, Qt.XButton2): if event.button() == Qt.XButton1: self.mainWindow.btnFolderHistoryPreviousClicked() if event.button() == Qt.XButton2: self.mainWindow.btnFolderHistoryNextClicked() return True else: return super(ExtraMouseButtonEventFilter, self).eventFilter(receiver, event) class RemoveSnapshotThread(QThread): """ remove snapshots in background thread so GUI will not freeze """ refreshSnapshotList = pyqtSignal() hideTimelineItem = pyqtSignal(qttools.SnapshotItem) def __init__(self, parent, items): self.config = parent.config self.snapshots = parent.snapshots self.items = items super(RemoveSnapshotThread, self).__init__(parent) def run(self): last_snapshot = snapshots.lastSnapshot(self.config) renew_last_snapshot = False #inhibit suspend/hibernate during delete self.config.inhibitCookie = tools.inhibitSuspend(toplevel_xid = self.config.xWindowId, reason = 'deleting snapshots') for item, sid in [(x, x.snapshotID()) for x in self.items]: self.snapshots.remove(sid) self.hideTimelineItem.emit(item) if sid == last_snapshot: renew_last_snapshot = True self.refreshSnapshotList.emit() #set correct last snapshot again if renew_last_snapshot: self.snapshots.createLastSnapshotSymlink(snapshots.lastSnapshot(self.config)) #release inhibit suspend if self.config.inhibitCookie: self.config.inhibitCookie = tools.unInhibitSuspend(*self.config.inhibitCookie) class FillTimeLineThread(QThread): """ add snapshot IDs to timeline in background """ addSnapshot = pyqtSignal(snapshots.SID) def __init__(self, parent): self.parent = parent self.config = parent.config super(FillTimeLineThread, self).__init__(parent) def run(self): for sid in snapshots.iterSnapshots(self.config): self.addSnapshot.emit(sid) self.parent.snapshotsList.append(sid) self.parent.snapshotsList.sort() class SetupCron(QThread): """ Check crontab entries on startup. """ def __init__(self, parent): self.config = parent.config super(SetupCron, self).__init__(parent) def run(self): self.config.setupCron() def debugTrace(): """ Set a tracepoint in the Python debugger that works with Qt """ from pdb import set_trace pyqtRemoveInputHook() set_trace() if __name__ == '__main__': cfg = backintime.startApp('backintime-qt') raiseCmd = '' if len(sys.argv) > 1: raiseCmd = '\n'.join(sys.argv[1 :]) appInstance = guiapplicationinstance.GUIApplicationInstance(cfg.appInstanceFile(), raiseCmd) cfg.PLUGIN_MANAGER.load(cfg = cfg) cfg.PLUGIN_MANAGER.appStart() logger.openlog() qapp = qttools.createQApplication(cfg.APP_NAME) translator = qttools.translator() qapp.installTranslator(translator) mainWindow = MainWindow(cfg, appInstance, qapp) if cfg.isConfigured(): cfg.xWindowId = mainWindow.winId() mainWindow.show() qapp.exec_() logger.closelog() cfg.PLUGIN_MANAGER.appExit() appInstance.exitApplication() backintime-1.2.1/qt/serviceHelper.py0000644000175000017500000003171613530533316016745 0ustar germargermar# (from BackInTime) # Copyright (C) 2015-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # (from jockey) # (c) 2008 Canonical Ltd. # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # (from python-dbus-docs) # Copyright (C) 2004-2006 Red Hat Inc. # Copyright (C) 2005-2007 Collabora Ltd. # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation # files (the "Software"), to deal in the Software without # restriction, including without limitation the rights to use, copy, # modify, merge, publish, distribute, sublicense, and/or sell copies # of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # DEALINGS IN THE SOFTWARE. # # This file was modified by David D. Lowe in 2009. # To the extent possible under law, David D. Lowe has waived all # copyright and related or neighboring rights to his modifications to # this file under this license: http://creativecommons.org/publicdomain/zero/1.0/ import os import re from subprocess import Popen, PIPE try: import pwd except ImportError: pwd = None import dbus import dbus.service import dbus.mainloop.pyqt5 from PyQt5.QtCore import QCoreApplication UDEV_RULES_PATH = '/etc/udev/rules.d/99-backintime-%s.rules' class InvalidChar(dbus.DBusException): _dbus_error_name = 'net.launchpad.backintime.InvalidChar' class InvalidCmd(dbus.DBusException): _dbus_error_name = 'net.launchpad.backintime.InvalidCmd' class LimitExceeded(dbus.DBusException): _dbus_error_name = 'net.launchpad.backintime.LimitExceeded' class PermissionDeniedByPolicy(dbus.DBusException): _dbus_error_name = 'com.ubuntu.DeviceDriver.PermissionDeniedByPolicy' class UdevRules(dbus.service.Object): def __init__(self, conn=None, object_path=None, bus_name=None): super(UdevRules, self).__init__(conn, object_path, bus_name) # the following variables are used by _checkPolkitPrivilege self.polkit = None self.enforce_polkit = True self.tmpDict = {} #find su path self.su = self._which('su', '/bin/su') self.backintime = self._which('backintime', '/usr/bin/backintime') self.nice = self._which('nice', '/usr/bin/nice') self.ionice = self._which('ionice', '/usr/bin/ionice') self.max_rules = 100 self.max_users = 20 self.max_cmd_len = 100 def _which(self, exe, fallback): proc = Popen(['which', exe], stdout = PIPE) ret = proc.communicate()[0].strip().decode() if proc.returncode or not ret: return fallback return ret def _validateCmd(self, cmd): if cmd.find("&&") != -1: raise InvalidCmd("Parameter 'cmd' contains '&&' concatenation") # make sure it starts with an absolute path elif not cmd.startswith(os.path.sep): raise InvalidCmd("Parameter 'cmd' does not start with '/'") parts = cmd.split() # make sure only well known commands and switches are used whitelist = ( (self.nice, r'^-n'), (self.ionice, r'(^-c|^-n)'), ) while parts: for c, switches in whitelist: if parts[0] == c: parts.pop(0) while parts and re.match(switches, parts[0]): parts.pop(0) break else: break if not parts: raise InvalidCmd("Parameter 'cmd' does not contain the backintime command") elif parts[0] != self.backintime: raise InvalidCmd("Parameter 'cmd' contains non-whitelisted cmd/parameter (%s)" % parts[0]) def _checkLimits(self, owner, cmd): if len(self.tmpDict.get(owner, [])) >= self.max_rules: raise LimitExceeded("Maximum number of cached rules reached (%d)" % self.max_rules) elif len(self.tmpDict) >= self.max_users: raise LimitExceeded("Maximum number of cached users reached (%d)" % self.max_users) elif len(cmd) > self.max_cmd_len: raise LimitExceeded("Maximum length of command line reached (%d)" % self.max_cmd_len) @dbus.service.method("net.launchpad.backintime.serviceHelper.UdevRules", in_signature='ss', out_signature='', sender_keyword='sender', connection_keyword='conn') def addRule(self, cmd, uuid, sender=None, conn=None): """ Receive command and uuid and create an Udev rule out of this. This is done on the service side to prevent malicious code to run as root. """ #prevent breaking out of su command chars = re.findall(r'[^a-zA-Z0-9-/\.>& ]', cmd) if chars: raise InvalidChar("Parameter 'cmd' contains invalid character(s) %s" % '|'.join(set(chars))) #only allow relevant chars in uuid chars = re.findall(r'[^a-zA-Z0-9-]', uuid) if chars: raise InvalidChar("Parameter 'uuid' contains invalid character(s) %s" % '|'.join(set(chars))) self._validateCmd(cmd) info = SenderInfo(sender, conn) user = info.connectionUnixUser() owner = info.nameOwner() self._checkLimits(owner, cmd) #create su command sucmd = "%s - '%s' -c '%s'" %(self.su, user, cmd) #create Udev rule rule = 'ACTION=="add|change", ENV{ID_FS_UUID}=="%s", RUN+="%s"\n' %(uuid, sucmd) #store rule if not owner in self.tmpDict: self.tmpDict[owner] = [] self.tmpDict[owner].append(rule) @dbus.service.method("net.launchpad.backintime.serviceHelper.UdevRules", in_signature='', out_signature='b', sender_keyword='sender', connection_keyword='conn') def save(self, sender=None, conn=None): """ Save rules to destiantion file after user authenticated as admin. This will first check if there are any changes between temporary added rules and current rules in destiantion file. Returns False if files are identical or no rules to be installed. """ info = SenderInfo(sender, conn) user = info.connectionUnixUser() owner = info.nameOwner() #delete rule if no rules in tmp if not owner in self.tmpDict or not self.tmpDict[owner]: self.delete(sender, conn) return False #return False if rule already exist. if os.path.exists(UDEV_RULES_PATH % user): with open(UDEV_RULES_PATH % user, 'r') as f: if self.tmpDict[owner] == f.readlines(): self._clean(owner) return False #auth to save changes self._checkPolkitPrivilege(sender, conn, 'net.launchpad.backintime.UdevRuleSave') with open(UDEV_RULES_PATH % user, 'w') as f: f.writelines(self.tmpDict[owner]) self._clean(owner) return True @dbus.service.method("net.launchpad.backintime.serviceHelper.UdevRules", in_signature='', out_signature='', sender_keyword='sender', connection_keyword='conn') def delete(self, sender=None, conn=None): """ Delete existing Udev rule """ info = SenderInfo(sender, conn) user = info.connectionUnixUser() owner = info.nameOwner() self._clean(owner) if os.path.exists(UDEV_RULES_PATH % user): #auth to delete rule self._checkPolkitPrivilege(sender, conn, 'net.launchpad.backintime.UdevRuleDelete') os.remove(UDEV_RULES_PATH % user) @dbus.service.method("net.launchpad.backintime.serviceHelper.UdevRules", in_signature='', out_signature='', sender_keyword='sender', connection_keyword='conn') def clean(self, sender=None, conn=None): """ clean up previous cached rules """ info = SenderInfo(sender, conn) self._clean(info.nameOwner()) def _clean(self, owner): if owner in self.tmpDict: del self.tmpDict[owner] def _initPolkit(self): if self.polkit is None: self.polkit = dbus.Interface(dbus.SystemBus().get_object( 'org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority', False), 'org.freedesktop.PolicyKit1.Authority') def _checkPolkitPrivilege(self, sender, conn, privilege): # from jockey """ Verify that sender has a given PolicyKit privilege. sender is the sender's (private) D-BUS name, such as ":1:42" (sender_keyword in @dbus.service.methods). conn is the dbus.Connection object (connection_keyword in @dbus.service.methods). privilege is the PolicyKit privilege string. This method returns if the caller is privileged, and otherwise throws a PermissionDeniedByPolicy exception. """ if sender is None and conn is None: # called locally, not through D-BUS return if not self.enforce_polkit: # that happens for testing purposes when running on the session # bus, and it does not make sense to restrict operations here return # query PolicyKit self._initPolkit() try: # we don't need is_challenge return here, since we call with AllowUserInteraction (is_auth, _, details) = self.polkit.CheckAuthorization( ('system-bus-name', {'name': dbus.String(sender, variant_level=1)}), privilege, {'': ''}, dbus.UInt32(1), '', timeout=3000) except dbus.DBusException as e: if e._dbus_error_name == 'org.freedesktop.DBus.Error.ServiceUnknown': # polkitd timed out, connect again self.polkit = None return self._checkPolkitPrivilege(sender, conn, privilege) else: raise if not is_auth: raise PermissionDeniedByPolicy(privilege) class SenderInfo(object): def __init__(self, sender, conn): self.sender = sender self.dbus_info = dbus.Interface(conn.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus/Bus', False), 'org.freedesktop.DBus') def connectionUnixUser(self): uid = self.dbus_info.GetConnectionUnixUser(self.sender) if pwd: return pwd.getpwuid(uid).pw_name else: return uid def nameOwner(self): return self.dbus_info.GetNameOwner(self.sender) def connectionPid(self): return self.dbus_info.GetConnectionUnixProcessID(self.sender) if __name__ == '__main__': dbus.mainloop.pyqt5.DBusQtMainLoop(set_as_default=True) app = QCoreApplication([]) bus = dbus.SystemBus() name = dbus.service.BusName("net.launchpad.backintime.serviceHelper", bus) object = UdevRules(bus, '/UdevRules') print("Running BIT service.") app.exec_() backintime-1.2.1/qt/icon.py0000644000175000017500000000732713530533316015076 0ustar germargermar# Copyright (C) 2012-2019 Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from PyQt5.QtGui import QIcon for theme in ('ubuntu-mono-dark', 'gnome', 'oxygen'): if not QIcon.fromTheme('document-save').isNull(): break QIcon.setThemeName(theme) #BackInTime Logo BIT_LOGO = QIcon.fromTheme('document-save') BIT_LOGO_INFO = QIcon.fromTheme('document-save-as') #Main toolbar TAKE_SNAPSHOT = BIT_LOGO PAUSE = QIcon.fromTheme('media-playback-pause') RESUME = QIcon.fromTheme('media-playback-start') STOP = QIcon.fromTheme('media-playback-stop') REFRESH_SNAPSHOT = QIcon.fromTheme('view-refresh') SNAPSHOT_NAME = QIcon.fromTheme('stock_edit', QIcon.fromTheme('gtk-edit', QIcon.fromTheme('edit-rename', QIcon.fromTheme('accessories-text-editor')))) REMOVE_SNAPSHOT = QIcon.fromTheme('edit-delete') VIEW_SNAPSHOT_LOG = QIcon.fromTheme('text-plain', QIcon.fromTheme('text-x-generic')) VIEW_LAST_LOG = QIcon.fromTheme('document-new') SETTINGS = QIcon.fromTheme('gtk-preferences', QIcon.fromTheme('configure')) SHUTDOWN = QIcon.fromTheme('system-shutdown') EXIT = QIcon.fromTheme('gtk-close', QIcon.fromTheme('application-exit')) #Help menu HELP = QIcon.fromTheme('help-contents') WEBSITE = QIcon.fromTheme('go-home') CHANGELOG = QIcon.fromTheme('format-justify-fill') FAQ = QIcon.fromTheme('help-faq', QIcon.fromTheme('help-hint')) QUESTION = QIcon.fromTheme('stock_dialog-question', QIcon.fromTheme('help-feedback')) BUG = QIcon.fromTheme('stock_dialog-error', QIcon.fromTheme('tools-report-bug')) ABOUT = QIcon.fromTheme('help-about') #Files toolbar UP = QIcon.fromTheme('go-up') SHOW_HIDDEN = QIcon.fromTheme('show-hidden', QIcon.fromTheme('list-add')) RESTORE = QIcon.fromTheme('edit-undo') RESTORE_TO = QIcon.fromTheme('document-revert') SNAPSHOTS = QIcon.fromTheme('file-manager', QIcon.fromTheme('view-list-details', QIcon.fromTheme('system-file-manager'))) #Snapshot dialog DIFF_OPTIONS = SETTINGS DELETE_FILE = REMOVE_SNAPSHOT SELECT_ALL = QIcon.fromTheme('edit-select-all') #Restore dialog RESTORE_DIALOG = VIEW_SNAPSHOT_LOG #Settings dialog SETTINGS_DIALOG = SETTINGS PROFILE_EDIT = SNAPSHOT_NAME ADD = QIcon.fromTheme('list-add') REMOVE = QIcon.fromTheme('list-remove') FOLDER = QIcon.fromTheme('folder') FILE = VIEW_SNAPSHOT_LOG EXCLUDE = REMOVE_SNAPSHOT DEFAULT_EXCLUDE = QIcon.fromTheme('emblem-important') INVALID_EXCLUDE = QIcon.fromTheme('emblem-ohno', QIcon.fromTheme('face-surprise')) backintime-1.2.1/qt/qttools.py0000644000175000017500000003702013530533316015644 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import gettext from PyQt5.QtGui import (QFont, QColor, QKeySequence) from PyQt5.QtCore import (QDir, Qt, pyqtSlot, pyqtSignal, QModelIndex, QTranslator, QLocale, QLibraryInfo, QEvent, QT_VERSION_STR) from PyQt5.QtWidgets import (QFileDialog, QAbstractItemView, QListView, QTreeView, QDialog, QApplication, QStyleFactory, QTreeWidget, QTreeWidgetItem, QComboBox, QMenu, QToolTip, QAction) from datetime import (datetime, date, timedelta) from calendar import monthrange from distutils.version import StrictVersion _ = gettext.gettext def backintimePath(*path): return os.path.abspath(os.path.join(__file__, os.pardir, os.pardir, *path)) def registerBackintimePath(*path): """ find duplicate in common/tools.py """ path = backintimePath(*path) if not path in sys.path: sys.path.insert(0, path) registerBackintimePath('common') import snapshots def fontBold(font): font.setWeight(QFont.Bold) return font def setFontBold(widget): widget.setFont(fontBold(widget.font())) def fontNormal(font): font.setWeight(QFont.Normal) return font def setFontNormal(widget): widget.setFont(fontNormal(widget.font())) def equalIndent(*args): width = 0 for widget in args: widget.setMinimumWidth(0) width = max(width, widget.sizeHint().width()) if len(args) > 1: for widget in args: widget.setMinimumWidth(width) class FileDialogShowHidden(QFileDialog): def __init__(self, parent, *args, **kwargs): super(FileDialogShowHidden, self).__init__(parent, *args, **kwargs) self.setOption(self.DontUseNativeDialog, True) self.setOption(self.HideNameFilterDetails, True) showHiddenAction = QAction(self) showHiddenAction.setShortcuts([QKeySequence(Qt.CTRL + Qt.Key_H),]) showHiddenAction.triggered.connect(self.toggleShowHidden) self.addAction(showHiddenAction) self.showHidden(hiddenFiles(parent)) def showHidden(self, enable): if enable: self.setFilter(self.filter() | QDir.Hidden) elif int(self.filter() & QDir.Hidden): self.setFilter(self.filter() ^ QDir.Hidden) def toggleShowHidden(self): self.showHidden(not int(self.filter() & QDir.Hidden)) def getExistingDirectories(parent, *args, **kwargs): """ Workaround for selecting multiple directories adopted from http://www.qtcentre.org/threads/34226-QFileDialog-select-multiple-directories?p=158482#post158482 This also give control about hidden folders """ dlg = FileDialogShowHidden(parent, *args, **kwargs) dlg.setFileMode(dlg.Directory) dlg.setOption(dlg.ShowDirsOnly, True) dlg.findChildren(QListView)[0].setSelectionMode(QAbstractItemView.ExtendedSelection) dlg.findChildren(QTreeView)[0].setSelectionMode(QAbstractItemView.ExtendedSelection) if dlg.exec_() == QDialog.Accepted: return dlg.selectedFiles() return [str(), ] def getExistingDirectory(parent, *args, **kwargs): """ Workaround to give control about hidden folders """ dlg = FileDialogShowHidden(parent, *args, **kwargs) dlg.setFileMode(dlg.Directory) dlg.setOption(dlg.ShowDirsOnly, True) if dlg.exec_() == QDialog.Accepted: return dlg.selectedFiles()[0] return str() def getOpenFileNames(parent, *args, **kwargs): """ Workaround to give control about hidden files """ dlg = FileDialogShowHidden(parent, *args, **kwargs) dlg.setFileMode(dlg.ExistingFiles) if dlg.exec_() == QDialog.Accepted: return dlg.selectedFiles() return [str(), ] def getOpenFileName(parent, *args, **kwargs): """ Workaround to give control about hidden files """ dlg = FileDialogShowHidden(parent, *args, **kwargs) dlg.setFileMode(dlg.ExistingFile) if dlg.exec_() == QDialog.Accepted: return dlg.selectedFiles()[0] return str() def hiddenFiles(parent): try: return parent.parent.showHiddenFiles except: pass try: return parent.showHiddenFiles except: pass return False def createQApplication(app_name = 'Back In Time'): global qapp try: return qapp except NameError: pass if StrictVersion(QT_VERSION_STR) >= StrictVersion('5.6') and \ hasattr(Qt, 'AA_EnableHighDpiScaling'): QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) qapp = QApplication(sys.argv) qapp.setApplicationName(app_name) if os.geteuid() == 0 and \ qapp.style().objectName().lower() == 'windows' and \ 'GTK+' in QStyleFactory.keys(): qapp.setStyle('GTK+') return qapp def translator(): translator = QTranslator() locale = QLocale.system().name() translator.load('qt_%s' % locale, QLibraryInfo.location(QLibraryInfo.TranslationsPath)) return translator def indexFirstColumn(idx): if idx.column() > 0: idx = idx.sibling(idx.row(), 0) return idx class MyTreeView(QTreeView): """ subclass QTreeView to emit a SIGNAL myCurrentIndexChanged if the SLOT currentChanged is called """ myCurrentIndexChanged = pyqtSignal(QModelIndex, QModelIndex) def currentChanged(self, current, previous): self.myCurrentIndexChanged.emit(current, previous) super(MyTreeView, self).currentChanged(current, previous) class TimeLine(QTreeWidget): updateFilesView = pyqtSignal(int) def __init__(self, parent): super(TimeLine, self).__init__(parent) self.setRootIsDecorated(False) self.setEditTriggers(QAbstractItemView.NoEditTriggers) self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setHeaderLabels([_('Snapshots'),'foo']) self.setSortingEnabled(True) self.sortByColumn(1, Qt.DescendingOrder) self.hideColumn(1) self.header().setSectionsClickable(False) self.parent = parent self.snapshots = parent.snapshots self._resetHeaderData() def clear(self): self._resetHeaderData() return super(TimeLine, self).clear() def _resetHeaderData(self): self.now = date.today() #list of tuples with (text, startDate, endDate) self.headerData = [] todayMin = datetime.combine(self.now, datetime.min.time()) todayMax = datetime.combine(self.now, datetime.max.time()) self.headerData.append((_('Today'), todayMin, todayMax)) yesterdayMin = datetime.combine(self.now - timedelta(days = 1), datetime.min.time()) yesterdayMax = datetime.combine(todayMin - timedelta(hours = 1), datetime.max.time()) self.headerData.append((_('Yesterday'), yesterdayMin, yesterdayMax)) thisWeekMin = datetime.combine(self.now - timedelta(self.now.weekday()), datetime.min.time()) thisWeekMax = datetime.combine(yesterdayMin - timedelta(hours = 1), datetime.max.time()) if thisWeekMin < thisWeekMax: self.headerData.append((_('This week'), thisWeekMin, thisWeekMax)) lastWeekMin = datetime.combine(self.now - timedelta(self.now.weekday() + 7), datetime.min.time()) lastWeekMax = datetime.combine(self.headerData[-1][1] - timedelta(hours = 1), datetime.max.time()) self.headerData.append((_('Last week'), lastWeekMin, lastWeekMax)) #the rest of current month. Otherwise this months header would be above today thisMonthMin = datetime.combine(self.now - timedelta(self.now.day - 1), datetime.min.time()) thisMonthMax = datetime.combine(lastWeekMin - timedelta(hours = 1), datetime.max.time()) if thisMonthMin < thisMonthMax: self.headerData.append((thisMonthMin.strftime('%B').capitalize(), thisMonthMin, thisMonthMax)) #the rest of last month lastMonthMax = datetime.combine(self.headerData[-1][1] - timedelta(hours = 1), datetime.max.time()) lastMonthMin = datetime.combine(date(lastMonthMax.year, lastMonthMax.month, 1), datetime.min.time()) self.headerData.append((lastMonthMin.strftime('%B').capitalize(), lastMonthMin, lastMonthMax)) def addRoot(self, sid): self.rootItem = self.addSnapshot(sid) return self.rootItem @pyqtSlot(snapshots.SID) def addSnapshot(self, sid): item = SnapshotItem(sid) self.addTopLevelItem(item) #select the snapshot that was selected before if sid == self.parent.sid: self.setCurrentItem(item) if not sid.isRoot: self.addHeader(sid) return item def addHeader(self, sid): for text, startDate, endDate in self.headerData: if startDate <= sid.date <= endDate: return self._createHeaderItem(text, endDate) #any previous months year = sid.date.year month = sid.date.month if year == self.now.year: text = date(year, month, 1).strftime('%B').capitalize() else: text = date(year, month, 1).strftime('%B, %Y').capitalize() startDate = datetime.combine(date(year, month, 1), datetime.min.time()) endDate = datetime.combine(date(year, month, monthrange(year, month)[1]), datetime.max.time()) if self._createHeaderItem(text, endDate): self.headerData.append((text, startDate, endDate)) def _createHeaderItem(self, text, endDate): for item in self.iterHeaderItems(): if item.snapshotID().date == endDate: return False item = HeaderItem(text, snapshots.SID(endDate, self.parent.config)) self.addTopLevelItem(item) return True @pyqtSlot() def checkSelection(self): if self.currentItem() is None: self.selectRootItem() def selectRootItem(self): self.setCurrentItem(self.rootItem) if not self.parent.sid.isRoot: self.parent.sid = self.rootItem.snapshotID() self.updateFilesView.emit(2) def selectedSnapshotIDs(self): return [i.snapshotID() for i in self.selectedItems()] def currentSnapshotID(self): item = self.currentItem() if item: return item.snapshotID() def setCurrentSnapshotID(self, sid): for item in self.iterItems(): if item.snapshotID() == sid: self.setCurrentItem(item) break def setCurrentItem(self, item, *args, **kwargs): super(TimeLine, self).setCurrentItem(item, *args, **kwargs) if self.parent.sid != item.snapshotID(): self.parent.sid = item.snapshotID() self.updateFilesView.emit(2) def iterItems(self): for index in range(self.topLevelItemCount()): yield self.topLevelItem(index) def iterSnapshotItems(self): for item in self.iterItems(): if isinstance(item, SnapshotItem): yield item def iterHeaderItems(self): for item in self.iterItems(): if isinstance(item, HeaderItem): yield item class TimeLineItem(QTreeWidgetItem): def __lt__(self, other): return self.snapshotID() < other.snapshotID() def snapshotID(self): return self.data(0, Qt.UserRole) class SnapshotItem(TimeLineItem): def __init__(self, sid): super(SnapshotItem, self).__init__() self.setText(0, sid.displayName) self.setFont(0, fontNormal(self.font(0))) self.setData(0, Qt.UserRole, sid) if sid.isRoot: self.setToolTip(0, _('This is NOT a snapshot but a live view of your local files')) else: self.setToolTip(0, _('Last check %s') %sid.lastChecked) def updateText(self): sid = self.snapshotID() self.setText(0, sid.displayName) class HeaderItem(TimeLineItem): def __init__(self, name, sid): super(HeaderItem, self).__init__() self.setText(0, name) self.setFont(0, fontBold(self.font(0))) self.setBackground(0, QColor(196, 196, 196)) self.setForeground(0, QColor(60, 60, 60)) self.setFlags(Qt.NoItemFlags) self.setData(0, Qt.UserRole, sid) class SortedComboBox(QComboBox): #prevent inserting items abroad from addItem because this would break sorting insertItem = NotImplemented def __init__(self, parent = None): super(SortedComboBox, self).__init__(parent) self.sortOrder = Qt.AscendingOrder self.sortRole = Qt.DisplayRole def addItem(self, text, userData = None): """ QComboBox doesn't support sorting so this little hack is used to insert items in sorted order. """ if self.sortRole == Qt.UserRole: sortObject = userData else: sortObject = text l = [self.itemData(i, self.sortRole) for i in range(self.count())] l.append(sortObject) l.sort(reverse = self.sortOrder) index = l.index(sortObject) super(SortedComboBox, self).insertItem(index, text, userData) def checkSelection(self): if self.currentIndex() < 0: self.setCurrentIndex(0) class SnapshotCombo(SortedComboBox): def __init__(self, parent = None): super(SnapshotCombo, self).__init__(parent) self.sortOrder = Qt.DescendingOrder self.sortRole = Qt.UserRole def addSnapshotID(self, sid): assert isinstance(sid, snapshots.SID), 'sid is not snapshots.SID type: {}'.format(sid) self.addItem(sid.displayName, sid) def currentSnapshotID(self): return self.itemData(self.currentIndex()) def setCurrentSnapshotID(self, sid): for i in range(self.count()): if self.itemData(i) == sid: self.setCurrentIndex(i) break class ProfileCombo(SortedComboBox): def __init__(self, parent): super(ProfileCombo, self).__init__(parent) self.getName = parent.config.profileName def addProfileID(self, profileID): self.addItem(self.getName(profileID), profileID) def currentProfileID(self): return self.itemData(self.currentIndex()) def setCurrentProfileID(self, profileID): for i in range(self.count()): if self.itemData(i) == profileID: self.setCurrentIndex(i) break class Menu(QMenu): """ Subclass QMenu to add ToolTips """ def event(self, e): action = self.activeAction() if e.type() == QEvent.ToolTip and \ action and \ action.toolTip() != action.text(): QToolTip.showText(e.globalPos(), self.activeAction().toolTip()) else: QToolTip.hideText() return super(Menu, self).event(e) backintime-1.2.1/qt/net.launchpad.backintime.serviceHelper.conf0000644000175000017500000000160313530533316024062 0ustar germargermar system backintime-1.2.1/qt/backintime-qt0000755000175000017500000000220413530533316016237 0ustar germargermar#!/bin/sh # Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #fixing gray window error #https://launchpad.net/bugs/1493020 export QT_GRAPHICSSYSTEM="native" CUR_PATH="$(dirname $(readlink -m $0))" if [ -f "${CUR_PATH}/app.py" ]; then APP_PATH=$CUR_PATH else APP_PATH=$(readlink -m "${CUR_PATH}/../share/backintime/qt") fi python3 -Es ${APP_PATH}/app.py "$@" backintime-1.2.1/qt/snapshotsdialog.py0000644000175000017500000003616113530533316017346 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import gettext import subprocess import shlex from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import tools import restoredialog import messagebox import qttools import snapshots _=gettext.gettext if tools.checkCommand('meld'): DIFF_CMD = 'meld' DIFF_PARAMS = '%1 %2' elif tools.checkCommand('kompare'): DIFF_CMD = 'kompare' DIFF_PARAMS = '%1 %2' else: DIFF_CMD = 'false' DIFF_PARAMS = '%1 %2' class DiffOptionsDialog(QDialog): def __init__(self, parent): super(DiffOptionsDialog, self).__init__(parent) self.config = parent.config import icon self.setWindowIcon(icon.DIFF_OPTIONS) self.setWindowTitle(_('Diff Options')) self.mainLayout = QGridLayout(self) self.diffCmd = self.config.strValue('qt.diff.cmd', DIFF_CMD) self.diffParams = self.config.strValue('qt.diff.params', DIFF_PARAMS) self.mainLayout.addWidget(QLabel(_('Command:')), 0, 0) self.editCmd = QLineEdit(self.diffCmd, self) self.mainLayout.addWidget(self.editCmd, 0, 1) self.mainLayout.addWidget(QLabel(_('Parameters:')), 1, 0) self.editParams = QLineEdit(self.diffParams, self) self.mainLayout.addWidget(self.editParams, 1, 1) self.mainLayout.addWidget(QLabel(_('Use %1 and %2 for path parameters')), 2, 1) buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) self.mainLayout.addWidget(buttonBox, 3, 0, 3, 2) def accept(self): diffCmd = str(self.editCmd.text().toUtf8()) diffParams = str(self.editParams.text().toUtf8()) if diffCmd != self.diffCmd or diffParams != self.diffParams: self.config.setStrValue('qt.diff.cmd', diffCmd) self.config.setStrValue('qt.diff.params', diffParams) self.config.save() super(DiffOptionsDialog, self).accept() class SnapshotsDialog(QDialog): def __init__(self, parent, sid, path): super(SnapshotsDialog, self).__init__(parent) self.parent = parent self.config = parent.config self.snapshots = parent.snapshots self.snapshotsList = parent.snapshotsList self.qapp = parent.qapp import icon self.sid = sid self.path = path self.setWindowIcon(icon.SNAPSHOTS) self.setWindowTitle(_('Snapshots')) self.mainLayout = QVBoxLayout(self) #path self.editPath = QLineEdit(self.path, self) self.editPath.setReadOnly(True) self.mainLayout.addWidget(self.editPath) #list different snapshots only self.cbOnlyDifferentSnapshots = QCheckBox(_('List only different snapshots'), self) self.mainLayout.addWidget(self.cbOnlyDifferentSnapshots) self.cbOnlyDifferentSnapshots.stateChanged.connect(self.cbOnlyDifferentSnapshotsChanged) #list equal snapshots only layout = QHBoxLayout() self.mainLayout.addLayout(layout) self.cbOnlyEqualSnapshots = QCheckBox(_('List only equal snapshots to: '), self) self.cbOnlyEqualSnapshots.stateChanged.connect(self.cbOnlyEqualSnapshotsChanged) layout.addWidget(self.cbOnlyEqualSnapshots) self.comboEqualTo = qttools.SnapshotCombo(self) self.comboEqualTo.currentIndexChanged.connect(self.comboEqualToChanged) self.comboEqualTo.setEnabled(False) layout.addWidget(self.comboEqualTo) #deep check self.cbDeepCheck = QCheckBox(_('Deep check (more accurate, but slow)'), self) self.mainLayout.addWidget(self.cbDeepCheck) self.cbDeepCheck.stateChanged.connect(self.cbDeepCheckChanged) #toolbar self.toolbar = QToolBar(self) self.toolbar.setFloatable(False) self.mainLayout.addWidget(self.toolbar) #toolbar restore menuRestore = QMenu(self) action = menuRestore.addAction(icon.RESTORE, _('Restore')) action.triggered.connect(self.restoreThis) action = menuRestore.addAction(icon.RESTORE_TO, _('Restore to ...')) action.triggered.connect(self.restoreThisTo) self.btnRestore = self.toolbar.addAction(icon.RESTORE, _('Restore')) self.btnRestore.setMenu(menuRestore) self.btnRestore.triggered.connect(self.restoreThis) #btn delete self.btnDelete = self.toolbar.addAction(icon.DELETE_FILE, _('Delete')) self.btnDelete.triggered.connect(self.btnDeleteClicked) #btn select_all self.btnSelectAll = self.toolbar.addAction(icon.SELECT_ALL, _('Select All')) self.btnSelectAll.triggered.connect(self.btnSelectAllClicked) #snapshots list self.timeLine = qttools.TimeLine(self) self.mainLayout.addWidget(self.timeLine) self.timeLine.itemSelectionChanged.connect(self.timeLineChanged) self.timeLine.itemActivated.connect(self.timeLineExecute) #diff layout = QHBoxLayout() self.mainLayout.addLayout(layout) self.btnDiff = QPushButton(_('Diff'), self) layout.addWidget(self.btnDiff) self.btnDiff.clicked.connect(self.btnDiffClicked) self.comboDiff = qttools.SnapshotCombo(self) layout.addWidget(self.comboDiff, 2) #buttons buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.btnGoto = buttonBox.button(QDialogButtonBox.Ok) self.btnCancel = buttonBox.button(QDialogButtonBox.Cancel) self.btnGoto.setText(_('Go To')) btnDiffOptions = buttonBox.addButton(_('Diff Options'), QDialogButtonBox.HelpRole) btnDiffOptions.setIcon(icon.DIFF_OPTIONS) self.mainLayout.addWidget(buttonBox) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) btnDiffOptions.clicked.connect(self.btnDiffOptionsClicked) # self.cbDeepCheck.setEnabled(False) full_path = self.sid.pathBackup(self.path) if os.path.islink(full_path): self.cbDeepCheck.hide() elif os.path.isdir(full_path): self.cbOnlyDifferentSnapshots.hide() self.cbOnlyEqualSnapshots.hide() self.comboEqualTo.hide() self.cbDeepCheck.hide() #update list and combobox self.UpdateSnapshotsAndComboEqualTo() def addSnapshot(self, sid): self.timeLine.addSnapshot(sid) #add to combo self.comboDiff.addSnapshotID(sid) if self.sid == sid: self.comboDiff.setCurrentSnapshotID(sid) self.comboDiff.checkSelection() def updateSnapshots(self): self.timeLine.clear() self.comboDiff.clear() equal_to_sid = self.comboEqualTo.currentSnapshotID() if self.cbOnlyEqualSnapshots.isChecked() and equal_to_sid: equal_to = equal_to_sid.pathBackup(self.path) else: equal_to = False snapshotsFiltered = self.snapshots.filter(self.sid, self.path, self.snapshotsList, self.cbOnlyDifferentSnapshots.isChecked(), self.cbDeepCheck.isChecked(), equal_to) for sid in snapshotsFiltered: self.addSnapshot(sid) self.updateToolbar() def UpdateComboEqualTo(self): self.comboEqualTo.clear() snapshotsFiltered = self.snapshots.filter(self.sid, self.path, self.snapshotsList) for sid in snapshotsFiltered: self.comboEqualTo.addSnapshotID(sid) if sid == self.sid: self.comboEqualTo.setCurrentSnapshotID(sid) self.comboEqualTo.checkSelection() def UpdateSnapshotsAndComboEqualTo(self): self.updateSnapshots() self.UpdateComboEqualTo() def cbOnlyDifferentSnapshotsChanged(self): enabled = self.cbOnlyDifferentSnapshots.isChecked() self.cbOnlyEqualSnapshots.setEnabled(not enabled) self.cbDeepCheck.setEnabled(enabled) self.updateSnapshots() def cbOnlyEqualSnapshotsChanged(self): enabled = self.cbOnlyEqualSnapshots.isChecked() self.comboEqualTo.setEnabled(enabled) self.cbOnlyDifferentSnapshots.setEnabled(not enabled) self.cbDeepCheck.setEnabled(enabled) self.updateSnapshots() def cbDeepCheckChanged(self): self.updateSnapshots() def updateToolbar(self): sids = self.timeLine.selectedSnapshotIDs() if not sids: enable_restore = False enable_delete = False elif len(sids) == 1: enable_restore = not sids[0].isRoot enable_delete = not sids[0].isRoot else: enable_restore = False enable_delete = True for sid in sids: if sid.isRoot: enable_delete = False self.btnRestore.setEnabled(enable_restore) self.btnDelete.setEnabled(enable_delete) def restoreThis(self): sid = self.timeLine.currentSnapshotID() if not sid.isRoot: restoredialog.restore(self, sid, self.path) def restoreThisTo(self): sid = self.timeLine.currentSnapshotID() if not sid.isRoot: restoredialog.restore(self, sid, self.path, None) def timeLineChanged(self): self.updateToolbar() def timeLineExecute(self, item, column): if self.qapp.keyboardModifiers() and Qt.ControlModifier: return sid = self.timeLine.currentSnapshotID() if not sid: return full_path = sid.pathBackup(self.path) if not os.path.exists(full_path): return # prevent backup data from being accidentally overwritten # by create a temporary local copy and only open that one if not isinstance(self.sid, snapshots.RootSnapshot): full_path = self.parent.tmpCopy(full_path, sid) self.run = QDesktopServices.openUrl(QUrl(full_path)) def btnDiffClicked(self): sid1 = self.timeLine.currentSnapshotID() sid2 = self.comboDiff.currentSnapshotID() if not sid1 or not sid2: return path1 = sid1.pathBackup(self.path) path2 = sid2.pathBackup(self.path) #check if the 2 paths are different if path1 == path2: messagebox.critical(self, _('You can\'t compare a snapshot to itself')) return diffCmd = self.config.strValue('qt.diff.cmd', DIFF_CMD) diffParams = self.config.strValue('qt.diff.params', DIFF_PARAMS) if not tools.checkCommand(diffCmd): messagebox.critical(self, _('Command not found: %s') % diffCmd) return # prevent backup data from being accidentally overwritten # by create a temporary local copy and only open that one if not isinstance(sid1, snapshots.RootSnapshot): path1 = self.parent.tmpCopy(path1, sid1) if not isinstance(sid2, snapshots.RootSnapshot): path2 = self.parent.tmpCopy(path2, sid2) params = diffParams params = params.replace('%1', '"%s"' %path1) params = params.replace('%2', '"%s"' %path2) cmd = diffCmd + ' ' + params subprocess.Popen(shlex.split(cmd)) def btnDiffOptionsClicked(self): DiffOptionsDialog(self).exec_() def comboEqualToChanged(self, index): self.updateSnapshots() def btnDeleteClicked(self): items = self.timeLine.selectedItems() if not items: return elif len(items) == 1: msg = _('Do you really want to delete "%(file)s" in snapshot "%(snapshot_id)s?\n') \ % {'file' : self.path, 'snapshot_id' : items[0].snapshotID()} else: msg = _('Do you really want to delete "%(file)s" in %(count)d snapshots?\n') \ % {'file' : self.path, 'count' : len(items)} msg += _('WARNING: This can not be revoked!') if QMessageBox.Yes == messagebox.warningYesNo(self, msg): for item in items: item.setFlags(Qt.NoItemFlags) thread = RemoveFileThread(self, items) thread.started.connect(lambda: self.btnGoto.setDisabled(True)) thread.finished.connect(lambda: self.btnGoto.setDisabled(False)) thread.started.connect(lambda: self.btnDelete.setDisabled(True)) thread.finished.connect(lambda: self.btnDelete.setDisabled(False)) thread.finished.connect(self.UpdateSnapshotsAndComboEqualTo) self.btnCancel.clicked.connect(thread.terminate) thread.start() exclude = self.config.exclude() msg = _('Exclude "%s" from future snapshots?' % self.path) if self.path not in exclude and QMessageBox.Yes == messagebox.warningYesNo(self, msg): exclude.append(self.path) self.config.setExclude(exclude) def btnSelectAllClicked(self): """ select all expect 'Now' """ self.timeLine.clearSelection() for item in self.timeLine.iterSnapshotItems(): if not isinstance(item.snapshotID(), snapshots.RootSnapshot): item.setSelected(True) def accept(self): sid = self.timeLine.currentSnapshotID() if sid: self.sid = sid super(SnapshotsDialog, self).accept() class RemoveFileThread(QThread): """ remove files in background thread so GUI will not freeze """ def __init__(self, parent, items): self.parent = parent self.config = parent.config self.snapshots = parent.snapshots self.items = items super(RemoveFileThread, self).__init__(parent) def run(self): #inhibit suspend/hibernate during delete self.config.inhibitCookie = tools.inhibitSuspend(toplevel_xid = self.config.xWindowId, reason = 'deleting files') for item in self.items: self.snapshots.deletePath(item.snapshotID(), self.parent.path) try: item.setHidden(True) except RuntimeError: #item has been deleted #probably because user refreshed treeview pass #release inhibit suspend if self.config.inhibitCookie: self.config.inhibitCookie = tools.unInhibitSuspend(*self.config.inhibitCookie) backintime-1.2.1/qt/configure0000755000175000017500000001652613530533316015504 0ustar germargermar#!/bin/sh #clean up if [ -e Makefile ]; then rm Makefile; fi #tmp files MAKEFILE="$(mktemp)" UNINSTALL_FILES="$(mktemp)" UNINSTALL_DIRS="$(mktemp)" #set default options PYTHON="--python3" USR_BIN_FILES="backintime-qt backintime-qt_polkit" DBUS_SERVICE_FILES="net.launchpad.backintime.serviceHelper.service" usage () { echo "Usage:" echo "$0 [--python | --python3]" echo "" echo "--python" echo "\tuse 'python' to start Python3" echo "--python3" echo "\tuse 'python3' to start Python3" } addInstallFiles () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi for i in $(ls $file); do addInstallFile "$i" "$dest" "$mode" done } addInstallFile () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi printf "\tinstall --mode=$mode $file \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallFile "$file" "$dest" } addInstallFileRename () { file=$1 dest=$2 mode=$3 if [ -z "$mode" ]; then mode=644 fi printf "\tinstall --mode=$mode $file \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallFileRename "$dest" } addUninstallFile () { file=$(basename "$1") dest=$2 printf "\trm -f \$(DEST)$dest/$file\n" >> ${UNINSTALL_FILES} } addUninstallFileRename () { file=$1 printf "\trm -f \$(DEST)$file\n" >> ${UNINSTALL_FILES} } addInstallDir () { dest=$1 printf "\tinstall -d \$(DEST)$dest\n" >> ${MAKEFILE} addUninstallDir "$dest" } addUninstallDir () { dest=$1 printf "\tif [ -d \$(DEST)$dest ]; then rmdir --ignore-fail-on-non-empty \$(DEST)$dest; fi\n" >> ${UNINSTALL_DIRS} } addComment () { printf "\t#install $1\n" >> ${MAKEFILE} printf "\t#uninstall files $1\n" >> ${UNINSTALL_FILES} printf "\t#uninstall directory $1\n" >> ${UNINSTALL_DIRS} } addNewline () { printf "\n" >> ${MAKEFILE} printf "\n" >> ${UNINSTALL_FILES} printf "\n" >> ${UNINSTALL_DIRS} } #get commandline arguments unknown_args="" for arg in $*; do case $arg in --python | --python3) PYTHON=$arg;; --help | -h) usage; exit 0;; *) unknown_args="$unknown_args $arg";; esac done if [ -n "$unknown_args" ]; then echo "Unknown Arguments: $unknown_args" fi #patch python command #use 'python' or 'python3' to start Python Version 3.x case $PYTHON in --python) PYVERSION="" ;; --python3) PYVERSION="3";; esac sed -e "s#^python3\? #python${PYVERSION} #g" \ -e "s#^ssh-agent python3\? #ssh-agent python${PYVERSION} #g" \ -i $USR_BIN_FILES sed -e "s#^Exec=/usr/bin/python3\? #Exec=/usr/bin/python${PYVERSION} #g" \ -i $DBUS_SERVICE_FILES #start Makefile printf "PREFIX=/usr\n" >> ${MAKEFILE} printf "DEST=\$(DESTDIR)\$(PREFIX)\n\n" >> ${MAKEFILE} printf "all:\tbuild\n\n" >> ${MAKEFILE} printf "build:\tcompress\n\n" >> ${MAKEFILE} printf "clean:\n" >> ${MAKEFILE} printf "\trm -f po/*.mo\n" >> ${MAKEFILE} printf "\trm -f man/C/*.gz\n\n" >> ${MAKEFILE} #create install and uninstall target printf "install:\n" >> ${MAKEFILE} addComment "python" addUninstallDir "/share/backintime/qt/__pycache__" addUninstallFile "*.pyc" "/share/backintime/qt/__pycache__" addInstallDir "/share/backintime/qt" addInstallFiles "*.py" "/share/backintime/qt" addNewline addComment "plugin" addUninstallDir "/share/backintime/plugins/__pycache__" addUninstallFile "*.pyc" "/share/backintime/plugins/__pycache__" addInstallDir "/share/backintime/plugins" addInstallFiles "plugins/*.py" "/share/backintime/plugins" addUninstallDir "/share/backintime" addNewline addComment "application" addInstallDir "/bin" addInstallFile "backintime-qt" "/bin" "755" addInstallFile "backintime-qt_polkit" "/bin" "755" addNewline addComment "dbus service" addInstallDir "/share/dbus-1/system-services" addInstallFiles "net.launchpad.backintime*.service" "/share/dbus-1/system-services" addUninstallDir "/share/dbus-1" addNewline addComment "dbus conf" addInstallDir "/../etc/dbus-1/system.d" addInstallFiles "net.launchpad.backintime*.conf" "/../etc/dbus-1/system.d" addUninstallDir "/../etc/dbus-1" addUninstallDir "/../etc" addNewline addComment "polkit action" addInstallDir "/share/polkit-1/actions" addInstallFiles "net.launchpad.backintime*.policy" "/share/polkit-1/actions" addUninstallDir "/share/polkit-1" addNewline addComment "documentation" addInstallDir "/share/doc/backintime-qt" addInstallFile "../debian/copyright" "/share/doc/backintime-qt" addInstallFile "../AUTHORS" "/share/doc/backintime-qt" addInstallFile "../LICENSE" "/share/doc/backintime-qt" addInstallFile "../README.md" "/share/doc/backintime-qt" addInstallFile "../TRANSLATIONS" "/share/doc/backintime-qt" addInstallFile "../VERSION" "/share/doc/backintime-qt" addInstallFile "../CHANGES" "/share/doc/backintime-qt" addNewline addComment ".desktop" addInstallDir "/share/applications" addInstallFiles "*.desktop" "/share/applications" addNewline addComment "docbook" addInstallDir "/share/doc/qt/HTML/en/backintime" addInstallFiles "docbook/en/*.docbook" "/share/doc/qt/HTML/en/backintime" addUninstallDir "/share/doc/qt/HTML/en" addUninstallDir "/share/doc/qt/HTML" addUninstallDir "/share/doc/qt" addUninstallDir "/share/doc" addNewline addComment "man" addInstallDir "/share/man/man1" addInstallFile "man/C/backintime-qt.1.gz" "/share/man/man1" addUninstallDir "/share/man" addNewline addComment "icons" for f in "scalable" "48x48" "32x32" "24x24" "22x22" "16x16"; do addInstallDir "/share/icons/hicolor/${f}/actions" addInstallFile "icons/${f}/actions/show-hidden.svg" "/share/icons/hicolor/${f}/actions" addUninstallDir "/share/icons/hicolor/${f}" done addUninstallDir "/share/icons/hicolor" addUninstallDir "/share/icons" addUninstallDir "/share" addNewline #compress printf "compress:\n" >> ${MAKEFILE} printf "\t#man pages\n" >> ${MAKEFILE} printf "\tfor i in \$\$(ls -1 man/C/); do case \$\$i in *.gz|*~) continue;; *) gzip -n --best -c man/C/\$\$i > man/C/\$\${i}.gz;; esac; done\n\n" >> ${MAKEFILE} #uninstall printf "uninstall: uninstall_files uninstall_dirs\n\n" >> ${MAKEFILE} printf "uninstall_files:\n" >> ${MAKEFILE} cat ${UNINSTALL_FILES} >> ${MAKEFILE} printf "uninstall_dirs:\n" >> ${MAKEFILE} cat ${UNINSTALL_DIRS} >> ${MAKEFILE} #copy Makefile mv ${MAKEFILE} Makefile chmod 644 Makefile #clean up for i in "${UNINSTALL_FILES}" "${UNINSTALL_DIRS}"; do if [ -e "$i" ]; then rm "$i" fi done #check python version if [ $(python${PYVERSION} --version 2>&1 | grep -c "^Python 3") -ne 1 ]; then printf "Wrong Python version.\n" printf "Please make sure Python 3.x is used by adding '--python' or '--python3'.\n" exit 1 fi printf "All OK. Now run:\n" printf " make\n" printf " sudo make install\n" backintime-1.2.1/qt/icons/0000755000175000017500000000000013530533316014676 5ustar germargermarbackintime-1.2.1/qt/icons/scalable/0000755000175000017500000000000013530533316016444 5ustar germargermarbackintime-1.2.1/qt/icons/scalable/actions/0000755000175000017500000000000013530533316020104 5ustar germargermarbackintime-1.2.1/qt/icons/scalable/actions/show-hidden.svg0000644000175000017500000003332413530533316023043 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/icons/32x32/0000755000175000017500000000000013530533316015457 5ustar germargermarbackintime-1.2.1/qt/icons/32x32/actions/0000755000175000017500000000000013530533316017117 5ustar germargermarbackintime-1.2.1/qt/icons/32x32/actions/show-hidden.svg0000644000175000017500000003337513530533316022064 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/icons/48x48/0000755000175000017500000000000013530533316015475 5ustar germargermarbackintime-1.2.1/qt/icons/48x48/actions/0000755000175000017500000000000013530533316017135 5ustar germargermarbackintime-1.2.1/qt/icons/48x48/actions/show-hidden.svg0000644000175000017500000003332413530533316022074 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/icons/16x16/0000755000175000017500000000000013530533316015463 5ustar germargermarbackintime-1.2.1/qt/icons/16x16/actions/0000755000175000017500000000000013530533316017123 5ustar germargermarbackintime-1.2.1/qt/icons/16x16/actions/show-hidden.svg0000644000175000017500000003336713530533316022071 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/icons/22x22/0000755000175000017500000000000013530533316015455 5ustar germargermarbackintime-1.2.1/qt/icons/22x22/actions/0000755000175000017500000000000013530533316017115 5ustar germargermarbackintime-1.2.1/qt/icons/22x22/actions/show-hidden.svg0000644000175000017500000003345413530533316022060 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/icons/24x24/0000755000175000017500000000000013530533316015461 5ustar germargermarbackintime-1.2.1/qt/icons/24x24/actions/0000755000175000017500000000000013530533316017121 5ustar germargermarbackintime-1.2.1/qt/icons/24x24/actions/show-hidden.svg0000644000175000017500000003345013530533316022060 0ustar germargermar show-hidden image/svg+xml show-hidden 2015-12-22 Germar Reitze eye Icon for showing hidden files in BackInTime https://github.com/bit-team/backintime backintime-1.2.1/qt/net.launchpad.backintime.policy0000644000175000017500000000353513530533316021643 0ustar germargermar BackInTime https://github.com/bit-team/backintime document-save Authentication is required to run Back In Time as root. Start Back In Time GUI as root. auth_admin auth_admin auth_admin_keep /usr/bin/backintime-qt true Authentication is required to add Udev rules. This will install Udev rules which will start Back In Time if a drive get connected. auth_admin auth_admin_keep auth_admin_keep Authentication is required to delete Udev rules. This will delete Udev rules. auth_admin auth_admin_keep auth_admin_keep backintime-1.2.1/qt/logviewdialog.py0000644000175000017500000002327213530533316016777 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import gettext from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import qttools import snapshots import encfstools import snapshotlog import tools import messagebox _=gettext.gettext class LogViewDialog(QDialog): def __init__(self, parent, sid = None, systray = False): if systray: super(LogViewDialog, self).__init__() else: super(LogViewDialog, self).__init__(parent) self.config = parent.config self.snapshots = parent.snapshots self.mainWindow = parent self.sid = sid self.enableUpdate = False self.decode = None w = self.config.intValue('qt.logview.width', 800) h = self.config.intValue('qt.logview.height', 500) self.resize(w, h) import icon self.setWindowIcon(icon.VIEW_SNAPSHOT_LOG) if self.sid is None: self.setWindowTitle(_('Last Log View')) else: self.setWindowTitle(_('Snapshot Log View')) self.mainLayout = QVBoxLayout(self) layout = QHBoxLayout() self.mainLayout.addLayout(layout) #profiles self.lblProfile = QLabel(_('Profile:'), self) layout.addWidget(self.lblProfile) self.comboProfiles = qttools.ProfileCombo(self) layout.addWidget(self.comboProfiles, 1) self.comboProfiles.currentIndexChanged.connect(self.profileChanged) #snapshots self.lblSnapshots = QLabel(_('Snapshots') + ':', self) layout.addWidget(self.lblSnapshots) self.comboSnapshots = qttools.SnapshotCombo(self) layout.addWidget(self.comboSnapshots, 1) self.comboSnapshots.currentIndexChanged.connect(self.comboSnapshotsChanged) if self.sid is None: self.lblSnapshots.hide() self.comboSnapshots.hide() if self.sid or systray: self.lblProfile.hide() self.comboProfiles.hide() #filter layout.addWidget(QLabel(_('Filter:'))) self.comboFilter = QComboBox(self) layout.addWidget(self.comboFilter, 1) self.comboFilter.currentIndexChanged.connect(self.comboFilterChanged) self.comboFilter.addItem(_('All'), 0) self.comboFilter.addItem(' + '.join((_('Errors'), _('Changes'))), 4) self.comboFilter.setCurrentIndex(self.comboFilter.count() - 1) self.comboFilter.addItem(_('Errors'), 1) self.comboFilter.addItem(_('Changes'), 2) self.comboFilter.addItem(_('Informations'), 3) #text view self.txtLogView = QPlainTextEdit(self) self.txtLogView.setFont(QFont('Monospace')) self.txtLogView.setReadOnly(True) self.txtLogView.setLineWrapMode(QPlainTextEdit.NoWrap) self.mainLayout.addWidget(self.txtLogView) # self.mainLayout.addWidget(QLabel(_('[E] Error, [I] Information, [C] Change'))) #decode path self.cbDecode = QCheckBox(_('decode paths'), self) self.cbDecode.stateChanged.connect(self.cbDecodeChanged) self.mainLayout.addWidget(self.cbDecode) #buttons buttonBox = QDialogButtonBox(QDialogButtonBox.Close) self.mainLayout.addWidget(buttonBox) buttonBox.rejected.connect(self.close) self.updateSnapshots() self.updateDecode() self.updateProfiles() # watch for changes in log file self.watcher = QFileSystemWatcher(self) if self.sid is None: # only watch if we show the last log log = self.config.takeSnapshotLogFile(self.comboProfiles.currentProfileID()) self.watcher.addPath(log) self.watcher.fileChanged.connect(self.updateLog) self.txtLogView.setContextMenuPolicy(Qt.CustomContextMenu) self.txtLogView.customContextMenuRequested.connect(self.contextMenuClicked) def cbDecodeChanged(self): if self.cbDecode.isChecked(): if not self.decode: self.decode = encfstools.Decode(self.config) else: if not self.decode is None: self.decode.close() self.decode = None self.updateLog() def profileChanged(self, index): if not self.enableUpdate: return profile_id = self.comboProfiles.currentProfileID() self.mainWindow.comboProfiles.setCurrentProfileID(profile_id) self.mainWindow.comboProfileChanged(None) self.updateDecode() self.updateLog() def comboSnapshotsChanged(self, index): if not self.enableUpdate: return self.sid = self.comboSnapshots.currentSnapshotID() self.updateLog() def comboFilterChanged(self, index): self.updateLog() def contextMenuClicked(self, point): menu = QMenu() clipboard = qttools.createQApplication().clipboard() cursor = self.txtLogView.textCursor() btnCopy = menu.addAction(_('Copy')) btnCopy.triggered.connect(lambda: clipboard.setText(cursor.selectedText())) btnCopy.setEnabled(cursor.hasSelection()) btnAddExclude = menu.addAction(_('Add to Exclude')) btnAddExclude.triggered.connect(self.btnAddExcludeClicked) btnAddExclude.setEnabled(cursor.hasSelection()) btnDecode = menu.addAction(_('Decode')) btnDecode.triggered.connect(self.btnDecodeClicked) btnDecode.setEnabled(cursor.hasSelection()) btnDecode.setVisible(self.config.snapshotsMode() == 'ssh_encfs') menu.exec_(self.txtLogView.mapToGlobal(point)) def btnAddExcludeClicked(self): exclude = self.config.exclude() path = self.txtLogView.textCursor().selectedText().strip() if not path or path in exclude: return edit = QLineEdit(self) edit.setText(path) edit.setMinimumWidth(600) options = {'widget': edit, 'retFunc': edit.text, 'id': 'path'} confirm, opt = messagebox.warningYesNoOptions(self, _("Do you want to exclude this?"), (options, )) if not confirm: return exclude.append(opt['path']) self.config.setExclude(exclude) def btnDecodeClicked(self): if not self.decode: self.decode = encfstools.Decode(self.config) cursor = self.txtLogView.textCursor() selection = cursor.selectedText().strip() plain = self.decode.path(selection) cursor.insertText(plain) def updateProfiles(self): current_profile_id = self.config.currentProfile() self.comboProfiles.clear() profiles = self.config.profilesSortedByName() for profile_id in profiles: self.comboProfiles.addProfileID(profile_id) if profile_id == current_profile_id: self.comboProfiles.setCurrentProfileID(profile_id) self.enableUpdate = True self.updateLog() if len(profiles) <= 1: self.lblProfile.setVisible(False) self.comboProfiles.setVisible(False) def updateSnapshots(self): if self.sid: self.comboSnapshots.clear() for sid in snapshots.iterSnapshots(self.config): self.comboSnapshots.addSnapshotID(sid) if sid == self.sid: self.comboSnapshots.setCurrentSnapshotID(sid) def updateDecode(self): if self.config.snapshotsMode() == 'ssh_encfs': self.cbDecode.show() else: self.cbDecode.hide() if self.cbDecode.isChecked(): self.cbDecode.setChecked(False) def updateLog(self, watchPath = None): if not self.enableUpdate: return mode = self.comboFilter.itemData(self.comboFilter.currentIndex()) if watchPath and self.sid is None: # remove path from watch to prevent multiple updates at the same time self.watcher.removePath(watchPath) # append only new lines to txtLogView log = snapshotlog.SnapshotLog(self.config, self.comboProfiles.currentProfileID()) for line in log.get(mode = mode, decode = self.decode, skipLines = self.txtLogView.document().lineCount() - 1): self.txtLogView.appendPlainText(line) # re-add path to watch after 5sec delay alarm = tools.Alarm(callback = lambda: self.watcher.addPath(watchPath), overwrite = False) alarm.start(5) elif self.sid is None: log = snapshotlog.SnapshotLog(self.config, self.comboProfiles.currentProfileID()) self.txtLogView.setPlainText('\n'.join(log.get(mode = mode, decode = self.decode))) else: self.txtLogView.setPlainText('\n'.join(self.sid.log(mode, decode = self.decode))) def closeEvent(self, event): self.config.setIntValue('qt.logview.width', self.width()) self.config.setIntValue('qt.logview.height', self.height()) event.accept() backintime-1.2.1/qt/settingsdialog.py0000644000175000017500000026227213530533316017170 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze, Taylor Raack # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import datetime import gettext import copy import grp import re from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import config import tools import qttools import mount import messagebox import snapshots import sshtools import logger from exceptions import MountException, NoPubKeyLogin, KnownHost _=gettext.gettext class SettingsDialog(QDialog): def __init__(self, parent): super(SettingsDialog, self).__init__(parent) self.parent = parent self.config = parent.config self.snapshots = parent.snapshots self.configDictCopy = copy.copy(self.config.dict) self.originalCurrentProfile = self.config.currentProfile() import icon self.icon = icon self.config.setQuestionHandler(self.questionHandler) self.config.setErrorHandler(self.errorHandler) self.setWindowIcon(icon.SETTINGS_DIALOG) self.setWindowTitle(_('Settings')) self.mainLayout = QVBoxLayout(self) #profiles layout = QHBoxLayout() self.mainLayout.addLayout(layout) layout.addWidget(QLabel(_('Profile:'), self)) self.firstUpdateAll = True self.disableProfileChanged = True self.comboProfiles = qttools.ProfileCombo(self) layout.addWidget(self.comboProfiles, 1) self.comboProfiles.currentIndexChanged.connect(self.profileChanged) self.disableProfileChanged = False self.btnEditProfile = QPushButton(icon.PROFILE_EDIT, _('Edit'), self) self.btnEditProfile.clicked.connect(self.editProfile) layout.addWidget(self.btnEditProfile) # update to full system backup button self.btnModifyProfileForFullSystemBackup = QPushButton(icon.ADD, _('Modify for Full System Backup'), self) self.btnModifyProfileForFullSystemBackup.clicked.connect(self.modifyProfileForFullSystemBackup) layout.addWidget(self.btnModifyProfileForFullSystemBackup) # hide 'full system backup button' until all dev regarding this is done self.btnModifyProfileForFullSystemBackup.hide() self.btnAddProfile = QPushButton(icon.ADD, _('Add'), self) self.btnAddProfile.clicked.connect(self.addProfile) layout.addWidget(self.btnAddProfile) self.btnRemoveProfile = QPushButton(icon.REMOVE, _('Remove'), self) self.btnRemoveProfile.clicked.connect(self.removeProfile) layout.addWidget(self.btnRemoveProfile) #TABs self.tabs = QTabWidget(self) self.mainLayout.addWidget(self.tabs) #occupy whole space for tabs scrollButtonDefault = self.tabs.usesScrollButtons() self.tabs.setUsesScrollButtons(False) #TAB: General scrollArea = QScrollArea(self) scrollArea.setFrameStyle(QFrame.NoFrame) self.tabs.addTab(scrollArea, _('General')) layoutWidget = QWidget(self) layout = QVBoxLayout(layoutWidget) #select mode self.mode = None vlayout = QVBoxLayout() layout.addLayout(vlayout) self.lblModes = QLabel(_('Mode:'), self) self.comboModes = QComboBox(self) hlayout = QHBoxLayout() hlayout.addWidget(self.lblModes) hlayout.addWidget(self.comboModes, 1) vlayout.addLayout(hlayout) store_modes = {} for key in list(self.config.SNAPSHOT_MODES.keys()): store_modes[key] = self.config.SNAPSHOT_MODES[key][1] self.fillCombo(self.comboModes, store_modes) #encfs security warning self.encfsWarning = QLabel(_("Warning: %(app)s uses EncFS for encryption. A recent security audit " "revealed several possible attack vectors for this. " "Please take a look at 'A NOTE ON SECURITY' in 'man backintime'.") \ % {'app': self.config.APP_NAME}) self.encfsWarning.setWordWrap(True) layout.addWidget(self.encfsWarning) #Where to save snapshots groupBox = QGroupBox(self) self.modeLocal = groupBox groupBox.setTitle(_('Where to save snapshots')) layout.addWidget(groupBox) vlayout = QVBoxLayout(groupBox) hlayout = QHBoxLayout() vlayout.addLayout(hlayout) self.editSnapshotsPath = QLineEdit(self) self.editSnapshotsPath.setReadOnly(True) self.editSnapshotsPath.textChanged.connect(self.fullPathChanged) hlayout.addWidget(self.editSnapshotsPath) self.btnSnapshotsPath = QToolButton(self) self.btnSnapshotsPath.setToolButtonStyle(Qt.ToolButtonIconOnly) self.btnSnapshotsPath.setIcon(icon.FOLDER) self.btnSnapshotsPath.setText(_('Folder')) self.btnSnapshotsPath.setMinimumSize(32,28) hlayout.addWidget(self.btnSnapshotsPath) self.btnSnapshotsPath.clicked.connect(self.btnSnapshotsPathClicked) #SSH groupBox = QGroupBox(self) self.modeSsh = groupBox groupBox.setTitle(_('SSH Settings')) layout.addWidget(groupBox) vlayout = QVBoxLayout(groupBox) hlayout1 = QHBoxLayout() vlayout.addLayout(hlayout1) hlayout2 = QHBoxLayout() vlayout.addLayout(hlayout2) hlayout3 = QHBoxLayout() vlayout.addLayout(hlayout3) self.lblSshHost = QLabel(_('Host:'), self) hlayout1.addWidget(self.lblSshHost) self.txtSshHost = QLineEdit(self) hlayout1.addWidget(self.txtSshHost) self.lblSshPort = QLabel(_('Port:'), self) hlayout1.addWidget(self.lblSshPort) self.txtSshPort = QLineEdit(self) hlayout1.addWidget(self.txtSshPort) self.lblSshUser = QLabel(_('User:'), self) hlayout1.addWidget(self.lblSshUser) self.txtSshUser = QLineEdit(self) hlayout1.addWidget(self.txtSshUser) self.lblSshPath = QLabel(_('Path:'), self) hlayout2.addWidget(self.lblSshPath) self.txtSshPath = QLineEdit(self) self.txtSshPath.textChanged.connect(self.fullPathChanged) hlayout2.addWidget(self.txtSshPath) self.lblSshCipher = QLabel(_('Cipher:'), self) hlayout3.addWidget(self.lblSshCipher) self.comboSshCipher = QComboBox(self) hlayout3.addWidget(self.comboSshCipher) self.fillCombo(self.comboSshCipher, self.config.SSH_CIPHERS) self.lblSshPrivateKeyFile = QLabel(_('Private Key:'), self) hlayout3.addWidget(self.lblSshPrivateKeyFile) self.txtSshPrivateKeyFile = QLineEdit(self) self.txtSshPrivateKeyFile.setReadOnly(True) hlayout3.addWidget(self.txtSshPrivateKeyFile) self.btnSshPrivateKeyFile = QToolButton(self) self.btnSshPrivateKeyFile.setToolButtonStyle(Qt.ToolButtonIconOnly) self.btnSshPrivateKeyFile.setIcon(icon.FOLDER) self.btnSshPrivateKeyFile.setToolTip(_('Key File')) self.btnSshPrivateKeyFile.setMinimumSize(32,28) hlayout3.addWidget(self.btnSshPrivateKeyFile) self.btnSshPrivateKeyFile.clicked.connect(self.btnSshPrivateKeyFileClicked) self.btnSshKeyGen = QToolButton(self) self.btnSshKeyGen.setToolButtonStyle(Qt.ToolButtonIconOnly) self.btnSshKeyGen.setIcon(icon.ADD) self.btnSshKeyGen.setToolTip(_('Create a new SSH key without Password.')) self.btnSshKeyGen.setMinimumSize(32,28) hlayout3.addWidget(self.btnSshKeyGen) self.btnSshKeyGen.clicked.connect(self.btnSshKeyGenClicked) self.txtSshPrivateKeyFile.textChanged.connect(lambda x: self.btnSshKeyGen.setEnabled(not x)) qttools.equalIndent(self.lblSshHost, self.lblSshPath, self.lblSshCipher) #encfs self.modeLocalEncfs = self.modeLocal self.modeSshEncfs = self.modeSsh #password groupBox = QGroupBox(self) self.groupPassword1 = groupBox groupBox.setTitle(_('Password')) layout.addWidget(groupBox) vlayout = QVBoxLayout(groupBox) hlayout1 = QHBoxLayout() vlayout.addLayout(hlayout1) hlayout2 = QHBoxLayout() vlayout.addLayout(hlayout2) self.lblPassword1 = QLabel(_('Password'), self) hlayout1.addWidget(self.lblPassword1) self.txtPassword1 = QLineEdit(self) self.txtPassword1.setEchoMode(QLineEdit.Password) hlayout1.addWidget(self.txtPassword1) self.lblPassword2 = QLabel(_('Password'), self) hlayout2.addWidget(self.lblPassword2) self.txtPassword2 = QLineEdit(self) self.txtPassword2.setEchoMode(QLineEdit.Password) hlayout2.addWidget(self.txtPassword2) self.cbPasswordSave = QCheckBox(_('Save Password to Keyring'), self) vlayout.addWidget(self.cbPasswordSave) self.cbPasswordUseCache = QCheckBox(_('Cache Password for Cron (Security issue: root can read password)'), self) vlayout.addWidget(self.cbPasswordUseCache) self.keyringSupported = tools.keyringSupported() self.cbPasswordSave.setEnabled(self.keyringSupported) #mode change self.comboModes.currentIndexChanged.connect(self.comboModesChanged) #host, user, profile id groupBox = QGroupBox(self) self.frameAdvanced = groupBox groupBox.setTitle(_('Advanced')) layout.addWidget(groupBox) hlayout = QHBoxLayout(groupBox) hlayout.addSpacing(12) vlayout2 = QVBoxLayout() hlayout.addLayout(vlayout2) hlayout2 = QHBoxLayout() vlayout2.addLayout(hlayout2) self.lblHost = QLabel(_('Host:'), self) hlayout2.addWidget(self.lblHost) self.txtHost = QLineEdit(self) self.txtHost.textChanged.connect(self.fullPathChanged) hlayout2.addWidget(self.txtHost) self.lblUser = QLabel(_('User:'), self) hlayout2.addWidget(self.lblUser) self.txtUser = QLineEdit(self) self.txtUser.textChanged.connect(self.fullPathChanged) hlayout2.addWidget(self.txtUser) self.lblProfile = QLabel(_('Profile:'), self) hlayout2.addWidget(self.lblProfile) self.txt_profile = QLineEdit(self) self.txt_profile.textChanged.connect(self.fullPathChanged) hlayout2.addWidget(self.txt_profile) self.lblFullPath = QLabel(_('Full snapshot path: '), self) self.lblFullPath.setWordWrap(True) vlayout2.addWidget(self.lblFullPath) #Schedule groupBox = QGroupBox(self) self.globalScheduleGroupBox = groupBox groupBox.setTitle(_('Schedule')) layout.addWidget(groupBox) glayout = QGridLayout(groupBox) glayout.setColumnStretch(1, 2) self.comboSchedule = QComboBox(self) glayout.addWidget(self.comboSchedule, 0, 0, 1, 2) self.fillCombo(self.comboSchedule, self.config.SCHEDULE_MODES) self.lblScheduleDay = QLabel(_('Day:'), self) self.lblScheduleDay.setContentsMargins(5, 0, 0, 0) self.lblScheduleDay.setAlignment(Qt.AlignRight | Qt.AlignVCenter) glayout.addWidget(self.lblScheduleDay, 1, 0) self.comboScheduleDay = QComboBox(self) glayout.addWidget(self.comboScheduleDay, 1, 1) for d in range(1, 29): self.comboScheduleDay.addItem(QIcon(), str(d), d) self.lblScheduleWeekday = QLabel(_('Weekday:'), self) self.lblScheduleWeekday.setContentsMargins(5, 0, 0, 0) self.lblScheduleWeekday.setAlignment(Qt.AlignRight | Qt.AlignVCenter) glayout.addWidget(self.lblScheduleWeekday, 2, 0) self.comboScheduleWeekday = QComboBox(self) glayout.addWidget(self.comboScheduleWeekday, 2, 1) for d in range(1, 8): self.comboScheduleWeekday.addItem(QIcon(), datetime.date(2011, 11, 6 + d).strftime("%A"), d) self.lblScheduleTime = QLabel(_('Hour:'), self) self.lblScheduleTime.setContentsMargins(5, 0, 0, 0) self.lblScheduleTime.setAlignment(Qt.AlignRight | Qt.AlignVCenter) glayout.addWidget(self.lblScheduleTime, 3, 0) self.comboScheduleTime = QComboBox(self) glayout.addWidget(self.comboScheduleTime, 3, 1) for t in range(0, 2400, 100): self.comboScheduleTime.addItem(QIcon(), datetime.time(t//100, t%100).strftime("%H:%M"), t) self.lblScheduleCronPatern = QLabel(_('Hours:'), self) self.lblScheduleCronPatern.setContentsMargins(5, 0, 0, 0) self.lblScheduleCronPatern.setAlignment(Qt.AlignRight | Qt.AlignVCenter) glayout.addWidget(self.lblScheduleCronPatern, 4, 0) self.txtScheduleCronPatern = QLineEdit(self) glayout.addWidget(self.txtScheduleCronPatern, 4, 1) #anacron self.lblScheduleRepeated = QLabel(_('Run Back In Time repeatedly. This is useful if the computer is not running regularly.')) self.lblScheduleRepeated.setContentsMargins(5, 0, 0, 0) self.lblScheduleRepeated.setWordWrap(True) glayout.addWidget(self.lblScheduleRepeated, 5, 0, 1, 2) self.lblScheduleRepeatedPeriod = QLabel(_('Every:')) self.lblScheduleRepeatedPeriod.setContentsMargins(5, 0, 0, 0) self.lblScheduleRepeatedPeriod.setAlignment(Qt.AlignRight | Qt.AlignVCenter) glayout.addWidget(self.lblScheduleRepeatedPeriod, 7, 0) hlayout = QHBoxLayout() self.spbScheduleRepeatedPeriod = QSpinBox(self) self.spbScheduleRepeatedPeriod.setSingleStep(1) self.spbScheduleRepeatedPeriod.setRange(1, 10000) hlayout.addWidget(self.spbScheduleRepeatedPeriod) self.comboScheduleRepeatedUnit = QComboBox(self) self.fillCombo(self.comboScheduleRepeatedUnit, self.config.REPEATEDLY_UNITS) hlayout.addWidget(self.comboScheduleRepeatedUnit) hlayout.addStretch() glayout.addLayout(hlayout, 7, 1) #udev self.lblScheduleUdev = QLabel(_('Run Back In Time as soon as the drive is connected (only once every X days).\nYou will be prompted for your sudo password.')) self.lblScheduleUdev.setWordWrap(True) glayout.addWidget(self.lblScheduleUdev, 6, 0, 1, 2) self.comboSchedule.currentIndexChanged.connect(self.scheduleChanged) # layout.addStretch() scrollArea.setWidget(layoutWidget) scrollArea.setWidgetResizable(True) #TAB: Include tabWidget = QWidget(self) self.tabs.addTab(tabWidget, _('Include')) layout = QVBoxLayout(tabWidget) self.listInclude = QTreeWidget(self) self.listInclude.setSelectionMode(QAbstractItemView.ExtendedSelection) self.listInclude.setRootIsDecorated(False) self.listInclude.setHeaderLabels([ _('Include files and folders'), 'Count' ]) self.listInclude.header().setSectionResizeMode(0, QHeaderView.Stretch) self.listInclude.header().setSectionsClickable(True) self.listInclude.header().setSortIndicatorShown(True) self.listInclude.header().setSectionHidden(1, True) self.listIncludeSortLoop = False self.listInclude.header().sortIndicatorChanged.connect(self.includeCustomSortOrder) layout.addWidget(self.listInclude) self.listIncludeCount = 0 buttonsLayout = QHBoxLayout() layout.addLayout(buttonsLayout) self.btnIncludeFile = QPushButton(icon.ADD, _('Add file'), self) buttonsLayout.addWidget(self.btnIncludeFile) self.btnIncludeFile.clicked.connect(self.btnIncludeFileClicked) self.btnIncludeAdd = QPushButton(icon.ADD, _('Add folder'), self) buttonsLayout.addWidget(self.btnIncludeAdd) self.btnIncludeAdd.clicked.connect(self.btnIncludeAddClicked) self.btnIncludeRemove = QPushButton(icon.REMOVE, _('Remove'), self) buttonsLayout.addWidget(self.btnIncludeRemove) self.btnIncludeRemove.clicked.connect(self.btnIncludeRemoveClicked) #TAB: Exclude tabWidget = QWidget(self) self.tabs.addTab(tabWidget, _('Exclude')) layout = QVBoxLayout(tabWidget) self.lblSshEncfsExcludeWarning = QLabel(_('Warning: Wildcards (\'foo*\', \'[fF]oo\', \'fo?\') will be ignored with mode \'SSH encrypted\'.\nOnly separate asterisk are allowed (\'foo/*\', \'foo/**/bar\')'), self) self.lblSshEncfsExcludeWarning.setWordWrap(True) layout.addWidget(self.lblSshEncfsExcludeWarning) self.listExclude = QTreeWidget(self) self.listExclude.setSelectionMode(QAbstractItemView.ExtendedSelection) self.listExclude.setRootIsDecorated(False) self.listExclude.setHeaderLabels([ _('Exclude patterns, files or folders') , 'Count' ]) self.listExclude.header().setSectionResizeMode(0, QHeaderView.Stretch) self.listExclude.header().setSectionsClickable(True) self.listExclude.header().setSortIndicatorShown(True) self.listExclude.header().setSectionHidden(1, True) self.listExcludeSortLoop = False self.listExclude.header().sortIndicatorChanged.connect(self.excludeCustomSortOrder) layout.addWidget(self.listExclude) self.listExcludeCount = 0 label = QLabel(_('Highly recommended:'), self) qttools.setFontBold(label) layout.addWidget(label) label = QLabel(', '.join(sorted(self.config.DEFAULT_EXCLUDE)), self) label.setWordWrap(True) layout.addWidget(label) buttonsLayout = QHBoxLayout() layout.addLayout(buttonsLayout) self.btnExcludeAdd = QPushButton(icon.ADD, _('Add'), self) buttonsLayout.addWidget(self.btnExcludeAdd) self.btnExcludeAdd.clicked.connect(self.btnExcludeAddClicked) self.btnExcludeFile = QPushButton(icon.ADD, _('Add file'), self) buttonsLayout.addWidget(self.btnExcludeFile) self.btnExcludeFile.clicked.connect(self.btnExcludeFileClicked) self.btnExcludeFolder = QPushButton(icon.ADD, _('Add folder'), self) buttonsLayout.addWidget(self.btnExcludeFolder) self.btnExcludeFolder.clicked.connect(self.btnExcludeFolderClicked) self.btnExcludeDefault = QPushButton(icon.DEFAULT_EXCLUDE, _('Add default'), self) buttonsLayout.addWidget(self.btnExcludeDefault) self.btnExcludeDefault.clicked.connect(self.btnExcludeDefaultClicked) self.btnExcludeRemove = QPushButton(icon.REMOVE, _('Remove'), self) buttonsLayout.addWidget(self.btnExcludeRemove) self.btnExcludeRemove.clicked.connect(self.btnExcludeRemoveClicked) #exclude files by size hlayout = QHBoxLayout() layout.addLayout(hlayout) self.cbExcludeBySize = QCheckBox(_('Exclude files bigger than: '), self) self.cbExcludeBySize.setToolTip(_('Exclude files bigger than value in %(prefix)s.\n' +\ 'With \'Full rsync mode\' disabled this will only affect new files\n' +\ 'because for rsync this is a transfer option, not an exclude option.\n' +\ 'So big files that has been backed up before will remain in snapshots\n' +\ 'even if they had changed.' %{'prefix': 'MiB'})) hlayout.addWidget(self.cbExcludeBySize) self.spbExcludeBySize = QSpinBox(self) self.spbExcludeBySize.setSuffix(' MiB') self.spbExcludeBySize.setRange(0, 100000000) hlayout.addWidget(self.spbExcludeBySize) hlayout.addStretch() enabled = lambda state: self.spbExcludeBySize.setEnabled(state) enabled(False) self.cbExcludeBySize.stateChanged.connect(enabled) #TAB: Auto-remove scrollArea = QScrollArea(self) scrollArea.setFrameStyle(QFrame.NoFrame) self.tabs.addTab(scrollArea, _('Auto-remove')) layoutWidget = QWidget(self) layout = QGridLayout(layoutWidget) #remove old snapshots self.cbRemoveOlder = QCheckBox(_('Older than:'), self) layout.addWidget(self.cbRemoveOlder, 0, 0) self.cbRemoveOlder.stateChanged.connect(self.updateRemoveOlder) self.spbRemoveOlder = QSpinBox(self) self.spbRemoveOlder.setRange(1, 1000) layout.addWidget(self.spbRemoveOlder, 0, 1) self.comboRemoveOlderUnit = QComboBox(self) layout.addWidget(self.comboRemoveOlderUnit, 0, 2) self.fillCombo(self.comboRemoveOlderUnit, self.config.REMOVE_OLD_BACKUP_UNITS) #min free space enabled, value, unit = self.config.minFreeSpace() self.cbFreeSpace = QCheckBox(_('If free space is less than:'), self) layout.addWidget(self.cbFreeSpace, 1, 0) self.cbFreeSpace.stateChanged.connect(self.updateFreeSpace) self.spbFreeSpace = QSpinBox(self) self.spbFreeSpace.setRange(1, 1000) layout.addWidget(self.spbFreeSpace, 1, 1) self.comboFreeSpaceUnit = QComboBox(self) layout.addWidget(self.comboFreeSpaceUnit, 1, 2) self.fillCombo(self.comboFreeSpaceUnit, self.config.MIN_FREE_SPACE_UNITS) #min free inodes self.cbFreeInodes = QCheckBox(_('If free inodes is less than:'), self) layout.addWidget(self.cbFreeInodes, 2, 0) self.spbFreeInodes = QSpinBox(self) self.spbFreeInodes.setSuffix(' %') self.spbFreeInodes.setSingleStep(1) self.spbFreeInodes.setRange(0, 15) layout.addWidget(self.spbFreeInodes, 2, 1) enabled = lambda state: self.spbFreeInodes.setEnabled(state) enabled(False) self.cbFreeInodes.stateChanged.connect(enabled) #smart remove self.cbSmartRemove = QCheckBox(_('Smart remove'), self) layout.addWidget(self.cbSmartRemove, 3, 0) widget = QWidget(self) widget.setContentsMargins(25, 0, 0, 0) layout.addWidget(widget, 4, 0, 1, 3) smlayout = QGridLayout(widget) self.cbSmartRemoveRunRemoteInBackground = QCheckBox(_('Run in background on remote Host.') + _(' EXPERIMENTAL!'), self) smlayout.addWidget(self.cbSmartRemoveRunRemoteInBackground, 0, 0, 1, 3) smlayout.addWidget(QLabel(_('Keep all snapshots for the last'), self), 1, 0) self.spbKeepAll = QSpinBox(self) self.spbKeepAll.setRange(1, 10000) smlayout.addWidget(self.spbKeepAll, 1, 1) smlayout.addWidget(QLabel(_('day(s)'), self), 1, 2) smlayout.addWidget(QLabel(_('Keep one snapshot per day for the last'), self), 2, 0) self.spbKeepOnePerDay = QSpinBox(self) self.spbKeepOnePerDay.setRange(1, 10000) smlayout.addWidget(self.spbKeepOnePerDay, 2, 1) smlayout.addWidget(QLabel(_('day(s)'), self), 2, 2) smlayout.addWidget(QLabel(_('Keep one snapshot per week for the last'), self), 3, 0) self.spbKeepOnePerWeek = QSpinBox(self) self.spbKeepOnePerWeek.setRange(1, 10000) smlayout.addWidget(self.spbKeepOnePerWeek, 3, 1) smlayout.addWidget(QLabel(_('weeks(s)'), self), 3, 2) smlayout.addWidget(QLabel(_('Keep one snapshot per month for the last'), self), 4, 0) self.spbKeepOnePerMonth = QSpinBox(self) self.spbKeepOnePerMonth.setRange(1, 1000) smlayout.addWidget(self.spbKeepOnePerMonth, 4, 1) smlayout.addWidget(QLabel(_('month(s)'), self), 4, 2) smlayout.addWidget(QLabel(_('Keep one snapshot per year for all years'), self), 5, 0, 1, 3) enabled = lambda state: [smlayout.itemAt(x).widget().setEnabled(state) for x in range(smlayout.count())] enabled(False) self.cbSmartRemove.stateChanged.connect(enabled) #don't remove named snapshots self.cbDontRemoveNamedSnapshots = QCheckBox(_("Don't remove named snapshots"), self) layout.addWidget(self.cbDontRemoveNamedSnapshots, 5, 0, 1, 3) # layout.addWidget(QWidget(self), 6, 0) layout.setRowStretch(6, 2) scrollArea.setWidget(layoutWidget) scrollArea.setWidgetResizable(True) #TAB: Options scrollArea = QScrollArea(self) scrollArea.setFrameStyle(QFrame.NoFrame) self.tabs.addTab(scrollArea, _('Options')) layoutWidget = QWidget(self) layout = QVBoxLayout(layoutWidget) self.cbNotify = QCheckBox(_('Enable notifications'), self) layout.addWidget(self.cbNotify) self.cbNoSnapshotOnBattery = QCheckBox(_('Disable snapshots when on battery'), self) if not tools.powerStatusAvailable (): self.cbNoSnapshotOnBattery.setEnabled (False) self.cbNoSnapshotOnBattery.setToolTip (_('Power status not available from system')) layout.addWidget(self.cbNoSnapshotOnBattery) self.cbGlobalFlock = QCheckBox(_('Run only one snapshot at a time')) self.cbGlobalFlock.setToolTip(_('Other snapshots will be blocked until the current snapshot is done.\n' 'This is a global option. So it will effect all profiles for this user.\n' 'But you need to activate this for all other users, too.')) layout.addWidget(self.cbGlobalFlock) self.cbBackupOnRestore = QCheckBox(_('Backup replaced files on restore'), self) self.cbBackupOnRestore.setToolTip(_("Newer versions of files will be " "renamed with trailing '%(suffix)s' " "before restoring.\n" "If you don't need them anymore " "you can remove them with '%(cmd)s'") %{'suffix': self.snapshots.backupSuffix(), 'cmd': 'find ./ -name "*%s" -delete' % self.snapshots.backupSuffix() }) layout.addWidget(self.cbBackupOnRestore) self.cbContinueOnErrors = QCheckBox(_('Continue on errors (keep incomplete snapshots)'), self) layout.addWidget(self.cbContinueOnErrors) self.cbUseChecksum = QCheckBox(_('Use checksum to detect changes'), self) layout.addWidget(self.cbUseChecksum) self.cbTakeSnapshotRegardlessOfChanges = QCheckBox(_('Take a new snapshot regardless of there were changes or not.')) layout.addWidget(self.cbTakeSnapshotRegardlessOfChanges) #log level hlayout = QHBoxLayout() layout.addLayout(hlayout) hlayout.addWidget(QLabel(_('Log Level:'), self)) self.comboLogLevel = QComboBox(self) hlayout.addWidget(self.comboLogLevel, 1) self.comboLogLevel.addItem(QIcon(), _('None'), 0) self.comboLogLevel.addItem(QIcon(), _('Errors'), 1) self.comboLogLevel.addItem(QIcon(), _('Changes & Errors'), 2) self.comboLogLevel.addItem(QIcon(), _('All'), 3) # layout.addStretch() scrollArea.setWidget(layoutWidget) scrollArea.setWidgetResizable(True) #TAB: Expert Options scrollArea = QScrollArea(self) scrollArea.setFrameStyle(QFrame.NoFrame) self.tabs.addTab(scrollArea, _('Expert Options')) layoutWidget = QWidget(self) layout = QVBoxLayout(layoutWidget) label = QLabel(_('Change these options only if you really know what you are doing !'), self) qttools.setFontBold(label) layout.addWidget(label) label = QLabel(_("Run 'rsync' with 'nice':")) layout.addWidget(label) grid = QGridLayout() grid.setColumnMinimumWidth(0, 20) layout.addLayout(grid) self.cbNiceOnCron = QCheckBox(_('as cron job') + self.printDefault(self.config.DEFAULT_RUN_NICE_FROM_CRON), self) grid.addWidget(self.cbNiceOnCron, 0, 1) self.cbNiceOnRemote = QCheckBox(_('on remote host') + self.printDefault(self.config.DEFAULT_RUN_NICE_ON_REMOTE), self) grid.addWidget(self.cbNiceOnRemote, 1, 1) label = QLabel(_("Run 'rsync' with 'ionice':")) layout.addWidget(label) grid = QGridLayout() grid.setColumnMinimumWidth(0, 20) layout.addLayout(grid) self.cbIoniceOnCron = QCheckBox(_('as cron job') + self.printDefault(self.config.DEFAULT_RUN_IONICE_FROM_CRON), self) grid.addWidget(self.cbIoniceOnCron, 0, 1) self.cbIoniceOnUser = QCheckBox(_('when taking a manual snapshot') + self.printDefault(self.config.DEFAULT_RUN_IONICE_FROM_USER), self) grid.addWidget(self.cbIoniceOnUser, 1, 1) self.cbIoniceOnRemote = QCheckBox(_('on remote host') + self.printDefault(self.config.DEFAULT_RUN_IONICE_ON_REMOTE), self) grid.addWidget(self.cbIoniceOnRemote, 2, 1) self.nocacheAvailable = tools.checkCommand('nocache') txt = _("Run 'rsync' with 'nocache':") if not self.nocacheAvailable: txt += ' ' + _("(Please install 'nocache' to enable this option)") layout.addWidget(QLabel(txt)) grid = QGridLayout() grid.setColumnMinimumWidth(0, 20) layout.addLayout(grid) self.cbNocacheOnLocal = QCheckBox(_('on local machine') + self.printDefault(self.config.DEFAULT_RUN_NOCACHE_ON_LOCAL), self) self.cbNocacheOnLocal.setEnabled(self.nocacheAvailable) grid.addWidget(self.cbNocacheOnLocal, 0, 1) self.cbNocacheOnRemote = QCheckBox(_('on remote host') + self.printDefault(self.config.DEFAULT_RUN_NOCACHE_ON_REMOTE), self) grid.addWidget(self.cbNocacheOnRemote, 2, 1) self.cbRedirectStdoutInCron = QCheckBox(_('Redirect stdout to /dev/null in cronjobs.') + self.printDefault(self.config.DEFAULT_REDIRECT_STDOUT_IN_CRON), self) self.cbRedirectStdoutInCron.setToolTip('cron will automatically send an email with attached output of cronjobs if a MTA is installed.') layout.addWidget(self.cbRedirectStdoutInCron) self.cbRedirectStderrInCron = QCheckBox(_('Redirect stderr to /dev/null in cronjobs.') + self.printDefault(self.config.DEFAULT_REDIRECT_STDERR_IN_CRON), self) self.cbRedirectStderrInCron.setToolTip('cron will automatically send an email with attached errors of cronjobs if a MTA is installed.') layout.addWidget(self.cbRedirectStderrInCron) #bwlimit hlayout = QHBoxLayout() layout.addLayout(hlayout) self.cbBwlimit = QCheckBox(_('Limit rsync bandwidth usage: '), self) hlayout.addWidget(self.cbBwlimit) self.spbBwlimit = QSpinBox(self) self.spbBwlimit.setSuffix(_(' KB/sec')) self.spbBwlimit.setSingleStep(100) self.spbBwlimit.setRange(0, 1000000) hlayout.addWidget(self.spbBwlimit) hlayout.addStretch() enabled = lambda state: self.spbBwlimit.setEnabled(state) enabled(False) self.cbBwlimit.stateChanged.connect(enabled) self.cbBwlimit.setToolTip( 'uses \'rsync --bwlimit=RATE\'\n' 'From \'man rsync\':\n' 'This option allows you to specify the maximum transfer rate for\n' 'the data sent over the socket, specified in units per second.\n' 'The RATE value can be suffixed with a string to indicate a size\n' 'multiplier, and may be a fractional value (e.g. "--bwlimit=1.5m").\n' 'If no suffix is specified, the value will be assumed to be in\n' 'units of 1024 bytes (as if "K" or "KiB" had been appended).\n' 'See the --max-size option for a description of all the available\n' 'suffixes. A value of zero specifies no limit.\n\n' 'For backward-compatibility reasons, the rate limit will be\n' 'rounded to the nearest KiB unit, so no rate smaller than\n' '1024 bytes per second is possible.\n\n' 'Rsync writes data over the socket in blocks, and this option\n' 'both limits the size of the blocks that rsync writes, and tries\n' 'to keep the average transfer rate at the requested limit.\n' 'Some "burstiness" may be seen where rsync writes out a block\n' 'of data and then sleeps to bring the average rate into compliance.\n\n' 'Due to the internal buffering of data, the --progress option\n' 'may not be an accurate reflection on how fast the data is being\n' 'sent. This is because some files can show up as being rapidly\n' 'sent when the data is quickly buffered, while other can show up\n' 'as very slow when the flushing of the output buffer occurs.\n' 'This may be fixed in a future version.' ) self.cbPreserveAcl = QCheckBox(_('Preserve ACL'), self) self.cbPreserveAcl.setToolTip( 'uses \'rsync -A\'\n' 'From \'man rsync\':\n' 'This option causes rsync to update the destination ACLs to be\n' 'the same as the source ACLs. The option also implies --perms.\n\n' 'The source and destination systems must have compatible ACL\n' 'entries for this option to work properly.\n' 'See the --fake-super option for a way to backup and restore\n' 'ACLs that are not compatible.' ) layout.addWidget(self.cbPreserveAcl) self.cbPreserveXattr = QCheckBox(_('Preserve extended attributes (xattr)'), self) self.cbPreserveXattr.setToolTip( 'uses \'rsync -X\'\n' 'From \'man rsync\':\n' 'This option causes rsync to update the destination extended\n' 'attributes to be the same as the source ones.\n\n' 'For systems that support extended-attribute namespaces, a copy\n' 'being done by a super-user copies all namespaces except\n' 'system.*. A normal user only copies the user.* namespace.\n' 'To be able to backup and restore non-user namespaces as a normal\n' 'user, see the --fake-super option.\n\n' 'Note that this option does not copy rsyncs special xattr values\n' '(e.g. those used by --fake-super) unless you repeat the option\n' '(e.g. -XX). This "copy all xattrs" mode cannot be used\n' 'with --fake-super.' ) layout.addWidget(self.cbPreserveXattr) self.cbCopyUnsafeLinks = QCheckBox(_('Copy unsafe links (works only with absolute links)'), self) self.cbCopyUnsafeLinks.setToolTip( 'uses \'rsync --copy-unsafe-links\'\n' 'From \'man rsync\':\n' 'This tells rsync to copy the referent of symbolic links that\n' 'point outside the copied tree. Absolute symlinks are also\n' 'treated like ordinary files, and so are any symlinks in the\n' 'source path itself when --relative is used. This option has\n' 'no additional effect if --copy-links was also specified.\n' ) layout.addWidget(self.cbCopyUnsafeLinks) self.cbCopyLinks = QCheckBox(_('Copy links (dereference symbolic links)'), self) self.cbCopyLinks.setToolTip( 'uses \'rsync --copy-links\'\n' 'From \'man rsync\':\n' 'When symlinks are encountered, the item that they point to\n' '(the referent) is copied, rather than the symlink. In older\n' 'versions of rsync, this option also had the side-effect of\n' 'telling the receiving side to follow symlinks, such as\n' 'symlinks to directories. In a modern rsync such as this one,\n' 'you\'ll need to specify --keep-dirlinks (-K) to get this extra\n' 'behavior. The only exception is when sending files to an rsync\n' 'that is too old to understand -K -- in that case, the -L option\n' 'will still have the side-effect of -K on that older receiving rsync.' ) layout.addWidget(self.cbCopyLinks) #additional rsync options hlayout = QHBoxLayout() layout.addLayout(hlayout) self.cbRsyncOptions = QCheckBox(_('Paste additional options to rsync'), self) hlayout.addWidget(self.cbRsyncOptions) self.txtRsyncOptions = QLineEdit(self) self.txtRsyncOptions.setToolTip(_('Options must be quoted e.g. --exclude-from="/path/to/my exclude file".')) hlayout.addWidget(self.txtRsyncOptions) enabled = lambda state: self.txtRsyncOptions.setEnabled(state) enabled(False) self.cbRsyncOptions.stateChanged.connect(enabled) #ssh prefix hlayout = QHBoxLayout() layout.addLayout(hlayout) self.cbSshPrefix = QCheckBox(_('Add prefix to SSH commands'), self) hlayout.addWidget(self.cbSshPrefix) self.txtSshPrefix = QLineEdit(self) self.txtSshPrefix.setToolTip(_('Prefix to run before every command on remote host.\n' 'Variables need to be escaped with \$FOO.\n' 'This doesn\'t touch rsync. So to add a prefix\n' 'for rsync use "%(cbRsyncOptions)s" with\n' '%(rsync_options_value)s\n\n' '%(default)s: %(def_value)s') % {'cbRsyncOptions': self.cbRsyncOptions.text(), 'rsync_options_value': '--rsync-path="FOO=bar:\$FOO /usr/bin/rsync"', 'default': _('default'), 'def_value': self.config.DEFAULT_SSH_PREFIX}) hlayout.addWidget(self.txtSshPrefix) enabled = lambda state: self.txtSshPrefix.setEnabled(state) enabled(False) self.cbSshPrefix.stateChanged.connect(enabled) qttools.equalIndent(self.cbRsyncOptions, self.cbSshPrefix) self.cbSshCheckPing = QCheckBox(_('Check if remote host is online')) self.cbSshCheckPing.setToolTip(_('Warning: if disabled and the remote host\n' 'is not available, this could lead to some\n' 'weird errors.')) self.cbSshCheckCommands = QCheckBox(_('Check if remote host support all necessary commands')) self.cbSshCheckCommands.setToolTip(_('Warning: if disabled and the remote host\n' 'does not support all necessary commands,\n' 'this could lead to some weird errors.')) layout.addWidget(self.cbSshCheckPing) layout.addWidget(self.cbSshCheckCommands) # layout.addStretch() scrollArea.setWidget(layoutWidget) scrollArea.setWidgetResizable(True) #buttons buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, parent = self) btnRestore = buttonBox.addButton(_('Restore Config'), QDialogButtonBox.ResetRole) btnUserCallback = buttonBox.addButton(_('Edit user-callback'), QDialogButtonBox.ResetRole) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) btnRestore.clicked.connect(self.restoreConfig) btnUserCallback.clicked.connect(self.editUserCallback) self.mainLayout.addWidget(buttonBox) self.updateProfiles() self.comboModesChanged() #enable tabs scroll buttons again but keep dialog size size = self.sizeHint() self.tabs.setUsesScrollButtons(scrollButtonDefault) self.resize(size) self.finished.connect(self.cleanup) def modifyProfileForFullSystemBackup(self): # verify to user that settings will change message = _("Full system backup can only create a snapshot to be restored to the same physical disk(s) " "with the same disk partitioning as from the source; restoring to new physical disks or the same disks " "with different partitioning will yield a potentially broken and unusable system.\n\n" "Full system backup will override some settings that may have been customized. Continue?") if QMessageBox.No == messagebox.warningYesNo(self, message): return # configure for full system backup # don't want to create a backup with any errors and give user false sense that backup was ok self.config.setContinueOnErrors(False) # make sure all files are backed up self.config.setExcludeBySize(False, 500) # when we restore the full system, don't want to keep old files (since we back up everything) self.config.setBackupOnRestore(False) # no need for checksum mode self.config.setUseChecksum(False) # must preserve ACLs and xattrs self.config.setPreserveAcl(True) self.config.setPreserveXattr(True) # don't want links self.config.setCopyLinks(False) self.config.setCopyUnsafeLinks(False) # backup root self.config.setInclude([("/", 0)]) # set UI self.updateProfiles() def addProfile(self): ret_val = QInputDialog.getText(self, _('New profile'), str()) if not ret_val[1]: return name = ret_val[0].strip() if not name: return profile_id = self.config.addProfile(name) if profile_id is None: return self.config.setCurrentProfile(profile_id) self.updateProfiles() def editProfile(self): ret_val = QInputDialog.getText(self, _('Rename profile'), str(), text = self.config.profileName()) if not ret_val[1]: return name = ret_val[0].strip() if not name: return if not self.config.setProfileName(name): return self.updateProfiles(reloadSettings = False) def removeProfile(self): if self.questionHandler(_('Are you sure you want to delete the profile "%s" ?') % self.config.profileName()): self.config.removeProfile() self.updateProfiles() def updateSchedule(self, backup_mode): if backup_mode == self.config.CUSTOM_HOUR: self.lblScheduleCronPatern.show() self.txtScheduleCronPatern.show() else: self.lblScheduleCronPatern.hide() self.txtScheduleCronPatern.hide() if backup_mode == self.config.WEEK: self.lblScheduleWeekday.show() self.comboScheduleWeekday.show() else: self.lblScheduleWeekday.hide() self.comboScheduleWeekday.hide() if backup_mode == self.config.MONTH: self.lblScheduleDay.show() self.comboScheduleDay.show() else: self.lblScheduleDay.hide() self.comboScheduleDay.hide() if backup_mode >= self.config.DAY: self.lblScheduleTime.show() self.comboScheduleTime.show() else: self.lblScheduleTime.hide() self.comboScheduleTime.hide() if self.config.REPEATEDLY <= backup_mode <= self.config.UDEV: self.lblScheduleRepeatedPeriod.show() self.spbScheduleRepeatedPeriod.show() self.comboScheduleRepeatedUnit.show() self.lblScheduleTime.hide() self.comboScheduleTime.hide() else: self.lblScheduleRepeatedPeriod.hide() self.spbScheduleRepeatedPeriod.hide() self.comboScheduleRepeatedUnit.hide() if backup_mode == self.config.REPEATEDLY: self.lblScheduleRepeated.show() else: self.lblScheduleRepeated.hide() if backup_mode == self.config.UDEV: self.lblScheduleUdev.show() else: self.lblScheduleUdev.hide() def scheduleChanged(self, index): backup_mode = self.comboSchedule.itemData(index) self.updateSchedule(backup_mode) def profileChanged(self, index): if self.disableProfileChanged: return profile_id = self.comboProfiles.currentProfileID() if not profile_id: return if profile_id != self.config.currentProfile(): self.saveProfile() self.config.setCurrentProfile(profile_id) self.updateProfile() def updateProfiles(self, reloadSettings = True): if reloadSettings: self.updateProfile() current_profile_id = self.config.currentProfile() self.disableProfileChanged = True self.comboProfiles.clear() profiles = self.config.profilesSortedByName() for profile_id in profiles: self.comboProfiles.addProfileID(profile_id) if profile_id == current_profile_id: self.comboProfiles.setCurrentProfileID(profile_id) self.disableProfileChanged = False def updateProfile(self): if self.config.currentProfile() == '1': self.btnEditProfile.setEnabled(False) self.btnRemoveProfile.setEnabled(False) else: self.btnEditProfile.setEnabled(True) self.btnRemoveProfile.setEnabled(True) self.btnAddProfile.setEnabled(self.config.isConfigured('1')) #TAB: General #mode self.setComboValue(self.comboModes, self.config.snapshotsMode(), t = 'str') #local self.editSnapshotsPath.setText(self.config.snapshotsPath(mode = 'local')) #ssh self.txtSshHost.setText(self.config.sshHost()) self.txtSshPort.setText(str(self.config.sshPort())) self.txtSshUser.setText(self.config.sshUser()) self.txtSshPath.setText(self.config.sshSnapshotsPath()) self.setComboValue(self.comboSshCipher, self.config.sshCipher(), t = 'str') self.txtSshPrivateKeyFile.setText(self.config.sshPrivateKeyFile()) #local_encfs if self.mode == 'local_encfs': self.editSnapshotsPath.setText(self.config.localEncfsPath()) #password password_1 = self.config.password(mode = self.mode, pw_id = 1, only_from_keyring = True) password_2 = self.config.password(mode = self.mode, pw_id = 2, only_from_keyring = True) if password_1 is None: password_1 = '' if password_2 is None: password_2 = '' self.txtPassword1.setText(password_1) self.txtPassword2.setText(password_2) self.cbPasswordSave.setChecked(self.keyringSupported and self.config.passwordSave(mode = self.mode)) self.cbPasswordUseCache.setChecked(self.config.passwordUseCache(mode = self.mode)) host, user, profile = self.config.hostUserProfile() self.txtHost.setText(host) self.txtUser.setText(user) self.txt_profile.setText(profile) self.setComboValue(self.comboSchedule, self.config.scheduleMode()) self.setComboValue(self.comboScheduleTime, self.config.scheduleTime()) self.setComboValue(self.comboScheduleDay, self.config.scheduleDay()) self.setComboValue(self.comboScheduleWeekday, self.config.scheduleWeekday()) self.txtScheduleCronPatern.setText(self.config.customBackupTime()) self.spbScheduleRepeatedPeriod.setValue(self.config.scheduleRepeatedPeriod()) self.setComboValue(self.comboScheduleRepeatedUnit, self.config.scheduleRepeatedUnit()) self.updateSchedule(self.config.scheduleMode()) #TAB: Include self.listInclude.clear() for include in self.config.include(): self.addInclude(include) includeSortColumn = int(self.config.profileIntValue('qt.settingsdialog.include.SortColumn', 1)) includeSortOrder = int(self.config.profileIntValue('qt.settingsdialog.include.SortOrder', Qt.AscendingOrder)) self.listInclude.sortItems(includeSortColumn, includeSortOrder) #TAB: Exclude self.listExclude.clear() for exclude in self.config.exclude(): self.addExclude(exclude) self.cbExcludeBySize.setChecked(self.config.excludeBySizeEnabled()) self.spbExcludeBySize.setValue(self.config.excludeBySize()) excludeSortColumn = int(self.config.profileIntValue('qt.settingsdialog.exclude.SortColumn', 1)) excludeSortOrder = int(self.config.profileIntValue('qt.settingsdialog.exclude.SortOrder', Qt.AscendingOrder)) self.listExclude.sortItems(excludeSortColumn, excludeSortOrder) #TAB: Auto-remove #remove old snapshots enabled, value, unit = self.config.removeOldSnapshots() self.cbRemoveOlder.setChecked(enabled) self.spbRemoveOlder.setValue(value) self.setComboValue(self.comboRemoveOlderUnit, unit) #min free space enabled, value, unit = self.config.minFreeSpace() self.cbFreeSpace.setChecked(enabled) self.spbFreeSpace.setValue(value) self.setComboValue(self.comboFreeSpaceUnit, unit) #min free inodes self.cbFreeInodes.setChecked(self.config.minFreeInodesEnabled()) self.spbFreeInodes.setValue(self.config.minFreeInodes()) #smart remove smart_remove, keep_all, keep_one_per_day, keep_one_per_week, keep_one_per_month = self.config.smartRemove() self.cbSmartRemove.setChecked(smart_remove) self.spbKeepAll.setValue(keep_all) self.spbKeepOnePerDay.setValue(keep_one_per_day) self.spbKeepOnePerWeek.setValue(keep_one_per_week) self.spbKeepOnePerMonth.setValue(keep_one_per_month) self.cbSmartRemoveRunRemoteInBackground.setChecked(self.config.smartRemoveRunRemoteInBackground()) #don't remove named snapshots self.cbDontRemoveNamedSnapshots.setChecked(self.config.dontRemoveNamedSnapshots()) #TAB: Options self.cbNotify.setChecked(self.config.notify()) self.cbNoSnapshotOnBattery.setChecked(self.config.noSnapshotOnBattery()) self.cbGlobalFlock.setChecked(self.config.globalFlock()) self.cbBackupOnRestore.setChecked(self.config.backupOnRestore()) self.cbContinueOnErrors.setChecked(self.config.continueOnErrors()) self.cbUseChecksum.setChecked(self.config.useChecksum()) self.cbTakeSnapshotRegardlessOfChanges.setChecked(self.config.takeSnapshotRegardlessOfChanges()) self.setComboValue(self.comboLogLevel, self.config.logLevel()) #TAB: Expert Options self.cbNiceOnCron.setChecked(self.config.niceOnCron()) self.cbIoniceOnCron.setChecked(self.config.ioniceOnCron()) self.cbIoniceOnUser.setChecked(self.config.ioniceOnUser()) self.cbNiceOnRemote.setChecked(self.config.niceOnRemote()) self.cbIoniceOnRemote.setChecked(self.config.ioniceOnRemote()) self.cbNocacheOnLocal.setChecked(self.config.nocacheOnLocal() and self.nocacheAvailable) self.cbNocacheOnRemote.setChecked(self.config.nocacheOnRemote()) self.cbRedirectStdoutInCron.setChecked(self.config.redirectStdoutInCron()) self.cbRedirectStderrInCron.setChecked(self.config.redirectStderrInCron()) self.cbBwlimit.setChecked(self.config.bwlimitEnabled()) self.spbBwlimit.setValue(self.config.bwlimit()) self.cbPreserveAcl.setChecked(self.config.preserveAcl()) self.cbPreserveXattr.setChecked(self.config.preserveXattr()) self.cbCopyUnsafeLinks.setChecked(self.config.copyUnsafeLinks()) self.cbCopyLinks.setChecked(self.config.copyLinks()) self.cbRsyncOptions.setChecked(self.config.rsyncOptionsEnabled()) self.txtRsyncOptions.setText(self.config.rsyncOptions()) self.cbSshPrefix.setChecked(self.config.sshPrefixEnabled()) self.txtSshPrefix.setText(self.config.sshPrefix()) self.cbSshCheckPing.setChecked(self.config.sshCheckPingHost()) self.cbSshCheckCommands.setChecked(self.config.sshCheckCommands()) #update self.updateRemoveOlder() self.updateFreeSpace() def saveProfile(self): if self.comboSchedule.itemData(self.comboSchedule.currentIndex()) == self.config.CUSTOM_HOUR: if not tools.checkCronPattern(self.txtScheduleCronPatern.text()): self.errorHandler(_('Custom Hours can only be a comma separated list of hours (e.g. 8,12,18,23) or */3 for periodic backups every 3 hours')) return False #mode mode = str(self.comboModes.itemData(self.comboModes.currentIndex())) self.config.setSnapshotsMode(mode) mount_kwargs = {} #password password_1 = self.txtPassword1.text() password_2 = self.txtPassword2.text() if mode in ('ssh', 'local_encfs'): mount_kwargs = {'password': password_1 } if mode == 'ssh_encfs': mount_kwargs = {'ssh_password': password_1, 'encfs_password': password_2, } #snapshots path self.config.setHostUserProfile( self.txtHost.text(), self.txtUser.text(), self.txt_profile.text()) #save ssh self.config.setSshHost(self.txtSshHost.text()) self.config.setSshPort(self.txtSshPort.text()) self.config.setSshUser(self.txtSshUser.text()) self.config.setSshSnapshotsPath(self.txtSshPath.text()) self.config.setSshCipher(self.comboSshCipher.itemData(self.comboSshCipher.currentIndex())) if mode in ('ssh', 'ssh_encfs'): if not self.txtSshPrivateKeyFile.text(): if self.questionHandler(_('You did not choose a private key file for SSH.\nWould you like to generate a new password-less public/private key pair?')): self.btnSshKeyGenClicked() if not self.txtSshPrivateKeyFile.text(): return False if not os.path.isfile(self.txtSshPrivateKeyFile.text()): self.errorHandler(_('Private key file "%(file)s" does not exist.') %{'file': self.txtSshPrivateKeyFile.text()}) self.txtSshPrivateKeyFile.setText('') return False self.config.setSshPrivateKeyFile(self.txtSshPrivateKeyFile.text()) #save local_encfs self.config.setLocalEncfsPath(self.editSnapshotsPath.text()) #include list self.config.setProfileIntValue('qt.settingsdialog.include.SortColumn', self.listInclude.header().sortIndicatorSection()) self.config.setProfileIntValue('qt.settingsdialog.include.SortOrder', self.listInclude.header().sortIndicatorOrder()) self.listInclude.sortItems(1, Qt.AscendingOrder) include_list = [] for index in range(self.listInclude.topLevelItemCount()): item = self.listInclude.topLevelItem(index) include_list.append((item.text(0), item.data(0, Qt.UserRole))) self.config.setInclude(include_list) #exclude patterns self.config.setProfileIntValue('qt.settingsdialog.exclude.SortColumn', self.listExclude.header().sortIndicatorSection()) self.config.setProfileIntValue('qt.settingsdialog.exclude.SortOrder', self.listExclude.header().sortIndicatorOrder()) self.listExclude.sortItems(1, Qt.AscendingOrder) exclude_list = [] for index in range(self.listExclude.topLevelItemCount()): item = self.listExclude.topLevelItem(index) exclude_list.append(item.text(0)) self.config.setExclude(exclude_list) self.config.setExcludeBySize(self.cbExcludeBySize.isChecked(), self.spbExcludeBySize.value()) #schedule self.config.setScheduleMode(self.comboSchedule.itemData(self.comboSchedule.currentIndex())) self.config.setScheduleTime(self.comboScheduleTime.itemData(self.comboScheduleTime.currentIndex())) self.config.setScheduleWeekday(self.comboScheduleWeekday.itemData(self.comboScheduleWeekday.currentIndex())) self.config.setScheduleDay(self.comboScheduleDay.itemData(self.comboScheduleDay.currentIndex())) self.config.setCustomBackupTime(self.txtScheduleCronPatern.text()) self.config.setScheduleRepeatedPeriod(self.spbScheduleRepeatedPeriod.value()) self.config.setScheduleRepeatedUnit(self.comboScheduleRepeatedUnit.itemData(self.comboScheduleRepeatedUnit.currentIndex())) #auto-remove self.config.setRemoveOldSnapshots( self.cbRemoveOlder.isChecked(), self.spbRemoveOlder.value(), self.comboRemoveOlderUnit.itemData(self.comboRemoveOlderUnit.currentIndex())) self.config.setMinFreeSpace( self.cbFreeSpace.isChecked(), self.spbFreeSpace.value(), self.comboFreeSpaceUnit.itemData(self.comboFreeSpaceUnit.currentIndex())) self.config.setMinFreeInodes( self.cbFreeInodes.isChecked(), self.spbFreeInodes.value()) self.config.setDontRemoveNamedSnapshots(self.cbDontRemoveNamedSnapshots.isChecked()) self.config.setSmartRemove( self.cbSmartRemove.isChecked(), self.spbKeepAll.value(), self.spbKeepOnePerDay.value(), self.spbKeepOnePerWeek.value(), self.spbKeepOnePerMonth.value()) self.config.setSmartRemoveRunRemoteInBackground(self.cbSmartRemoveRunRemoteInBackground.isChecked()) #options self.config.setNotify(self.cbNotify.isChecked()) self.config.setNoSnapshotOnBattery(self.cbNoSnapshotOnBattery.isChecked()) self.config.setGlobalFlock(self.cbGlobalFlock.isChecked()) self.config.setBackupOnRestore(self.cbBackupOnRestore.isChecked()) self.config.setContinueOnErrors(self.cbContinueOnErrors.isChecked()) self.config.setUseChecksum(self.cbUseChecksum.isChecked()) self.config.setTakeSnapshotRegardlessOfChanges(self.cbTakeSnapshotRegardlessOfChanges.isChecked()) self.config.setLogLevel(self.comboLogLevel.itemData(self.comboLogLevel.currentIndex())) #expert options self.config.setNiceOnCron(self.cbNiceOnCron.isChecked()) self.config.setIoniceOnCron(self.cbIoniceOnCron.isChecked()) self.config.setIoniceOnUser(self.cbIoniceOnUser.isChecked()) self.config.setNiceOnRemote(self.cbNiceOnRemote.isChecked()) self.config.setIoniceOnRemote(self.cbIoniceOnRemote.isChecked()) self.config.setNocacheOnLocal(self.cbNocacheOnLocal.isChecked()) self.config.setNocacheOnRemote(self.cbNocacheOnRemote.isChecked()) self.config.setRedirectStdoutInCron(self.cbRedirectStdoutInCron.isChecked()) self.config.setRedirectStderrInCron(self.cbRedirectStderrInCron.isChecked()) self.config.setBwlimit(self.cbBwlimit.isChecked(), self.spbBwlimit.value()) self.config.setPreserveAcl(self.cbPreserveAcl.isChecked()) self.config.setPreserveXattr(self.cbPreserveXattr.isChecked()) self.config.setCopyUnsafeLinks(self.cbCopyUnsafeLinks.isChecked()) self.config.setCopyLinks(self.cbCopyLinks.isChecked()) self.config.setRsyncOptions(self.cbRsyncOptions.isChecked(), self.txtRsyncOptions.text()) self.config.setSshPrefix(self.cbSshPrefix.isChecked(), self.txtSshPrefix.text()) self.config.setSshCheckPingHost(self.cbSshCheckPing.isChecked()) self.config.setSshCheckCommands(self.cbSshCheckCommands.isChecked()) # TODO - consider a single API method to bridge the UI layer (settings dialog) and backend layer (config) # when setting snapshots path rather than having to call the mount module from the UI layer # # currently, setting snapshots path requires the path to be mounted. it seems that it might be nice, # since the config object is more than a data structure, but has side-effect logic as well, to have the # config.setSnapshotsPath() method take care of everything it needs to perform its job # (mounting and unmounting the fuse filesystem if necessary). # https://en.wikipedia.org/wiki/Single_responsibility_principle if not self.config.SNAPSHOT_MODES[mode][0] is None: #preMountCheck mnt = mount.Mount(cfg = self.config, tmp_mount = True, parent = self) try: mnt.preMountCheck(mode = mode, first_run = True, **mount_kwargs) except NoPubKeyLogin as ex: logger.error(str(ex), self) if self.questionHandler(_('Would you like to copy your public SSH key to the\nremote host to enable password-less login?')) \ and sshtools.sshCopyId(self.config.sshPrivateKeyFile() + '.pub', self.config.sshUser(), self.config.sshHost(), port = str(self.config.sshPort()), askPass = tools.which('backintime-askpass'), cipher = self.config.sshCipher()): return self.saveProfile() else: return False except KnownHost as ex: logger.error(str(ex), self) fingerprint, hashedKey, keyType = sshtools.sshHostKey(self.config.sshHost(), str(self.config.sshPort())) if not fingerprint: self.errorHandler(str(ex)) return False msg = _('The authenticity of host "%(host)s" can\'t be established.\n\n%(keytype)s key fingerprint is:') msg = msg %{'host': self.config.sshHost(), 'keytype': keyType} options = [] lblFingerprint = QLabel(fingerprint + '\n') lblFingerprint.setWordWrap(False) lblFingerprint.setFont(QFont('Monospace')) options.append({'widget': lblFingerprint, 'retFunc': None}) lblQuestion = QLabel(_('Please verify this fingerprint! Would you like to add it to your \'known_hosts\' file?')) options.append({'widget': lblQuestion, 'retFunc': None}) if messagebox.warningYesNoOptions(self, msg, options)[0]: sshtools.writeKnownHostsFile(hashedKey) return self.saveProfile() else: return False except MountException as ex: self.errorHandler(str(ex)) return False #okay, lets try to mount try: hash_id = mnt.mount(mode = mode, check = False, **mount_kwargs) except MountException as ex: self.errorHandler(str(ex)) return False #save password self.config.setPasswordSave(self.cbPasswordSave.isChecked(), mode = mode) self.config.setPasswordUseCache(self.cbPasswordUseCache.isChecked(), mode = mode) self.config.setPassword(password_1, mode = mode) self.config.setPassword(password_2, mode = mode, pw_id = 2) #save snaphots_path if self.config.SNAPSHOT_MODES[mode][0] is None: snapshots_path = self.editSnapshotsPath.text() else: snapshots_path = self.config.snapshotsPath(mode = mode, tmp_mount = True) ret = self.config.setSnapshotsPath(snapshots_path, mode = mode) if not ret: return ret #umount if not self.config.SNAPSHOT_MODES[mode][0] is None: try: mnt.umount(hash_id = hash_id) except MountException as ex: self.errorHandler(str(ex)) return False return True def errorHandler(self, message): messagebox.critical(self, message) def questionHandler(self, message): return QMessageBox.Yes == messagebox.warningYesNo(self, message) def updateRemoveOlder(self): enabled = self.cbRemoveOlder.isChecked() self.spbRemoveOlder.setEnabled(enabled) self.comboRemoveOlderUnit.setEnabled(enabled) def updateFreeSpace(self): enabled = self.cbFreeSpace.isChecked() self.spbFreeSpace.setEnabled(enabled) self.comboFreeSpaceUnit.setEnabled(enabled) def addInclude(self, data): item = QTreeWidgetItem() if data[1] == 0: item.setIcon(0, self.icon.FOLDER) else: item.setIcon(0, self.icon.FILE) item.setText(0, data[0]) item.setData(0, Qt.UserRole, data[1]) self.listIncludeCount += 1 item.setText(1, str(self.listIncludeCount).zfill(6)) item.setData(1, Qt.UserRole, self.listIncludeCount) self.listInclude.addTopLevelItem(item) if self.listInclude.currentItem() is None: self.listInclude.setCurrentItem(item) return item def addExclude(self, pattern): item = QTreeWidgetItem() item.setText(0, pattern) item.setData(0, Qt.UserRole, pattern) self.listExcludeCount += 1 item.setText(1, str(self.listExcludeCount).zfill(6)) item.setData(1, Qt.UserRole, self.listExcludeCount) self.formatExcludeItem(item) self.listExclude.addTopLevelItem(item) if self.listExclude.currentItem() is None: self.listExclude.setCurrentItem(item) return item def fillCombo(self, combo, d): keys = list(d.keys()) keys.sort() for key in keys: combo.addItem(QIcon(), d[key], key) def setComboValue(self, combo, value, t = 'int'): for i in range(combo.count()): if t == 'int' and value == combo.itemData(i): combo.setCurrentIndex(i) break if t == 'str' and value == combo.itemData(i): combo.setCurrentIndex(i) break def validate(self): if not self.saveProfile(): return False if not self.config.checkConfig(): return False if not self.config.setupCron(): return False return self.config.save() def btnExcludeRemoveClicked(self): for item in self.listExclude.selectedItems(): index = self.listExclude.indexOfTopLevelItem(item) if index < 0: continue self.listExclude.takeTopLevelItem(index) if self.listExclude.topLevelItemCount() > 0: self.listExclude.setCurrentItem(self.listExclude.topLevelItem(0)) def addExclude_(self, pattern): if not pattern: return for index in range(self.listExclude.topLevelItemCount()): item = self.listExclude.topLevelItem(index) if pattern == item.text(0): return self.addExclude(pattern) def btnExcludeAddClicked(self): dlg = QInputDialog(self) dlg.setInputMode(QInputDialog.TextInput) dlg.setWindowTitle(_('Exclude pattern')) dlg.setLabelText('') dlg.resize(400, 0) if not dlg.exec(): return pattern = dlg.textValue().strip() if not pattern: return self.addExclude_(pattern) def btnExcludeFileClicked(self): for path in qttools.getOpenFileNames(self, _('Exclude file')): self.addExclude_(path) def btnExcludeFolderClicked(self): for path in qttools.getExistingDirectories(self, _('Exclude folder')) : self.addExclude_(path) def btnExcludeDefaultClicked(self): for path in self.config.DEFAULT_EXCLUDE: self.addExclude_(path) def btnIncludeRemoveClicked(self): for item in self.listInclude.selectedItems(): index = self.listInclude.indexOfTopLevelItem(item) if index < 0: continue self.listInclude.takeTopLevelItem(index) if self.listInclude.topLevelItemCount() > 0: self.listInclude.setCurrentItem(self.listInclude.topLevelItem(0)) def btnIncludeFileClicked(self): for path in qttools.getOpenFileNames(self, _('Include file')): if not path: continue if os.path.islink(path) \ and not (self.cbCopyUnsafeLinks.isChecked() \ or self.cbCopyLinks.isChecked()): if self.questionHandler(\ _('"%s" is a symlink. The linked target will not be backed up until you include it, too.\nWould you like to include the symlinks target instead?') % path): path = os.path.realpath(path) path = self.config.preparePath(path) for index in range(self.listInclude.topLevelItemCount()): if path == self.listInclude.topLevelItem(index).text(0): continue self.addInclude((path, 1)) def btnIncludeAddClicked(self): for path in qttools.getExistingDirectories(self, _('Include folder')): if not path: continue if os.path.islink(path) \ and not (self.cbCopyUnsafeLinks.isChecked() \ or self.cbCopyLinks.isChecked()): if self.questionHandler(\ _('"%s" is a symlink. The linked target will not be backed up until you include it, too.\nWould you like to include the symlinks target instead?') % path): path = os.path.realpath(path) path = self.config.preparePath(path) for index in range(self.listInclude.topLevelItemCount()): if path == self.listInclude.topLevelItem(index).text(0): continue self.addInclude((path, 0)) def btnSnapshotsPathClicked(self): old_path = self.editSnapshotsPath.text() path = str(qttools.getExistingDirectory(self, _('Where to save snapshots'), self.editSnapshotsPath.text())) if path: if old_path and old_path != path: if not self.questionHandler(_('Are you sure you want to change snapshots folder ?')): return self.config.removeProfileKey('snapshots.path.uuid') self.editSnapshotsPath.setText(self.config.preparePath(path)) def btnSshPrivateKeyFileClicked(self): old_file = self.txtSshPrivateKeyFile.text() if old_file: start_dir = self.txtSshPrivateKeyFile.text() else: start_dir = self.config.sshPrivateKeyFolder() f = qttools.getOpenFileName(self, _('SSH private key'), start_dir) if f: self.txtSshPrivateKeyFile.setText(f) def btnSshKeyGenClicked(self): key = os.path.join(self.config.sshPrivateKeyFolder(), 'id_rsa') if sshtools.sshKeyGen(key): self.txtSshPrivateKeyFile.setText(key) else: self.errorHandler(_('Failed to create new SSH key in %(path)s') %{'path': key}) def comboModesChanged(self, *params): if not params: index = self.comboModes.currentIndex() else: index = params[0] active_mode = str(self.comboModes.itemData(index)) if active_mode != self.mode: for mode in list(self.config.SNAPSHOT_MODES.keys()): getattr(self, 'mode%s' % tools.camelCase(mode)).hide() for mode in list(self.config.SNAPSHOT_MODES.keys()): if active_mode == mode: getattr(self, 'mode%s' % tools.camelCase(mode)).show() self.mode = active_mode if self.config.modeNeedPassword(active_mode): self.lblPassword1.setText(self.config.SNAPSHOT_MODES[active_mode][2] + ':') self.groupPassword1.show() if self.config.modeNeedPassword(active_mode, 2): self.lblPassword2.setText(self.config.SNAPSHOT_MODES[active_mode][3] + ':') self.lblPassword2.show() self.txtPassword2.show() qttools.equalIndent(self.lblPassword1, self.lblPassword2) else: self.lblPassword2.hide() self.txtPassword2.hide() qttools.equalIndent(self.lblPassword1) else: self.groupPassword1.hide() if active_mode == 'ssh_encfs': self.lblSshEncfsExcludeWarning.show() else: self.lblSshEncfsExcludeWarning.hide() self.updateExcludeItems() enabled = active_mode in ('ssh', 'ssh_encfs') self.cbNiceOnRemote.setEnabled(enabled) self.cbIoniceOnRemote.setEnabled(enabled) self.cbNocacheOnRemote.setEnabled(enabled) self.cbSmartRemoveRunRemoteInBackground.setHidden(not enabled) self.cbSshPrefix.setHidden(not enabled) self.txtSshPrefix.setHidden(not enabled) self.cbSshCheckPing.setHidden(not enabled) self.cbSshCheckCommands.setHidden(not enabled) self.encfsWarning.setHidden(active_mode not in ('local_encfs', 'ssh_encfs')) def fullPathChanged(self, dummy): if self.mode in ('ssh', 'ssh_encfs'): path = self.txtSshPath.text() else: path = self.editSnapshotsPath.text() self.lblFullPath.setText( _('Full snapshot path: ') + os.path.join( path, 'backintime', self.txtHost.text(), self.txtUser.text(), self.txt_profile.text() )) def updateExcludeItems(self): for index in range(self.listExclude.topLevelItemCount()): item = self.listExclude.topLevelItem(index) self.formatExcludeItem(item) def formatExcludeItem(self, item): if self.mode == 'ssh_encfs' and tools.patternHasNotEncryptableWildcard(item.text(0)): item.setIcon(0, self.icon.INVALID_EXCLUDE) item.setBackground(0, QBrush(Qt.lightGray)) elif item.text(0) in self.config.DEFAULT_EXCLUDE: item.setIcon(0, self.icon.DEFAULT_EXCLUDE) item.setBackground(0, QBrush()) else: item.setIcon(0, self.icon.EXCLUDE) item.setBackground(0, QBrush()) def customSortOrder(self, header, loop, newColumn, newOrder): if newColumn == 0 and newOrder == Qt.AscendingOrder: if loop: newColumn, newOrder = 1, Qt.AscendingOrder header.setSortIndicator(newColumn, newOrder) loop = False else: loop = True header.model().sort(newColumn, newOrder) return loop def includeCustomSortOrder(self, *args): self.listIncludeSortLoop = self.customSortOrder(self.listInclude.header(), self.listIncludeSortLoop, *args) def excludeCustomSortOrder(self, *args): self.listExcludeSortLoop = self.customSortOrder(self.listExclude.header(), self.listExcludeSortLoop, *args) def printDefault(self, value): if value: value_ = _('enabled') else: value_ = _('disabled') return ' (%s: %s)' %(_('default'), value_) def restoreConfig(self, *args): RestoreConfigDialog(self).exec_() self.updateProfiles() def editUserCallback(self, *args): EditUserCallback(self).exec_() def accept(self): if self.validate(): super(SettingsDialog, self).accept() def cleanup(self, result): self.config.clearHandlers() if not result: self.config.dict = self.configDictCopy self.config.setCurrentProfile(self.originalCurrentProfile) if result: self.parent.remount(self.originalCurrentProfile, self.originalCurrentProfile) self.parent.updateProfiles() class RestoreConfigDialog(QDialog): """ Show a dialog that will help to restore BITs configuration. User can select a config from previous snapshots. """ def __init__(self, parent): super(RestoreConfigDialog, self).__init__(parent) self.parent = parent self.config = parent.config self.snapshots = parent.snapshots import icon self.icon = icon self.setWindowIcon(icon.SETTINGS_DIALOG) self.setWindowTitle(_('Restore Settings')) layout = QVBoxLayout(self) #show a hint on how the snapshot path will look like. samplePath = os.path.join('backintime', self.config.host(), self.config.user(), '1', snapshots.SID(datetime.datetime.now(), self.config).sid ) #inform user to join group fuse if he hasn't already. #If there is no group fuse than it is most likly not nessesary. addFuse = '' try: user = self.config.user() fuse_grp_members = grp.getgrnam('fuse')[3] if not user in fuse_grp_members: addFuse = _(' and add your user to group \'fuse\'') except KeyError: pass label = QLabel(_('Please navigate to the snapshot from which you want ' 'to restore %(appName)s\'s configuration. The path ' 'may look like: \n%(samplePath)s\n\n' 'If your snapshots are on a remote drive or if they are ' 'encrypted you need to manually mount them first. ' 'If you use Mode SSH you also may need to set up public key ' 'login to the remote host%(addFuse)s.\n' 'Take a look at \'man backintime\'.') % {'appName': self.config.APP_NAME, 'samplePath': samplePath, 'addFuse': addFuse}, self) label.setWordWrap(True) layout.addWidget(label) #treeView self.treeView = qttools.MyTreeView(self) self.treeViewModel = QFileSystemModel(self) self.treeViewModel.setRootPath(QDir().rootPath()) self.treeViewModel.setReadOnly(True) self.treeViewModel.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot | QDir.Hidden) self.treeViewFilterProxy = QSortFilterProxyModel(self) self.treeViewFilterProxy.setDynamicSortFilter(True) self.treeViewFilterProxy.setSourceModel(self.treeViewModel) self.treeViewFilterProxy.setFilterRegExp(r'^[^\.]') self.treeView.setModel(self.treeViewFilterProxy) for col in range(self.treeView.header().count()): self.treeView.setColumnHidden(col, col != 0) self.treeView.header().hide() #expand users home self.expandAll(os.path.expanduser('~')) layout.addWidget(self.treeView) #context menu self.treeView.setContextMenuPolicy(Qt.CustomContextMenu) self.treeView.customContextMenuRequested.connect(self.onContextMenu) self.contextMenu = QMenu(self) self.btnShowHidden = self.contextMenu.addAction(icon.SHOW_HIDDEN, _('Show hidden files')) self.btnShowHidden.setCheckable(True) self.btnShowHidden.toggled.connect(self.onBtnShowHidden) #colors self.colorRed = QPalette() self.colorRed.setColor(QPalette.WindowText, QColor(205, 0, 0)) self.colorGreen = QPalette() self.colorGreen.setColor(QPalette.WindowText, QColor(0, 160, 0)) #wait indicator which will show that the scan for snapshots is still running self.wait = QProgressBar(self) self.wait.setMinimum(0) self.wait.setMaximum(0) self.wait.setMaximumHeight(7) layout.addWidget(self.wait) #show where a snapshot with config was found self.lblFound = QLabel(_('No config found'), self) self.lblFound.setWordWrap(True) self.lblFound.setPalette(self.colorRed) layout.addWidget(self.lblFound) #show profiles inside the config self.widgetProfiles = QWidget(self) self.widgetProfiles.setContentsMargins(0, 0, 0, 0) self.widgetProfiles.hide() self.gridProfiles = QGridLayout() self.gridProfiles.setContentsMargins(0, 0, 0, 0) self.gridProfiles.setHorizontalSpacing(20) self.widgetProfiles.setLayout(self.gridProfiles) layout.addWidget(self.widgetProfiles) self.restoreConfig = None self.scan = ScanFileSystem(self) self.treeView.myCurrentIndexChanged.connect(self.indexChanged) self.scan.foundConfig.connect(self.scanFound) self.scan.finished.connect(self.scanFinished) buttonBox = QDialogButtonBox(self) self.restoreButton = buttonBox.addButton(_('Restore'), QDialogButtonBox.AcceptRole) self.restoreButton.setEnabled(False) buttonBox.addButton(QDialogButtonBox.Cancel) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) layout.addWidget(buttonBox) self.scan.start() self.resize(600, 700) def pathFromIndex(self, index): """ return a path string for a given treeView index """ sourceIndex = self.treeViewFilterProxy.mapToSource(index) return str(self.treeViewModel.filePath(sourceIndex)) def indexFromPath(self, path): """ return the index for path which can be used in treeView """ indexSource = self.treeViewModel.index(path) return self.treeViewFilterProxy.mapFromSource(indexSource) def indexChanged(self, current, previous): """ called everytime a new item is choosen in treeView. If there was a config found inside the selected folder, show available informations about the config. """ cfg = self.searchConfig(self.pathFromIndex(current)) if cfg: self.expandAll(os.path.dirname(os.path.dirname(cfg._LOCAL_CONFIG_PATH))) self.lblFound.setText(cfg._LOCAL_CONFIG_PATH) self.lblFound.setPalette(self.colorGreen) self.showProfile(cfg) self.restoreConfig = cfg else: self.lblFound.setText(_('No config found')) self.lblFound.setPalette(self.colorRed) self.widgetProfiles.hide() self.restoreConfig = None self.restoreButton.setEnabled(bool(cfg)) def searchConfig(self, path): """ try to find config in couple possible subfolders """ snapshotPath = os.path.join('backintime', self.config.host(), self.config.user()) tryPaths = ['', '..', 'last_snapshot'] tryPaths.extend([os.path.join(snapshotPath, str(i), 'last_snapshot') for i in range(10)]) for p in tryPaths: cfgPath = os.path.join(path, p, 'config') if os.path.exists(cfgPath): try: cfg = config.Config(cfgPath) if cfg.isConfigured(): return cfg except: pass return def expandAll(self, path): """ expand all folders from filesystem root to given path """ paths = [path, ] while len(path) > 1: path = os.path.dirname(path) paths.append(path) paths.append('/') paths.reverse() [self.treeView.expand(self.indexFromPath(p)) for p in paths] def showProfile(self, cfg): """ show information about the profiles inside cfg """ child = self.gridProfiles.takeAt(0) while child: child.widget().deleteLater() child = self.gridProfiles.takeAt(0) for row, profileId in enumerate(cfg.profiles()): for col, txt in enumerate((_('Profile:') + ' ' + str(profileId), cfg.profileName(profileId), _('Mode:') + ' ' + cfg.SNAPSHOT_MODES[cfg.snapshotsMode(profileId)][1] )): self.gridProfiles.addWidget(QLabel(txt, self), row, col) self.gridProfiles.setColumnStretch(col, 1) self.widgetProfiles.show() def scanFound(self, path): """ scan hit a config. Expand the snapshot folder. """ self.expandAll(os.path.dirname(path)) def scanFinished(self): """ scan is done. Delete the wait indicator """ self.wait.deleteLater() def onContextMenu(self, point): self.contextMenu.exec_(self.treeView.mapToGlobal(point)) def onBtnShowHidden(self, checked): if checked: self.treeViewFilterProxy.setFilterRegExp(r'') else: self.treeViewFilterProxy.setFilterRegExp(r'^[^\.]') def accept(self): """ handle over the dict from the selected config. The dict contains all settings from the config. """ if self.restoreConfig: self.config.dict = self.restoreConfig.dict super(RestoreConfigDialog, self).accept() def exec_(self): """ stop the scan thread if it is still running after dialog was closed. """ ret = super(RestoreConfigDialog, self).exec_() self.scan.stop() return ret class ScanFileSystem(QThread): CONFIG = 'config' BACKUP = 'backup' BACKINTIME = 'backintime' foundConfig = pyqtSignal(str) def __init__(self, parent): super(ScanFileSystem, self).__init__(parent) self.stopper = False def stop(self): """ prepair stop and wait for finish. """ self.stopper = True return self.wait() def run(self): """ search in order of hopefully fastest way to find the snapshots. 1. /home/USER 2. /media 3. /mnt and at last filesystem root. Already searched paths will be excluded. """ searchOrder = [os.path.expanduser('~'), '/media', '/mnt', '/'] for scan in searchOrder: exclude = searchOrder[:] exclude.remove(scan) for path in self.scanPath(scan, exclude): self.foundConfig.emit(path) def scanPath(self, path, excludes = ()): """ walk through all folders and try to find 'config' file. If found make sure it is nested in backintime/FOO/BAR/1/2345/config and return its path. Exclude all paths from excludes and also all backintime/FOO/BAR/1/2345/backup """ for root, dirs, files in os.walk(path, topdown = True): if self.stopper: return for exclude in excludes: exDir, exBase = os.path.split(exclude) if root == exDir: if exBase in dirs: del dirs[dirs.index(exBase)] if self.CONFIG in files: rootdirs = root.split(os.sep) if len(rootdirs) > 4 and rootdirs[-5].startswith(self.BACKINTIME): if self.BACKUP in dirs: del dirs[dirs.index(self.BACKUP)] yield root class EditUserCallback(QDialog): def __init__(self, parent): super(EditUserCallback, self).__init__(parent) self.config = parent.config self.script = self.config.takeSnapshotUserCallback() import icon self.setWindowIcon(icon.SETTINGS_DIALOG) self.setWindowTitle(self.script) self.resize(800, 500) layout = QVBoxLayout(self) self.edit = QPlainTextEdit(self) try: with open(self.script, 'rt') as f: self.edit.setPlainText(f.read()) except IOError: pass layout.addWidget(self.edit) btnBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, parent = self) btnBox.accepted.connect(self.accept) btnBox.rejected.connect(self.reject) layout.addWidget(btnBox) def checkScript(self, script): m = re.match(r'^#!(/[\w/-]+)\n', script) if not m: logger.error('user-callback script has no shebang (#!/bin/sh) line.') self.config.errorHandler(_('user-callback script has no shebang (#!/bin/sh) line.')) return False if not tools.checkCommand(m.group(1)): logger.error('Shebang in user-callback script is not executable.') self.config.errorHandler(_('Shebang in user-callback script is not executable.')) return False return True def accept(self): if not self.checkScript(self.edit.toPlainText()): return with open(self.script, 'wt') as f: f.write(self.edit.toPlainText()) os.chmod(self.script, 0o755) super(EditUserCallback, self).accept() def debugTrace(): """ Set a tracepoint in the Python debugger that works with Qt """ from pdb import set_trace pyqtRemoveInputHook() set_trace() backintime-1.2.1/qt/restoredialog.py0000644000175000017500000001060413530533316017001 0ustar germargermar# Back In Time # Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze # # 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 2 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import gettext import tools from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * import qttools _=gettext.gettext class RestoreDialog(QDialog): def __init__(self, parent, sid, what, where = '', **kwargs): super(RestoreDialog, self).__init__(parent) self.resize(600, 500) self.config = parent.config self.snapshots = parent.snapshots self.sid = sid self.what = what self.where = where self.kwargs = kwargs import icon self.logFile = self.config.restoreLogFile() if os.path.exists(self.logFile): os.remove(self.logFile) self.setWindowIcon(icon.RESTORE_DIALOG) self.setWindowTitle(_('Restore')) self.mainLayout = QVBoxLayout(self) #text view self.txtLogView = QPlainTextEdit(self) self.txtLogView.setReadOnly(True) self.txtLogView.setLineWrapMode(QPlainTextEdit.NoWrap) self.txtLogView.setMaximumBlockCount(100000) self.mainLayout.addWidget(self.txtLogView) #buttons buttonBox = QDialogButtonBox(QDialogButtonBox.Close) showLog = buttonBox.addButton(_('Show full Log'), QDialogButtonBox.ActionRole) self.mainLayout.addWidget(buttonBox) self.btnClose = buttonBox.button(QDialogButtonBox.Close) self.btnClose.setEnabled(False) buttonBox.rejected.connect(self.close) showLog.clicked.connect(lambda: QDesktopServices.openUrl(QUrl(self.logFile))) #restore in separate thread self.thread = RestoreThread(self) self.thread.finished.connect(self.threadFinished) #refresh log every 200ms self.refreshTimer = QTimer(self) self.refreshTimer.setInterval(200) self.refreshTimer.setSingleShot(False) self.refreshTimer.timeout.connect(self.refreshLog) def refreshLog(self): """ get new log from thread """ newLog = self.thread.buffer[:] size = len(newLog) if size: self.thread.mutex.lock() self.thread.buffer = self.thread.buffer[size:] self.thread.mutex.unlock() self.txtLogView.appendPlainText(newLog.rstrip('\n')) def exec(self): #inhibit suspend/hibernate during restore self.config.inhibitCookie = tools.inhibitSuspend(toplevel_xid = self.config.xWindowId, reason = 'restoring') self.show() self.refreshTimer.start() self.thread.start() super(RestoreDialog, self).exec() self.refreshTimer.stop() self.thread.wait() def threadFinished(self): self.btnClose.setEnabled(True) #release inhibit suspend if self.config.inhibitCookie: self.config.inhibitCookie = tools.unInhibitSuspend(*self.config.inhibitCookie) class RestoreThread(QThread): """ run restore in a separate Thread to prevent GUI freeze and speed up restore """ def __init__(self, parent): super(RestoreThread, self).__init__() self.parent = parent self.log = open(parent.logFile, 'wt') self.mutex = QMutex() self.buffer = '' def run(self): self.parent.snapshots.restore(self.parent.sid, self.parent.what, self.callback, self.parent.where, **self.parent.kwargs) self.log.close() def callback(self, line, *args): """ write into log file and provide thread save string for log window """ line += '\n' self.log.write(line) self.mutex.lock() self.buffer += line self.mutex.unlock() backintime-1.2.1/debian/0000755000175000017500000000000013530533316014361 5ustar germargermarbackintime-1.2.1/debian/copyright0000644000175000017500000000155713530533316016324 0ustar germargermarBack In Time Copyright (C) 2008-2019 Oprea Dan, Bart de Koning, Richard Bailey, Germar Reitze A copy of the license can be found: /usr/share/common-licenses/GPL-2 /usr/share/doc/backintime/LICENSE 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. backintime-1.2.1/debian/changelog0000644000175000017500000000037413530533316016237 0ustar germargermarbackintime (1.2.1) unstable; urgency=low * Fix bug: TypeError in backintime.py if mount failed while running a snapshot (https://github.com/bit-team/backintime/issues/1005) -- Germar Reitze Sun, 25 Aug 2019 18:10:34 +0200 backintime-1.2.1/debian/compat0000644000175000017500000000000213530533316015557 0ustar germargermar9 backintime-1.2.1/debian/source/0000755000175000017500000000000013530533316015661 5ustar germargermarbackintime-1.2.1/debian/source/format0000644000175000017500000000000413530533316017066 0ustar germargermar1.0 backintime-1.2.1/debian/control0000644000175000017500000000505113530533316015765 0ustar germargermarSource: backintime Maintainer: BIT Team Section: utils Priority: extra Build-Depends: debhelper (>= 7), dh-python X-Python3-Version: >= 3.3 Standards-Version: 3.9.5 Homepage: https://github.com/bit-team/backintime Package: backintime-common Architecture: all Depends: rsync, cron-daemon, openssh-client, python3-keyring, python3-dbus, ${python3:Depends}, ${misc:Depends} Recommends: sshfs, encfs Conflicts: backintime Replaces: backintime Description: Simple backup system (common) This package contains non GUI files used by different GUI fontends. Package: backintime-qt Architecture: all Depends: x11-utils, libnotify-bin, python3-pyqt5, python3-dbus.mainloop.pyqt5, policykit-1, backintime-common (>= ${source:Version}~), ${python3:Depends}, ${misc:Depends} Recommends: python3-secretstorage Suggests: meld | kompare Conflicts: backintime-qt4 (<< ${source:Version}~), backintime-kde (<< ${source:Version}~), backintime-kde4 (<< ${source:Version}~), backintime-gnome (<< ${source:Version}~), backintime-notify (<< ${source:Version}~) Replaces: backintime-qt4 (<< ${source:Version}~), backintime-kde (<< ${source:Version}~), backintime-kde4 (<< ${source:Version}~), backintime-gnome (<< ${source:Version}~), backintime-notify (<< ${source:Version}~) Description: Simple backup system This is a Qt5 GUI frontend for backintime-common. Package: backintime-qt4 Section: oldlibs Architecture: all Depends: backintime-qt, ${misc:Depends} Description: Virtual package This is a virtual package to replace backintime-qt4 from official repositories with backintime-qt from PPA. It can safely be removed. Package: backintime-kde Section: oldlibs Architecture: all Depends: backintime-qt, ${misc:Depends} Description: Virtual package This is a virtual package to replace backintime-kde from official repositories with backintime-qt from PPA. It can safely be removed. Package: backintime-kde4 Section: oldlibs Architecture: all Depends: backintime-qt, ${misc:Depends} Description: Virtual package This is a virtual package to replace backintime-kde4 with backintime-qt. It can safely be removed. Package: backintime-gnome Section: oldlibs Architecture: all Depends: backintime-qt, ${misc:Depends} Description: Virtual package This is a virtual package to replace backintime-gnome with backintime-qt. It can safely be removed. Package: backintime-notify Section: oldlibs Architecture: all Depends: backintime-qt, ${misc:Depends} Description: Virtual package This is a virtual package to replace backintime-notify with backintime-qt. It can safely be removed. backintime-1.2.1/debian/rules0000755000175000017500000000126413530533316015444 0ustar germargermar#!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 override_dh_auto_clean: rm -rf locale common/po/*.mo find $(CURDIR) -name "*\.py[co]" -delete # these get regenerated rm -f */man/C/*.1.gz rm -f common/Makefile qt/Makefile rm -f common/config-example-*.gz override_dh_auto_configure: cd common && ./configure cd qt && ./configure override_dh_auto_build: cd common && $(MAKE) cd qt && $(MAKE) override_dh_auto_install: cd common && DESTDIR=../debian/backintime-common $(MAKE) install cd qt && DESTDIR=../debian/backintime-qt $(MAKE) install override_dh_python3: dh_python3 /usr/share/backintime/ %: dh $@ --with python3