aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/lint_python.yml21
-rw-r--r--.github/workflows/make.yml53
-rw-r--r--.travis.yml23
-rw-r--r--.tx/config49
-rw-r--r--CHANGES.md92
-rw-r--r--COPYING2
-rw-r--r--README.md32
-rwxr-xr-xautogen.sh2
-rwxr-xr-xbuild-aux/git-version-gen2
-rw-r--r--configure.ac75
-rw-r--r--contrib/caldav/README.md13
-rwxr-xr-xcontrib/caldav/calcurse-caldav.py242
-rw-r--r--contrib/caldav/config.sample14
-rwxr-xr-xcontrib/caldav/hooks/post-sync2
-rw-r--r--contrib/setup.cfg3
-rw-r--r--doc/Makefile.am2
-rw-r--r--doc/calcurse.1.txt4
-rw-r--r--doc/credits.txt2
-rw-r--r--doc/de/credits.txt2
-rw-r--r--doc/es/credits.txt2
-rw-r--r--doc/fr/credits.txt2
-rw-r--r--doc/manual.txt8
-rw-r--r--doc/nl/credits.txt2
-rw-r--r--doc/pt_BR/credits.txt2
-rw-r--r--doc/ru/credits.txt2
-rw-r--r--doc/submitting-patches.txt2
-rw-r--r--po/calcurse.pot124
-rw-r--r--po/de.po356
-rw-r--r--po/doc/add-nb_NO.po4
-rw-r--r--po/doc/copy-paste-nb_NO.po4
-rw-r--r--po/doc/credits-nb_NO.po2
-rw-r--r--po/doc/edit-nb_NO.po4
-rw-r--r--po/doc/export-nb_NO.po4
-rw-r--r--po/doc/flag-nb_NO.po4
-rw-r--r--po/doc/save-nb_NO.po4
-rw-r--r--po/doc/tab-nb_NO.po4
-rw-r--r--po/doc/vnote-nb_NO.po4
-rw-r--r--po/en.po1585
-rw-r--r--po/es.po365
-rw-r--r--po/fr.po419
-rw-r--r--po/nl.po250
-rw-r--r--po/pt_BR.po418
-rw-r--r--po/ru.po1101
-rw-r--r--scripts/calcurse-upgrade.sh.in2
-rw-r--r--src/apoint.c10
-rw-r--r--src/args.c12
-rw-r--r--src/calcurse.c113
-rw-r--r--src/calcurse.h63
-rw-r--r--src/config.c28
-rw-r--r--src/custom.c76
-rw-r--r--src/day.c70
-rw-r--r--src/dmon.c4
-rw-r--r--src/event.c2
-rw-r--r--src/getstring.c4
-rw-r--r--src/help.c6
-rw-r--r--src/hooks.c15
-rw-r--r--src/htable.h2
-rw-r--r--src/ical.c311
-rw-r--r--src/io.c213
-rw-r--r--src/keys.c426
-rw-r--r--src/listbox.c2
-rw-r--r--src/llist.c204
-rw-r--r--src/llist.h5
-rw-r--r--src/llist_ts.h4
-rw-r--r--src/mem.c2
-rw-r--r--src/note.c6
-rw-r--r--src/notify.c25
-rw-r--r--src/pcal.c6
-rw-r--r--src/queue.c2
-rw-r--r--src/recur.c79
-rw-r--r--src/sha1.c3
-rw-r--r--src/sha1.h4
-rw-r--r--src/sigs.c2
-rw-r--r--src/strings.c3
-rw-r--r--src/todo.c6
-rw-r--r--src/ui-calendar.c123
-rw-r--r--src/ui-day.c31
-rw-r--r--src/ui-todo.c27
-rw-r--r--src/utf8.c2
-rw-r--r--src/utils.c87
-rw-r--r--src/vars.c3
-rw-r--r--src/vector.c2
-rw-r--r--src/vector.h2
-rw-r--r--src/wins.c22
-rw-r--r--test/data/ical-009.ical12
-rwxr-xr-xtest/ical-001.sh12
-rwxr-xr-xtest/ical-002.sh10
-rwxr-xr-xtest/ical-003.sh14
-rwxr-xr-xtest/ical-004.sh12
-rwxr-xr-xtest/ical-005.sh12
-rwxr-xr-xtest/ical-006.sh10
-rwxr-xr-xtest/ical-007.sh12
-rwxr-xr-xtest/ical-008.sh12
-rwxr-xr-xtest/ical-009.sh51
-rwxr-xr-xtest/ical-010.sh12
-rwxr-xr-xtest/ical-011.sh21
-rwxr-xr-xtest/ical-012.sh10
-rwxr-xr-xtest/ical-013.sh10
-rwxr-xr-xtest/ical-014.sh10
-rwxr-xr-xtest/io-005.sh1
-rwxr-xr-xtest/io-006.sh1
-rw-r--r--test/run-test.c2
-rw-r--r--test/test-init.sh5
103 files changed, 3179 insertions, 4366 deletions
diff --git a/.github/workflows/lint_python.yml b/.github/workflows/lint_python.yml
new file mode 100644
index 0000000..c04a772
--- /dev/null
+++ b/.github/workflows/lint_python.yml
@@ -0,0 +1,21 @@
+name: Lint Python
+
+on:
+ pull_request:
+ paths: ['contrib/**']
+ push:
+ paths: ['contrib/**']
+
+jobs:
+ lint_python:
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: contrib
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ - run: pip install codespell flake8 isort
+ - run: codespell --quiet-level=2 || true
+ - run: flake8 --count --show-source --statistics
+ - run: isort --check-only --profile black .
diff --git a/.github/workflows/make.yml b/.github/workflows/make.yml
new file mode 100644
index 0000000..552bce6
--- /dev/null
+++ b/.github/workflows/make.yml
@@ -0,0 +1,53 @@
+name: Build and test
+
+on:
+ push:
+ branches: [master, pu]
+ paths-ignore:
+ - 'contrib/**'
+ - 'doc/**'
+ - 'po/**'
+ pull_request:
+ branches: [master, pu]
+ paths-ignore:
+ - 'contrib/**'
+ - 'doc/**'
+ - 'po/**'
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ os: ['ubuntu-latest', 'macos-latest']
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install dependencies (Ubuntu)
+ run: |
+ sudo apt-get update
+ sudo apt-get install asciidoc autopoint gettext xmlto autoconf-archive
+ if: matrix.os == 'ubuntu-latest'
+ - name: Install dependencies (MacOS)
+ run: |
+ brew install --overwrite python
+ brew update
+ brew install automake
+ brew install asciidoc
+ brew install gettext
+ brew install xmlto
+ brew install autoconf-archive
+ brew link --force gettext
+ sudo mkdir /etc/xml
+ sudo ln -s /usr/local/etc/xml/catalog /etc/xml/catalog
+ if: matrix.os == 'macos-latest'
+ - name: autogen.sh
+ run: ./autogen.sh
+ - name: configure
+ run: ./configure
+ - name: make
+ run: make
+ - name: make check
+ run: make check
+ - name: make distcheck
+ run: make distcheck
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 47d27fe..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-language: c
-
-os:
- - linux
- - osx
-
-addons:
- apt:
- packages:
- - asciidoc
- - autopoint
- - xmlto
-
-before_install:
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install asciidoc; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install gettext; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install xmlto; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew link --force gettext; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo mkdir /etc/xml; fi
- - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo ln -s /usr/local/etc/xml/catalog /etc/xml/catalog; fi
-
-script: ./autogen.sh && ./configure && make && make check
diff --git a/.tx/config b/.tx/config
index b9ac976..376e152 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,123 +1,122 @@
[main]
host = https://www.transifex.com
-type = PO
-[calcurse.calcurse]
+[o:lfleischer:p:calcurse:r:calcurse]
file_filter = po/<lang>.po
source_file = po/calcurse.pot
source_lang = en
-[calcurse.doc-add]
+[o:lfleischer:p:calcurse:r:doc-add]
file_filter = po/doc/add-<lang>.po
source_file = po/doc/add.pot
source_lang = en
-[calcurse.doc-config]
+[o:lfleischer:p:calcurse:r:doc-config]
file_filter = po/doc/config-<lang>.po
source_file = po/doc/config.pot
source_lang = en
-[calcurse.doc-copy-paste]
+[o:lfleischer:p:calcurse:r:doc-copy-paste]
file_filter = po/doc/copy-paste-<lang>.po
source_file = po/doc/copy-paste.pot
source_lang = en
-[calcurse.doc-credits]
+[o:lfleischer:p:calcurse:r:doc-credits]
file_filter = po/doc/credits-<lang>.po
source_file = po/doc/credits.pot
source_lang = en
-[calcurse.doc-delete]
+[o:lfleischer:p:calcurse:r:doc-delete]
file_filter = po/doc/delete-<lang>.po
source_file = po/doc/delete.pot
source_lang = en
-[calcurse.doc-displacement]
+[o:lfleischer:p:calcurse:r:doc-displacement]
file_filter = po/doc/displacement-<lang>.po
source_file = po/doc/displacement.pot
source_lang = en
-[calcurse.doc-edit]
+[o:lfleischer:p:calcurse:r:doc-edit]
file_filter = po/doc/edit-<lang>.po
source_file = po/doc/edit.pot
source_lang = en
-[calcurse.doc-enote]
+[o:lfleischer:p:calcurse:r:doc-enote]
file_filter = po/doc/enote-<lang>.po
source_file = po/doc/enote.pot
source_lang = en
-[calcurse.doc-export]
+[o:lfleischer:p:calcurse:r:doc-export]
file_filter = po/doc/export-<lang>.po
source_file = po/doc/export.pot
source_lang = en
-[calcurse.doc-flag]
+[o:lfleischer:p:calcurse:r:doc-flag]
file_filter = po/doc/flag-<lang>.po
source_file = po/doc/flag.pot
source_lang = en
-[calcurse.doc-general]
+[o:lfleischer:p:calcurse:r:doc-general]
file_filter = po/doc/general-<lang>.po
source_file = po/doc/general.pot
source_lang = en
-[calcurse.doc-goto]
+[o:lfleischer:p:calcurse:r:doc-goto]
file_filter = po/doc/goto-<lang>.po
source_file = po/doc/goto.pot
source_lang = en
-[calcurse.doc-import]
+[o:lfleischer:p:calcurse:r:doc-import]
file_filter = po/doc/import-<lang>.po
source_file = po/doc/import.pot
source_lang = en
-[calcurse.doc-intro]
+[o:lfleischer:p:calcurse:r:doc-intro]
file_filter = po/doc/intro-<lang>.po
source_file = po/doc/intro.pot
source_lang = en
-[calcurse.doc-other]
+[o:lfleischer:p:calcurse:r:doc-other]
file_filter = po/doc/other-<lang>.po
source_file = po/doc/other.pot
source_lang = en
-[calcurse.doc-pipe]
+[o:lfleischer:p:calcurse:r:doc-pipe]
file_filter = po/doc/pipe-<lang>.po
source_file = po/doc/pipe.pot
source_lang = en
-[calcurse.doc-priority]
+[o:lfleischer:p:calcurse:r:doc-priority]
file_filter = po/doc/priority-<lang>.po
source_file = po/doc/priority.pot
source_lang = en
-[calcurse.doc-reload]
+[o:lfleischer:p:calcurse:r:doc-reload]
file_filter = po/doc/reload-<lang>.po
source_file = po/doc/reload.pot
source_lang = en
-[calcurse.doc-repeat]
+[o:lfleischer:p:calcurse:r:doc-repeat]
file_filter = po/doc/repeat-<lang>.po
source_file = po/doc/repeat.pot
source_lang = en
-[calcurse.doc-save]
+[o:lfleischer:p:calcurse:r:doc-save]
file_filter = po/doc/save-<lang>.po
source_file = po/doc/save.pot
source_lang = en
-[calcurse.doc-tab]
+[o:lfleischer:p:calcurse:r:doc-tab]
file_filter = po/doc/tab-<lang>.po
source_file = po/doc/tab.pot
source_lang = en
-[calcurse.doc-view]
+[o:lfleischer:p:calcurse:r:doc-view]
file_filter = po/doc/view-<lang>.po
source_file = po/doc/view.pot
source_lang = en
-[calcurse.doc-vnote]
+[o:lfleischer:p:calcurse:r:doc-vnote]
file_filter = po/doc/vnote-<lang>.po
source_file = po/doc/vnote.pot
source_lang = en
diff --git a/CHANGES.md b/CHANGES.md
index 4124197..acc24e4 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,98 @@
Release Notes
=============
+Version 4.8.1 (2023-05-22)
+--------------------------
+
+- Bug fixes:
+
+ * Fixed characters in weekly view.
+
+ * AsciiDoc checks are skipped if --disable-docs is used.
+
+ * Fixed import for iCal files with empty description (fixed by Marian
+ Buschsieweke).
+
+ * Fixed handling of note files edited outside calcurse (fixed by Nicholas
+ Johnson).
+
+ * Fixed handling of recurrent open-ended appointments at 00:00.
+
+ * Default description for items with empty descriptions (reported and
+ partially implemented by Jonathan van der Steege).
+
+- New calcurse-caldav features:
+
+ * The PasswordCommand option can now be used to manage passwords in an
+ external program and is the new recommended way of storing passwords for
+ calcurse-caldav (implemented by Ryan Lue).
+
+Version 4.8.0 (2022-04-16)
+--------------------------
+
+- New features:
+
+ * Support any weekday as first day of week; previously, only Sunday and
+ Monday were allowed (implemented by Morgan Seltzer).
+
+ * Configuration of the format in which appointment time is displayed
+ (implemented by mercurialmoon).
+
+ * Actions without key bindings.
+
+ * generic-prev-view key binding to cycle backwards through windows
+ (implemented by Aurora).
+
+ * Support for Home/End keys in text input mode.
+
+- Bug fixes:
+
+ * Support compilation on big-endian systems (reported by nmeum).
+
+ * Fixed --docdir support (fixed by Marco Sirabella).
+
+ * Allow newlines in iCal SUMMARY by replacing them with blanks (reported by
+ Matthias Braun).
+
+ * Fixed sidebar configuration sometimes not increasing width (fixed by
+ Morgan Seltzer).
+
+ * Layout change recognizes changed appointment space; before this change, a
+ layout change did not update the maximum number of appointments visible
+ until the config menu was left (fixed by Morgan Seltzer).
+
+- calcurse-caldav bug fixes:
+
+ * Fixed InsecureSSL support (reported by Pitido).
+
+Version 4.7.1 (2021-04-11)
+--------------------------
+
+- Bug fixes:
+
+ * Multiple iCal import fixes: Make iCal event import independent of
+ property ordering. Return failure if an item is skipped. Avoid double
+ free on import errors. Fix parsing of UNTIL.
+
+ * Do not remove an empty note file after edit session.
+
+ * Keep internal linked list sorted when moving items.
+
+ * Prevent external hook/notification commands from interacting with the UI.
+
+- calcurse-caldav bug fixes:
+
+ * Allow non-ASCII characters in username and password (fixed by Henrik
+ Grimler).
+
+ * Improved error handling for the configuration file. Unknown keys are now
+ reported as errors instead of ignored.
+
+ * Always request href from server after pushing a new object to prevent
+ items from being erroneously deleted or created when path contains
+ characters that need to be URL-encoded (reported and fixed by Max
+ Deineko).
+
Version 4.7.0 (2020-10-12)
--------------------------
diff --git a/COPYING b/COPYING
index d3ebf1b..ceb0721 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
index 6fc80af..009a5e6 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,26 @@
-calcurse
-========
+# calcurse
+
+[![Build and test](https://github.com/lfos/calcurse/actions/workflows/make.yml/badge.svg)](https://github.com/lfos/calcurse/actions/workflows/make.yml)
+[![Lint Python](https://github.com/lfos/calcurse/actions/workflows/lint_python.yml/badge.svg)](https://github.com/lfos/calcurse/actions/workflows/lint_python.yml)
![Demo](https://calcurse.org/images/demo.gif)
-Building
---------
+## Installation
+
+calcurse is available on a number of Linux distributions:
+
+[![Packaging status](https://repology.org/badge/vertical-allrepos/calcurse.svg)](https://repology.org/project/calcurse/versions)
+
+## Building from Source
-Install the following build dependencies. If your distro segments development
-files from core packages (i.e., \*-devel or \*-dev packages), you may need to
-install those as well:
+Install the following build dependencies. If your distribution segments
+development files from core packages (i.e., \*-devel or \*-dev packages), you
+may need to install those as well:
* gcc
+* autoconf-archive
* automake
+* autopoint
* asciidoc
* gettext with development files
* ncurses with development files
@@ -26,8 +35,7 @@ and install calcurse:
Note that `make install` needs to be run as root. When working on a Git
checkout, you need to run `./autogen.sh` before `./configure`.
-Package Overview
-----------------
+## Source Overview
* `build-aux`: auxiliary files for the build process
* `contrib`: useful tools such as hooks or the CalDAV synchronization script
@@ -37,8 +45,7 @@ Package Overview
* `src`: the actual calcurse source files
* `test`: test suite and test cases for calcurse
-Authors
--------
+## Authors
calcurse was created by Frederic Culot in 2004. Since 2011, the project is
maintained by Lukas Fleischer. Many core features added to calcurse since 2017
@@ -48,8 +55,7 @@ Of course, there are numerous other contributors. Check the Git commit log and
the `Thanks` section in the manual for a list of people who have contributed by
reporting bugs, sending fixes, or suggesting improvements.
-Contributing and Donations
---------------------------
+## Contributing and Donations
Patches, bug reports and other requests are always welcome! You can submit them
to one of our mailing lists (check the [patch submission
diff --git a/autogen.sh b/autogen.sh
index 55c7768..ee8f12f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+# Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
index fe1ec84..40c04b5 100755
--- a/build-aux/git-version-gen
+++ b/build-aux/git-version-gen
@@ -6,7 +6,7 @@ then
exit 1
fi
-DEF_VER=4.7.0
+DEF_VER=4.8.1
VERFILE="$1"
if [ -d '.git' ]
diff --git a/configure.ac b/configure.ac
index 1f6ec61..da211d0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,16 +1,14 @@
#-------------------------------------------------------------------------------
# Init
#-------------------------------------------------------------------------------
-AC_PREREQ(2.59)
-AC_INIT([calcurse],
- m4_esyscmd([build-aux/git-version-gen .version]),
- [bugs@calcurse.org])
+AC_PREREQ([2.71])
+AC_INIT([calcurse],[m4_esyscmd(build-aux/git-version-gen .version)],[bugs@calcurse.org])
AM_INIT_AUTOMAKE
#m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AM_GNU_GETTEXT([external])
-AM_GNU_GETTEXT_VERSION([0.14.1])
+AM_GNU_GETTEXT_VERSION([0.19.8])
AC_CONFIG_SRCDIR([src/calcurse.c])
-AC_CONFIG_HEADER([config.h])
+AC_CONFIG_HEADERS([config.h])
#-------------------------------------------------------------------------------
# Checks for system type
#-------------------------------------------------------------------------------
@@ -19,37 +17,22 @@ AC_CANONICAL_HOST
# Checks for programs
#-------------------------------------------------------------------------------
AC_PROG_CC
+AC_C_BIGENDIAN
#-------------------------------------------------------------------------------
# Checks for header files
#-------------------------------------------------------------------------------
-AC_HEADER_STDC
AC_CHECK_HEADERS([ctype.h getopt.h locale.h math.h signal.h stdio.h stdlib.h \
string.h sys/stat.h sys/types.h sys/wait.h time.h unistd.h \
fcntl.h paths.h errno.h limits.h regex.h])
#-------------------------------------------------------------------------------
# Checks for system libs
#-------------------------------------------------------------------------------
-AC_CHECK_FUNC(initscr,,
-[
- available_ncurses="none"
- for lib in ncursesw ncurses
- do
- AC_CHECK_LIB($lib, initscr,
- [available_ncurses="$lib"; break])
- done
- if test "$available_ncurses" = none; then
- AC_MSG_ERROR(Either ncurses or ncursesw library is required to build calcurse!)
- elif test "$available_ncurses" = ncursesw; then
- AC_CHECK_HEADERS([ncursesw/ncurses.h],,
- [AC_CHECK_HEADERS([ncurses.h],,
- AC_MSG_ERROR([Missing ncursesw header file]))])
- else
- AC_CHECK_HEADERS([ncurses/ncurses.h],,
- [AC_CHECK_HEADERS([ncurses.h],,
- AC_MSG_ERROR([Missing ncurses header file]))])
- fi
- LIBS="$LIBS -l$available_ncurses"
-])
+AX_WITH_CURSES
+if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then
+ AC_MSG_ERROR(Either ncurses or ncursesw library is required to build calcurse!)
+fi
+
+LIBS="$LIBS $CURSES_LIBS"
AC_CHECK_HEADERS([pthread.h], [
AC_CHECK_LIB(pthread, pthread_create, [
@@ -76,7 +59,6 @@ AC_ARG_ENABLE(docs,
[enabledocs=$enableval], [enabledocs=yes])
if test x"$enabledocs" != x"yes"; then
enabledocs=no
- AC_MSG_WARN([Skipping documentation!])
fi
AC_MSG_CHECKING([whether to include documentation])
AC_MSG_RESULT($enabledocs)
@@ -87,7 +69,21 @@ AC_ARG_WITH(asciidoc,
[use AsciiDoc to regenerate documentation]),
[use_asciidoc=$withval],
[use_asciidoc="auto"])
-if test x"$use_asciidoc" = x"auto"; then
+if test x"$enabledocs" = x"no" -o x"$use_asciidoc" = x"no"; then
+ AC_MSG_WARN([Will not rebuild documentation!])
+ have_asciidoc=no
+ have_a2x=no
+elif test x"$use_asciidoc" = x"yes"; then
+ AC_PATH_PROG([ASCIIDOC], [asciidoc])
+ if test -z "$ASCIIDOC"; then
+ AC_MSG_ERROR([AsciiDoc not found and "--with-asciidoc" specified!])
+ fi
+ AC_PATH_PROG([A2X], [a2x])
+ if test -z "$A2X"; then
+ AC_MSG_ERROR([a2x not found and "--with-asciidoc" specified!])
+ fi
+ have_asciidoc=yes
+elif test x"$use_asciidoc" = x"auto"; then
AC_PATH_PROG([ASCIIDOC], [asciidoc])
if test -z "$ASCIIDOC"; then
have_asciidoc=no
@@ -112,20 +108,6 @@ if test x"$use_asciidoc" = x"auto"; then
else
have_a2x=yes
fi
-elif test x"$use_asciidoc" = x"yes"; then
- AC_PATH_PROG([ASCIIDOC], [asciidoc])
- if test -z "$ASCIIDOC"; then
- AC_MSG_ERROR([AsciiDoc not found and "--with-asciidoc" specified!])
- fi
- AC_PATH_PROG([A2X], [a2x])
- if test -z "$A2X"; then
- AC_MSG_ERROR([a2x not found and "--with-asciidoc" specified!])
- fi
- have_asciidoc=yes
-elif test x"$use_asciidoc" = x"no"; then
- AC_MSG_WARN([Will not rebuild documentation!])
- have_asciidoc=no
- have_a2x=no
fi
AM_CONDITIONAL(HAVE_ASCIIDOC, test $have_asciidoc = yes)
AM_CONDITIONAL(HAVE_A2X, test $have_a2x = yes)
@@ -152,9 +134,10 @@ AM_CONDITIONAL(CALCURSE_MEMORY_DEBUG, test x$memdebug = xyes)
#-------------------------------------------------------------------------------
# Create Makefiles
#-------------------------------------------------------------------------------
-AC_OUTPUT(Makefile doc/Makefile src/Makefile test/Makefile \
+AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile test/Makefile \
scripts/Makefile po/Makefile.in po/Makefile \
- contrib/caldav/Makefile contrib/vdir/Makefile)
+ contrib/caldav/Makefile contrib/vdir/Makefile])
+AC_OUTPUT
#-------------------------------------------------------------------------------
# Summary
#-------------------------------------------------------------------------------
diff --git a/contrib/caldav/README.md b/contrib/caldav/README.md
index a842081..b464dc9 100644
--- a/contrib/caldav/README.md
+++ b/contrib/caldav/README.md
@@ -34,13 +34,12 @@ argument. You can choose between the following initialization modes:
For subsequent calcurse-caldav invocations, you don't need to specify any
additional parameters.
-You can specify a username and password for basic authentication in the
-config file. Alternatively, the password can be passed securely from another
-program (such as *pass*) via the `CALCURSE_CALDAV_PASSWORD` environment variable like
-so:
-```
-CALCURSE_CALDAV_PASSWORD=$(pass show calcurse) calcurse-caldav
-```
+Specify your HTTP Basic authentication credentials under the config file's
+`Auth` section. The most secure approach is to save your password in a CLI
+encrypted password store (_e.g.,_ [pass](https://www.passwordstore.org/)), and
+then set `PasswordCommand` to the shell command used to retrieve it.
+If security is not a priority, you may store your password in plain text
+instead.
Hooks
-----
diff --git a/contrib/caldav/calcurse-caldav.py b/contrib/caldav/calcurse-caldav.py
index 7c9b89b..5efd306 100755
--- a/contrib/caldav/calcurse-caldav.py
+++ b/contrib/caldav/calcurse-caldav.py
@@ -3,25 +3,92 @@
import argparse
import base64
import configparser
-import httplib2
-import pathlib
import os
+import pathlib
import re
+import shlex
import subprocess
import sys
import textwrap
-import urllib.parse
import xml.etree.ElementTree as etree
+import httplib2
+
# Optional libraries for OAuth2 authentication
try:
- from oauth2client.client import OAuth2WebServerFlow, HttpAccessTokenRefreshError
- from oauth2client.file import Storage
import webbrowser
+
+ from oauth2client.client import HttpAccessTokenRefreshError, OAuth2WebServerFlow
+ from oauth2client.file import Storage
except ModuleNotFoundError:
pass
+class Config:
+ _map = {}
+
+ def __init__(self, fn):
+ self._map = {
+ 'Auth': {
+ 'Password': None,
+ 'PasswordCommand': None,
+ 'Username': None,
+ },
+ 'CustomHeaders': {},
+ 'General': {
+ 'AuthMethod': 'basic',
+ 'Binary': 'calcurse',
+ 'Debug': False,
+ 'DryRun': True,
+ 'HTTPS': True,
+ 'Hostname': None,
+ 'InsecureSSL': False,
+ 'Path': None,
+ 'SyncFilter': 'cal,todo',
+ 'Verbose': False,
+ },
+ 'OAuth2': {
+ 'ClientID': None,
+ 'ClientSecret': None,
+ 'RedirectURI': 'http://127.0.0.1',
+ 'Scope': None,
+ },
+ }
+
+ config = configparser.RawConfigParser()
+ config.optionxform = str
+ if verbose:
+ print('Loading configuration from ' + configfn + '...')
+ try:
+ config.read_file(open(fn))
+ except FileNotFoundError:
+ die('Configuration file not found: {}'.format(fn))
+
+ for sec in config.sections():
+ if sec not in self._map:
+ die('Unexpected config section: {}'.format(sec))
+
+ if not self._map[sec]:
+ # Import section with custom key-value pairs.
+ self._map[sec] = dict(config.items(sec))
+ continue
+
+ # Import section with predefined keys.
+ for key, val in config.items(sec):
+ if key not in self._map[sec]:
+ die('Unexpected config key in section {}: {}'.format(sec, key))
+ if isinstance(self._map[sec][key], bool):
+ self._map[sec][key] = config.getboolean(sec, key)
+ else:
+ self._map[sec][key] = val
+
+ def section(self, section):
+ return self._map[section]
+
+ def get(self, section, key):
+ return self._map[section][key]
+
+
def msgfmt(msg, prefix=''):
lines = []
for line in msg.splitlines():
@@ -43,6 +110,7 @@ def check_dir(dir):
except FileExistsError:
die("{} is not a directory".format(dir))
+
def die_atnode(msg, node):
if debug:
msg += '\n\n'
@@ -147,8 +215,8 @@ def calcurse_version():
def get_auth_headers():
if not username or not password:
return {}
- user_password = ('{}:{}'.format(username, password)).encode('ascii')
- user_password = base64.b64encode(user_password).decode('ascii')
+ user_password = ('{}:{}'.format(username, password)).encode('utf-8')
+ user_password = base64.b64encode(user_password).decode('utf-8')
headers = {'Authorization': 'Basic {}'.format(user_password)}
return headers
@@ -353,18 +421,21 @@ def push_object(conn, objhash):
if not headers:
return None
-
- etag = None
headerdict = dict(headers)
- if 'etag' in headerdict:
- etag = headerdict['etag']
- while not etag:
+
+ # Retrieve href from server to match server-side format. Retrieve ETag
+ # unless it can be extracted from the PUT response already.
+ ret_href, ret_etag = None, headerdict.get('etag')
+ while not ret_etag or not ret_href:
etagdict = get_etags(conn, [href])
- if etagdict:
- etag = next(iter(etagdict.values()))
- etag = etag.strip('"')
+ if not etagdict:
+ continue
+ ret_href, new_etag = next(iter(etagdict.items()))
+ # Favor ETag from PUT response to avoid race condition.
+ if not ret_etag:
+ ret_etag = new_etag
- return (urllib.parse.quote(href), etag)
+ return (ret_href, ret_etag.strip('"'))
def push_objects(objhashes, conn, syncdb, etagdict):
@@ -588,105 +659,58 @@ verbose = args.verbose
debug = args.debug
debug_raw = args.debug_raw
-# Read environment variables
-password = os.getenv('CALCURSE_CALDAV_PASSWORD')
-
# Read configuration.
-config = configparser.RawConfigParser()
-if verbose:
- print('Loading configuration from ' + configfn + '...')
-try:
- config.read_file(open(configfn))
-except FileNotFoundError as e:
- die('Configuration file not found: {}'.format(configfn))
-
-if config.has_option('General', 'InsecureSSL'):
- insecure_ssl = config.getboolean('General', 'InsecureSSL')
+config = Config(configfn)
+
+authmethod = config.get('General', 'AuthMethod').lower()
+calcurse = [config.get('General', 'Binary')]
+debug = debug or config.get('General', 'Debug')
+dry_run = config.get('General', 'DryRun')
+hostname = config.get('General', 'Hostname')
+https = config.get('General', 'HTTPS')
+insecure_ssl = config.get('General', 'InsecureSSL')
+path = config.get('General', 'Path')
+sync_filter = config.get('General', 'SyncFilter')
+verbose = verbose or config.get('General', 'Verbose')
+
+if os.getenv('CALCURSE_CALDAV_PASSWORD'):
+ # This approach is deprecated, but preserved for backwards compatibility
+ password = os.getenv('CALCURSE_CALDAV_PASSWORD')
+elif config.get('Auth', 'Password'):
+ password = config.get('Auth', 'Password')
+elif config.get('Auth', 'PasswordCommand'):
+ tokenized_cmd = shlex.split(config.get('Auth', 'PasswordCommand'))
+ password = subprocess.run(
+ tokenized_cmd, capture_output=True).stdout.decode('UTF-8').rstrip('\n')
else:
- insecure_ssl = False
+ password = None
-# Read config for "HTTPS" option (default=True)
-if config.has_option('General', 'HTTPS'):
- https = config.getboolean('General', 'HTTPS')
-else:
- https = True
+username = config.get('Auth', 'Username')
-if config.has_option('General', 'Binary'):
- calcurse = [config.get('General', 'Binary')]
-else:
- calcurse = ['calcurse']
+client_id = config.get('OAuth2', 'ClientID')
+client_secret = config.get('OAuth2', 'ClientSecret')
+redirect_uri = config.get('OAuth2', 'RedirectURI')
+scope = config.get('OAuth2', 'Scope')
+
+custom_headers = config.section('CustomHeaders')
+# Append data directory to calcurse command.
if datadir:
check_dir(datadir)
calcurse += ['-D', datadir]
-if config.has_option('General', 'DryRun'):
- dry_run = config.getboolean('General', 'DryRun')
-else:
- dry_run = True
-
-if not verbose and config.has_option('General', 'Verbose'):
- verbose = config.getboolean('General', 'Verbose')
-
-if not debug and config.has_option('General', 'Debug'):
- debug = config.getboolean('General', 'Debug')
-
-if config.has_option('General', 'AuthMethod'):
- authmethod = config.get('General', 'AuthMethod').lower()
-else:
- authmethod = 'basic'
-
-if config.has_option('General', 'SyncFilter'):
- sync_filter = config.get('General', 'SyncFilter')
-
- invalid_filter_values = validate_sync_filter()
-
- if len(invalid_filter_values):
- die('Invalid value(s) in SyncFilter option: ' + ', '.join(invalid_filter_values))
-else:
- sync_filter = 'cal,todo'
-
-if config.has_option('Auth', 'UserName'):
- username = config.get('Auth', 'UserName')
-else:
- username = None
-
-if config.has_option('Auth', 'Password') and not password:
- password = config.get('Auth', 'Password')
-
-if config.has_section('CustomHeaders'):
- custom_headers = dict(config.items('CustomHeaders'))
-else:
- custom_headers = {}
-
-if config.has_option('OAuth2', 'ClientID'):
- client_id = config.get('OAuth2', 'ClientID')
-else:
- client_id = None
-
-if config.has_option('OAuth2', 'ClientSecret'):
- client_secret = config.get('OAuth2', 'ClientSecret')
-else:
- client_secret = None
-
-if config.has_option('OAuth2', 'Scope'):
- scope = config.get('OAuth2', 'Scope')
-else:
- scope = None
-
-if config.has_option('OAuth2', 'RedirectURI'):
- redirect_uri = config.get('OAuth2', 'RedirectURI')
-else:
- redirect_uri = 'http://127.0.0.1'
-
-# Change URl prefix according to HTTP/HTTPS
-if https:
- urlprefix = "https://"
-else:
- urlprefix = "http://"
-
-hostname = config.get('General', 'HostName')
-path = '/' + config.get('General', 'Path').strip('/') + '/'
+# Validate sync filter.
+invalid_filter_values = validate_sync_filter()
+if len(invalid_filter_values):
+ die('Invalid value(s) in SyncFilter option: ' + ', '.join(invalid_filter_values))
+
+# Ensure host name and path are defined and initialize *_uri.
+if not hostname:
+ die('Hostname missing in configuration.')
+if not path:
+ die('Path missing in configuration.')
+urlprefix = "https://" if https else "http://"
+path = '/{}/'.format(path.strip('/'))
hostname_uri = urlprefix + hostname
absolute_uri = hostname_uri + path
@@ -719,9 +743,7 @@ try:
# Connect to the server.
if verbose:
print('Connecting to ' + hostname + '...')
- conn = httplib2.Http()
- if insecure_ssl:
- conn.disable_ssl_certificate_validation = True
+ conn = httplib2.Http(disable_ssl_certificate_validation=insecure_ssl)
if authmethod == 'oauth2':
# Authenticate with OAuth2 and authorize HTTP object
@@ -784,7 +806,7 @@ try:
# Write the synchronization database.
save_syncdb(syncdbfn, syncdb)
- #Clear OAuth2 credentials if used
+ # Clear OAuth2 credentials if used.
if authmethod == 'oauth2':
conn.clear_credentials()
diff --git a/contrib/caldav/config.sample b/contrib/caldav/config.sample
index c89cfb7..0ba8fa8 100644
--- a/contrib/caldav/config.sample
+++ b/contrib/caldav/config.sample
@@ -11,10 +11,12 @@
# Path to the calcurse binary that is used for importing/exporting items.
Binary = calcurse
-# Host name of the server that hosts CalDAV.
+# Host name of the server that hosts CalDAV. Do NOT prepend a protocol prefix,
+# such as http:// or https://. Append :<port> for a port other than 80.
Hostname = some.hostname.com
-# Path to the CalDAV calendar on the host specified above.
+# Path to the CalDAV calendar on the host specified above. This is the base
+# path following your host name in the URL.
Path = /path/to/calendar/on/the/server/
# Type of authentication to use. Must be "basic" or "oauth2"
@@ -46,11 +48,13 @@ DryRun = Yes
# Enable this if you want detailed logs written to stdout.
Verbose = Yes
-# Credentials for HTTP Basic Authentication. Leave this commented out if you do
-# not want to use authentication.
+# Credentials for HTTP Basic Authentication (if required).
+# Set `Password` to your password in plaintext (unsafe),
+# or `PasswordCommand` to a shell command that retrieves it (recommended).
#[Auth]
#Username = user
-#Password = pass
+#Password = password
+#PasswordCommand = pass baikal
# Optionally specify additional HTTP headers here.
#[CustomHeaders]
diff --git a/contrib/caldav/hooks/post-sync b/contrib/caldav/hooks/post-sync
index 62ebe11..db0059b 100755
--- a/contrib/caldav/hooks/post-sync
+++ b/contrib/caldav/hooks/post-sync
@@ -26,7 +26,7 @@ commit_dir() {
if [ -d .git ] && command -v git >/dev/null; then
git add "$@"
if ! git diff-index --quiet --cached HEAD; then
- git commit -m "Automatic commit by the post-save hook"
+ git commit -m "Automatic commit by the post-sync hook"
fi
fi
}
diff --git a/contrib/setup.cfg b/contrib/setup.cfg
new file mode 100644
index 0000000..0691fee
--- /dev/null
+++ b/contrib/setup.cfg
@@ -0,0 +1,3 @@
+[flake8]
+max-line-length = 100
+max-complexity = 16
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 73cd8ce..adee962 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -57,8 +57,6 @@ CLEANFILES = \
submitting-patches.html \
calcurse.1
-docdir = $(datadir)/doc/$(PACKAGE)
-
.txt.html:
if HAVE_ASCIIDOC
$(AM_V_GEN) $(ASCIIDOC) $(ASCIIDOC_ARGS) $<
diff --git a/doc/calcurse.1.txt b/doc/calcurse.1.txt
index 4605219..1f79f9a 100644
--- a/doc/calcurse.1.txt
+++ b/doc/calcurse.1.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -764,5 +764,5 @@ AUTHORS
COPYRIGHT
---------
-Copyright (c) 2004-2020 calcurse Development Team.
+Copyright (c) 2004-2023 calcurse Development Team.
This software is released under the BSD License.
diff --git a/doc/credits.txt b/doc/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/credits.txt
+++ b/doc/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/de/credits.txt b/doc/de/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/de/credits.txt
+++ b/doc/de/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/es/credits.txt b/doc/es/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/es/credits.txt
+++ b/doc/es/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/fr/credits.txt b/doc/fr/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/fr/credits.txt
+++ b/doc/fr/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/manual.txt b/doc/manual.txt
index 7eaa211..03a27ff 100644
--- a/doc/manual.txt
+++ b/doc/manual.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -143,7 +143,7 @@ Install process
First you need to gunzip and untar the source archive:
----
-$ tar zxvf calcurse-4.7.0.tar.gz
+$ tar zxvf calcurse-4.8.1.tar.gz
----
Once you meet the requirements and have extracted the archive, the install
@@ -650,9 +650,9 @@ directory. Also make sure the scripts are executable.
*pre-load*::
Executed before the data files are loaded.
*post-load*::
- Executed after the data files are saved.
+ Executed after the data files are loaded.
*pre-save*::
- Executed before the data files are loaded.
+ Executed before the data files are saved.
*post-save*::
Executed after the data files are saved.
diff --git a/doc/nl/credits.txt b/doc/nl/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/nl/credits.txt
+++ b/doc/nl/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/pt_BR/credits.txt b/doc/pt_BR/credits.txt
index 5cddabc..82efeb5 100644
--- a/doc/pt_BR/credits.txt
+++ b/doc/pt_BR/credits.txt
@@ -1,7 +1,7 @@
Calcurse - organizador baseado em texto
=======================================
-Copyright (c) 2004-2020 Equipe de Desenvolvimento do Calcurse
+Copyright (c) 2004-2023 Equipe de Desenvolvimento do Calcurse
Todos os direitos reservados.
A redistribuição e uso na forma de código-fonte e binário, com ou
diff --git a/doc/ru/credits.txt b/doc/ru/credits.txt
index ac7c1ab..e1f5ae7 100644
--- a/doc/ru/credits.txt
+++ b/doc/ru/credits.txt
@@ -1,7 +1,7 @@
Calcurse - text-based organizer
===============================
-Copyright (c) 2004-2020 calcurse Development Team
+Copyright (c) 2004-2023 calcurse Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/doc/submitting-patches.txt b/doc/submitting-patches.txt
index 056bfb5..6514949 100644
--- a/doc/submitting-patches.txt
+++ b/doc/submitting-patches.txt
@@ -1,6 +1,6 @@
////
/*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/po/calcurse.pot b/po/calcurse.pot
index 16bf2e9..2fd17ea 100644
--- a/po/calcurse.pot
+++ b/po/calcurse.pot
@@ -1,14 +1,14 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: calcurse 4.8.1-11-g9f7e\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -50,7 +50,7 @@ msgstr ""
msgid "calcurse %s -- text-based organizer\n"
msgstr ""
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
msgid "This is free software; see the source for copying conditions."
@@ -419,12 +419,6 @@ msgstr ""
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
-msgid "Monday"
-msgstr ""
-
-msgid "Sunday"
-msgstr ""
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -449,12 +443,18 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+
msgid "Enter the date format: "
msgstr ""
@@ -467,7 +467,7 @@ msgstr ""
msgid "Undefined option!"
msgstr ""
-msgid "undefined"
+msgid "UNDEFINED"
msgstr ""
msgid "keys configuration"
@@ -480,7 +480,7 @@ msgstr ""
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -581,6 +581,12 @@ msgstr ""
msgid "unknown ical type"
msgstr ""
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -602,6 +608,9 @@ msgstr ""
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
msgstr ""
@@ -640,58 +649,55 @@ msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr ""
-
-msgid "item start date is not defined."
+msgid "malformed start time line."
msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, c-format
-msgid "Location: %s"
+msgid "invalid end time value type."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
+msgid "end must be later than start."
msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-msgid "invalid or malformed event start time."
+msgid "malformed duration line."
msgstr ""
-msgid "either end or duration."
+msgid "invalid duration."
msgstr ""
-msgid "invalid end time value type."
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-msgid "malformed event end time."
+#, c-format
+msgid "Location: %s"
msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-msgid "malformed duration line."
+#, c-format
+msgid "rrule does not match start day (%s)."
msgstr ""
-msgid "invalid duration."
+msgid "item could not be identified."
msgstr ""
msgid "only one description allowed."
@@ -703,6 +709,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
+msgid "could not retrieve item summary."
+msgstr ""
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -797,31 +806,37 @@ msgstr ""
msgid "failed to open key file"
msgstr ""
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
+msgid "Could not read key label"
msgstr ""
-msgid "Could not read key label"
+#, c-format
+msgid "Key label not recognized: \"%s\""
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+
+msgid "Some actions do not have any associated key bindings!"
msgstr ""
#, c-format
@@ -948,6 +963,9 @@ msgstr ""
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr ""
@@ -1126,6 +1144,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr ""
@@ -1246,7 +1267,7 @@ msgid "FATAL ERROR: null file pointer."
msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1339,12 +1360,6 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr ""
-msgid "error while launching command: could not fork"
-msgstr ""
-
-msgid "error while launching command"
-msgstr ""
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr ""
@@ -1370,9 +1385,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
@@ -1761,7 +1773,7 @@ msgstr ""
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
diff --git a/po/de.po b/po/de.po
index 9707916..568ec93 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1,23 +1,23 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# delix, 2012
-# delix, 2012
+# 854c965733f966783769d2df566aaebe_fdcf60e, 2012
# Lukas Fleischer, 2019
# Stefan Schroeder <ondekoza@gmail.com>, 2017
# Tim, 2013
# Tim Summerer <summerer.tim@gmail.com>, 2019
-# Tim, 2013
+# 8eda48bac0dbbe266f569e2487f7fa50_208ec8f, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: German (http://www.transifex.com/lfleischer/calcurse/language/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Tim Summerer <summerer.tim@gmail.com>, 2019\n"
+"Language-Team: German (http://app.transifex.com/lfleischer/calcurse/language/"
"de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
@@ -28,13 +28,11 @@ msgstr ""
msgid "null pointer"
msgstr "Null-Zeiger"
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "Datumsfehler im Termin"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "Datumsfehler im Termin"
+msgstr ""
msgid "date error in appointment"
msgstr "Datumsfehler im Termin"
@@ -59,9 +57,8 @@ msgstr "Der Aufruf `calcurse -h` zeigt weitere Hilfen."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- Terminplaner im Textmodus\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Entwickler-Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr "This is free software; see the source for copying conditions."
@@ -301,13 +298,11 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr "Hilfethema existiert nicht: %s"
-#, fuzzy
msgid "Select a repeating item in the appointments panel."
-msgstr "(Position des Titels in der Terminleiste)"
+msgstr ""
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Ein Item wiederholen"
+msgstr ""
msgid "Last occurrence."
msgstr ""
@@ -438,12 +433,6 @@ msgstr ""
"(Ist JA gewählt, ist eine Bestätigung erforderlich, um ein Ereignis zu "
"löschen)"
-msgid "Monday"
-msgstr "Montag"
-
-msgid "Sunday"
-msgstr "Sonntag"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(lege den ersten Tag der Woche in der Kalenderansicht fest)"
@@ -468,12 +457,18 @@ msgstr "(Position des Titels in der Terminleiste)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Format des Datums in der Termin-Anzeige)"
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Geben Sie das Datumsformat an (vgl. 'man 3 strftime')"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Zeitformat eingeben (vgl. 'man 3 strftime')"
+
msgid "Enter the date format: "
msgstr "Datumsformat eingeben:"
@@ -488,8 +483,8 @@ msgstr "Allgemeine Einstellungen"
msgid "Undefined option!"
msgstr "Unbestimmte Einstellung!"
-msgid "undefined"
-msgstr "unbestimmt"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Tasteneinstellung"
@@ -501,8 +496,8 @@ msgstr "Taste drücken, die zugewiesen werden soll:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "Die Taste '%s' wird schon von %s benutzt. Wählen Sie eine andere."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Einige Aktionen haben keine Tastenzuordnung!"
+msgid "Some actions are left undefined!"
+msgstr ""
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -518,9 +513,8 @@ msgstr ""
msgid "unknown item type"
msgstr "Unbekannte Position"
-#, fuzzy
msgid "Note:"
-msgstr "Notiz bearb."
+msgstr ""
msgid "Event:"
msgstr "Ereignis:"
@@ -590,13 +584,11 @@ msgstr "Aufgeweckt als %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "Kann den calcurse-Dienst nicht beenden: %s\n"
-#, fuzzy
msgid "illegal date in event"
-msgstr "Datumsfehler im Ereignis"
+msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "Datumsfehler im Ereignis"
+msgstr ""
msgid "Internal error: line too long"
msgstr "INTERNER FEHLER: Die Zeile ist zu lang"
@@ -607,6 +599,12 @@ msgstr "Hauptspeicher reicht nicht aus"
msgid "unknown ical type"
msgstr "Unbekannter ICal-Typ"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -619,20 +617,20 @@ msgstr ""
msgid "frequency absent in rrule."
msgstr ""
-#, fuzzy
msgid "rrule frequency not supported."
-msgstr "Wiederholung nicht gefunden."
+msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "Ungültiger Filter"
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "Ungültiges Exportformat: %s"
+msgstr ""
msgid "invalid count value."
msgstr ""
@@ -640,13 +638,11 @@ msgstr ""
msgid "invalid bymonth list."
msgstr ""
-#, fuzzy
msgid "invalid bymonthday list."
-msgstr "Ungültiges Datum: %s"
+msgstr ""
-#, fuzzy
msgid "invalid byday list."
-msgstr "Ungültiges Datum: %s"
+msgstr ""
msgid "invalid exception date value type."
msgstr ""
@@ -654,89 +650,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "Ungültige Wiederholungsrate."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Beschreibung eingeben:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "Kann die Zusammenfassung des Eintrags nicht lesen."
-
-msgid "item start date is not defined."
-msgstr "Anfangsdatum des Eintrags fehlt."
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr "alloziiert bei: %s\n"
+msgid "invalid end time value type."
+msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
-msgstr "Element kann nicht erkannt werden."
+msgid "end must be later than start."
+msgstr ""
-#, fuzzy
-msgid "malformed start time line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgid "either end or duration."
+msgstr ""
-#, fuzzy
-msgid "invalid or malformed event start time."
-msgstr "Kann die Startzeit des Ereignis nicht lesen."
+msgid "malformed duration line."
+msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "Syntaxfehler in Item-Zeit oder -Dauer"
+msgid "invalid duration."
+msgstr ""
-#, fuzzy
-msgid "invalid end time value type."
-msgstr "Ungültiger Zeitraum: %s"
+msgid "exception date, but no recurrence rule."
+msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-#, fuzzy
-msgid "malformed event end time."
-msgstr "Kann die Endzeit des Ereignis nicht lesen."
+#, c-format
+msgid "Location: %s"
+msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "Beschreibung Fehlerhaft."
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "Ungültiges Datum: %s"
+msgid "item could not be identified."
+msgstr "Element kann nicht erkannt werden."
-#, fuzzy
msgid "only one description allowed."
-msgstr "Beschreibung Fehlerhaft."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -744,6 +727,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr "Die ICal Datei ist fehlerhaft. Keine Enddatum des Eintrags gefunden."
+msgid "could not retrieve item summary."
+msgstr "Kann die Zusammenfassung des Eintrags nicht lesen."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr "Priorität des Eintrags ist ungültig (gültig sind 0 bis 9)"
@@ -816,9 +802,8 @@ msgstr "Falsches Format für den Termin oder das Ereignis"
msgid "syntax error in item repetition"
msgstr "Syntaxfehler in Item-Wiederholung"
-#, fuzzy
msgid "syntax error in until date"
-msgstr "Eingabefehler im Datum"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -829,9 +814,8 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "Eingabefehler im Datum"
+msgstr ""
msgid "failed to open todo file"
msgstr "konnte Aufgaben-Datei nicht öffnen"
@@ -842,36 +826,38 @@ msgstr ""
msgid "failed to open key file"
msgstr "Konnte Tastenkonfigurationsdatei nicht öffnen"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Zu viele Fehler beim Lesen der Konfigurationsdatei!\n"
-"Bitte die Einstellungsdatei der Tastaturkürzel sichern, diese aus dem\n"
-"Verzeichnis löschen und calcurse neu starten.\n"
-
msgid "Could not read key label"
msgstr "Tastenbezeichnung nicht lesbar"
-msgid "Key label not recognized"
-msgstr "Tastenbezeichnung nicht erkannt"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Fehler beim Lesen der Taste \"%s\""
+msgid "Keyname not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" ist mehrfach zugeordnet!"
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Zu viele Fehler beim Lesen der 'keys'-Datei, Abbruch..."
+msgid "Errors in the keys file."
+msgstr ""
+
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Einige Aktionen haben keine Tastenzuordnung!"
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
@@ -1002,6 +988,9 @@ msgstr "Einfügen"
msgid "Chg Win"
msgstr "Wechseln"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importieren"
@@ -1189,6 +1178,9 @@ msgstr "Item an aktueller Position einfügen."
msgid "Select next panel in calcurse main screen."
msgstr "Wähle nächstes Fenster im calcurse-Hauptbildschirm."
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importiere Daten von einer externen Datei."
@@ -1321,9 +1313,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "SCHWERER FEHLER: Null-Datei-Zeiger."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Beim Hinzufügen einer Default-Taste für \"%s\" war \"%s\" bereits zugewiesen!"
msgid "xmalloc: zero size"
msgstr "xmalloc: Länge 0"
@@ -1415,12 +1406,6 @@ msgstr " belegte Blöcke: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "WARNUNG: Kann %s nicht öffnen. Abbruch..."
-msgid "error while launching command: could not fork"
-msgstr "Fehler beim Ausführen einer Befehlszeile: Kann nicht Ausführen"
-
-msgid "error while launching command"
-msgstr "Fehler beim Ausführen einer Befehlszeile"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Ist JA gewählt, wird die Benachrichtigungszeile angezeigt)"
@@ -1447,9 +1432,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Aufzeichnen von Aktivitäten, wenn im Hintergrund ausgeführt)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Zeitformat eingeben (vgl. 'man 3 strftime')"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr "Geben Sie die Zeit in Sekunden ein (0 um keine Hinweis zu erhalten)."
@@ -1472,9 +1454,8 @@ msgstr "Unbekanntes Zeichen"
msgid "recurrence error: not on start day (%s)"
msgstr ""
-#, fuzzy
msgid "illegel date in event"
-msgstr "Datumsfehler im Ereignis"
+msgstr ""
msgid "date error in event"
msgstr "Datumsfehler im Ereignis"
@@ -1482,9 +1463,8 @@ msgstr "Datumsfehler im Ereignis"
msgid "month day is zero"
msgstr ""
-#, fuzzy
msgid "no daily frequency check"
-msgstr "Ungültige Wiederholungsrate."
+msgstr ""
msgid "illegal BYDAY value"
msgstr ""
@@ -1495,17 +1475,14 @@ msgstr "Ereignis nicht gefunden"
msgid "appointment not found"
msgstr "Termin nicht gefunden"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "Eingabefehler im Datum"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "Eingabefehler im Datum"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "Eingabefehler im Datum"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
@@ -1636,23 +1613,20 @@ msgstr ""
msgid "Invalid format - try again."
msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Eine beliebige Taste um fortzufahren..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "Heute"
+msgstr ""
msgid "week"
msgstr ""
-#, fuzzy
msgid "month"
-msgstr "(m)onatlich"
+msgstr ""
msgid "year"
msgstr ""
@@ -1730,30 +1704,25 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent and has a note attached to it. Delete (s)elected "
"occurrence, (a)ll occurrences, or just its (n)ote?"
msgstr ""
-"An diesem Eintrag ist eine Notiz. E(i)ntrag löschen oder nur die (n)otiz?"
msgid "[san]"
msgstr ""
-#, fuzzy
msgid ""
"This item has a note attached to it. Delete (s)elected occurrence or just "
"its (n)ote?"
msgstr ""
-"An diesem Eintrag ist eine Notiz. E(i)ntrag löschen oder nur die (n)otiz?"
msgid "[sn]"
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
-msgstr "Dieser Eintrag ist wiederkehrend. Lösche (a)lle oder nur (e)inen?"
+msgstr ""
msgid "[sa]"
msgstr ""
@@ -1764,9 +1733,8 @@ msgstr ""
msgid "[s]"
msgstr ""
-#, fuzzy
msgid "Already repeated."
-msgstr "Es handelt sich bereits um einen wiederkehrenden Eintrag."
+msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
@@ -1853,16 +1821,11 @@ msgstr "unbekannte Ansicht"
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr "Verwendung: calcurse-upgrade [-h|-v|--config <file>]"
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"Copyright (c) 2004-2017 calcurse Entwickler-Team.\n"
-"Calcurse ist freie Software; die Lizenzbedingungen sind in den Quelltexten "
-"vermerkt.\n"
msgid "unrecognized option:"
msgstr "unbekannte Option:"
@@ -1911,80 +1874,3 @@ msgstr "Aktualisiere Konfigurationsanweisungen..."
msgid "Remove temporary backup..."
msgstr "Entferne temporäres Backup..."
-
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(Ist JA gewählt, werden Nachrichten über geladene und gespeicherte Daten "
-#~ "angezeigt)"
-
-#~ msgid "date error in the event\n"
-#~ msgstr "Fehlerhafte Zeit für das Ereignis\n"
-
-#~ msgid "recurrence frequency not recognized."
-#~ msgstr "Wiederholung nicht erkannt."
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Beschreibung eingeben:"
-
-#~ msgid "item has a negative duration."
-#~ msgstr "Eintrag hat eine negative Dauer."
-
-#~ msgid "item duration malformed."
-#~ msgstr "Dauer des Eintrags fehlerhaft."
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr "Willkommen zu calcurse. Fehlende Dateien werden erzeugt."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Benutzerdaten gefunden. Daten werden geladen."
-
-#~ msgid "unknown repetition type"
-#~ msgstr "Unbekannter Wiederholungstyp"
-
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Neuen Wiederholungstyp eingeben:"
-
-#~ msgid "(d)aily"
-#~ msgstr "(t)äglich"
-
-#~ msgid "(w)eekly"
-#~ msgstr "(w)öchentlich"
-
-#~ msgid "(y)early"
-#~ msgstr "(j)ährlich"
-
-#, c-format
-#~ msgid "(currently using %s)"
-#~ msgstr "(verwende momentan %s)"
-
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Eingabe der Wiederholungsrate:"
-
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Möchten Sie diesen Eintrag wirklich löschen?"
-
-#~ msgid "[ao]"
-#~ msgstr "[ae]"
-
-#~ msgid "[in]"
-#~ msgstr "[in]"
-
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Wiederholungstyp eingeben:"
-
-#~ msgid "wrong item type"
-#~ msgstr "Falscher Typ des Eintrags"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "Wiederholungstyp falsch."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "Ausnahmen des Wiederholungstyp falsch."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "Kann nicht die ganze Beschreibung lesen."
-
-#~ msgid "event end time malformed."
-#~ msgstr "Ereignis-Endzeit hat ein ungültiges Format."
diff --git a/po/doc/add-nb_NO.po b/po/doc/add-nb_NO.po
index c981c8b..19838eb 100644
--- a/po/doc/add-nb_NO.po
+++ b/po/doc/add-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/copy-paste-nb_NO.po b/po/doc/copy-paste-nb_NO.po
index c84f2ba..363ac2a 100644
--- a/po/doc/copy-paste-nb_NO.po
+++ b/po/doc/copy-paste-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/credits-nb_NO.po b/po/doc/credits-nb_NO.po
index 76ddeef..074595b 100644
--- a/po/doc/credits-nb_NO.po
+++ b/po/doc/credits-nb_NO.po
@@ -1,6 +1,6 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
diff --git a/po/doc/edit-nb_NO.po b/po/doc/edit-nb_NO.po
index 89fc52e..42d4951 100644
--- a/po/doc/edit-nb_NO.po
+++ b/po/doc/edit-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/export-nb_NO.po b/po/doc/export-nb_NO.po
index 4fcd275..80d78e9 100644
--- a/po/doc/export-nb_NO.po
+++ b/po/doc/export-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/flag-nb_NO.po b/po/doc/flag-nb_NO.po
index 60e4a19..bfd2673 100644
--- a/po/doc/flag-nb_NO.po
+++ b/po/doc/flag-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/save-nb_NO.po b/po/doc/save-nb_NO.po
index 0b35dc9..9f5a111 100644
--- a/po/doc/save-nb_NO.po
+++ b/po/doc/save-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/tab-nb_NO.po b/po/doc/tab-nb_NO.po
index 386f0bc..6b2a512 100644
--- a/po/doc/tab-nb_NO.po
+++ b/po/doc/tab-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2017
+# Alexander F. Rødseth <rodseth@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/doc/vnote-nb_NO.po b/po/doc/vnote-nb_NO.po
index c008471..16876ba 100644
--- a/po/doc/vnote-nb_NO.po
+++ b/po/doc/vnote-nb_NO.po
@@ -1,13 +1,13 @@
#
# Translators:
-# Alexander F Rødseth <rodseth@gmail.com>, 2013
+# Alexander F. Rødseth <rodseth@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-22 10:27+0200\n"
"PO-Revision-Date: 2017-09-19 19:05+0000\n"
-"Last-Translator: Alexander F Rødseth <rodseth@gmail.com>\n"
+"Last-Translator: Alexander F. Rødseth <rodseth@gmail.com>\n"
"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/lfleischer/calcurse/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/po/en.po b/po/en.po
index 971cdaf..4e15252 100644
--- a/po/en.po
+++ b/po/en.po
@@ -1,15 +1,13 @@
-# English/GB translation of calcurse.
-# Copyright (C) 2006 Copyright (c) Frederic Culot <frederic@culot.org>
+# English/GB translation of calcurse
+# Copyright (C) 2021 calcurse Development Team <misc@calcurse.org>
# This file is distributed under the same license as the calcurse package.
# Neil Williams <linux@codehelp.co.uk>, 2006.
-# , fuzzy
-#
#
msgid ""
msgstr ""
-"Project-Id-Version: calcurse 1.4\n"
+"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
"PO-Revision-Date: 2006-07-03 00:05+0100\n"
"Last-Translator: Neil Williams <linux@codehelp.co.uk>\n"
"Language-Team: English/GB <en_GB@li.org>\n"
@@ -17,25 +15,22 @@ msgstr ""
"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"
msgid "null pointer"
msgstr ""
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "date error in appointment"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "no such appointment"
-msgstr "Appointment :"
+msgstr ""
msgid ""
"Usage:\n"
@@ -47,31 +42,21 @@ msgid ""
"daemon"
msgstr ""
-#, fuzzy
msgid "Try `calcurse -h` for more information."
-msgstr "Try 'calcurse -h' for more information.\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "calcurse %s -- text-based organizer\n"
-msgstr "Calcurse %s - text-based organizer\n"
+msgstr ""
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
-#, fuzzy
msgid "This is free software; see the source for copying conditions."
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
-#, fuzzy
msgid "Operations in command line mode:"
-msgstr "starting interactive mode...\n"
+msgstr ""
msgid " -Q, --query Print items in a given query range"
msgstr ""
@@ -155,20 +140,15 @@ msgid ""
" -x, --export[<format>] Export to stdout in ical (default) or pcal format"
msgstr ""
-#, fuzzy
msgid ""
"For more information, type '?' from within calcurse, or read the manpage."
msgstr ""
-"\n"
-"For more information, type '?' from within Calcurse, or read the manpage.\n"
-#, fuzzy
msgid "Submit feature requests and suggestions to <misc@calcurse.org>."
-msgstr "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
+msgstr ""
-#, fuzzy
msgid "Submit bug reports to <bugs@calcurse.org>."
-msgstr "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
+msgstr ""
#, c-format
msgid ""
@@ -192,11 +172,10 @@ msgid "completed tasks:\n"
msgstr ""
msgid "to do:\n"
-msgstr "to do:\n"
+msgstr ""
-#, fuzzy
msgid "next appointment:\n"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "invalid range: %s"
@@ -236,13 +215,13 @@ msgstr ""
msgid "calcurse is running (pid = %d)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid input date format: %s"
-msgstr "Enter the new ToDo item : "
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid output date format: %s"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "invalid argument combination"
msgstr ""
@@ -256,13 +235,11 @@ msgstr ""
msgid "Unable to find documentation."
msgstr ""
-#, fuzzy
msgid "Data were saved successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
-#, fuzzy
msgid "Data were saved/reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Save cancelled"
msgstr ""
@@ -270,17 +247,14 @@ msgstr ""
msgid "Data were already saved"
msgstr ""
-#, fuzzy
msgid "Cannot open data file"
-msgstr "Failed to open todo file"
+msgstr ""
-#, fuzzy
msgid "Data were reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
-#, fuzzy
msgid "Date were merged/reloaded successfully"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Reload cancelled"
msgstr ""
@@ -297,9 +271,8 @@ msgstr ""
msgid "There are unsaved changes. Should they be saved?"
msgstr ""
-#, fuzzy
msgid "Do you really want to quit?"
-msgstr "Do you really want to quit ?"
+msgstr ""
msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
@@ -330,13 +303,11 @@ msgstr ""
msgid "No such command: %s"
msgstr ""
-#, fuzzy
msgid "unknown color"
-msgstr "Colour"
+msgstr "unknown colour"
-#, fuzzy
msgid "failed to open configuration file"
-msgstr "Failed to open config file"
+msgstr ""
#, c-format
msgid "invalid configuration directive: \"%s\""
@@ -351,21 +322,20 @@ msgstr ""
msgid "unknown user option: \"%s\" (ignored)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid option format: \"%s\" (ignored)"
-msgstr "Enter the new ToDo item : "
+msgstr ""
#, c-format
msgid "unknown user option: \"%s\" (disabled)"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "invalid option format: \"%s\" (disabled)"
-msgstr "Enter the new ToDo item : "
+msgstr ""
-#, fuzzy
msgid "layout configuration"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Foreground"
msgstr ""
@@ -376,19 +346,17 @@ msgstr ""
msgid "(terminal's default)"
msgstr ""
-#, fuzzy
msgid "color theme"
-msgstr "CalCurse %s | help"
+msgstr "colour theme"
-#, fuzzy
msgid "(if set to YES, compact panels are used)"
-msgstr "(if set to YES, progress bar will not be displayed when saving data)"
+msgstr ""
msgid "Calendar"
-msgstr "Calendar"
+msgstr ""
msgid "Appointments"
-msgstr "Appointments"
+msgstr ""
msgid "TODO"
msgstr ""
@@ -433,7 +401,7 @@ msgid "(display more than one day in the appointments panel)"
msgstr ""
msgid "(if set to YES, automatic save is done when quitting)"
-msgstr "(if set to YES, automatic save is done when quitting)"
+msgstr ""
msgid "(run the garbage collector when quitting)"
msgstr ""
@@ -445,15 +413,9 @@ msgid "(if YES, system events are turned into appointments (or else deleted))"
msgstr ""
msgid "(if set to YES, confirmation is required before quitting)"
-msgstr "(if set to YES, confirmation is required before quitting)"
-
-msgid "(if set to YES, confirmation is required before deleting an event)"
-msgstr "(if set to YES, confirmation is required before deleting an event)"
-
-msgid "Monday"
msgstr ""
-msgid "Sunday"
+msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
msgid "(specifies the first day of week in the calendar view)"
@@ -480,32 +442,35 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
-#, fuzzy
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+
msgid "Enter the date format: "
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "Enter the delay, in minutes, between automatic saves (0 to disable) "
msgstr ""
-#, fuzzy
msgid "general options"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Undefined option!"
msgstr ""
-msgid "undefined"
+msgid "UNDEFINED"
msgstr ""
-#, fuzzy
msgid "keys configuration"
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Press the key you want to assign to:"
msgstr ""
@@ -514,7 +479,7 @@ msgstr ""
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -524,67 +489,62 @@ msgstr ""
"Sorry, colours are not supported by your terminal\n"
"(Press [ENTER] to continue)"
-#, fuzzy, c-format
+#, c-format
msgid "Could not save %s."
-msgstr "Enter description :"
+msgstr ""
msgid "unknown item type"
msgstr ""
-#, fuzzy
msgid "Note:"
-msgstr "Add Item"
+msgstr ""
-#, fuzzy
msgid "Event:"
-msgstr "Event :"
+msgstr ""
-#, fuzzy
msgid "Appointment:"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not stop daemon properly: %s\n"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "terminated at %s with signal %d\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not remove daemon lock file: %s\n"
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not fork: %s\n"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "Could not detach from the controlling terminal: %s\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not change working directory: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "Cannot daemonize, aborting\n"
msgstr ""
-#, fuzzy
msgid "Could not set lock file\n"
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not access \"%s\": %s\n"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
msgid "started at %s\n"
msgstr ""
-#, fuzzy
msgid "error loading next appointment\n"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "launching notification at %s for: \"%s\"\n"
@@ -603,16 +563,15 @@ msgstr[1] ""
msgid "awakened at %s\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not stop calcurse daemon: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "illegal date in event"
msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "FATAL ERROR in event_scan: date error in the event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr ""
@@ -620,9 +579,14 @@ msgstr ""
msgid "out of memory"
msgstr ""
-#, fuzzy
msgid "unknown ical type"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
+
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
msgid "need DTSTART to determine event type."
msgstr ""
@@ -639,16 +603,17 @@ msgstr ""
msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "invalid count value."
msgstr ""
@@ -668,87 +633,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Enter description :"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Enter description :"
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-#, fuzzy
-msgid "could not retrieve item summary."
-msgstr "Enter description :"
-
-#, fuzzy
-msgid "item start date is not defined."
-msgstr "The day you entered is not valid"
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, c-format
-msgid "Location: %s"
+msgid "invalid end time value type."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
+msgid "end must be later than start."
msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-msgid "invalid or malformed event start time."
+msgid "malformed duration line."
msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgid "invalid duration."
+msgstr ""
-msgid "invalid end time value type."
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-msgid "malformed event end time."
+#, c-format
+msgid "Location: %s"
msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "Enter description :"
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgid "item could not be identified."
+msgstr ""
-#, fuzzy
msgid "only one description allowed."
-msgstr "Enter description :"
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -756,6 +710,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
+msgid "could not retrieve item summary."
+msgstr ""
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -768,13 +725,12 @@ msgstr ""
msgid "The file cannot be accessed, please enter another file name."
msgstr ""
-#, fuzzy
msgid "Press [ENTER] to continue."
-msgstr "Press [ENTER] to continue"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Failed to open \"%s\", - %s\n"
-msgstr "Failed to open todo file"
+msgstr ""
msgid "Failed to build message\n"
msgstr ""
@@ -791,9 +747,8 @@ msgstr ""
msgid "%s does not exist"
msgstr ""
-#, fuzzy
msgid "Data files have changed and will be overwritten:"
-msgstr "Data files found. Data will be loaded now."
+msgstr ""
msgid "(c)ontinue"
msgstr ""
@@ -807,37 +762,29 @@ msgstr ""
msgid "[cma]"
msgstr ""
-#, fuzzy
msgid "failed to open appointment file"
-msgstr "Failed to open config file"
+msgstr ""
-#, fuzzy
msgid "syntax error in the item date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "no event nor appointment found"
-msgstr "FATAL ERROR in load_app: no event nor appointment found\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item time or duration"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item identifier"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "wrong format in the appointment or event"
-msgstr "FATAL ERROR in load_app: wrong format in the appointment or event\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in item repetition"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in until date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -848,58 +795,60 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "failed to open todo file"
-msgstr "Failed to open todo file"
+msgstr ""
msgid "Screen data have changed and will be lost:"
msgstr ""
-#, fuzzy
msgid "failed to open key file"
-msgstr "Failed to open todo file"
-
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
msgstr ""
msgid "Could not read key label"
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-#, fuzzy, c-format
+msgid "Some actions do not have any associated key bindings!"
+msgstr ""
+
+#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
-#, fuzzy
msgid "The data were successfully exported"
-msgstr "The data files were successfully saved"
+msgstr ""
msgid "Press [ENTER] to continue"
-msgstr "Press [ENTER] to continue"
+msgstr ""
msgid "unknown export type"
msgstr ""
@@ -920,9 +869,8 @@ msgstr ""
msgid "FATAL ERROR: the input file cannot be accessed, Aborting..."
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: wrong import mode"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
msgid "%d app"
@@ -996,13 +944,13 @@ msgid "Credits"
msgstr ""
msgid "Help"
-msgstr "Help"
+msgstr ""
msgid "Quit"
-msgstr "Quit"
+msgstr ""
msgid "Save"
-msgstr "Save"
+msgstr ""
msgid "Reload"
msgstr ""
@@ -1013,9 +961,11 @@ msgstr ""
msgid "Paste"
msgstr ""
-#, fuzzy
msgid "Chg Win"
-msgstr "Chg View"
+msgstr ""
+
+msgid "Prev Win"
+msgstr ""
msgid "Import"
msgstr ""
@@ -1023,41 +973,35 @@ msgstr ""
msgid "Export"
msgstr ""
-#, fuzzy
msgid "Go to"
-msgstr "Goto:\n"
+msgstr ""
msgid "OtherCmd"
msgstr ""
msgid "Config"
-msgstr "Config"
+msgstr ""
msgid "Redraw"
-msgstr "Redraw"
+msgstr ""
-#, fuzzy
msgid "Add Appt"
-msgstr "Add Item"
+msgstr ""
msgid "Add Todo"
msgstr ""
-#, fuzzy
msgid "-1 Day"
-msgstr "-/+1 Day"
+msgstr ""
-#, fuzzy
msgid "+1 Day"
-msgstr "-/+1 Day"
+msgstr ""
-#, fuzzy
msgid "-1 Week"
-msgstr "-/+1 Week"
+msgstr ""
-#, fuzzy
msgid "+1 Week"
-msgstr "-/+1 Week"
+msgstr ""
msgid "-1 Month"
msgstr ""
@@ -1071,13 +1015,11 @@ msgstr ""
msgid "+1 Year"
msgstr ""
-#, fuzzy
msgid "Nxt View"
-msgstr "View"
+msgstr ""
-#, fuzzy
msgid "Prv View"
-msgstr "View"
+msgstr ""
msgid "Today"
msgstr ""
@@ -1091,51 +1033,44 @@ msgstr ""
msgid "Left"
msgstr ""
-#, fuzzy
msgid "Down"
-msgstr "Up/Down"
+msgstr ""
msgid "Up"
msgstr ""
-#, fuzzy
msgid "beg Week"
-msgstr "-/+1 Week"
+msgstr ""
-#, fuzzy
msgid "end Week"
-msgstr "-/+1 Week"
+msgstr ""
msgid "Add Item"
-msgstr "Add Item"
+msgstr ""
msgid "Del Item"
-msgstr "Del Item"
+msgstr ""
-#, fuzzy
msgid "Edit Itm"
-msgstr "Add Item"
+msgstr ""
msgid "View"
-msgstr "View"
+msgstr ""
msgid "Pipe"
msgstr ""
-#, fuzzy
msgid "Flag Itm"
-msgstr "Del Item"
+msgstr ""
msgid "Repeat"
msgstr ""
-#, fuzzy
msgid "EditNote"
-msgstr "Add Item"
+msgstr ""
-#, fuzzy
msgid "ViewNote"
-msgstr "View"
+msgstr ""
msgid "Prio.+"
msgstr ""
@@ -1153,25 +1088,23 @@ msgid ""
"# interface. It should not be edited directly.\n"
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: could not create default keys file."
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
-#, fuzzy
msgid "FATAL ERROR: key value out of bounds"
-msgstr "FATAL ERROR in update_windows: no window selected\n"
+msgstr ""
msgid "General"
-msgstr "General"
+msgstr ""
msgid "Layout"
-msgstr "Layout"
+msgstr ""
msgid "Sidebar"
msgstr ""
msgid "Color"
-msgstr "Colour"
+msgstr ""
msgid "Notify"
msgstr ""
@@ -1179,9 +1112,8 @@ msgstr ""
msgid "Keys"
msgstr ""
-#, fuzzy
msgid "Unknown"
-msgstr "Colour"
+msgstr ""
msgid "Cancel the ongoing action."
msgstr ""
@@ -1213,6 +1145,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr ""
@@ -1225,9 +1160,8 @@ msgstr ""
msgid "Show next possible actions inside status bar."
msgstr ""
-#, fuzzy
msgid "Enter the configuration menu."
-msgstr "CalCurse %s | general options"
+msgstr ""
msgid "Redraw calcurse's screen."
msgstr ""
@@ -1330,12 +1264,11 @@ msgstr ""
msgid "Lower a task priority inside the todo panel."
msgstr ""
-#, fuzzy
msgid "FATAL ERROR: null file pointer."
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1365,9 +1298,8 @@ msgstr ""
msgid "could not allocate memory to store block info"
msgstr ""
-#, fuzzy
msgid "Block not found"
-msgstr "Appointment :"
+msgstr ""
#, c-format
msgid "overflow at %s"
@@ -1429,16 +1361,8 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr ""
-#, fuzzy
-msgid "error while launching command: could not fork"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-msgid "error while launching command"
-msgstr ""
-
-#, fuzzy
msgid "(if set to YES, notify-bar will be displayed)"
-msgstr "(if set to YES, progress bar will not be displayed when saving data)"
+msgstr ""
msgid "(Format of the date to be displayed inside notify-bar)"
msgstr ""
@@ -1462,9 +1386,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
@@ -1505,32 +1426,26 @@ msgstr ""
msgid "event not found"
msgstr ""
-#, fuzzy
msgid "appointment not found"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
-#, fuzzy
msgid "syntax error in item date"
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "date error in item exception"
-msgstr "FATAL ERROR in event_scan: date error in the event\n"
+msgstr ""
#, c-format
msgid "Error setting signal #%d : %s\n"
@@ -1546,22 +1461,22 @@ msgid "ERROR setting first day of week"
msgstr ""
msgid "The day you entered is not valid"
-msgstr "The day you entered is not valid"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Enter the day to go to [ENTER for today] : %s"
-msgstr "Enter the day to go to [ENTER for today] : dd/mm/yyyy"
+msgstr ""
#, c-format
msgid "The move failed (%d/%d/%d)."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Enter start date [%s] and/or time ([hh:mm] or [hhmm]):"
-msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
+msgstr ""
msgid "Press [Enter] to continue"
-msgstr "Press [Enter] to continue"
+msgstr ""
msgid "Invalid date or time."
msgstr ""
@@ -1583,23 +1498,20 @@ msgstr ""
msgid "Time: hh:mm (hh: or :mm) or hhmm. Duration: +mm, +hh:mm, +??d??h??m."
msgstr ""
-#, fuzzy
msgid "Invalid time or duration."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "Invalid date: end time must come after start time."
msgstr ""
-#, fuzzy
msgid "Enter the new item description:"
-msgstr "Enter description :"
+msgstr ""
msgid "Exception days:"
msgstr ""
-#, fuzzy
msgid "Invalid date format - try again:."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
msgid "Limit repetition to listed days."
msgstr ""
@@ -1652,20 +1564,17 @@ msgstr ""
msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
msgstr ""
-#, fuzzy
msgid "Invalid format - try again."
-msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
+msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Press any key to continue..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "May"
+msgstr ""
msgid "week"
msgstr ""
@@ -1685,9 +1594,8 @@ msgstr ""
msgid "Invalid frequency."
msgstr ""
-#, fuzzy
msgid "Until date, increment or repeat count ('?' for input formats):"
-msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
+msgstr ""
#, c-format
msgid "Date: %s (year, month may be omitted, endless: 0)."
@@ -1710,16 +1618,14 @@ msgstr ""
msgid "Repetition must begin on start day (%s); any change discarded."
msgstr ""
-#, fuzzy
msgid "Description"
-msgstr "Enter description :"
+msgstr ""
msgid "Repetition"
msgstr ""
-#, fuzzy
msgid "Edit: "
-msgstr "Add Item"
+msgstr ""
msgid "Start time"
msgstr ""
@@ -1733,18 +1639,15 @@ msgstr ""
msgid "Pipe item to external command:"
msgstr ""
-#, fuzzy
msgid "Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event:"
msgstr ""
-"Enter start time ([hh:mm] or [h:mm]), leave blank for an all-day event : "
msgid ""
"Enter end time as date (and/or time) or duration ('?' for input formats):"
msgstr ""
-#, fuzzy
msgid "Enter description:"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "Date: %s (and/or time), year or month may be omitted."
@@ -1788,16 +1691,14 @@ msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
-#, fuzzy
msgid "Enter the new TODO item:"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "Enter the TODO priority [0 (none), 1 (highest) - 9 (lowest)]:"
msgstr ""
-#, fuzzy
msgid "Do you really want to delete this task?"
-msgstr "Do you really want to delete this task ?"
+msgstr ""
msgid "This item has a note attached to it. Delete (t)odo or just its (n)ote?"
msgstr ""
@@ -1805,16 +1706,15 @@ msgstr ""
msgid "[tn]"
msgstr ""
-#, fuzzy
msgid "Enter the new TODO description:"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "TODO:"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Enter description :"
+msgstr ""
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr ""
@@ -1826,7 +1726,7 @@ msgid "[yn]"
msgstr ""
msgid "Press any key to continue..."
-msgstr "Press any key to continue..."
+msgstr ""
msgid "failure in mktime"
msgstr ""
@@ -1835,10 +1735,10 @@ msgid "error in mktime"
msgstr ""
msgid "yes"
-msgstr "yes"
+msgstr ""
msgid "no"
-msgstr "no"
+msgstr ""
msgid "option not defined"
msgstr ""
@@ -1872,30 +1772,23 @@ msgstr ""
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr ""
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"Copyright (c) 2004-2006 Frederic Culot.\n"
-"This is free software; see the source for copying conditions.\n"
msgid "unrecognized option:"
msgstr ""
-#, fuzzy
msgid "Configuration file not found:"
-msgstr "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
+msgstr ""
-#, fuzzy
msgid "Pre-3.0.0 configuration file format detected..."
-msgstr "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
+msgstr ""
-#, fuzzy
msgid "Create temporary backup of the configuration file..."
-msgstr "Failed to open config file"
+msgstr ""
msgid "Old backup file found:"
msgstr ""
@@ -1924,1023 +1817,3 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-
-#, fuzzy
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(if set to YES, messages about loaded and saved data will not be "
-#~ "displayed)"
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Enter description :"
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr "Welcome to Calcurse. Missing data files were created."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Data files found. Data will be loaded now."
-
-#, fuzzy
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Do you really want to delete this item ?"
-
-#, fuzzy
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "could not get entire item description."
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "configuration variable unknown: \"%s\""
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "wrong configuration variable format for \"%s\""
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "(if set to YES, progress bar will be displayed when saving data)"
-#~ msgstr ""
-#~ "(if set to YES, progress bar will not be displayed when saving data)"
-
-#~ msgid "Saving..."
-#~ msgstr "Saving..."
-
-#~ msgid "Loading..."
-#~ msgstr "Loading..."
-
-#, fuzzy
-#~ msgid "Exporting..."
-#~ msgstr "aborting...\n"
-
-#~ msgid "Problems accessing data file ..."
-#~ msgstr "Problems accessing data file ..."
-
-#~ msgid "The data files were successfully saved"
-#~ msgstr "The data files were successfully saved"
-
-#, fuzzy
-#~ msgid "You entered an invalid time, should be [hh:mm] or [hhmm]"
-#~ msgstr "You entered an invalid start time, should be [h:mm] or [hh:mm]"
-
-#, fuzzy
-#~ msgid ""
-#~ "Enter end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm]):"
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "The entered date is not valid."
-#~ msgstr "The day you entered is not valid"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s] or '0' for an endless repetition."
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Enter the new repetition frequency:"
-#~ msgstr "Enter description :"
-
-#, fuzzy
-#~ msgid "Enter end date ([%s]), duration ([+xxwxxd]) or '0':"
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "You entered an invalid start time, should be [hh:mm] or [hhmm]"
-#~ msgstr "You entered an invalid start time, should be [h:mm] or [hh:mm]"
-
-#, fuzzy
-#~ msgid ""
-#~ "Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], "
-#~ "[+xxxdxxhxxm] or [+mm]"
-#~ msgstr ""
-#~ "You entered an invalid end time, should be [h:mm] or [hh:mm] or [mm]"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s], [+xxwxxd] or '0'."
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Enter an option number to change its value"
-#~ msgstr "Enter an option number to change its value [Q to quit] "
-
-#, fuzzy
-#~ msgid "The frequence you entered is not valid."
-#~ msgstr "The day you entered is not valid"
-
-#~ msgid "January"
-#~ msgstr "January"
-
-#~ msgid "February"
-#~ msgstr "February"
-
-#~ msgid "March"
-#~ msgstr "March"
-
-#~ msgid "April"
-#~ msgstr "April"
-
-#~ msgid "June"
-#~ msgstr "June"
-
-#~ msgid "July"
-#~ msgstr "July"
-
-#~ msgid "August"
-#~ msgstr "August"
-
-#~ msgid "September"
-#~ msgstr "September"
-
-#~ msgid "October"
-#~ msgstr "October"
-
-#~ msgid "November"
-#~ msgstr "November"
-
-#~ msgid "December"
-#~ msgstr "December"
-
-#~ msgid "Sun"
-#~ msgstr "Sun"
-
-#~ msgid "Mon"
-#~ msgstr "Mon"
-
-#~ msgid "Tue"
-#~ msgstr "Tue"
-
-#~ msgid "Wed"
-#~ msgstr "Wed"
-
-#~ msgid "Thu"
-#~ msgstr "Thu"
-
-#~ msgid "Fri"
-#~ msgstr "Fri"
-
-#~ msgid "Sat"
-#~ msgstr "Sat"
-
-#, fuzzy
-#~ msgid ""
-#~ "Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n"
-#~ " [-d <date>|<num>] [-s[date]] [-r[range]]\n"
-#~ " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n"
-#~ " [--read-only]\n"
-#~ msgstr "Usage: calcurse [-h | -v] [-at] [-d date|num] [-c file]\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "Miscellaneous:\n"
-#~ " -h, --help\n"
-#~ "\tprint this help and exit.\n"
-#~ "\n"
-#~ " -v, --version\n"
-#~ "\tprint calcurse version and exit.\n"
-#~ "\n"
-#~ " --status\n"
-#~ "\tdisplay the status of running instances of calcurse.\n"
-#~ "\n"
-#~ " --read-only\n"
-#~ "\tDon't save configuration nor appointments/todos. Use with care.\n"
-#~ "\n"
-#~ "Files:\n"
-#~ " -c <file>, --calendar <file>\n"
-#~ "\tspecify the calendar <file> to use (has precedence over '-D').\n"
-#~ "\n"
-#~ " -D <dir>, --directory <dir>\n"
-#~ "\tspecify the data directory to use.\n"
-#~ "\tIf not specified, the default directory is ~/.calcurse\n"
-#~ "\n"
-#~ "Non-interactive:\n"
-#~ " -a, --appointment\n"
-#~ " \tprint events and appointments for current day and exit.\n"
-#~ "\n"
-#~ " -d <date|num>, --day <date|num>\n"
-#~ "\tprint events and appointments for <date> or <num> upcoming days and\n"
-#~ "\texit. To specify both a starting date and a range, use the\n"
-#~ "\t'--startday' and the '--range' option.\n"
-#~ "\n"
-#~ " -g, --gc\n"
-#~ "\trun the garbage collector for note files and exit. \n"
-#~ "\n"
-#~ " -i <file>, --import <file>\n"
-#~ "\timport the icalendar data contained in <file>. \n"
-#~ "\n"
-#~ " -n, --next\n"
-#~ "\tprint next appointment within upcoming 24 hours and exit. Also given\n"
-#~ "\tis the remaining time before this next appointment.\n"
-#~ "\n"
-#~ " -l <num>, --limit <num>\n"
-#~ "\tonly print information regarding the next <num> items. \n"
-#~ "\n"
-#~ " -r[num], --range[=num]\n"
-#~ "\tprint events and appointments for the [num] number of days\n"
-#~ "\tand exit. If no [num] is given, a range of 1 day is considered.\n"
-#~ "\n"
-#~ " -s[date], --startday[=date]\n"
-#~ "\tprint events and appointments from [date] and exit.\n"
-#~ "\tIf no [date] is given, the current day is considered.\n"
-#~ "\n"
-#~ " -S<regex>, --search=<regex>\n"
-#~ "\tsearch for the given regular expression within events, appointments,\n"
-#~ "\tand todos description.\n"
-#~ "\n"
-#~ " -t[num], --todo[=num]\n"
-#~ "\tprint todo list and exit. If the optional number [num] is given,\n"
-#~ "\tthen only todos having a priority equal to [num] will be returned.\n"
-#~ "\tThe priority number must be between 1 (highest) and 9 (lowest).\n"
-#~ "\tIt is also possible to specify '0' for the priority, in which case\n"
-#~ "\tonly completed tasks will be shown.\n"
-#~ "\n"
-#~ " -x[format], --export[=format]\n"
-#~ "\texport user data to the specified format. Events, appointments and\n"
-#~ "\ttodos are converted and echoed to stdout.\n"
-#~ "\tTwo possible formats are available: 'ical' and 'pcal'.\n"
-#~ "\tIf the optional argument format is not given, ical format is\n"
-#~ "\tselected by default.\n"
-#~ "\tnote: redirect standard output to export data to a file,\n"
-#~ "\tby issuing a command such as: calcurse --export > calcurse.dat\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Miscellaneous:\n"
-#~ " -h\t\tprint this help and exit.\n"
-#~ " -v\t\tprint calcurse version and exit.\n"
-#~ "\n"
-#~ "Options:\n"
-#~ " -c <file>\tspecify the calendar <file> to use.\n"
-#~ "\n"
-#~ "Non-interactive:\n"
-#~ " -a \t\tprint events and appointments for current day and exit.\n"
-#~ " -d <date|num>\tprint events and appointments for <date> or <num> "
-#~ "upcoming\n"
-#~ "\t\tdays and exit.\n"
-#~ " -t\t\tprint todo list and exit.\n"
-#~ "\n"
-#~ "For more information, type '?' from within Calcurse, or read the "
-#~ "manpage.\n"
-#~ "Mail bug reports and suggestions to <misc@calcurse.org>.\n"
-
-#, fuzzy
-#~ msgid "Enter the new ending date: [%s] or '0'"
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#, fuzzy
-#~ msgid "Possible formats are [%s] or '0' for an endless repetition"
-#~ msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
-
-#~ msgid "Argument to the '-d' flag is not valid\n"
-#~ msgstr "Argument to the '-d' flag is not valid\n"
-
-#, fuzzy
-#~ msgid "Argument is not valid\n"
-#~ msgstr "Argument to the '-d' flag is not valid\n"
-
-#, fuzzy
-#~ msgid "%s does not exist, create it now [y/n]? "
-#~ msgstr "%s does not exist, create it now [y or n] ? "
-
-#~ msgid "aborting...\n"
-#~ msgstr "aborting...\n"
-
-#~ msgid "%s successfully created\n"
-#~ msgstr "%s successfully created\n"
-
-#~ msgid "Exit"
-#~ msgstr "Exit"
-
-#, fuzzy
-#~ msgid "No color"
-#~ msgstr "Colour"
-
-#, fuzzy
-#~ msgid "Add key"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "Del key"
-#~ msgstr "Del Item"
-
-#, fuzzy
-#~ msgid "unknwon type"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "To do :"
-#~ msgstr "To do :"
-
-#, fuzzy
-#~ msgid "Calcurse help"
-#~ msgstr "CalCurse %s | help"
-
-#~ msgid " Welcome to Calcurse. This is the main help screen.\n"
-#~ msgstr " Welcome to Calcurse. This is the main help screen.\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Moving around: Press '%s' or '%s' to scroll text upward or downward\n"
-#~ " inside help screens, if necessary.\n"
-#~ "\n"
-#~ " Exit help: When finished, press '%s' to exit help and go back to\n"
-#~ " the main Calcurse screen.\n"
-#~ "\n"
-#~ " Help topic: At the bottom of this screen you can see a panel with\n"
-#~ " different fields, represented by a letter and a short\n"
-#~ " title. This panel contains all the available actions\n"
-#~ " you can perform when using Calcurse.\n"
-#~ " By pressing one of the letters appearing in this\n"
-#~ " panel, you will be shown a short description of the\n"
-#~ " corresponding action. At the top right side of the\n"
-#~ " description screen are indicated the user-defined key\n"
-#~ " bindings that lead to the action.\n"
-#~ "\n"
-#~ " Credits: Press '%s' for credits."
-#~ msgstr ""
-#~ " Moving around: Press CTRL-P or CTRL-N to scroll text upward or\n"
-#~ " downward inside help screens, if necessary.\n"
-#~ "\n"
-#~ " Exit help: When finished, press 'Q' to exit help and go back\n"
-#~ " to the main Calcurse screen.\n"
-#~ "\n"
-#~ " Help topic: At the bottom of this screen you can see a panel\n"
-#~ " with different fields, represented by a letter and\n"
-#~ " a short title. This panel contains all the available\n"
-#~ " actions you can perform when using Calcurse.\n"
-#~ " By pressing one of the letters appearing in this\n"
-#~ " panel, you will be shown a short description of the\n"
-#~ " corresponding action.\n"
-#~ "\n"
-#~ " Credits: Press '@' for credits."
-
-#, fuzzy
-#~ msgid "Save\n"
-#~ msgstr "Save:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Save calcurse data.\n"
-#~ "Data are splitted into four different files which contain :\n"
-#~ "\n"
-#~ " / ~/.calcurse/conf -> user configuration\n"
-#~ " | (layout, color, general options)\n"
-#~ " | ~/.calcurse/apts -> data related to the appointments\n"
-#~ " | ~/.calcurse/todo -> data related to the todo list\n"
-#~ " \\ ~/.calcurse/keys -> user-defined key bindings\n"
-#~ "\n"
-#~ "In the config menu, you can choose to save the Calcurse data\n"
-#~ "automatically before quitting."
-#~ msgstr ""
-#~ "Pressing 'S' saves the Calcurse data.\n"
-#~ "\n"
-#~ "The data is splitted into three different files which contains :\n"
-#~ "\n"
-#~ " / ~/.calcurse/conf -> the user configuration\n"
-#~ " | (layout, colour, general options)\n"
-#~ " | ~/.calcurse/apts -> the data related to the appointments\n"
-#~ " \\ ~/.calcurse/todo -> the data related to the todo list\n"
-#~ "\n"
-#~ "In the config menu, you can choose to save the Calcurse data\n"
-#~ "automatically before quitting."
-
-#, fuzzy
-#~ msgid "Export\n"
-#~ msgstr "aborting...\n"
-
-#, fuzzy
-#~ msgid "Displacement keys\n"
-#~ msgstr "Displacement keys:\n"
-
-#, fuzzy
-#~ msgid "View\n"
-#~ msgstr "View:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "View the item you select in either the Todo or Appointment panel.\n"
-#~ "\n"
-#~ "This is usefull when an event description is longer than the available\n"
-#~ "space to display it. If that is the case, the description will be\n"
-#~ "shortened and its end replaced by '...'. To be able to read the entire\n"
-#~ "description, just press '%s' and a popup window will appear, containing\n"
-#~ "the whole event.\n"
-#~ "\n"
-#~ "Press any key to close the popup window and go back to the main\n"
-#~ "Calcurse screen."
-#~ msgstr ""
-#~ "Pressing 'V' allows you to view the item you select in either the ToDo\n"
-#~ "or Appointment panel.\n"
-#~ "\n"
-#~ "This is usefull when an event description is longer than the available\n"
-#~ "space to display it. If that is the case, the description will be\n"
-#~ "shortened and its end replaced by '...'. To be able to read the entire\n"
-#~ "description, just press 'V' and a popup window will appear, containing\n"
-#~ "the whole event.\n"
-#~ "\n"
-#~ "Press any key to close the popup window and go back to the main\n"
-#~ "Calcurse screen."
-
-#, fuzzy
-#~ msgid "Tab\n"
-#~ msgstr "Tab:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Switch between panels.\n"
-#~ "The panel currently in use has its border colorized.\n"
-#~ "\n"
-#~ "Some actions are possible only if the right panel is selected.\n"
-#~ "For example, if you want to add a task in the TODO list, you need first\n"
-#~ "to press the '%s' key to get the TODO panel selected. Then you can\n"
-#~ "press '%s' to add your item.\n"
-#~ "\n"
-#~ "Notice that at the bottom of the screen the list of possible actions\n"
-#~ "change while pressing '%s', so you always know what action can be\n"
-#~ "performed on the selected panel."
-#~ msgstr ""
-#~ "Pressing 'Tab' allows you to switch between panels.\n"
-#~ "The panel currently in use has its border in colour.\n"
-#~ "\n"
-#~ "Some actions are possible only if the right panel is selected.\n"
-#~ "For example, if you want to add a task in the TODO list, you need first\n"
-#~ "to press the 'Tab' key to get the TODO panel selected. Then you can\n"
-#~ "press 'A' to add your item.\n"
-#~ "\n"
-#~ "Notice that at the bottom of the screen the list of possible actions\n"
-#~ "change while pressing 'Tab', so you always know what action can be\n"
-#~ "performed on the selected panel."
-
-#, fuzzy
-#~ msgid "Goto\n"
-#~ msgstr "Goto:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Jump to a specific day in the calendar.\n"
-#~ "\n"
-#~ "Using this command, you do not need to travel to that day using\n"
-#~ "the displacement keys inside the calendar panel.\n"
-#~ "If you hit [ENTER] without specifying any date, Calcurse checks the\n"
-#~ "system current date and you will be taken to that date.\n"
-#~ "\n"
-#~ "Notice that pressing '%s', whatever panel is\n"
-#~ "selected, will select current day in the calendar."
-#~ msgstr ""
-#~ "Pressing 'G' allows you to jump to a specific day in the calendar.\n"
-#~ "\n"
-#~ "Using this command, you do not need to travel to that day using\n"
-#~ "the displacement keys inside the calendar panel.\n"
-#~ "If you hit [ENTER] without specifying any date, Calcurse checks the\n"
-#~ "system current date and you will be taken to that date."
-
-#, fuzzy
-#~ msgid "Delete\n"
-#~ msgstr "Delete:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Delete an element in the ToDo or Appointment list.\n"
-#~ "\n"
-#~ "Depending on which panel is selected when you press the delete key,\n"
-#~ "the hilighted item of either the ToDo or Appointment list will be \n"
-#~ "removed from this list.\n"
-#~ "\n"
-#~ "If the item to be deleted is recurrent, you will be asked if you\n"
-#~ "wish to suppress all of the item occurences or just the one you\n"
-#~ "selected.\n"
-#~ "\n"
-#~ "If the general option 'confirm_delete' is set to 'YES', then you will\n"
-#~ "be asked for confirmation before deleting the selected event.\n"
-#~ "Do not forget to save the calendar data to retrieve the modifications\n"
-#~ "next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'D' deletes an element in the ToDo or Appointment list.\n"
-#~ "\n"
-#~ "Depending on which panel is selected when you press the delete key,\n"
-#~ "the highlighted item of either the ToDo or Appointment list will be \n"
-#~ "removed from this list.\n"
-#~ "\n"
-#~ "If the general option 'confirm_delete' is set to 'YES', then you will\n"
-#~ "be asked for confirmation before deleting the selected event.\n"
-#~ "Do not forget to save the calendar data to retrieve the modifications\n"
-#~ "next time you launch Calcurse."
-
-#, fuzzy
-#~ msgid "Add\n"
-#~ msgstr "Add:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Add an item in either the ToDo or Appointment list, depending on which\n"
-#~ "panel is selected when you press '%s'.\n"
-#~ "\n"
-#~ "To enter a new item in the TODO list, you will need first to enter the\n"
-#~ "description of this new item. Then you will be asked to specify the todo\n"
-#~ "priority. This priority is represented by a number going from 9 for the\n"
-#~ "lowest priority, to 1 for the highest one. It is still possible to\n"
-#~ "change the item priority afterwards, by using the '%s' and '%s' keys\n"
-#~ "inside the todo panel.\n"
-#~ "\n"
-#~ "If the APPOINTMENT panel is selected while pressing '%s', you will be\n"
-#~ "able to enter either a new appointment or a new all-day long event.\n"
-#~ "To enter a new event, press [ENTER] instead of the item start time, and\n"
-#~ "just fill in the event description.\n"
-#~ "To enter a new appointment to be added in the APPOINTMENT list, you\n"
-#~ "will need to enter successively the time at which the appointment\n"
-#~ "begins, the appointment length (either by specifying the end time in\n"
-#~ "[hh:mm] or the duration in [+hh:mm], [+xxdxxhxxm] or [+mm] format), \n"
-#~ "and the description of the event.\n"
-#~ "\n"
-#~ "The day at which occurs the event or appointment is the day currently\n"
-#~ "selected in the calendar, so you need to move to the desired day before\n"
-#~ "pressing '%s'.\n"
-#~ "\n"
-#~ "Notes:\n"
-#~ " o if an appointment lasts for such a long time that it continues\n"
-#~ " on the next days, this event will be indicated on all the\n"
-#~ " corresponding days, and the beginning or ending hour will be\n"
-#~ " replaced by '..' if the event does not begin or end on the day.\n"
-#~ " o if you only press [ENTER] at the APPOINTMENT or TODO event\n"
-#~ " description prompt, without any description, no item will be\n"
-#~ " added.\n"
-#~ " o do not forget to save the calendar data to retrieve the new\n"
-#~ " event next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'A' allows you to add an item in either the ToDo or Appointment\n"
-#~ "list, depending on which panel is selected when you press 'A'.\n"
-#~ "\n"
-#~ "To enter a new item in the TODO list, you only need to enter the\n"
-#~ "description of this new item.\n"
-#~ "\n"
-#~ "If the APPOINTMENT panel is selected while pressing 'A', you will be\n"
-#~ "able to enter either a new appointment or a new all-day long event.\n"
-#~ "To enter a new event, press [ENTER] instead of the item start time, and\n"
-#~ "just fill in the event description.\n"
-#~ "To enter a new appointment to be added in the APPOINTMENT list, you\n"
-#~ "will need to enter successively the time at which the appointment\n"
-#~ "begins, the appointment length (either by specifying the duration in\n"
-#~ "minutes, or the end time in [hh:mm] or [h:mm] format), and the\n"
-#~ "description of the event.\n"
-#~ "\n"
-#~ "The day at which occurs the event or appointment is the day currently\n"
-#~ "selected in the calendar, so you need to move to the desired day before\n"
-#~ "pressing 'A'.\n"
-#~ "\n"
-#~ "Notes:\n"
-#~ " o if an appointment lasts for such a long time that it continues\n"
-#~ " into the next days, this event will be indicated on all the\n"
-#~ " corresponding days, and the beginning or ending hour will be\n"
-#~ " replaced by '..' if the event does not begin or end on the day.\n"
-#~ " o if you only press [ENTER] at the APPOINTMENT or TODO event\n"
-#~ " description prompt, without any description, no item will be\n"
-#~ " added.\n"
-#~ " o do not forget to save the calendar data to retrieve the new\n"
-#~ " event next time you launch Calcurse."
-
-#, fuzzy
-#~ msgid "Edit Item\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "EditNote\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "ViewNote\n"
-#~ msgstr "View:\n"
-
-#, fuzzy
-#~ msgid "Repeat\n"
-#~ msgstr "Redraw:\n"
-
-#, fuzzy
-#~ msgid "Flag Item\n"
-#~ msgstr "Add Item"
-
-#, fuzzy
-#~ msgid "Config\n"
-#~ msgstr "Config:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Open the configuration submenu.\n"
-#~ "From this submenu, you can select between color, layout, notification\n"
-#~ "and general options, and you can also configure your keybindings.\n"
-#~ "\n"
-#~ "The color submenu lets you choose the color theme.\n"
-#~ "The layout submenu lets you choose the Calcurse screen layout, in other\n"
-#~ "words where to place the three different panels on the screen.\n"
-#~ "The general options submenu brings a screen with the different options\n"
-#~ "which modifies the way Calcurse interacts with the user.\n"
-#~ "The notify submenu allows you to change the notify-bar settings.\n"
-#~ "The keys submenu lets you define your own key bindings.\n"
-#~ "\n"
-#~ "Do not forget to save the calendar data to retrieve your configuration\n"
-#~ "next time you launch Calcurse."
-#~ msgstr ""
-#~ "Pressing 'C' leads to the configuration submenu, from which you can\n"
-#~ "select between colour, layout, and general options.\n"
-#~ "\n"
-#~ "The colour submenu lets you choose the colour theme.\n"
-#~ "\n"
-#~ "The layout submenu lets you choose the Calcurse screen layout, in other\n"
-#~ "words where to place the three different panels on the screen.\n"
-#~ "\n"
-#~ "The general options submenu brings a screen with the different options\n"
-#~ "which modifies the way Calcurse interacts with the user.\n"
-#~ "\n"
-#~ "Do not forget to save the calendar data to retrieve your configuration\n"
-#~ "next time you launch Calcurse."
-
-#~ msgid "Calcurse - text-based organizer"
-#~ msgstr "Calcurse - text-based organizer"
-
-#, fuzzy
-#~ msgid ""
-#~ "Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] "
-#~ "or [+mm]) : "
-#~ msgstr "Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : "
-
-#, fuzzy
-#~ msgid "could not convert string"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "ToDo"
-#~ msgstr "ToDo"
-
-#~ msgid "Appointment"
-#~ msgstr "Appointment"
-
-#, fuzzy
-#~ msgid "missing colors in config file"
-#~ msgstr "Failed to open config file"
-
-#~ msgid "auto_save = "
-#~ msgstr "auto_save = "
-
-#, fuzzy
-#~ msgid "periodic_save = "
-#~ msgstr "auto_save = "
-
-#~ msgid "confirm_quit = "
-#~ msgstr "confirm_quit = "
-
-#~ msgid "confirm_delete = "
-#~ msgstr "confirm_delete = "
-
-#~ msgid "skip_system_dialogs = "
-#~ msgstr "skip_system_dialogues = "
-
-#~ msgid "skip_progress_bar = "
-#~ msgstr "skip_progress_bar = "
-
-#~ msgid "week_begins_on_monday = "
-#~ msgstr "week_begins_on_monday = "
-
-#~ msgid ""
-#~ "(if set to YES, monday is the first day of the week, else it is sunday)"
-#~ msgstr ""
-#~ "(if set to YES, monday is the first day of the week, otherwise it is "
-#~ "sunday)"
-
-#, fuzzy
-#~ msgid "Week"
-#~ msgstr "-/+1 Week"
-
-#, fuzzy
-#~ msgid "could not find any key file."
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "could not remove note"
-#~ msgstr "Enter description :"
-
-#~ msgid "Enter an option number to change its value [Q to quit] "
-#~ msgstr "Enter an option number to change its value [Q to quit] "
-
-#, fuzzy
-#~ msgid "CalCurse %s | notify-bar options"
-#~ msgstr "CalCurse %s | general options"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "Copyright (c) 2004-2008 Frederic Culot\n"
-#~ "\n"
-#~ "This program is free software; you can redistribute it and/or modify\n"
-#~ "it under the terms of the GNU General Public License as published by\n"
-#~ "the Free Software Foundation; either version 2 of the License, or\n"
-#~ "(at your option) any later version.\n"
-#~ "\n"
-#~ "This program is distributed in the hope that it will be useful,\n"
-#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
-#~ "GNU General Public License for more details.\n"
-#~ "\n"
-#~ "\n"
-#~ "Send your feedback or comments to : misc@calcurse.org\n"
-#~ "Calcurse home page : http://calcurse.org"
-#~ msgstr ""
-#~ "Copyright (c) 2004-2006 Frederic Culot\n"
-#~ "\n"
-#~ "This program is free software; you can redistribute it and/or modify\n"
-#~ "it under the terms of the GNU General Public License as published by\n"
-#~ "the Free Software Foundation; either version 2 of the License, or\n"
-#~ "(at your option) any later version.\n"
-#~ "\n"
-#~ "This program is distributed in the hope that it will be useful,\n"
-#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
-#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
-#~ "GNU General Public License for more details.\n"
-#~ "\n"
-#~ "\n"
-#~ "Send your feedback or comments to : misc@calcurse.org\n"
-#~ "Calcurse home page : http://calcurse.org"
-
-#~ msgid "Pick the desired layout on next screen [press ENTER]"
-#~ msgstr "Pick the desired layout on next screen [press ENTER]"
-
-#, fuzzy
-#~ msgid "('A'= Appointment panel, 'C'= calendar panel, 'T'= todo panel)"
-#~ msgstr "('A'= Appointment panel, 'c'= calendar panel, 't'= todo panel)"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_delete: no such type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in apoint_scan: date error in the appointment\n"
-#~ msgstr "FATAL ERROR in apoint_scan: date error in the appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_get: no such item\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_delete_bynum: no such appointment"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in apoint_switch_notify: no such appointment"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_load_color: wrong color number.\n"
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_load_color: wrong color name.\n"
-#~ msgstr "FATAL ERROR in load_app: wrong format in the appointment or event\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in custom_load_color: wrong configuration variable format.\n"
-#~ msgstr ""
-#~ "FATAL ERROR in fill_config_var: wrong configuration variable format.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in custom_color_theme_name: unknown color\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in day_popup_item: unknown item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in event_get: no such item\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#~ msgid "FATAL ERROR in event_delete_bynum: no such event\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in foreach_date_dump: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in pcal_export_recur_events: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "FATAL ERROR in pcal_export_recur_apoints: incoherent repetition type\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_export_data: wrong export mode\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_export_data: unknown export type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in io_import_data: unknown import type"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in launch_cmd: could not launch user command"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_def2char: unknown recur type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_char2def: unknown char\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_event_scan: date error in the event\n"
-#~ msgstr "FATAL ERROR in event_scan: date error in the event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_item_inday: unknown item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_event_erase: no such event\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_apoint_erase: no such appointment\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_repeat_item: wrong item type\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_exc_scan: syntax error in the item date\n"
-#~ msgstr "FATAL ERROR in load_app: syntax error in the item date\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_get_apoint: no such item\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_get_event: no such item\n"
-#~ msgstr "FATAL ERROR in event_delete_bynum: no such event\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in recur_apoint_switch_notify: no such item\n"
-#~ msgstr "FATAL ERROR in apoint_delete_bynum: no such appointment\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_delete_note_bynum: no note attached\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_delete_note_bynum: no such todo\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in todo_delete_bynum: no such todo\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_get_position: todo not found\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in todo_chg_priority: no such action\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid "FATAL ERROR in date2sec: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in date_sec_change: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in other_status_page: unknown panel\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in mystrtol: number is out of range"
-#~ msgstr "FATAL ERROR in update_windows: no window selected\n"
-
-#~ msgid "option not defined - Problem in print_option_incolor()"
-#~ msgstr "option not defined - Problem in print_option_incolor()"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in erase_note: could not remove note\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in wins_update: no window selected\n"
-#~ msgstr "FATAL ERROR in update_windows: no window selected\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "You can use either 'H','J','K','L' or the arrow keys '<','v','^','>'\n"
-#~ "to move into the calendar.\n"
-#~ "\n"
-#~ "The following scheme explains how :\n"
-#~ "\n"
-#~ " move to previous week\n"
-#~ " K ^ \n"
-#~ " move to previous day H < > L move to next day\n"
-#~ " J v \n"
-#~ " move to next week\n"
-#~ "\n"
-#~ "Moreover, while inside the calendar panel, the '0' (zero) key moves\n"
-#~ "to the first day of the week, and the '$' key selects the last day of\n"
-#~ "the week.\n"
-#~ "\n"
-#~ "When the Appointment or ToDo panel is selected, the up and down keys\n"
-#~ "(respectively K or up arrow, and J or down arrow) allows you to select\n"
-#~ "an item from those lists."
-#~ msgstr ""
-#~ "You can use either 'H','J','K','L' or the arrow keys '<','v','^','>'\n"
-#~ "to move into the calendar.\n"
-#~ "\n"
-#~ "The following scheme explains how :\n"
-#~ "\n"
-#~ " move to previous week\n"
-#~ " K ^ \n"
-#~ " move to previous day H < > L move to next day\n"
-#~ " J v \n"
-#~ " move to next week\n"
-#~ "\n"
-#~ "When the Appointment or ToDo panel is selected, the up and down keys\n"
-#~ "(respectively K or up arrow, and J or down arrow) allows you to select\n"
-#~ "an item from those lists."
-
-#~ msgid "CalCurse %s | help"
-#~ msgstr "CalCurse %s | help"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in wins_prop: property unknown\n"
-#~ msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
-
-#~ msgid ""
-#~ "Please resize your terminal screen\n"
-#~ "(to at least 80x24),\n"
-#~ "and restart calcurse.\n"
-#~ msgstr ""
-#~ "Please resize your terminal screen\n"
-#~ "(to at least 80x24),\n"
-#~ "and restart calcurse.\n"
-
-#, fuzzy
-#~ msgid "FATAL ERROR in update_time_in_date: failure in mktime\n"
-#~ msgstr "FATAL ERROR in date2sec: failure in mktime\n"
-
-#~ msgid "Pick the number corresponding to the color scheme (Q to exit) :"
-#~ msgstr "Pick the number corresponding to the colour scheme (Q to exit) :"
-
-#~ msgid "([>0<] for black & white)"
-#~ msgstr "([>0<] for black & white)"
-
-#~ msgid "-- Press 'N' for next page --"
-#~ msgstr "-- Press 'N' for next page --"
-
-#~ msgid "-- Press 'P' for previous page --"
-#~ msgstr "-- Press 'P' for previous page --"
-
-#~ msgid " |Ac| |At| |cA| |tA|"
-#~ msgstr " |Ac| |At| |cA| |tA|"
-
-#~ msgid "[1]|At| [2]|Ac| [3]|tA| [4]|cA|"
-#~ msgstr "[1]|At| [2]|Ac| [3]|tA| [4]|cA|"
-
-#~ msgid "Redraw:\n"
-#~ msgstr "Redraw:\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "Pressing CTRL-L redraws the Calcurse panels.\n"
-#~ "\n"
-#~ "You might want to use this function when you resize your terminal\n"
-#~ "screen for example, and you want Calcurse to take into account the new\n"
-#~ "size of the terminal.\n"
-#~ "\n"
-#~ "This function can also be useful when garbage appears in the display,\n"
-#~ "and you want to clean it."
-#~ msgstr ""
-#~ "Pressing 'R' redraws the Calcurse panels.\n"
-#~ "\n"
-#~ "You might want to use this function when you resize your terminal\n"
-#~ "screen for example, and you want Calcurse to take into account the new\n"
-#~ "size of the terminal.\n"
-#~ "\n"
-#~ "This function can also be useful when garbage appears in the display,\n"
-#~ "and you want to clear it."
-
-#~ msgid "GoTo"
-#~ msgstr "GoTo"
diff --git a/po/es.po b/po/es.po
index 01a4295..c15fa5b 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1,6 +1,6 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# Emmanuel M <emmanuelbendavid@gmail.com>, 2017
@@ -12,27 +12,26 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: Spanish (http://www.transifex.com/lfleischer/calcurse/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Victorhck <victorhck@opensuse.org>, 2018\n"
+"Language-Team: Spanish (http://app.transifex.com/lfleischer/calcurse/"
"language/es/)\n"
"Language: es\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"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? "
+"1 : 2;\n"
msgid "null pointer"
msgstr "puntero nulo"
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "error en la fecha de la cita"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "error en la fecha de la cita"
+msgstr ""
msgid "date error in appointment"
msgstr "error en la fecha de la cita"
@@ -57,9 +56,8 @@ msgstr "Consulte `calcurse -h` para más información."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- organizador basado en texto\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 Equipo de desarrollo de calcurse."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -305,13 +303,11 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr "El tema de ayuda no existe: %s"
-#, fuzzy
msgid "Select a repeating item in the appointments panel."
-msgstr "(posición de la cabecera en el panel de citas)"
+msgstr ""
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Repetir un elemento"
+msgstr ""
msgid "Last occurrence."
msgstr ""
@@ -443,12 +439,6 @@ msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
"(si se le asigna YES, se requiere confirmación antes de borrar un evento)"
-msgid "Monday"
-msgstr "Lunes"
-
-msgid "Sunday"
-msgstr "Domingo"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(especifica el primer día de la semana en la vista de calendario)"
@@ -473,6 +463,9 @@ msgstr "(posición de la cabecera en el panel de citas)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Formato de la fecha mostrado en el panel de citas)"
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
@@ -481,6 +474,11 @@ msgstr ""
"Ingrese el formato de la fecha (ver 'man 3 strftime' para los formatos "
"posibles) "
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Introduzca el formato de la hora (ver 'man 3 strftime' para los formatos "
+"posibles) "
+
msgid "Enter the date format: "
msgstr "Ingrese el formato de fecha:"
@@ -495,8 +493,8 @@ msgstr "opciones generales"
msgid "Undefined option!"
msgstr "¡Opción no definida!"
-msgid "undefined"
-msgstr "sin definir"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "configuración de teclas"
@@ -508,8 +506,8 @@ msgstr "Presione la tecla que quiere asignarle a:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "La tecla '%s' ya está en uso por %s. Elija otra."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "¡Algunas acciones no tienen ninguna tecla asociada!"
+msgid "Some actions are left undefined!"
+msgstr ""
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -525,9 +523,8 @@ msgstr ""
msgid "unknown item type"
msgstr "tipo de elemento desconocido"
-#, fuzzy
msgid "Note:"
-msgstr "EditarNota"
+msgstr ""
msgid "Event:"
msgstr "Evento:"
@@ -588,6 +585,7 @@ msgid "sleeping at %s for %d second\n"
msgid_plural "sleeping at %s for %d seconds\n"
msgstr[0] "durmiendo en %s por %d segundo\n"
msgstr[1] "durmiendo en %s por %d segundos\n"
+msgstr[2] "durmiendo en %s por %d segundos\n"
#, c-format
msgid "awakened at %s\n"
@@ -597,13 +595,11 @@ msgstr "despertado %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "No pudo detenerse el demonio de calcurse: %s\n"
-#, fuzzy
msgid "illegal date in event"
-msgstr "error de fecha en evento"
+msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "error de fecha en evento"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Error interno: línea demasiado larga"
@@ -614,6 +610,12 @@ msgstr "memoria agotada"
msgid "unknown ical type"
msgstr "tipo ical desconocido"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -626,20 +628,20 @@ msgstr ""
msgid "frequency absent in rrule."
msgstr ""
-#, fuzzy
msgid "rrule frequency not supported."
-msgstr "frecuencia recurrente no encontrada."
+msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "máscara de filtrado inválida"
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "formato de exportación inválido: %s"
+msgstr ""
msgid "invalid count value."
msgstr ""
@@ -647,13 +649,11 @@ msgstr ""
msgid "invalid bymonth list."
msgstr ""
-#, fuzzy
msgid "invalid bymonthday list."
-msgstr "fecha inválida: %s"
+msgstr ""
-#, fuzzy
msgid "invalid byday list."
-msgstr "fecha inválida: %s"
+msgstr ""
msgid "invalid exception date value type."
msgstr ""
@@ -661,89 +661,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "Frecuencia inválida."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "fecha de comienzo del evento mal formada."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Ingrese descripción:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "fecha de comienzo del evento mal formada."
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "no se pudo recuperar el resumen del elemento."
-
-msgid "item start date is not defined."
-msgstr "la fecha de comienzo del elemento no está definida."
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " asignado en: %s\n"
+msgid "invalid end time value type."
+msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
-msgstr "el elemento no pudo ser identificado."
+msgid "end must be later than start."
+msgstr ""
-#, fuzzy
-msgid "malformed start time line."
-msgstr "fecha de comienzo del evento mal formada."
+msgid "either end or duration."
+msgstr ""
-#, fuzzy
-msgid "invalid or malformed event start time."
-msgstr "no se pudo recuperar la fecha de comienzo del evento."
+msgid "malformed duration line."
+msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "error de sintaxis en la hora o duración del evento"
+msgid "invalid duration."
+msgstr ""
-#, fuzzy
-msgid "invalid end time value type."
-msgstr "rango de fecha inválido: %s"
+msgid "exception date, but no recurrence rule."
+msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-#, fuzzy
-msgid "malformed event end time."
-msgstr "no se pudo recuperar la fecha de finalización del evento."
+#, c-format
+msgid "Location: %s"
+msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "descripción mal formada."
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "fecha inválida: %s"
+msgid "item could not be identified."
+msgstr "el elemento no pudo ser identificado."
-#, fuzzy
msgid "only one description allowed."
-msgstr "descripción mal formada."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -753,6 +740,9 @@ msgstr ""
"El archivo ical parece estar mal formado. No se pudo encontrar el fin del "
"elemento."
+msgid "could not retrieve item summary."
+msgstr "no se pudo recuperar el resumen del elemento."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr "La prioridad del elemento es inválida (debe estar entre 0 y 9)."
@@ -825,9 +815,8 @@ msgstr "formato inválido en la cita o evento"
msgid "syntax error in item repetition"
msgstr "error de sintaxis en el valor de repetición del elemento"
-#, fuzzy
msgid "syntax error in until date"
-msgstr "error de sintaxis en la fecha del elemento"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -838,9 +827,8 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "error de sintaxis en la fecha del elemento"
+msgstr ""
msgid "failed to open todo file"
msgstr "No pudo abrirse archivo de tareas"
@@ -851,36 +839,38 @@ msgstr ""
msgid "failed to open key file"
msgstr "no pudo abrirse el archivo de teclas"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"¡Demasiados errores al leer el archivo de configuración!\n"
-"Por favor respalde el archivo de teclas, elimínelo del directorio y vuelva a "
-"iniciar calcurse.\n"
-
msgid "Could not read key label"
msgstr "No se pudo leer etiqueta de tecla"
-msgid "Key label not recognized"
-msgstr "Etiqueta de tecla no reconocida"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Error leyendo tecla: \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "¡\"%s\" asignado múltiples veces!"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Demasiados errores al leer archivo de teclas, abortando..."
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+
+msgid "Some actions do not have any associated key bindings!"
+msgstr "¡Algunas acciones no tienen ninguna tecla asociada!"
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
@@ -919,18 +909,21 @@ msgid "%d app"
msgid_plural "%d apps"
msgstr[0] "%d app"
msgstr[1] "%d apps"
+msgstr[2] "%d apps"
#, c-format
msgid "%d event"
msgid_plural "%d events"
msgstr[0] "%d evento"
msgstr[1] "%d eventos"
+msgstr[2] "%d eventos"
#, c-format
msgid "%d todo"
msgid_plural "%d todos"
msgstr[0] "%d tarea"
msgstr[1] "%d tareas"
+msgstr[2] "%d tareas"
#, c-format
msgid "%d skipped"
@@ -1015,6 +1008,9 @@ msgstr "Pegar"
msgid "Chg Win"
msgstr "CmbVent"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1202,6 +1198,9 @@ msgstr "Pegar un elemento en la posición actual."
msgid "Select next panel in calcurse main screen."
msgstr "Seleccionar el panel siguiente en la pantalla principal de calcurse."
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importar datos desde un archivo externo."
@@ -1345,9 +1344,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERROR FATAL: puntero nulo a archivo."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Al añadir la tecla por defecto para \"%s\", ¡\"%s\" ya estaba asignada!!"
msgid "xmalloc: zero size"
msgstr "xmalloc: tamaño cero"
@@ -1439,12 +1437,6 @@ msgstr " bloques sin liberar: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Advertencia: no pudo abrirse %s. Abortando..."
-msgid "error while launching command: could not fork"
-msgstr "error al lanzar comando: no pudo realizarse fork"
-
-msgid "error while launching command"
-msgstr "error al lanzar comando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(si selecciona SÃ, se mostrará la barra de notificaciones)"
@@ -1472,11 +1464,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Registrar actividad al ejecutar en segundo plano)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Introduzca el formato de la hora (ver 'man 3 strftime' para los formatos "
-"posibles) "
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
"Introduzca el número de segundos (con 0 no se avisará antes de una cita)"
@@ -1500,9 +1487,8 @@ msgstr "carácter inválido"
msgid "recurrence error: not on start day (%s)"
msgstr ""
-#, fuzzy
msgid "illegel date in event"
-msgstr "error de fecha en evento"
+msgstr ""
msgid "date error in event"
msgstr "error de fecha en evento"
@@ -1510,9 +1496,8 @@ msgstr "error de fecha en evento"
msgid "month day is zero"
msgstr ""
-#, fuzzy
msgid "no daily frequency check"
-msgstr "Frecuencia inválida."
+msgstr ""
msgid "illegal BYDAY value"
msgstr ""
@@ -1523,17 +1508,14 @@ msgstr "evento no encontrado"
msgid "appointment not found"
msgstr "cita no encontrada"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "error de sintaxis en la fecha del elemento"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "error de sintaxis en la fecha del elemento"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "error de sintaxis en la fecha del elemento"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
@@ -1664,23 +1646,20 @@ msgstr ""
msgid "Invalid format - try again."
msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Presione cualquier tecla para continuar..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "Hoy"
+msgstr ""
msgid "week"
msgstr ""
-#, fuzzy
msgid "month"
-msgstr "(m)ensual"
+msgstr ""
msgid "year"
msgstr ""
@@ -1758,33 +1737,25 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent and has a note attached to it. Delete (s)elected "
"occurrence, (a)ll occurrences, or just its (n)ote?"
msgstr ""
-"Este elemento tiene una nota adjunta. ¿Eliminar el elemento m(i)smo o sólo "
-"su (n)ota?"
msgid "[san]"
msgstr ""
-#, fuzzy
msgid ""
"This item has a note attached to it. Delete (s)elected occurrence or just "
"its (n)ote?"
msgstr ""
-"Este elemento tiene una nota adjunta. ¿Eliminar el elemento m(i)smo o sólo "
-"su (n)ota?"
msgid "[sn]"
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"Este elemento es recurrente. ¿Eliminar tod(a)s las ocurrencias o sól(o) ésta?"
msgid "[sa]"
msgstr ""
@@ -1795,9 +1766,8 @@ msgstr ""
msgid "[s]"
msgstr ""
-#, fuzzy
msgid "Already repeated."
-msgstr "Este elemento es ya un elemento repetido."
+msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
@@ -1885,16 +1855,11 @@ msgstr "panel desconocido"
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr "Uso: calcurse-upgrade [-h|-v|--config <file>]"
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"Copyright (c) 2004-2017 Equipo de desarrollo de calcurse. \n"
-"Esto es software libre; consulte el código fuente para las condiciones de "
-"copia.\n"
msgid "unrecognized option:"
msgstr "opción no reconocida:"
@@ -1945,81 +1910,3 @@ msgstr "Actualizar directivas de configuración..."
msgid "Remove temporary backup..."
msgstr "Eliminar respaldo temporal..."
-
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(si se le asigna YES, se mostraran mensajes sobre datos leídos y "
-#~ "guardados)"
-
-#~ msgid "date error in the event\n"
-#~ msgstr "error de fecha en el evento\n"
-
-#~ msgid "recurrence frequency not recognized."
-#~ msgstr "frecuencia recurrente no reconocida."
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Ingrese descripción:"
-
-#~ msgid "item has a negative duration."
-#~ msgstr "el elemento tiene una duración negativa."
-
-#~ msgid "item duration malformed."
-#~ msgstr "duración del elemento mal formada."
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr ""
-#~ "Bienvenido/a a calcurse. Se crearon los archivos de datos que faltaban."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Archivos de datos encontrados. Ahora se cargaran los datos."
-
-#~ msgid "unknown repetition type"
-#~ msgstr "tipo de repetición desconocido"
-
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Ingrese el tipo de repetición:"
-
-#~ msgid "(d)aily"
-#~ msgstr "(d)iario"
-
-#~ msgid "(w)eekly"
-#~ msgstr "semanal (w)"
-
-#~ msgid "(y)early"
-#~ msgstr "anual (y)"
-
-#, c-format
-#~ msgid "(currently using %s)"
-#~ msgstr "(actualmente utilizando %s)"
-
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Introduzca la frecuencia de repetición:"
-
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "¿Quiere eliminar este elemento?"
-
-#~ msgid "[ao]"
-#~ msgstr "[ao]"
-
-#~ msgid "[in]"
-#~ msgstr "[in]"
-
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Ingrese el tipo de repetición:"
-
-#~ msgid "wrong item type"
-#~ msgstr "tipo de elemento inválido"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "regla de recurrencia mal formada"
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "excepción de recurrencia mal formada."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "no se pudo obtener la descripción completa del elemento."
-
-#~ msgid "event end time malformed."
-#~ msgstr "fecha de finalización del evento mal formada."
diff --git a/po/fr.po b/po/fr.po
index 58ff7f9..4af80ea 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,12 +1,12 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# esaule <godrik@mandragor.org>, 2011
# Gwendal Rogel <pythot@yahoo.fr>, 2018-2019
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
-# lkppo, 2012
+# 4a14a73d523224463300dea5e0502458_3dab472, 2012
# SubS0, 2017
# tikismoke <webmaster@tikijs.dyndns.org>, 2014
# zorun <zerstorer@free.fr>, 2012
@@ -14,27 +14,26 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: French (http://www.transifex.com/lfleischer/calcurse/language/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Gwendal Rogel <pythot@yahoo.fr>, 2018-2019\n"
+"Language-Team: French (http://app.transifex.com/lfleischer/calcurse/language/"
"fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
+"1000000 == 0 ? 1 : 2;\n"
msgid "null pointer"
msgstr "Pointeur nul"
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "erreur de date sur ce rendez-vous"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "erreur de date sur ce rendez-vous"
+msgstr ""
msgid "date error in appointment"
msgstr "erreur de date sur ce rendez-vous"
@@ -42,7 +41,6 @@ msgstr "erreur de date sur ce rendez-vous"
msgid "no such appointment"
msgstr "rendez-vous inconnu"
-#, fuzzy
msgid ""
"Usage:\n"
"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
@@ -52,13 +50,6 @@ msgid ""
"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
-"Usage :\n"
-"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
-"calcurse -Q [--from <date>] [--to <date>] [--days <number>]\n"
-"calcurse -a | -d <date> | -d <number> | -n | -r[<number>] | -s[<date>] | -"
-"t[<number>]\n"
-"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<file>] | --"
-"daemon"
msgid "Try `calcurse -h` for more information."
msgstr "Tapez `calcurse -h` pour plus d'informations"
@@ -67,10 +58,8 @@ msgstr "Tapez `calcurse -h` pour plus d'informations"
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- organiseur en mode texte\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
-"(c) 2004-2017. L'équipe de développement de calcurse. Tous droits réservés."
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -154,9 +143,8 @@ msgstr " -h, --help Affiche cette aide"
msgid " -i, --import <file> Import iCal data from file"
msgstr " -i, --import <file> Importe des données iCal depuis le fichier"
-#, fuzzy
msgid " -q, --quiet Suppress import/export result message"
-msgstr " -q, --quiet Supprime les messages système"
+msgstr ""
msgid " --read-only Do not save configuration or data files"
msgstr ""
@@ -316,9 +304,8 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr "Voulez-vous vraiment quitter?"
-#, fuzzy
msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
-msgstr "Commande : [ h (aide) | w(!) (écrire) | q(!) (quitter) | wq(!) ]"
+msgstr ""
msgid "Read-only mode - use w!"
msgstr "Mode écriture seule - utiliser w!"
@@ -330,13 +317,11 @@ msgstr "Il y a des modifications non sauvegardées - utiliser w ou q!"
msgid "Help topic does not exist: %s"
msgstr "Le sujet n'existe pas dans l'aide : %s"
-#, fuzzy
msgid "Select a repeating item in the appointments panel."
-msgstr "(position de l'entête dans le panneau rendez-vous)"
+msgstr ""
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Répéter un élément"
+msgstr ""
msgid "Last occurrence."
msgstr ""
@@ -470,12 +455,6 @@ msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
"(si fixé à OUI, il est nécessaire de confirmer avant d'effacer un élément)"
-msgid "Monday"
-msgstr "Lundi"
-
-msgid "Sunday"
-msgstr "Dimanche"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(indique le premier jour de la semaine dans la vue de calendrier)"
@@ -500,6 +479,9 @@ msgstr "(position de l'entête dans le panneau rendez-vous)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Format de la date affichée dans le panneau rendez-vous)"
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
@@ -507,6 +489,11 @@ msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
"Saisir le format de date (voir 'man 3 strftime' pour les formats possibles)"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Saisir le format de l'heure (voir 'man 3 strftime' pour les formats "
+"possibles)"
+
msgid "Enter the date format: "
msgstr "Saisir le format de date : "
@@ -521,8 +508,8 @@ msgstr "options générales"
msgid "Undefined option!"
msgstr "Option inconnue !"
-msgid "undefined"
-msgstr "inconnue"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Configuration des raccourcis"
@@ -534,8 +521,8 @@ msgstr "Pressez la touche que vous voulez assigner :"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "Le raccourci '%s' est déjà utilisé for %s. Choisissez en un autre."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Certaines actions n'ont pas de raccourcis clavier associés !"
+msgid "Some actions are left undefined!"
+msgstr ""
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -551,9 +538,8 @@ msgstr "N'a pu sauvegarder %s."
msgid "unknown item type"
msgstr "type d'élément inconnu"
-#, fuzzy
msgid "Note:"
-msgstr "EditNote"
+msgstr ""
msgid "Event:"
msgstr "Événement :"
@@ -614,6 +600,7 @@ msgid "sleeping at %s for %d second\n"
msgid_plural "sleeping at %s for %d seconds\n"
msgstr[0] "endormi à %s pour %d seconde\n"
msgstr[1] "endormi à %s pour %d secondes\n"
+msgstr[2] "endormi à %s pour %d secondes\n"
#, c-format
msgid "awakened at %s\n"
@@ -623,13 +610,11 @@ msgstr "réveillé à %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "Impossible d'arrêter le démon calcurse : %s\n"
-#, fuzzy
msgid "illegal date in event"
-msgstr "date erronée dans l'événement"
+msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "date erronée dans l'événement"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Erreur interne : ligne trop longue"
@@ -640,6 +625,12 @@ msgstr "dépassement de mémoire"
msgid "unknown ical type"
msgstr "type ical inconnu"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -652,35 +643,32 @@ msgstr ""
msgid "frequency absent in rrule."
msgstr ""
-#, fuzzy
msgid "rrule frequency not supported."
-msgstr "fréquence de répétition introuvable."
+msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "Filtre invalide"
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "format d'exportation invalide : %s"
+msgstr ""
-#, fuzzy
msgid "invalid count value."
-msgstr "Date non valide."
+msgstr ""
msgid "invalid bymonth list."
msgstr ""
-#, fuzzy
msgid "invalid bymonthday list."
-msgstr "date invalide : %s"
+msgstr ""
-#, fuzzy
msgid "invalid byday list."
-msgstr "Date non valide."
+msgstr ""
msgid "invalid exception date value type."
msgstr ""
@@ -688,89 +676,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "Fréquence invalide."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Heure de départ non valide."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Saisir la description :"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "Heure de départ non valide."
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "impossible de récupérer le résumé de l'événement."
-
-msgid "item start date is not defined."
-msgstr "la date de début de l'élément n'est pas définie."
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " alloué en : %s\n"
+msgid "invalid end time value type."
+msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
-msgstr "l'élément n'a pu être identifié."
+msgid "end must be later than start."
+msgstr ""
-#, fuzzy
-msgid "malformed start time line."
-msgstr "Heure de départ non valide."
+msgid "either end or duration."
+msgstr ""
-#, fuzzy
-msgid "invalid or malformed event start time."
-msgstr "impossible de récupérer l'heure de début de l'événement."
+msgid "malformed duration line."
+msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "Heure ou durée non valide."
+msgid "invalid duration."
+msgstr ""
-#, fuzzy
-msgid "invalid end time value type."
-msgstr "Date ou heure non valide."
+msgid "exception date, but no recurrence rule."
+msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-#, fuzzy
-msgid "malformed event end time."
-msgstr "impossible de récupérer l'heure de fin de l'événement."
+#, c-format
+msgid "Location: %s"
+msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "description mal formée."
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "Heure ou durée non valide."
+msgid "item could not be identified."
+msgstr "l'élément n'a pu être identifié."
-#, fuzzy
msgid "only one description allowed."
-msgstr "description mal formée."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -779,6 +754,9 @@ msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
"Le fichier ical semble mal formé. La fin de l'élément n'a pas été trouvée."
+msgid "could not retrieve item summary."
+msgstr "impossible de récupérer le résumé de l'événement."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
"La priorité de l'élément est invalide (doit être comprise entre 0 et 9)"
@@ -853,9 +831,8 @@ msgstr "format incorrect du rendez-vous ou de l'événement"
msgid "syntax error in item repetition"
msgstr "erreur de syntaxe dans la répétition de l'élément"
-#, fuzzy
msgid "syntax error in until date"
-msgstr "erreur de syntaxe dans la date de l'élément"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -866,9 +843,8 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "erreur de syntaxe dans la date de l'élément"
+msgstr ""
msgid "failed to open todo file"
msgstr "impossible d'ouvrir le fichier des tâches"
@@ -879,39 +855,38 @@ msgstr "Les données à l'écran ont été modifiées et seront perdues :"
msgid "failed to open key file"
msgstr "impossible d'ouvrir le fichier des raccourcis clavier"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Trop d'erreurs à la lecture du fichier de configuration !\n"
-"Veuillez faire une sauvegarde de votre fichier de raccourcis, supprimer le "
-"du répertoire, puis relancer calcurse.\n"
-
msgid "Could not read key label"
msgstr "Impossible de lire le libellé de la touche"
-msgid "Key label not recognized"
-msgstr "Libellé de la touche non reconnu"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "No keys assigned to \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Erreur de lecture de la touche : \"%s\""
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" est assignée plusieurs fois !"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "There were some errors when loading keys file."
+msgid "Errors in the keys file."
msgstr ""
-"Il y a eu des erreurs au chargement du fichier de configuration des "
-"raccourcis."
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-"Trop d'erreurs durant la lecture du fichier de raccourcis, annulation..."
+
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Certaines actions n'ont pas de raccourcis clavier associés !"
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
@@ -950,18 +925,21 @@ msgid "%d app"
msgid_plural "%d apps"
msgstr[0] "%d app"
msgstr[1] "%d apps"
+msgstr[2] "%d apps"
#, c-format
msgid "%d event"
msgid_plural "%d events"
msgstr[0] "%d événement"
msgstr[1] "%d événements"
+msgstr[2] "%d événements"
#, c-format
msgid "%d todo"
msgid_plural "%d todos"
msgstr[0] "%d tâche"
msgstr[1] "%d tâches"
+msgstr[2] "%d tâches"
#, c-format
msgid "%d skipped"
@@ -993,13 +971,10 @@ msgstr "Attention : impossible d'effacer le journal temporaire %s, Abandon..."
msgid "Invalid delay"
msgstr "Délai invalide"
-#, fuzzy
msgid ""
"Periodic save cancelled. Data files have changed. Save and merge "
"interactively"
msgstr ""
-"Sauvegarde périodique : les fichiers de données ont été modifiés. "
-"L'enregistrement est annulé."
#, c-format
msgid ""
@@ -1047,6 +1022,9 @@ msgstr "Coller"
msgid "Chg Win"
msgstr "Chg.Fen."
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importer"
@@ -1236,6 +1214,9 @@ msgstr "Coller un élément à la position actuelle."
msgid "Select next panel in calcurse main screen."
msgstr "Sélectionner le panneau suivant dans l'écran général de calcurse."
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importer les données d'un fichier externe."
@@ -1375,10 +1356,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERREUR FATALE : pointeur de fichier nul."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
-"Pendant l'ajout de la touche par défaut pour \"%s\", \"%s\" était déjà "
-"assignée !"
msgid "xmalloc: zero size"
msgstr "xmalloc : taille nulle"
@@ -1471,12 +1450,6 @@ msgstr " blocs non libérés : %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Attention : impossible d'ouvrir %s, abandon..."
-msgid "error while launching command: could not fork"
-msgstr "erreur pendant le lancement de la commande : fork impossible"
-
-msgid "error while launching command"
-msgstr "erreur durant le lancement de la commande"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(si fixé à OUI, la barre de notification sera affichée)"
@@ -1509,11 +1482,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr "(Enregistrer l'activité lors de l'exécution en arrière-plan)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Saisir le format de l'heure (voir 'man 3 strftime' pour les formats "
-"possibles)"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
"Saisir le nombre de secondes (0 pour désactiver l'alerte qui précéde un "
@@ -1538,9 +1506,8 @@ msgstr "caractère inconnu"
msgid "recurrence error: not on start day (%s)"
msgstr ""
-#, fuzzy
msgid "illegel date in event"
-msgstr "date erronée dans l'événement"
+msgstr ""
msgid "date error in event"
msgstr "date erronée dans l'événement"
@@ -1548,9 +1515,8 @@ msgstr "date erronée dans l'événement"
msgid "month day is zero"
msgstr ""
-#, fuzzy
msgid "no daily frequency check"
-msgstr "Fréquence invalide."
+msgstr ""
msgid "illegal BYDAY value"
msgstr ""
@@ -1561,17 +1527,14 @@ msgstr "événement introuvable"
msgid "appointment not found"
msgstr "rendez-vous introuvable"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "erreur de syntaxe dans la date de l'élément"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "erreur de syntaxe dans la date de l'élément"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "erreur de syntaxe dans la date de l'élément"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
@@ -1705,28 +1668,23 @@ msgstr ""
msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
msgstr ""
-#, fuzzy
msgid "Invalid format - try again."
-msgstr "Date ou heure non valide."
+msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Presser une touche pour continuer..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "Aujourd."
+msgstr ""
-#, fuzzy
msgid "week"
-msgstr "hebdomadaire"
+msgstr ""
-#, fuzzy
msgid "month"
-msgstr "mensuel"
+msgstr ""
msgid "year"
msgstr ""
@@ -1740,22 +1698,19 @@ msgstr ""
msgid "Invalid frequency."
msgstr "Fréquence invalide."
-#, fuzzy
msgid "Until date, increment or repeat count ('?' for input formats):"
-msgstr "Entrer la date de fin ou la durée ('?' pour les formats d'entrée) :"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Date: %s (year, month may be omitted, endless: 0)."
-msgstr "Date : %s (année ou mois peuvent être omis). Durée infinie : 0."
+msgstr ""
msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
-"Date non valide : la date de fin doit être postérieure à la date de début "
-"(%s)."
msgid "Invalid date."
msgstr "Date non valide."
@@ -1809,34 +1764,25 @@ msgstr "Date : %s (et/ou heure), année ou mois peuvent être omis."
msgid "Invalid start time."
msgstr "Heure de départ non valide."
-#, fuzzy
msgid ""
"This item is recurrent and has a note attached to it. Delete (s)elected "
"occurrence, (a)ll occurrences, or just its (n)ote?"
msgstr ""
-"Une note est associée à cet élément. Effacer l'élém(e)nt ou seulement la "
-"(n)ote ?"
msgid "[san]"
msgstr ""
-#, fuzzy
msgid ""
"This item has a note attached to it. Delete (s)elected occurrence or just "
"its (n)ote?"
msgstr ""
-"Une note est associée à cet élément. Effacer l'élém(e)nt ou seulement la "
-"(n)ote ?"
msgid "[sn]"
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"Cet élément est répétitif. Effacer (t)outes les occurrences ou seulement "
-"(c)elle-ci ?"
msgid "[sa]"
msgstr ""
@@ -1847,9 +1793,8 @@ msgstr ""
msgid "[s]"
msgstr ""
-#, fuzzy
msgid "Already repeated."
-msgstr "Cet élément est déjà répétitif."
+msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
@@ -1939,16 +1884,11 @@ msgstr "panneau inconnu"
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr "Utilisation : calcurse-upgrade [-h|-v|--config <fichier>]"
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"\n"
-"(c) 2004-2017. L'équipe de développement de calcurse. Tous droits réservés.\n"
-"Ceci est un logiciel libre ; voir le code source pour les conditions légales "
-"d'utilisation.\n"
msgid "unrecognized option:"
msgstr "option non reconnue :"
@@ -1997,94 +1937,3 @@ msgstr "Mise à jour des instructions de configuration..."
msgid "Remove temporary backup..."
msgstr "Suppression de la sauvegarde temporaire..."
-
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(si fixé à OUI, les messages concernant le chargement et l'enregistrement "
-#~ "des données seront affichés)"
-
-#~ msgid "date error in the event\n"
-#~ msgstr "erreur dans la date de l'événement\n"
-
-#~ msgid "recurrence frequency not recognized."
-#~ msgstr "fréquence de répétition non reconnue."
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Saisir la description :"
-
-#~ msgid "item has a negative duration."
-#~ msgstr "l'élément a une durée négative."
-
-#~ msgid "item duration malformed."
-#~ msgstr "durée de l'élément mal formée."
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr "Bienvenue dans Calcurse. Les fichiers manquants ont été créés."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr ""
-#~ "Fichiers de données trouvés. Les données seront chargées immédiatement."
-
-#~ msgid "unknown repetition type"
-#~ msgstr "type de répétition inconnu"
-
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Saisir le nouveau type de répétition :"
-
-#~ msgid "(d)aily"
-#~ msgstr "(q)uotidien"
-
-#~ msgid "(w)eekly"
-#~ msgstr "(h)ebdomadaire"
-
-#~ msgid "(m)onthly"
-#~ msgstr "(m)ensuel"
-
-#~ msgid "(y)early"
-#~ msgstr "(a)nnuel"
-
-#, c-format
-#~ msgid "(currently using %s)"
-#~ msgstr "(actuellement : %s)"
-
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Saisir la fréquence de répétition :"
-
-#~ msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
-#~ msgstr "Durée en jours : +dd. Durée en semaines et jours : +??w??d."
-
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Voulez-vous vraiment effacer cet élément ?"
-
-#~ msgid "[ao]"
-#~ msgstr "[tc]"
-
-#~ msgid "[in]"
-#~ msgstr "[en]"
-
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Saisir le type de répétition :"
-
-#, c-format
-#~ msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
-#~ msgstr "Date : %s (année or mois peuvent être omis). Durée infinie : '0'."
-
-#~ msgid "wrong item type"
-#~ msgstr "type d'élément incorrect"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "règle de répétition mal formée."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "dates de répétition exceptées mal formées."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "impossible de trouver la description entière de l'élément."
-
-#~ msgid "event start time malformed."
-#~ msgstr "heure de début de l'événement mal formée."
-
-#~ msgid "event end time malformed."
-#~ msgstr "heure de fin de l'événement mal formée."
diff --git a/po/nl.po b/po/nl.po
index 59807b5..8392ccc 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,6 +1,6 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# Frob Nicator <mart@martlubbers.net>, 2016
@@ -11,10 +11,10 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: Dutch (http://www.transifex.com/lfleischer/calcurse/language/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Marco van Hulten <marco@hulten.org>, 2018\n"
+"Language-Team: Dutch (http://app.transifex.com/lfleischer/calcurse/language/"
"nl/)\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
@@ -25,13 +25,11 @@ msgstr ""
msgid "null pointer"
msgstr "null pointer"
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "datumfout in de afspraak"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "datumfout in de afspraak"
+msgstr ""
msgid "date error in appointment"
msgstr "datumfout in de afspraak"
@@ -56,7 +54,7 @@ msgstr "Probeer `calcurse -h` voor meer informatie."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- tekst gebaseerde agenda\n"
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
msgstr ""
msgid "This is free software; see the source for copying conditions."
@@ -297,9 +295,8 @@ msgstr ""
msgid "Select a repeating item in the appointments panel."
msgstr ""
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Herhaal item"
+msgstr ""
msgid "Last occurrence."
msgstr ""
@@ -428,12 +425,6 @@ msgstr "(Bij JA, wordt er een bevestiging gevraagd bij eindigen programma"
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr "(Bij JA, is een bevestiging nodig voor het wissen van een gebeurtenis)"
-msgid "Monday"
-msgstr "maandag"
-
-msgid "Sunday"
-msgstr "zondag"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -458,12 +449,18 @@ msgstr ""
msgid "(Format of the date displayed in the appointments panel)"
msgstr ""
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr ""
+
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Geef het formaat van de datum (zie 'man 3 strftime')"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Geef het formaat van de tijd (zie 'man 3 strftime')"
+
msgid "Enter the date format: "
msgstr ""
@@ -478,8 +475,8 @@ msgstr "Algemene opties"
msgid "Undefined option!"
msgstr "Niet gekende optie!"
-msgid "undefined"
-msgstr "Ongekend"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Toetsinstellingen"
@@ -491,7 +488,7 @@ msgstr "Druk de toets die u wilt toewijzen:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr ""
-msgid "Some actions do not have any associated key bindings!"
+msgid "Some actions are left undefined!"
msgstr ""
msgid ""
@@ -508,9 +505,8 @@ msgstr ""
msgid "unknown item type"
msgstr "ongekend type item"
-#, fuzzy
msgid "Note:"
-msgstr "WzgNoot"
+msgstr ""
msgid "Event:"
msgstr ""
@@ -580,13 +576,11 @@ msgstr ""
msgid "Could not stop calcurse daemon: %s\n"
msgstr ""
-#, fuzzy
msgid "illegal date in event"
-msgstr "datumfout in gebeurtenis"
+msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "datumfout in gebeurtenis"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Interne fout: lijn te lang"
@@ -597,6 +591,12 @@ msgstr ""
msgid "unknown ical type"
msgstr "onbekend ical type"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -618,6 +618,9 @@ msgstr ""
msgid "either until or count."
msgstr ""
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
msgstr ""
@@ -642,83 +645,73 @@ msgstr ""
msgid "invalid exception."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "omschrijving beschadigd"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "omschrijving beschadigd"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "omschrijving beschadigd"
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "kan item onderwerp niet ophalen"
-
-msgid "item start date is not defined."
+msgid "malformed start time line."
msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, c-format
-msgid "Location: %s"
+msgid "invalid end time value type."
msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
-msgstr "item onbekend"
+msgid "end must be later than start."
+msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-#, fuzzy
-msgid "invalid or malformed event start time."
-msgstr "kan begintijd van gebeurtenis niet ophalen"
+msgid "malformed duration line."
+msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "syntaxfout in itemtijd of duurtijd van het item"
+msgid "invalid duration."
+msgstr ""
-msgid "invalid end time value type."
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-#, fuzzy
-msgid "malformed event end time."
-msgstr "kan eindtijd van gebeurtenis niet ophalen"
+#, c-format
+msgid "Location: %s"
+msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "omschrijving beschadigd"
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "item heeft een negatieve tijdsduur"
+msgid "item could not be identified."
+msgstr "item onbekend"
-#, fuzzy
msgid "only one description allowed."
-msgstr "omschrijving beschadigd"
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -726,6 +719,9 @@ msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
msgstr "Ical-bestand oogt onjuist. Het einde van item niet gevonden."
+msgid "could not retrieve item summary."
+msgstr "kan item onderwerp niet ophalen"
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -796,9 +792,8 @@ msgstr "fout formaat in de afspraak of gebeurtenis"
msgid "syntax error in item repetition"
msgstr "syntaxfout in de herhaling van het item"
-#, fuzzy
msgid "syntax error in until date"
-msgstr "syntaxfout in datum van item"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -809,9 +804,8 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "syntaxfout in datum van item"
+msgstr ""
msgid "failed to open todo file"
msgstr "kon het todo-bestand niet openen"
@@ -822,37 +816,38 @@ msgstr ""
msgid "failed to open key file"
msgstr ""
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
+msgid "Could not read key label"
msgstr ""
-"\n"
-"Teveel fouten tijdens het lezen van het configuratiebestand!\n"
-"Maak een backup van het sneltoetsenbestand, verwijder het van de map en "
-"start calcurse opnieuw op.\n"
-msgid "Could not read key label"
+#, c-format
+msgid "Key label not recognized: \"%s\""
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "No keys assigned to \"%s\"."
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "Keyname not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" meer dan eens toegewezen!"
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
+
+msgid "Errors in the keys file."
+msgstr ""
+
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
+msgid "Some actions do not have any associated key bindings!"
msgstr ""
-"Teveel fouten bij het laden van het sneltoetsenbestand, wordt afgebroken ..."
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
@@ -979,6 +974,9 @@ msgstr "Plak"
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Import"
@@ -1157,6 +1155,9 @@ msgstr ""
msgid "Select next panel in calcurse main screen."
msgstr ""
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importeer gegevens uit een extern bestand."
@@ -1279,7 +1280,7 @@ msgid "FATAL ERROR: null file pointer."
msgstr ""
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
+msgid "Default key(s) assigned to %d action%s."
msgstr ""
msgid "xmalloc: zero size"
@@ -1372,12 +1373,6 @@ msgstr ""
msgid "Warning: could not open %s, Aborting..."
msgstr "Pas op: bestand %s niet te openen. Stoppen..."
-msgid "error while launching command: could not fork"
-msgstr ""
-
-msgid "error while launching command"
-msgstr "fout bij uitvoeren commando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Bij JA, wordt de informatiebalk weergegeven)"
@@ -1405,9 +1400,6 @@ msgstr ""
msgid "(Log activity when running in background)"
msgstr ""
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Geef het formaat van de tijd (zie 'man 3 strftime')"
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr "Geef het aantal seconden (0 voor geen waarschuwing voor een afspraak)."
@@ -1430,9 +1422,8 @@ msgstr "onbekend karakter"
msgid "recurrence error: not on start day (%s)"
msgstr ""
-#, fuzzy
msgid "illegel date in event"
-msgstr "datumfout in gebeurtenis"
+msgstr ""
msgid "date error in event"
msgstr "datumfout in gebeurtenis"
@@ -1452,17 +1443,14 @@ msgstr "Gebeurtenis niet gevonden"
msgid "appointment not found"
msgstr "afspraak niet gevonden"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "syntaxfout in datum van item"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "syntaxfout in datum van item"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "syntaxfout in datum van item"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
@@ -1593,23 +1581,20 @@ msgstr ""
msgid "Invalid format - try again."
msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Druk op een toets om door te gaan..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "Vandaag"
+msgstr ""
msgid "week"
msgstr ""
-#, fuzzy
msgid "month"
-msgstr "(m)aandelijks"
+msgstr ""
msgid "year"
msgstr ""
@@ -1714,9 +1699,8 @@ msgstr ""
msgid "[s]"
msgstr ""
-#, fuzzy
msgid "Already repeated."
-msgstr "Dit item wordt al herhaald."
+msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
@@ -1802,12 +1786,11 @@ msgstr ""
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr ""
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
-msgstr "Dit is vrije software; bekijk de broncode voor de kopieer voorwaarden"
+msgstr ""
msgid "unrecognized option:"
msgstr ""
@@ -1848,34 +1831,3 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "omschrijving beschadigd"
-
-#~ msgid "item duration malformed."
-#~ msgstr "item tijdsduur onjuist"
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr "Welkom bij Calcurse. De missende databestanden zijn aangemaakt."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Databestanden gevonden. Data wordt geladen."
-
-#~ msgid "(d)aily"
-#~ msgstr "(d)agelijks"
-
-#~ msgid "(w)eekly"
-#~ msgstr "(w)ekelijks"
-
-#~ msgid "(y)early"
-#~ msgstr "(y)aarlijks"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "herhalingsregel onjuist"
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "herhaling exceptie datum onjuist"
-
-#~ msgid "could not get entire item description."
-#~ msgstr "onvolledige item omschrijving"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 8bd9327..bcee694 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1,35 +1,35 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# Fabio Bianchi <fabiobianchi10@gmail.com>, 2019
# Rafael Fontenelle <rffontenelle@gmail.com>, 2012-2014
+# Vitor Henrique, 2023
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/lfleischer/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Vitor Henrique, 2023\n"
+"Language-Team: Portuguese (Brazil) (http://app.transifex.com/lfleischer/"
"calcurse/language/pt_BR/)\n"
"Language: pt_BR\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"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % "
+"1000000 == 0 ? 1 : 2;\n"
msgid "null pointer"
msgstr "ponteiro nulo"
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "erro de data no agendamento"
+msgstr ""
-#, fuzzy
msgid "error in appointment description"
-msgstr "erro de data no agendamento"
+msgstr ""
msgid "date error in appointment"
msgstr "erro de data no agendamento"
@@ -37,7 +37,6 @@ msgstr "erro de data no agendamento"
msgid "no such appointment"
msgstr "agendamento inexistente"
-#, fuzzy
msgid ""
"Usage:\n"
"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
@@ -47,13 +46,6 @@ msgid ""
"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
-"Uso:\n"
-"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
-"calcurse -Q [--from <date>] [--to <date>] [--days <number>]\n"
-"calcurse -a | -d <date> | -d <number> | -n | -r[<number>] | -s[<date>] | -"
-"t[<number>]\n"
-"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<file>] | --"
-"daemon"
msgid "Try `calcurse -h` for more information."
msgstr "Tente `calcurse -h` para mais informações."
@@ -62,9 +54,8 @@ msgstr "Tente `calcurse -h` para mais informações."
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s -- agenda baseada em texto\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Equipe de Desenvolvimento."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr ""
msgid "This is free software; see the source for copying conditions."
msgstr ""
@@ -132,13 +123,13 @@ msgstr ""
" -c, --calendar <file> O arquivo correspondente da agenda a ser usada"
msgid " -C, --confdir <dir> The configuration directory to use"
-msgstr ""
+msgstr " -C, --confdir <dir> O diretório de configuração a ser usado"
msgid " --daemon Run notification daemon in the background"
msgstr " --daemon Executa a notificação em segundo plano"
msgid " -D, --datadir <dir> The data directory to use"
-msgstr ""
+msgstr " -D, --datadir <dir> O diretório de dados a ser usado"
msgid " -g, --gc Run the garbage collector"
msgstr " -g, --gc Execute o coletor de lixo"
@@ -149,9 +140,8 @@ msgstr " -h, --help Mostra o texto de ajuda"
msgid " -i, --import <file> Import iCal data from file"
msgstr " -i, --import <file> Importa o arquivo iCal"
-#, fuzzy
msgid " -q, --quiet Suppress import/export result message"
-msgstr " -q, --quiet Esconde os diálogos do sistema"
+msgstr ""
msgid " --read-only Do not save configuration or data files"
msgstr ""
@@ -307,9 +297,8 @@ msgstr "Existem alterações não salvas. Salvar?"
msgid "Do you really want to quit?"
msgstr "Você certeza que deseja sair?"
-#, fuzzy
msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
-msgstr "Comando: [ h(ajuda) | w(escrever)(!) | q(sair)(!) | wq(!) ]"
+msgstr ""
msgid "Read-only mode - use w!"
msgstr "Modo somente-leitura - usar w!"
@@ -321,13 +310,11 @@ msgstr "Existem alterações não salvas - use w ou q!"
msgid "Help topic does not exist: %s"
msgstr "Tópico de ajuda não existe: %s"
-#, fuzzy
msgid "Select a repeating item in the appointments panel."
-msgstr "(posição do cabeçalho no painel de agendamentos)"
+msgstr ""
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Repete um item"
+msgstr ""
msgid "Last occurrence."
msgstr ""
@@ -358,19 +345,19 @@ msgstr ""
#, c-format
msgid "unknown user option: \"%s\" (ignored)"
-msgstr ""
+msgstr "opção de usuário desconhecida: \"%s\" (ignorada)"
#, c-format
msgid "invalid option format: \"%s\" (ignored)"
-msgstr ""
+msgstr "formato de opção inválido: \"%s\" (ignorado)"
#, c-format
msgid "unknown user option: \"%s\" (disabled)"
-msgstr ""
+msgstr "opção de usuário desconhecida: \"%s\" (desabilitada)"
#, c-format
msgid "invalid option format: \"%s\" (disabled)"
-msgstr ""
+msgstr "formato de opção inválido: \"%s\" (desabilitada)"
msgid "layout configuration"
msgstr "Configuração de layout"
@@ -464,12 +451,6 @@ msgstr ""
"(se definida como SIM, uma confirmação será necessária antes da exclusão de "
"um evento)"
-msgid "Monday"
-msgstr "Segunda-feira"
-
-msgid "Sunday"
-msgstr "Domingo"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr "(especifica o primeiro dia da semana na visão de calendário)"
@@ -494,20 +475,26 @@ msgstr "(posição do cabeçalho no painel de agendamentos)"
msgid "(Format of the date displayed in the appointments panel)"
msgstr "(Formato da data exibida no painel de agendamentos)"
-msgid "Enter a text string (an empty string for the default text)"
+msgid "(Format of the time displayed in the appointments panel)"
msgstr ""
+msgid "Enter a text string (an empty string for the default text)"
+msgstr "Insira um texto (deixe vazio para o texto padrão)"
+
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr ""
-"Entre com o formato da data (veja \"man 3 strftime\" para formatos "
+"Insira o formato da data (veja \"man 3 strftime\" para formatos possíveis) "
+
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr ""
+"Insira o formato do horário (veja \"man 3 strftime\" para formatos "
"possíveis) "
msgid "Enter the date format: "
-msgstr "Entre com formato da data: "
+msgstr "Insira o formato da data: "
msgid "Enter the delay, in minutes, between automatic saves (0 to disable) "
-msgstr ""
-"Entre com a distância, em minutos, entre salvamentos (0 = desabilitar) "
+msgstr "Insira a distância, em minutos, entre salvamentos (0 = desabilitar) "
msgid "general options"
msgstr "Opções Gerais"
@@ -515,8 +502,8 @@ msgstr "Opções Gerais"
msgid "Undefined option!"
msgstr "Opção indefinida!"
-msgid "undefined"
-msgstr "indefinida"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Configuração das Teclas"
@@ -528,8 +515,8 @@ msgstr "Pressione a tecla que você quer designar para:"
msgid "The key '%s' is already used for %s. Choose another one."
msgstr "A tecla '%s' já está em uso para %s. Selecione outra."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Algumas ações não têm teclas de atalho associadas!"
+msgid "Some actions are left undefined!"
+msgstr ""
msgid ""
"Sorry, colors are not supported by your terminal\n"
@@ -545,9 +532,8 @@ msgstr "Não foi possível salvarCould not save %s."
msgid "unknown item type"
msgstr "tipo de item desconhecido"
-#, fuzzy
msgid "Note:"
-msgstr "EditNota"
+msgstr ""
msgid "Event:"
msgstr "Evento:"
@@ -608,6 +594,7 @@ msgid "sleeping at %s for %d second\n"
msgid_plural "sleeping at %s for %d seconds\n"
msgstr[0] "Dormir em %s por %d segundo\n"
msgstr[1] "Dormir em %s por %d segundos\n"
+msgstr[2] "Dormir em %s por %d segundos\n"
#, c-format
msgid "awakened at %s\n"
@@ -617,13 +604,11 @@ msgstr "Acordou em %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "Não foi possível parar o daemon do calcurse: %s\n"
-#, fuzzy
msgid "illegal date in event"
-msgstr "erro na data em evento"
+msgstr ""
-#, fuzzy
msgid "date error in event\n"
-msgstr "erro na data em evento"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Erro interno: linha muito comprida"
@@ -634,6 +619,12 @@ msgstr "memória insuficiente"
msgid "unknown ical type"
msgstr "tipo de ical desconhecido"
+msgid "(empty)"
+msgstr ""
+
+msgid "ical_store_event: out of memory"
+msgstr ""
+
msgid "need DTSTART to determine event type."
msgstr ""
@@ -646,20 +637,20 @@ msgstr ""
msgid "frequency absent in rrule."
msgstr ""
-#, fuzzy
msgid "rrule frequency not supported."
-msgstr "periodicidade de recorrência não encontrada."
+msgstr ""
-#, fuzzy
msgid "invalid interval."
-msgstr "máscara de filtro inválida"
+msgstr ""
msgid "either until or count."
msgstr ""
-#, fuzzy
+msgid "missing until value."
+msgstr ""
+
msgid "invalid until format."
-msgstr "formato de exportação inválido: %s"
+msgstr ""
msgid "invalid count value."
msgstr ""
@@ -667,13 +658,11 @@ msgstr ""
msgid "invalid bymonth list."
msgstr ""
-#, fuzzy
msgid "invalid bymonthday list."
-msgstr "data inválida: %s"
+msgstr ""
-#, fuzzy
msgid "invalid byday list."
-msgstr "data inválida: %s"
+msgstr ""
msgid "invalid exception date value type."
msgstr ""
@@ -681,88 +670,76 @@ msgstr ""
msgid "malformed exceptions line."
msgstr ""
-#, fuzzy
msgid "invalid exception."
-msgstr "combinação inválida de argumentos"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "descrição mal-formulada."
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "Insera uma descrição:"
+msgstr ""
-#, fuzzy
msgid "malformed summary line."
-msgstr "descrição mal-formulada."
+msgstr ""
msgid "malformed summary."
msgstr ""
-msgid "line break in summary."
+msgid "item start date not defined."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "não foi possível adquirir sumário do item."
-
-msgid "item start date is not defined."
-msgstr "data de início do ítem não foi definida."
+msgid "malformed start time line."
+msgstr ""
-msgid "multi-day event changed to one-day event"
+msgid "invalid or malformed event start time."
msgstr ""
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " alocado em: %s\n"
+msgid "invalid end time value type."
+msgstr ""
-#, c-format
-msgid "Comment: %s"
+msgid "malformed end time line."
msgstr ""
-#, c-format
-msgid "rrule does not match start day (%s)."
+msgid "malformed event end time."
msgstr ""
-msgid "item could not be identified."
-msgstr "item não pôde ser identificado."
+msgid "end must be later than start."
+msgstr ""
-msgid "malformed start time line."
+msgid "either end or duration."
msgstr ""
-#, fuzzy
-msgid "invalid or malformed event start time."
-msgstr "não foi possível adquirir hora de início do evento."
+msgid "malformed duration line."
+msgstr ""
-#, fuzzy
-msgid "either end or duration."
-msgstr "erro de sintaxe no horário ou duração do item"
+msgid "invalid duration."
+msgstr ""
-#, fuzzy
-msgid "invalid end time value type."
-msgstr "intervalo de datas inválido: %s"
+msgid "exception date, but no recurrence rule."
+msgstr ""
-msgid "malformed end time line."
+msgid "multi-day event changed to one-day event"
msgstr ""
-#, fuzzy
-msgid "malformed event end time."
-msgstr "não foi possível adquirir hora de término do evento."
+#, c-format
+msgid "Location: %s"
+msgstr ""
-msgid "end must be later than start."
+#, c-format
+msgid "Comment: %s"
msgstr ""
-#, fuzzy
-msgid "malformed duration line."
-msgstr "descrição mal-formulada."
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-#, fuzzy
-msgid "invalid duration."
-msgstr "data inválida: %s"
+msgid "item could not be identified."
+msgstr "item não pôde ser identificado."
-#, fuzzy
msgid "only one description allowed."
-msgstr "descrição mal-formulada."
+msgstr ""
msgid "only one location allowed."
msgstr ""
@@ -771,6 +748,9 @@ msgid "The ical file seems to be malformed. The end of item was not found."
msgstr ""
"O arquivo ical parece estar mal-formulada. O fim do item não foi encontrado."
+msgid "could not retrieve item summary."
+msgstr "não foi possível adquirir sumário do item."
+
msgid "item priority is invalid (must be between 0 and 9)."
msgstr ""
@@ -843,9 +823,8 @@ msgstr "formato errado no agendamento ou evento"
msgid "syntax error in item repetition"
msgstr "erro de sintaxe na repetição do item"
-#, fuzzy
msgid "syntax error in until date"
-msgstr "erro de sintaxe no item data"
+msgstr ""
msgid "until date error"
msgstr ""
@@ -856,9 +835,8 @@ msgstr ""
msgid "missing end of recurrence"
msgstr ""
-#, fuzzy
msgid "syntax error in item state"
-msgstr "erro de sintaxe no item data"
+msgstr ""
msgid "failed to open todo file"
msgstr "falha na abertura do arquivo de tarefas"
@@ -869,36 +847,38 @@ msgstr ""
msgid "failed to open key file"
msgstr "falha na abertura do arquivo de teclas"
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Muitos erros de leitura do arquivo de configuração!\n"
-"Favor faça backup de seus arquivos de teclas, exclua-o de seu diretório e "
-"carregue calcurse novamente.\n"
-
msgid "Could not read key label"
msgstr "Não foi possível ler o rótulo de tecla"
-msgid "Key label not recognized"
-msgstr "Rótulo de tecla não reconhecida"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Erro na leitura da tecla: \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" alocada múltiplas vezes!"
+msgid "Keyname not recognized: \"%s\""
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Erros demais na leitura do arquivo de chaves, abortando..."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
+
+msgid "Errors in the keys file."
+msgstr ""
+
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Algumas ações não têm teclas de atalho associadas!"
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
@@ -917,7 +897,7 @@ msgid "wrong export mode"
msgstr "modo de exportação errado"
msgid "Enter the file name to import data from:"
-msgstr "Entre com o nome do arquivo de onde serão importados os dados:"
+msgstr "Insira o nome do arquivo de onde serão importados os dados:"
#, c-format
msgid "Import process report: %04d lines read"
@@ -937,18 +917,21 @@ msgid "%d app"
msgid_plural "%d apps"
msgstr[0] "%d agend."
msgstr[1] "%d agends."
+msgstr[2] "%d agends."
#, c-format
msgid "%d event"
msgid_plural "%d events"
msgstr[0] "%d evento"
msgstr[1] "%d eventos"
+msgstr[2] "%d eventos"
#, c-format
msgid "%d todo"
msgid_plural "%d todos"
msgstr[0] "%d tarefa"
msgstr[1] "%d tarefas"
+msgstr[2] "%d tarefas"
#, c-format
msgid "%d skipped"
@@ -1031,6 +1014,9 @@ msgstr "Colar"
msgid "Chg Win"
msgstr "MudarJan"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1151,6 +1137,15 @@ msgid ""
"# via the key configuration menu of the interactive user\n"
"# interface. It should not be edited directly.\n"
msgstr ""
+"#\n"
+"# Arquivo de configuração das teclas do Calcurse\n"
+"#\n"
+"# Nesse arquivo, são definidos os atalhos de teclado\n"
+"# usados pelo Calcurse. Ele é gerado automaticamente\n"
+"# pelo Calcurse e é mantido por meio do menu de\n"
+"# configuração de teclas da interface interativa do usuário\n"
+"# interface interativa do usuário. Ele não deve ser editado\n"
+"# diretamente.\n"
msgid "FATAL ERROR: could not create default keys file."
msgstr "ERRO FATAL: não foi possível criar arquivo de teclas padrões."
@@ -1209,6 +1204,9 @@ msgstr "Cola um item na posição atual."
msgid "Select next panel in calcurse main screen."
msgstr "Seleciona o próximo painel na tela principal do calcurse."
+msgid "Select previous panel in calcurse main screen."
+msgstr ""
+
msgid "Import data from an external file."
msgstr "Importa dados a partir de um arquivo externo."
@@ -1354,8 +1352,8 @@ msgid "FATAL ERROR: null file pointer."
msgstr "ERRO FATAL: ponteiro nulo de arquivo."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
-msgstr "Quando adicionava tecla padrão para \"%s\", \"%s\" já foi designada!"
+msgid "Default key(s) assigned to %d action%s."
+msgstr ""
msgid "xmalloc: zero size"
msgstr "xmalloc: tamanho zero"
@@ -1447,12 +1445,6 @@ msgstr " blocos não livres: %u\n"
msgid "Warning: could not open %s, Aborting..."
msgstr "Aviso: não foi possível abrir %s. Abortando..."
-msgid "error while launching command: could not fork"
-msgstr "erro durante o lançamento do comando: não foi possível realizar fork"
-
-msgid "error while launching command"
-msgstr "erro durante o lançamento do comando"
-
msgid "(if set to YES, notify-bar will be displayed)"
msgstr "(Se definida como SIM, a barra de notificação será exibida)"
@@ -1465,8 +1457,8 @@ msgstr "(Formato de horário a ser exibido dentro da barra de notificação)"
msgid ""
"(Warn user if an appointment is within next 'notify-bar_warning' seconds)"
msgstr ""
-"(Avisa o usuário se um agendamento ocorrerá nos próximos \"notify-bar_warning"
-"\" segundos)"
+"(Avisa o usuário se um agendamento ocorrerá nos próximos \"notify-"
+"bar_warning\" segundos)"
msgid "(Command used to notify user of an upcoming appointment)"
msgstr "(Comando usado para notificar usuário de um agendamento próximo)"
@@ -1480,17 +1472,12 @@ msgstr "(Executa em plano de fundo para pegar notificações depois de sair)"
msgid "(Log activity when running in background)"
msgstr "(Registra atividades quando estiver executando em plano de fundo)"
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr ""
-"Entre com o formato do horário (veja \"man 3 strftime\" para formatos "
-"possíveis) "
-
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
msgstr ""
-"Entre com o número de segundos (0 para não ser avisado antes do agendamento)"
+"Insira o número de segundos (0 para não ser avisado antes do agendamento)"
msgid "Enter the notification command "
-msgstr "Entre com o comando de notificação "
+msgstr "Insira o comando de notificação "
msgid "notification options"
msgstr "opções de notificação"
@@ -1510,9 +1497,8 @@ msgstr "caractere desconhecido"
msgid "recurrence error: not on start day (%s)"
msgstr ""
-#, fuzzy
msgid "illegel date in event"
-msgstr "erro na data em evento"
+msgstr ""
msgid "date error in event"
msgstr "erro na data em evento"
@@ -1532,17 +1518,14 @@ msgstr "evento não encontrado"
msgid "appointment not found"
msgstr "agendamento não encontrado"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "erro de sintaxe no item data"
+msgstr ""
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "erro de sintaxe no item data"
+msgstr ""
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "erro de sintaxe no item data"
+msgstr ""
msgid "illegal bymonth value"
msgstr ""
@@ -1673,24 +1656,20 @@ msgstr ""
msgid "Invalid format - try again."
msgstr ""
-#, fuzzy
msgid "Press any key to continue."
-msgstr "Pressione qualquer tecla para continuar..."
+msgstr ""
msgid "Base period:"
msgstr ""
-#, fuzzy
msgid "day"
-msgstr "Hoje"
+msgstr ""
-#, fuzzy
msgid "week"
-msgstr "semanalmente"
+msgstr ""
-#, fuzzy
msgid "month"
-msgstr "mensalmente"
+msgstr ""
msgid "year"
msgstr ""
@@ -1714,9 +1693,9 @@ msgstr ""
msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Invalid date: until date must come after start date (%s)."
-msgstr "a data final não pode vir antes da data inicial"
+msgstr ""
msgid "Invalid date."
msgstr ""
@@ -1759,7 +1738,7 @@ msgid ""
msgstr ""
msgid "Enter description:"
-msgstr "Insera uma descrição:"
+msgstr "Insira uma descrição:"
#, c-format
msgid "Date: %s (and/or time), year or month may be omitted."
@@ -1768,33 +1747,25 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent and has a note attached to it. Delete (s)elected "
"occurrence, (a)ll occurrences, or just its (n)ote?"
msgstr ""
-"Este item tem uma anotação anexada a ele. Excluir o (i)tem ou somente sua "
-"(n)ota?"
msgid "[san]"
msgstr ""
-#, fuzzy
msgid ""
"This item has a note attached to it. Delete (s)elected occurrence or just "
"its (n)ote?"
msgstr ""
-"Este item tem uma anotação anexada a ele. Excluir o (i)tem ou somente sua "
-"(n)ota?"
msgid "[sn]"
msgstr ""
-#, fuzzy
msgid ""
"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"Este item é recorrente. Excluir (t)odas as ocorrências ou (s)omente esta?"
msgid "[sa]"
msgstr ""
@@ -1805,9 +1776,8 @@ msgstr ""
msgid "[s]"
msgstr ""
-#, fuzzy
msgid "Already repeated."
-msgstr "Este é um item repetido."
+msgstr ""
msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
@@ -1895,14 +1865,11 @@ msgstr "painel desconhecido"
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
msgstr "Uso: calcurse-upgrade [-h|-v|--config <arquivo>]"
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"Esse programa é livre; veja o arquivo fonte para as condições aplicadas em "
-"cópias."
msgid "unrecognized option:"
msgstr "opção não reconhecida:"
@@ -1950,78 +1917,3 @@ msgstr "Atualizar diretivas de configuração..."
msgid "Remove temporary backup..."
msgstr "Excluir backup temporário..."
-
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr ""
-#~ "(se definida como SIM, mensagens sobre dados carregados e salvados serão "
-#~ "exibidos)"
-
-#~ msgid "date error in the event\n"
-#~ msgstr "erro de data no evento\n"
-
-#~ msgid "recurrence frequency not recognized."
-#~ msgstr "periodicidade de recorrência não reconhecida."
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "Insera uma descrição:"
-
-#~ msgid "item has a negative duration."
-#~ msgstr "item tem uma duração negativa."
-
-#~ msgid "item duration malformed."
-#~ msgstr "duração de item mal-formulada."
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr ""
-#~ "Bem-vindo ao Calcurse. Arquivos de dados não encontrados foram criados."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Arquivos de dados encontrados. Os dados serão carregados agora."
-
-#~ msgid "unknown repetition type"
-#~ msgstr "tipo de repetição desconhecida"
-
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Insira o novo tipo de repetição:"
-
-#~ msgid "(d)aily"
-#~ msgstr "(d)iária"
-
-#~ msgid "(w)eekly"
-#~ msgstr "(s)emanal"
-
-#~ msgid "(m)onthly"
-#~ msgstr "(m)ensal"
-
-#~ msgid "(y)early"
-#~ msgstr "(a)nual"
-
-#, c-format
-#~ msgid "(currently using %s)"
-#~ msgstr "(atualmente usando %s)"
-
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Tem certeza que deseja excluir este item?"
-
-#~ msgid "[ao]"
-#~ msgstr "[ts]"
-
-#~ msgid "[in]"
-#~ msgstr "[in]"
-
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Insira o tipo da repetição:"
-
-#~ msgid "wrong item type"
-#~ msgstr "tipo de item errado"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "regra de recorrência mal-formulada."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "Exceção de datas de recorrência mal-formulada."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "não foi possível adquirir a descrição completa do item."
diff --git a/po/ru.po b/po/ru.po
index 82d034b..7243440 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -1,45 +1,53 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR calcurse Development Team <misc@calcurse.org>
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the calcurse package.
#
# Translators:
# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2011-2012
# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2012-2014,2016
+# Vladimir Kalashnikov, 2023
# Lukas Fleischer <transifex@cryptocrack.de>, 2011
-# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2016-2017,2019
+# Vladimir Kalashnikov, 2023
+# Vladimir Kalashnikov, 2023
+# Vlad Savikin, 2021
+# Vlad Savikin, 2021
+# ÐлекÑей Мехоношин <ruskidecko@gmail.com>, 2016-2017,2019-2020
msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-10-12 10:38-0400\n"
-"PO-Revision-Date: 2020-01-30 18:17+0000\n"
-"Last-Translator: Lukas Fleischer\n"
-"Language-Team: Russian (http://www.transifex.com/lfleischer/calcurse/"
+"POT-Creation-Date: 2024-01-26 18:28+0100\n"
+"PO-Revision-Date: 2013-07-23 08:43+0000\n"
+"Last-Translator: Vlad Savikin, 2021\n"
+"Language-Team: Russian (http://app.transifex.com/lfleischer/calcurse/"
"language/ru/)\n"
"Language: ru\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%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
-"%100>=11 && n%100<=14)? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
+"(n%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "null pointer"
-msgstr "пуÑтой указатель"
+msgstr ""
+"Ошибка в работе программы: null pointer (указатель не указывает на "
+"корректные данные)."
-#, fuzzy
msgid "illegal date in appointment"
-msgstr "ошибка даты в задаче"
+msgstr "ÐеÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸ÑтиÑ."
-#, fuzzy
msgid "error in appointment description"
-msgstr "ошибка даты в задаче"
+msgstr "Ошибка в опиÑании мероприÑтиÑ."
msgid "date error in appointment"
-msgstr "ошибка даты в задаче"
+msgstr ""
+"Ошибка в работе программы: date error in appointment (некорректно указана "
+"дата мероприÑтиÑ)."
msgid "no such appointment"
-msgstr "задача отÑутÑтвует"
+msgstr ""
+"Ошибка в работе программы: no such appointment (мероприÑтие не найдено)."
msgid ""
"Usage:\n"
@@ -50,6 +58,13 @@ msgid ""
"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
+"ИÑпользуйте:\n"
+"calcurse [-D <directory>] [-C <directory>] [-c <calendar file>]\n"
+"calcurse -Q [--from <date>] [--to <date>] [--days <number>]\n"
+"calcurse -a | -d <date> | -d <number> | -n | -r[<number>] | -s[<date>] | -"
+"t[<number>]\n"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
+"daemon"
msgid "Try `calcurse -h` for more information."
msgstr "Выполните 'calcurse -h' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки."
@@ -58,17 +73,17 @@ msgstr "Выполните 'calcurse -h' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑправкÐ
msgid "calcurse %s -- text-based organizer\n"
msgstr "calcurse %s - текÑтовый органайзер\n"
-#, fuzzy
-msgid "Copyright (c) 2004-2020 calcurse Development Team."
-msgstr "Copyright (c) 2004-2017 calcurse Development Team."
+msgid "Copyright (c) 2004-2023 calcurse Development Team."
+msgstr "Copyright (c) 2004-2023 calcurse Development Team."
msgid "This is free software; see the source for copying conditions."
msgstr ""
-"Это Ñвободное ПО. Ð”Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑƒÑловиÑми ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐž, ознакомьтеÑÑŒ "
-"Ñ Ð¸Ñходным кодом."
+"Это Ñвободное программное обеÑпечение.\n"
+"Ð”Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑƒÑловиÑми ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого программного обеÑпечениÑ,\n"
+"ознакомьтеÑÑŒ Ñ Ð¸Ñходным кодом."
msgid "Operations in command line mode:"
-msgstr ""
+msgstr "Операции в режиме командной Ñтроки:"
msgid " -Q, --query Print items in a given query range"
msgstr ""
@@ -80,79 +95,92 @@ msgstr ""
msgid " -P, --purge Read items and write them back"
msgstr ""
+" -P, --purge ИÑпользование рег. выражений Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей в календаре"
msgid ""
"Query short forms:\n"
"-a, -d <date>|<number>, -n, -r[<number>], -s[<date>], -t<number>"
msgstr ""
+" Краткие запроÑÑ‹:\n"
+" -a, -d <date>|<number>, -n, -r[<number>], -s[<date>], -t<number>"
msgid "Note that filter, format and day-range options affect input or output:"
msgstr ""
+" Заметьте, еÑÑ‚ÑŒ опции Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°, формата и временного диапазона "
+"влиÑющие на ввод или вывод: "
msgid " --filter-* Filter items loaded by -Q, -G, -P and -x"
msgstr ""
+" --filter-* Фильтрует загруженные Ñлементы Ð´Ð»Ñ -Q, -G, -"
+"P и -x"
msgid ""
" --format-* Rewrite output from -Q, -G and --dump-imported"
msgstr ""
+" --format-* Переоформить вывод -Q, -G и --dump-imported"
msgid " --from <date> Limit day range of -Q."
-msgstr ""
+msgstr " --from <date> Ðачало временного диапазона Ð´Ð»Ñ -Q"
msgid " --to <date> Limit day range of -Q."
-msgstr ""
+msgstr " --to <date> Конец временного диапазона Ð´Ð»Ñ -Q"
msgid " --days <number> Limit day range of -Q."
-msgstr ""
+msgstr " --days <number> От \"СегоднÑ\" отÑчёт дней Ð´Ð»Ñ -Q"
msgid " --limit, -l <number> Limit number of query results"
-msgstr ""
+msgstr " --limit, -l <number> Ограничение вывода (количеÑтвенно)"
msgid " --search, -S <regexp> Match regular expression in queries"
msgstr ""
+" --search, -S <regexp> ИÑпользование рег. выражений в запроÑах"
msgid "Consult the man page for details."
-msgstr ""
+msgstr " ПодробноÑти Ñмотрите в man-Ñтранице"
msgid "Miscellaneous:"
msgstr "Разное:"
msgid " -c, --calendar <file> The calendar data file to use"
-msgstr ""
+msgstr " -c, --calendar <file> Выбор файла Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ нужного календарÑ"
msgid " -C, --confdir <dir> The configuration directory to use"
-msgstr ""
+msgstr " -C, --confdir <dir> Выбор рабочей директории Ð´Ð»Ñ Ð½Ð°Ñтроек"
msgid " --daemon Run notification daemon in the background"
-msgstr "--daemon ЗапуÑтить демон уведомлений в фоне"
+msgstr " --daemon ЗапуÑтить демон уведомлений в фоне"
msgid " -D, --datadir <dir> The data directory to use"
-msgstr ""
+msgstr " -D, --datadir <dir> Выбор рабочей директории Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…"
msgid " -g, --gc Run the garbage collector"
-msgstr ""
+msgstr " -g, --gc ЗапуÑтить Ñборщик муÑора"
msgid " -h, --help Show this help text"
-msgstr ""
+msgstr " -h, --help Показать Ñту Ñправку"
msgid " -i, --import <file> Import iCal data from file"
-msgstr ""
+msgstr " -i, --import <file> Импорт данных в формате iCalendar (*.ics)"
msgid " -q, --quiet Suppress import/export result message"
-msgstr ""
+msgstr " -q, --quiet Подавить вывод при импорте/ÑкÑпорте"
msgid " --read-only Do not save configuration or data files"
-msgstr "--read-only Ðе ÑохранÑÑ‚ÑŒ наÑтройки или файлы Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸"
+msgstr " --read-only Ðе ÑохранÑÑ‚ÑŒ наÑтройки или файлы Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸"
msgid " --status Display status of running instances"
msgstr ""
+" --status Показать информацию о запущенных ÑкземплÑрах "
+"программы"
msgid " -v, --version Show version information"
-msgstr ""
+msgstr " -v, --version Показать информацию о верÑии программы"
msgid ""
" -x, --export[<format>] Export to stdout in ical (default) or pcal format"
msgstr ""
+" -x, --export[<format>] ЭкÑпорт в iCalendar (по умолчанию) (*.ics) или "
+"Pcal (*.ps)"
msgid ""
"For more information, type '?' from within calcurse, or read the manpage."
@@ -161,7 +189,7 @@ msgstr ""
"обратитеÑÑŒ к man."
msgid "Submit feature requests and suggestions to <misc@calcurse.org>."
-msgstr "ÐŸÐ¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ваши идеи приÑылайте на <misc@calcurse.org>."
+msgstr "ÐŸÐ¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¸/или Ваши идеи приÑылайте на <misc@calcurse.org>."
msgid "Submit bug reports to <bugs@calcurse.org>."
msgstr "Обнаруженные ошибки приÑылайте на <bugs@calcurse.org>."
@@ -185,101 +213,101 @@ msgid "calcurse is running in background (pid %d)\n"
msgstr "calcurse запущен в фоновом режиме (pid: %d)\n"
msgid "calcurse is not running"
-msgstr ""
+msgstr "calcurse не запущен"
msgid "completed tasks:\n"
-msgstr "Выполненные задачи:\n"
+msgstr "Прошедшие мероприÑтиÑ:\n"
msgid "to do:\n"
msgstr "СпиÑок дел:\n"
msgid "next appointment:\n"
-msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°:\n"
+msgstr "Следующее мероприÑтие:\n"
#, c-format
msgid "invalid range: %s"
-msgstr "неверный диапазон: %s"
+msgstr "Ðеверный диапазон: %s."
#, c-format
msgid "invalid date: %s"
-msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: %s"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: %s."
#, c-format
msgid "invalid priority: %s"
-msgstr "неверный приоритет: %s"
+msgstr "Ðеверный приоритет: %s."
#, c-format
msgid "invalid export format: %s"
-msgstr "неверный формат ÑкÑпорта: %s"
+msgstr "Ðеверный формат ÑкÑпорта: %s."
msgid "invalid filter mask"
-msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка фильтра"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка фильтра."
msgid "cannot handle more than one regular expression"
-msgstr "невозможно иÑпользовать более одного рег. выражениÑ"
+msgstr "Ðевозможно иÑпользовать более одного рег. выражениÑ."
#, c-format
msgid "could not compile regular expression: %s"
-msgstr "невозможно Ñкомпилировать рег. выражение: %s"
+msgstr "Ðевозможно Ñкомпилировать рег. выражение: %s."
#, c-format
msgid "filter criterion already in use: %s"
-msgstr ""
+msgstr "Критерий уже иÑпользован: %s."
#, c-format
msgid "invalid date range: %s"
-msgstr "неверный диапазон дат: %s"
+msgstr "Ðеверный диапазон дат: %s."
#, c-format
msgid "calcurse is running (pid = %d)"
-msgstr ""
+msgstr "calcurse запущен (pid = %d)"
#, c-format
msgid "invalid input date format: %s"
-msgstr ""
+msgstr "Ðеверный формат ввода даты %s."
#, c-format
msgid "invalid output date format: %s"
-msgstr ""
+msgstr "Ðеверный формат вывода даты %s."
msgid "invalid argument combination"
-msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²."
msgid "cannot specify a range and an end date"
-msgstr "невозможно задать диапазон и конечную дату"
+msgstr "Ðевозможно задать диапазон и конечную дату."
msgid "end date cannot come before start date"
-msgstr ""
+msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° не может быть до даты начала."
msgid "Unable to find documentation."
-msgstr "Ðевозможно найти документацию"
+msgstr "Ðевозможно найти документацию."
msgid "Data were saved successfully"
-msgstr ""
+msgstr "Данные уÑпешно Ñохранены."
msgid "Data were saved/reloaded successfully"
-msgstr ""
+msgstr "Данные уÑпешно Ñохранены/обновлены."
msgid "Save cancelled"
-msgstr ""
+msgstr "Сохранение отменено."
msgid "Data were already saved"
-msgstr ""
+msgstr "Данные уже были Ñохранены."
msgid "Cannot open data file"
-msgstr ""
+msgstr "Ðевозможно открыть файл данных."
msgid "Data were reloaded successfully"
-msgstr ""
+msgstr "Данные уÑпешно обновлены."
msgid "Date were merged/reloaded successfully"
-msgstr ""
+msgstr "Данные уÑпешно Ñинхронизированы."
msgid "Reload cancelled"
-msgstr ""
+msgstr "Обновление отменено."
msgid "Data were already loaded"
-msgstr ""
+msgstr "Данные уже были загружены."
msgid "Export to (i)cal or (p)cal format?"
msgstr "Формат ÑкÑпорта (i)cal или (p)cal?"
@@ -288,51 +316,51 @@ msgid "[ip]"
msgstr "[ip]"
msgid "There are unsaved changes. Should they be saved?"
-msgstr ""
+msgstr "ИмеютÑÑ Ð½ÐµÑохранённые изменениÑ. Сохранить?"
msgid "Do you really want to quit?"
msgstr "Вы уверены, что хотите выйти?"
msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
-msgstr ""
+msgstr "Команды: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgid "Read-only mode - use w!"
-msgstr ""
+msgstr "Режим Ñ‡Ñ‚ÐµÐ½Ð¸Ñ - иÑпользуйте w!"
msgid "There are unsaved changes - use w or q!"
msgstr ""
+"ИмеютÑÑ Ð½ÐµÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ - иÑпользуйте w (запиÑÑŒ) или q! (выход без "
+"ÑохранениÑ)."
#, c-format
msgid "Help topic does not exist: %s"
-msgstr "Раздел Ñправки не ÑущеÑтвует: %s"
+msgstr "Раздел Ñправки не ÑущеÑтвует: %s."
-#, fuzzy
msgid "Select a repeating item in the appointments panel."
-msgstr "(Формат даты, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² панели задач)"
+msgstr "Выберете повторÑющуюÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ на панели МероприÑтий."
-#, fuzzy
msgid "Not a repeating item."
-msgstr "Повторить запиÑÑŒ"
+msgstr "Ðе повторÑющаÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ."
msgid "Last occurrence."
-msgstr ""
+msgstr "ПоÑледний пункт из поÑледовательноÑти."
msgid "First occurrence."
-msgstr ""
+msgstr "Первый пункт из поÑледовательноÑти."
#, c-format
msgid "No such command: %s"
-msgstr "Команда не обнаружено: %s"
+msgstr "Команда не обнаружена: %s."
msgid "unknown color"
-msgstr "неизвеÑтный цвет"
+msgstr "ÐеизвеÑтный цвет."
msgid "failed to open configuration file"
-msgstr "ошибка Ð¾Ñ‚Ñ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации"
+msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации."
#, c-format
msgid "invalid configuration directive: \"%s\""
-msgstr "invalid configuration directive: \"%s\""
+msgstr "Ðеверные параметры конфигурации: \"%s\""
msgid ""
"Pre-3.0.0 configuration file format detected, please upgrade running "
@@ -343,19 +371,19 @@ msgstr ""
#, c-format
msgid "unknown user option: \"%s\" (ignored)"
-msgstr ""
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ: \"%s\" (игнорируетÑÑ)"
#, c-format
msgid "invalid option format: \"%s\" (ignored)"
-msgstr ""
+msgstr "Ðеверный формат опции: \"%s\" (игнорируетÑÑ)"
#, c-format
msgid "unknown user option: \"%s\" (disabled)"
-msgstr ""
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ: \"%s\" (отключена)"
#, c-format
msgid "invalid option format: \"%s\" (disabled)"
-msgstr ""
+msgstr "Ðеверный формат опции: \"%s\" (отключена)"
msgid "layout configuration"
msgstr "ÐаÑтройки раÑположениÑ"
@@ -373,82 +401,77 @@ msgid "color theme"
msgstr "Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема"
msgid "(if set to YES, compact panels are used)"
-msgstr "(ЕÑли выбрано ДÐ/YES, будет иÑпользован компактный вид панелей)"
+msgstr "(да/нет) Компактное отображение"
msgid "Calendar"
msgstr "Календарь"
msgid "Appointments"
-msgstr "Задачи"
+msgstr "МероприÑтиÑ"
msgid "TODO"
-msgstr "Дела"
+msgstr "СпиÑок дел"
msgid "(specifies the panel that is selected by default)"
-msgstr "(Задаёт панель, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ активна по умолчанию)"
+msgstr "Определение панели выделенной по умолчанию"
msgid "monthly"
-msgstr ""
+msgstr "ЕжемеÑÑчно"
msgid "weekly"
-msgstr ""
+msgstr "Еженедельно"
msgid "(preferred calendar display)"
-msgstr ""
+msgstr "Предпочитаемый вид календарÑ"
msgid "show completed"
-msgstr ""
+msgstr "Показывать выполненные"
msgid "hide completed"
-msgstr ""
+msgstr "СпрÑтать выполненные"
msgid "(preferred todo display)"
-msgstr ""
+msgstr "Предпочитаемый вид ÑпиÑка дел"
msgid "(horizontal line above the day heading)"
msgstr ""
+"(да/нет) Отобразить разделительную линию между днÑми в панели календарÑ"
msgid "(empty line between events and appointments)"
-msgstr ""
+msgstr "(да/нет) Добавить раÑÑтоÑние между мероприÑтиÑми и вÑтречами"
msgid "(each day ends with an empty line)"
-msgstr ""
+msgstr "(да/нет) Окончить предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð½Ñ Ð¿ÑƒÑтой Ñтрокой"
msgid "(insert an empty line after each appointment)"
-msgstr ""
+msgstr "(да/нет) Добавить пуÑтую Ñтроку между мероприÑтиÑми"
msgid "(text for a day without events and appointments)"
-msgstr ""
+msgstr "Отображаемый текÑÑ‚ на поле Ñвободного днÑ"
msgid "(display more than one day in the appointments panel)"
-msgstr ""
+msgstr "(да/нет) Показывать неÑколько дней на панели мероприÑтий"
msgid "(if set to YES, automatic save is done when quitting)"
-msgstr "(yes/no) ÐвтоÑохранение при выходе из программы"
+msgstr "(да/нет) ÐвтоматичеÑкое Ñохранение при выходе из программы"
msgid "(run the garbage collector when quitting)"
-msgstr "(yes/no) запуÑтить Ñборщик муÑора при выходе"
+msgstr "(да/нет) ЗапуÑтить Ñборщик муÑора при выходе"
msgid "(if not null, automatically save data every 'periodic_save' minutes)"
-msgstr "(N/0) ÐвтоÑохранение каждые N минут. (Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ '0')"
+msgstr "ÐвтоматичеÑкое Ñохранение каждые n минут. (Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ '0')"
msgid "(if YES, system events are turned into appointments (or else deleted))"
-msgstr ""
+msgstr "(да/нет) Ð’Ñе ÑиÑтемные мероприÑÑ‚Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑŽÑ‚ÑÑ Ð² общие (или нет)"
msgid "(if set to YES, confirmation is required before quitting)"
-msgstr "(yes/no) Подтверждение выхода из программы"
+msgstr "(да/нет) Подтверждение выхода из программы"
msgid "(if set to YES, confirmation is required before deleting an event)"
-msgstr "(yes/no) Подтверждение ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñобытий"
-
-msgid "Monday"
-msgstr "Пн"
-
-msgid "Sunday"
-msgstr "Ð’Ñ"
+msgstr "(да/нет) Подтверждение ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñобытий"
msgid "(specifies the first day of week in the calendar view)"
-msgstr "(указание первого Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ в календаре)"
+msgstr "Указание первого Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸ в календаре"
msgid "(Format of the date to be displayed in non-interactive mode)"
msgstr "Формат даты отображаетÑÑ Ð² неинтерактивном режиме"
@@ -466,31 +489,40 @@ msgid "to the right"
msgstr "вправо"
msgid "(position of the heading in the appointments panel)"
-msgstr ""
+msgstr "РаÑположение шапки на панели мероприÑтий"
msgid "(Format of the date displayed in the appointments panel)"
-msgstr "(Формат даты, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² панели задач)"
+msgstr "Формат даты, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÑ‚ÑÑ Ð² панели задач"
+
+msgid "(Format of the time displayed in the appointments panel)"
+msgstr "Формат времени, которое отображаетÑÑ Ð² панели задач"
msgid "Enter a text string (an empty string for the default text)"
msgstr ""
+"Добавить текÑтовую Ñтроку (иначе будет отображатьÑÑ Ñ‚ÐµÐºÑÑ‚ по умолчанию)"
msgid "Enter the date format (see 'man 3 strftime' for possible formats) "
msgstr "Задайте формат даты (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов)"
+msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
+msgstr "Задайте формат времени (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов) "
+
msgid "Enter the date format: "
msgstr "Задайте формат даты: "
msgid "Enter the delay, in minutes, between automatic saves (0 to disable) "
-msgstr "Введите задержку между автоÑохранениÑми (в минутах) или 0 Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ "
+msgstr ""
+"Введите задержку между автоматичеÑкими ÑохранениÑми (в минутах) или 0 Ð´Ð»Ñ "
+"отмены "
msgid "general options"
msgstr "ОÑновные наÑтройки"
msgid "Undefined option!"
-msgstr "ÐÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка!"
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð½Ð°Ñтройка!"
-msgid "undefined"
-msgstr "неопределено"
+msgid "UNDEFINED"
+msgstr "ОтÑутÑтвует инициализациÑ!"
msgid "keys configuration"
msgstr "ÐаÑтройка клавиш"
@@ -500,32 +532,33 @@ msgstr "Ðажмите клавишу, чтобы привÑзать её к:"
#, c-format
msgid "The key '%s' is already used for %s. Choose another one."
-msgstr "Ключ '%s' уже иÑпользуетÑÑ Ð´Ð»Ñ %s. Выберите другой ключ."
+msgstr "Клавиша '%s' уже иÑпользуетÑÑ Ð´Ð»Ñ %s. Выберите другую клавишу."
-msgid "Some actions do not have any associated key bindings!"
-msgstr "Ðекоторые дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ привÑзаны к клавишам!"
+msgid "Some actions are left undefined!"
+msgstr "Ðекоторые дейÑÑ‚Ð²Ð¸Ñ Ð½Ðµ определены!"
msgid ""
"Sorry, colors are not supported by your terminal\n"
"(Press [ENTER] to continue)"
-msgstr "Цвета не поддерживаютÑÑ Ð²Ð°ÑˆÐ¸Ð¼ терминалом (Ðажмите [ENTER])"
+msgstr ""
+"Цвета не поддерживаютÑÑ Ð²Ð°ÑˆÐ¸Ð¼ терминалом\n"
+"(Ðажмите [ENTER], чтобы продолжить)"
#, c-format
msgid "Could not save %s."
-msgstr ""
+msgstr "Ðевоможно Ñохранить %s"
msgid "unknown item type"
-msgstr "неизвеÑтный тип запиÑи"
+msgstr "ÐеизвеÑтный тип запиÑи"
-#, fuzzy
msgid "Note:"
-msgstr "Изм.Заметку"
+msgstr "Заметка:"
msgid "Event:"
msgstr "Событие:"
msgid "Appointment:"
-msgstr "Задача:"
+msgstr "МероприÑтие:"
#, c-format
msgid "Could not stop daemon properly: %s\n"
@@ -533,7 +566,7 @@ msgstr "Ðевозможно оÑтановить демон должным об
#, c-format
msgid "terminated at %s with signal %d\n"
-msgstr "завершено %s Ñ Ñигналом %d\n"
+msgstr "Завершено %s Ñ Ñигналом %d\n"
#, c-format
msgid "Could not remove daemon lock file: %s\n"
@@ -549,13 +582,13 @@ msgstr "Ðевозможно прервать Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего тер
#, c-format
msgid "Could not change working directory: %s\n"
-msgstr "Ðевозможно выбрать рабочую директориюг: %s\n"
+msgstr "Ðевозможно выбрать рабочую директорию: %s\n"
msgid "Cannot daemonize, aborting\n"
-msgstr "Ðевозможно демонизировать процеÑÑ. Завершение\n"
+msgstr "Ðевозможно демонизировать процеÑÑ. Завершение...\n"
msgid "Could not set lock file\n"
-msgstr "Ðевозможно выбрать заблокированный файл\n"
+msgstr "Ðе удалоÑÑŒ Ñоздать файл блокировки\n"
#, c-format
msgid "Could not access \"%s\": %s\n"
@@ -563,195 +596,188 @@ msgstr "Ðет доÑтупа \"%s\": %s\n"
#, c-format
msgid "started at %s\n"
-msgstr "запуÑк в %s\n"
+msgstr "ЗапуÑк в %s\n"
msgid "error loading next appointment\n"
-msgstr "ошибка при загрузке Ñледующей задачи\n"
+msgstr "Ошибка при загрузке Ñледующего мероприÑтиÑ\n"
#, c-format
msgid "launching notification at %s for: \"%s\"\n"
-msgstr "запуÑк ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ %s длÑ: \"%s\"\n"
+msgstr "ЗапуÑк ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ %s длÑ: \"%s\"\n"
msgid "error while sending notification\n"
-msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ уведомлениÑ\n"
+msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ уведомлениÑ\n"
#, c-format
msgid "sleeping at %s for %d second\n"
msgid_plural "sleeping at %s for %d seconds\n"
-msgstr[0] "ÑпÑщий режим %s на %d Ñек.\n"
+msgstr[0] "СпÑщий режим %s на %d Ñек.\n"
msgstr[1] "ÑпÑщий режим %s на %d Ñек.\n"
msgstr[2] "ÑпÑщий режим %s на %d Ñек.\n"
-msgstr[3] "ÑпÑщий режим %s на %d Ñек.\n"
+msgstr[3] "СпÑщий режим %s на %d Ñек.\n"
#, c-format
msgid "awakened at %s\n"
-msgstr "пробуждение %s\n"
+msgstr "Пробуждение %s\n"
#, c-format
msgid "Could not stop calcurse daemon: %s\n"
msgstr "Ðевозможно оÑтановить демон calcurse: %s\n"
-#, fuzzy
msgid "illegal date in event"
-msgstr "ошибка даты в Ñобытии"
+msgstr "Ошибка в дате мероприÑтиÑ."
-#, fuzzy
msgid "date error in event\n"
-msgstr "ошибка даты в Ñобытии"
+msgstr "Ошибка в дате мероприÑтиÑ.\n"
msgid "Internal error: line too long"
msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока"
msgid "out of memory"
-msgstr "нехватка памÑти"
+msgstr "Ðе хватает памÑти"
msgid "unknown ical type"
-msgstr "неизвеÑтный тип ical"
+msgstr "ÐеизвеÑтный тип файла iCalendar"
+
+msgid "(empty)"
+msgstr "(пуÑто)"
+
+msgid "ical_store_event: out of memory"
+msgstr "ical_store_event: не хватает памÑти"
msgid "need DTSTART to determine event type."
-msgstr ""
+msgstr "Ðеобходим DTSTART Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° мероприÑтиÑ."
msgid "malformed recurrence line."
-msgstr ""
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð² Ñтрочке поÑледовательноÑÑ‚ÑŒ."
msgid "frequency not set in rrule."
-msgstr ""
+msgstr "Ðе задана продолжительноÑÑ‚ÑŒ повторений Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
msgid "frequency absent in rrule."
msgstr ""
+"Ðе ÑоответÑтвует Ñтандарту продолжительноÑÑ‚ÑŒ повторений Ð´Ð»Ñ "
+"поÑледовательноÑти."
-#, fuzzy
msgid "rrule frequency not supported."
-msgstr "Ñ€ÐµÐºÑƒÑ€Ñ€ÐµÐ½Ñ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота не найдена"
+msgstr "Ð”Ð»Ñ Ð¿Ð¾ÑледовательноÑти Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ‡Ð°Ñтота повторений не поддерживаетÑÑ."
-#, fuzzy
msgid "invalid interval."
-msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка фильтра"
+msgstr "Ðекорректный интервал."
msgid "either until or count."
-msgstr ""
+msgstr "Выберете дату или продолжительноÑÑ‚ÑŒ."
+
+msgid "missing until value."
+msgstr "ОтÑутÑтвует Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
-#, fuzzy
msgid "invalid until format."
-msgstr "неверный формат ÑкÑпорта: %s"
+msgstr "Ðекорректный формат Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
-#, fuzzy
msgid "invalid count value."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°."
+msgstr "Ðекорректное значение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти."
msgid "invalid bymonth list."
-msgstr ""
+msgstr "Ðекорректно задан ÑпиÑок по меÑÑцам."
-#, fuzzy
msgid "invalid bymonthday list."
-msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: %s"
+msgstr "Ðекорректно задан ÑпиÑок по днÑм в меÑÑце."
-#, fuzzy
msgid "invalid byday list."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°."
+msgstr "Ðекорректно задан ÑпиÑок по днÑм."
msgid "invalid exception date value type."
-msgstr ""
+msgstr "Ðекорректный тип Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹ иÑключениÑ."
msgid "malformed exceptions line."
-msgstr ""
+msgstr "Ðекорректно Ñформированное в Ñтроке иÑключение."
-#, fuzzy
msgid "invalid exception."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота."
+msgstr "Ðекорректное иÑключение."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s line."
-msgstr "Ðеверное начальное времÑ."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ %s Ñтрока."
-#, fuzzy, c-format
+#, c-format
msgid "malformed %s."
-msgstr "ОпиÑание: "
+msgstr "Ðекорректно Ñформированный %s."
-#, fuzzy
msgid "malformed summary line."
-msgstr "Ðеверное начальное времÑ."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð² Ñтроке ÐºÑ€Ð°Ñ‚ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ "
msgid "malformed summary."
-msgstr ""
-
-msgid "line break in summary."
-msgstr ""
-
-msgid "could not retrieve item summary."
-msgstr "невозможно воÑÑтановить Ñуммарные запиÑи."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÑ€Ð°Ñ‚ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ."
-msgid "item start date is not defined."
-msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ðµ определено."
+msgid "item start date not defined."
+msgstr "Дата начала мероприÑÑ‚Ð¸Ñ Ð½Ðµ определена."
-msgid "multi-day event changed to one-day event"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "Location: %s"
-msgstr " allocated in: %s\n"
-
-#, c-format
-msgid "Comment: %s"
-msgstr ""
-
-#, c-format
-msgid "rrule does not match start day (%s)."
-msgstr ""
-
-msgid "item could not be identified."
-msgstr "значение не может быть раÑпознано."
-
-#, fuzzy
msgid "malformed start time line."
-msgstr "Ðеверное начальное времÑ."
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°."
-#, fuzzy
msgid "invalid or malformed event start time."
-msgstr "невозможно воÑÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑобытиÑ."
+msgstr "ÐедопуÑтимое или некорректно Ñформированное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° мероприÑтиÑ."
-#, fuzzy
-msgid "either end or duration."
-msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
-
-#, fuzzy
msgid "invalid end time value type."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° или времÑ."
+msgstr "Ðекорректный тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ окончаниÑ."
msgid "malformed end time line."
-msgstr ""
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ."
-#, fuzzy
msgid "malformed event end time."
-msgstr "невозможно воÑÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ ÑобытиÑ."
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸ÑтиÑ. "
msgid "end must be later than start."
-msgstr ""
+msgstr "Окончание должно быть поÑле начала."
+
+msgid "either end or duration."
+msgstr "Либо окончание, либо продолжительноÑÑ‚ÑŒ."
-#, fuzzy
msgid "malformed duration line."
-msgstr "опиÑание повреждено."
+msgstr "Ðе правильный формат Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти."
-#, fuzzy
msgid "invalid duration."
-msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ."
+
+msgid "exception date, but no recurrence rule."
+msgstr "Дата-иÑключение, но не задано правило повтора."
+
+msgid "multi-day event changed to one-day event"
+msgstr "Многодневное мероприÑтие изменено на однодневное."
+
+#, c-format
+msgid "Location: %s"
+msgstr "РаÑположение: %s"
+
+#, c-format
+msgid "Comment: %s"
+msgstr "Комментарий: %s"
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° поÑледовательноÑти отноÑительно даты начала (%s)."
+
+msgid "item could not be identified."
+msgstr "ЗапиÑÑŒ не может быть идентифицирована."
-#, fuzzy
msgid "only one description allowed."
-msgstr "опиÑание повреждено."
+msgstr "ДопуÑтимо лишь одно опиÑание. "
msgid "only one location allowed."
-msgstr ""
+msgstr "ДопуÑтимо лишь одно раÑположение."
msgid "The ical file seems to be malformed. The end of item was not found."
-msgstr "Файл ical Ñкорее вÑего повреждён. Ðе найдено окончание запиÑи."
+msgstr "Файл iСalendar Ñкорее-вÑего повреждён. Ðе найдено окончание запиÑи."
+
+msgid "could not retrieve item summary."
+msgstr "Ðевозможно получить краткое опиÑание запиÑи."
msgid "item priority is invalid (must be between 0 and 9)."
-msgstr "приоритет запиÑи в неверном формате (должно быть чиÑло между 0 и 9)"
+msgstr "Приоритет запиÑи в неверном формате (должно быть чиÑло от 0 и до 9)."
msgid "Warning: ical header malformed or wrong version number. Aborting..."
msgstr ""
-"Внимание: заголовок ical повреждён или неправильный номер верÑии. "
+"Внимание: заголовок iCalendar повреждён или его верÑÐ¸Ñ Ð½Ðµ поддерживаетÑÑ. "
"Завершение..."
msgid "Choose the file used to export calcurse data:"
@@ -761,156 +787,162 @@ msgid "The file cannot be accessed, please enter another file name."
msgstr "Файл не может быть добавлен, попробуйте другое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
msgid "Press [ENTER] to continue."
-msgstr "Ðажмите [ENTER]."
+msgstr "Ðажмите [Enter], чтобы продолжить..."
#, c-format
msgid "Failed to open \"%s\", - %s\n"
-msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ \"%s\", - %s\n"
+msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ \"%s\", - %s.\n"
msgid "Failed to build message\n"
-msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑообщениÑ\n"
+msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑообщениÑ.\n"
#, c-format
msgid "Failed to print message \"%s\"\n"
-msgstr "Ошибка вывода ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"%s\"\n"
+msgstr "Ошибка вывода ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"%s\".\n"
#, c-format
msgid "Failed to close \"%s\" - %s\n"
-msgstr "Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ \"%s\" - %s\n"
+msgstr "Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ \"%s\" - %s.\n"
#, c-format
msgid "%s does not exist"
-msgstr "%s не ÑущеÑтвует"
+msgstr "%s не ÑущеÑтвует."
msgid "Data files have changed and will be overwritten:"
-msgstr ""
+msgstr "Файлы данных были изменены и будут перезапиÑаны:"
msgid "(c)ontinue"
-msgstr ""
+msgstr "(c)продолжить"
msgid "(m)erge"
msgstr "(m)ÑлиÑние"
msgid "c(a)ncel"
-msgstr ""
+msgstr "(a)отмена"
msgid "[cma]"
-msgstr ""
+msgstr "[cma]"
msgid "failed to open appointment file"
-msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° задач"
+msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸ÑтиÑми."
msgid "syntax error in the item date"
-msgstr "опечатка в запиÑе даты"
+msgstr "Опечатка даты в запиÑи"
msgid "no event nor appointment found"
-msgstr "ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸ задачи не найдены"
+msgstr "МероприÑÑ‚Ð¸Ñ Ð¾Ñ‚ÑутÑтвуют."
msgid "syntax error in item time or duration"
-msgstr "опечатка в запиÑи даты или продолжительноÑти"
+msgstr "Опечатка во времени или в продолжительноÑти запиÑи."
msgid "syntax error in item identifier"
-msgstr "опечатка в запиÑи опознавателÑ"
+msgstr "Опечатка в идентификаторе запиÑи."
msgid "wrong format in the appointment or event"
-msgstr "неверный формат ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸Ð»Ð¸ задачи"
+msgstr "Ðеверный формат мероприÑтиÑ."
msgid "syntax error in item repetition"
-msgstr "опечатка в запиÑи повторениÑ"
+msgstr "Опечатка в запиÑи повторениÑ."
-#, fuzzy
msgid "syntax error in until date"
-msgstr "опечатка в запиÑи даты"
+msgstr "Опечатка в дате Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
msgid "until date error"
-msgstr ""
+msgstr "Ошибка в дате Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
msgid "BYMONTHDAY illegal with WEEKLY"
-msgstr ""
+msgstr "ÐеÑовмеÑтимые параметры."
msgid "missing end of recurrence"
-msgstr ""
+msgstr "ОтÑутÑтвует дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
-#, fuzzy
msgid "syntax error in item state"
-msgstr "опечатка в запиÑи даты"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в данных запиÑи."
msgid "failed to open todo file"
-msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ todo-файла"
+msgstr "Ðе удалоÑÑŒ открыть файл Ñо ÑпиÑком дел."
msgid "Screen data have changed and will be lost:"
-msgstr ""
+msgstr "Обнаружены неÑохранённые изменениÑ, которые могут быть утрачены:"
msgid "failed to open key file"
-msgstr "ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° ключа"
-
-msgid ""
-"\n"
-"Too many errors while reading configuration file!\n"
-"Please backup your keys file, remove it from directory, and launch calcurse "
-"again.\n"
-msgstr ""
-"\n"
-"Обнаружены ошибки при чтении файла наÑтроек!\n"
-"Сделайте копию keys-файла, удалите его из каталога и запуÑтите calcurse "
-"Ñнова.\n"
+msgstr "Ðе удалоÑÑŒ открыть файл Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими клавишами."
msgid "Could not read key label"
-msgstr "Ðевозможно раÑпознать клавишу"
+msgstr "Ðекорректный формат Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющей клавиши."
-msgid "Key label not recognized"
-msgstr "Клавиша не опознана"
+#, c-format
+msgid "Key label not recognized: \"%s\""
+msgstr "ÐераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÑÑŽÑ‰Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°: \"%s\""
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸: \"%s\""
+msgid "No keys assigned to \"%s\"."
+msgstr "Ðе назначено управлÑющей клавиши Ð´Ð»Ñ \"%s\"."
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" определено множеÑтво времён!"
+msgid "Keyname not recognized: \"%s\""
+msgstr "УправлÑÑŽÑ‰Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° не раÑпознана: \"%s\"."
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr "\"%s\" приÑвоена дважды: \"%s\"."
+
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
+"Команда \"%s\" невыполнима, управ. клавиша \"%s\" назначена Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ "
+"команды."
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Обнаружены ошибки при чтении keys-файла, отмена..."
+msgid "Errors in the keys file."
+msgstr "Ошибки в файле Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими клавишами."
+
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+"Удалите некорректную Ñтроку(и) из файла Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими клавишами. "
+"Завершение..."
+
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Ð”Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… дейÑтвий не назначены клавиши!"
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "ФÐТÐЛЬÐÐЯ ОШИБКÐ: невозможно Ñоздать %s: %s\n"
+msgstr "Ðварийное завершение программы: не удалоÑÑŒ Ñоздать %s: %s\n"
msgid "The data were successfully exported"
-msgstr "Данные уÑпешно ÑкÑпортированы"
+msgstr "Данные уÑпешно ÑкÑпортированы."
msgid "Press [ENTER] to continue"
-msgstr "Ðажмите [ENTER]"
+msgstr "Ðажмите [Enter], чтобы продолжить"
msgid "unknown export type"
-msgstr "неизвеÑтный тип ÑкÑпорта"
+msgstr "ÐеизвеÑтный тип ÑкÑпорта."
msgid "wrong export mode"
-msgstr "ошибочный режим ÑкÑпорта"
+msgstr "Ошибочный режим ÑкÑпорта."
msgid "Enter the file name to import data from:"
-msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°: "
+msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°:"
#, c-format
msgid "Import process report: %04d lines read"
-msgstr "Отчёт процеÑÑа импорта:%04d lines read"
+msgstr "Отчёт процеÑÑа импорта: %04d Ñтрок прочитано"
msgid "unknown import type"
-msgstr "неизвеÑтный тип импорта"
+msgstr "ÐеизвеÑтный тип импорта"
msgid "FATAL ERROR: the input file cannot be accessed, Aborting..."
-msgstr "ФÐТÐЛЬÐÐЯ ОШИБКÐ: входÑщий файл не может быть добавлен. Завершение..."
+msgstr ""
+"Ðварийное завершение программы: входÑщий файл не может быть добавлен. "
+"Завершение..."
msgid "FATAL ERROR: wrong import mode"
-msgstr "ФÐТÐЛЬÐÐЯ ОШИБКÐ: неправильный режим импорта"
+msgstr "Ðварийное завершение программы: неправильный режим импорта."
#, c-format
msgid "%d app"
msgid_plural "%d apps"
-msgstr[0] "%d app"
+msgstr[0] "%d мероприÑтий"
msgstr[1] "%d apps"
msgstr[2] "%d apps"
msgstr[3] "%d apps"
@@ -918,7 +950,7 @@ msgstr[3] "%d apps"
#, c-format
msgid "%d event"
msgid_plural "%d events"
-msgstr[0] "%d Ñобытие"
+msgstr[0] "%d Ñобытий"
msgstr[1] "%d ÑобытиÑ"
msgstr[2] "%d ÑобытиÑ"
msgstr[3] "%d ÑобытиÑ"
@@ -926,17 +958,17 @@ msgstr[3] "%d ÑобытиÑ"
#, c-format
msgid "%d todo"
msgid_plural "%d todos"
-msgstr[0] "%d дело"
+msgstr[0] "%d дел"
msgstr[1] "%d дела"
msgstr[2] "%d дела"
msgstr[3] "%d дела"
#, c-format
msgid "%d skipped"
-msgstr "%d пропущен"
+msgstr "%d пропущено"
msgid "Some items could not be imported."
-msgstr ""
+msgstr "Ðекоторые запиÑи не прошли импорт. "
msgid "Warning: could not open temporary log file, Aborting..."
msgstr "Внимание: невозможно открыть временный log-файл. Завершение..."
@@ -949,22 +981,24 @@ msgstr "Ðет log-файла Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ!"
#, c-format
msgid "See %s for details."
-msgstr ""
+msgstr "Детали в %s."
msgid "Display log file?"
-msgstr ""
+msgstr "Отобразить лог файл?"
#, c-format
msgid "Warning: could not erase temporary log file %s, Aborting..."
msgstr "Внимание: невозможно очиÑтить временный log-файл %s. Завершение..."
msgid "Invalid delay"
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ°"
+msgstr "Ðекорректный интервал Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ."
msgid ""
"Periodic save cancelled. Data files have changed. Save and merge "
"interactively"
msgstr ""
+"ÐвтоÑохранение не выполнено. Данные изменены. Сохр./объедините данные "
+"вручную."
#, c-format
msgid ""
@@ -1008,7 +1042,10 @@ msgid "Paste"
msgstr "Ð’Ñтавить"
msgid "Chg Win"
-msgstr "Панель"
+msgstr "След.Панель"
+
+msgid "Prev Win"
+msgstr "Пред.Панель"
msgid "Import"
msgstr "Импорт"
@@ -1020,7 +1057,7 @@ msgid "Go to"
msgstr "Переход"
msgid "OtherCmd"
-msgstr "..."
+msgstr ". . ."
msgid "Config"
msgstr "ÐаÑтройки"
@@ -1029,7 +1066,7 @@ msgid "Redraw"
msgstr "Обновить"
msgid "Add Appt"
-msgstr "Доб.Задачу"
+msgstr "Доб.Меропр."
msgid "Add Todo"
msgstr "Доб.Дело"
@@ -1098,10 +1135,10 @@ msgid "Edit Itm"
msgstr "Изм.ЗапиÑÑŒ"
msgid "View"
-msgstr "Смотреть"
+msgstr "ПроÑмотреть"
msgid "Pipe"
-msgstr "Программный канал (pipe)"
+msgstr "Передать ->"
msgid "Flag Itm"
msgstr "Флаг"
@@ -1133,16 +1170,21 @@ msgstr ""
"#\n"
"# Файл наÑтройки быÑтрых клавиш Calcurse\n"
"#\n"
-"# Ð’ Ñтом файле определены быÑтрые клавиши, которые иÑпользуютÑÑ Ð² Calcurse.\n"
+"# Ð’ Ñтом файле определены управлÑющие клавиши, которые иÑпользуютÑÑ Ð² "
+"Calcurse.\n"
"# Calcurse Ñоздал их автоматичеÑки и редактируютÑÑ Ð¾Ð½Ð¸ в меню наÑтроек в "
"программе.\n"
"# ÐапрÑмую редактировать быÑтрые клавиши нельзÑ.\n"
msgid "FATAL ERROR: could not create default keys file."
-msgstr "FATAL ERROR: could not create default keys file."
+msgstr ""
+"Ðварийное завершение программы: не удалоÑÑŒ Ñоздать файл Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими "
+"клавишами."
msgid "FATAL ERROR: key value out of bounds"
-msgstr "FATAL ERROR: key value out of bounds"
+msgstr ""
+"Ðварийное завершение программы: значение Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющей клавиши не "
+"корректно. "
msgid "General"
msgstr "ОÑновные"
@@ -1166,34 +1208,37 @@ msgid "Unknown"
msgstr "ÐезвеÑтный(аÑ)"
msgid "Cancel the ongoing action."
-msgstr "Отмена поÑтоÑнного дейÑтвиÑ."
+msgstr "Прервать выполнÑемое дейÑтвие."
msgid "Select the highlighted item."
msgstr "Выбрать подÑвеченную запиÑÑŒ."
msgid "Print general information about calcurse's authors, license, etc."
-msgstr "ПроÑмотреть оÑновную информацию об авторах, лицензии и Ñ‚.п."
+msgstr "ПроÑмотреть оÑновную информацию об авторах, лицензии и прочем."
msgid "Display hints whenever some help screens are available."
msgstr "Показать Ñправку, еÑли Ñ‚Ð°ÐºÐ¾Ð²Ð°Ñ Ð¸Ð¼ÐµÐµÑ‚ÑÑ."
msgid "Exit from the current menu, or quit calcurse."
-msgstr "Выйти из текущего меню или из calcurse"
+msgstr "Выйти из текущего меню, или из calcurse."
msgid "Save calcurse data."
-msgstr "Сохр. данные calcurse"
+msgstr "Сохр. данные calcurse."
msgid "Reload appointments and todo items."
-msgstr "Обновить задачу и ÑпиÑок дел."
+msgstr "Обновить запиÑи мероприÑтий и ÑпиÑка дел."
msgid "Copy the item that is currently selected."
-msgstr "Копировать выделенную запиÑÑŒ (пункт?)"
+msgstr "Копировать выделенную запиÑÑŒ."
msgid "Paste an item at the current position."
-msgstr "Ð’Ñтавить запиÑÑŒ в текущую позицию"
+msgstr "Ð’Ñтавить запиÑÑŒ в текущую позицию."
msgid "Select next panel in calcurse main screen."
-msgstr "Выбрать Ñлед. панель на главном Ñкране calcurse"
+msgstr "Выбрать Ñлед. панель на главном Ñкране calcurse."
+
+msgid "Select previous panel in calcurse main screen."
+msgstr "Выбрать пред. панель на главном Ñкране calcurse."
msgid "Import data from an external file."
msgstr "Импортированть данные Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ файла."
@@ -1202,19 +1247,19 @@ msgid "Export data to a new file format."
msgstr "ЭкÑпортировать данные в файл."
msgid "Select the day to go to."
-msgstr "Выбрать день Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° на него."
+msgstr "Выбрать день Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° к нему."
msgid "Show next possible actions inside status bar."
-msgstr "Отобразить в полоÑе ÑтатуÑа ещё одни возможные дейÑтвиÑ. "
+msgstr "Отобразить в полоÑе ÑтатуÑа ещё одни возможные дейÑтвиÑ."
msgid "Enter the configuration menu."
msgstr "Войти в меню наÑтроек."
msgid "Redraw calcurse's screen."
-msgstr "Обновить Ñкран calcurse"
+msgstr "Обновить Ñкран calcurse."
msgid "Add an appointment, whichever panel is currently selected."
-msgstr "Добавить Задачу. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
+msgstr "Добавить МероприÑтие. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
msgid "Add a todo item, whichever panel is currently selected."
msgstr "Добавить Дело. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
@@ -1257,7 +1302,7 @@ msgid "Go to today, whichever panel is selected."
msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð°. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
msgid "Enter command mode."
-msgstr "Введите командный режим."
+msgstr "Введите в командном режиме."
msgid "Move to the right."
msgstr "Вправо"
@@ -1297,15 +1342,14 @@ msgid "Repeat an item"
msgstr "Повторить запиÑÑŒ"
msgid "Pipe the currently selected item to an external program."
-msgstr ""
-"Открыть программный канал (pipe) выбранной запиÑи Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ программой."
+msgstr "Передать выбранный Ñлемент на обработку внешней программе."
msgid "Attach (or edit if one exists) a note to the currently selected item"
msgstr ""
-"ПривÑзать (или задать, еÑли не ÑущеÑтвует) заметку Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ запиÑи"
+"Добавить (или редактировать, еÑли ÑущеÑтвует) заметку Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ запиÑи"
msgid "View the note attached to the currently selected item."
-msgstr "ПроÑмотр вложенной запиÑки."
+msgstr "ПроÑмотреть заметку, прикреплённую к выбранному Ñлементу."
msgid "Raise a task priority inside the todo panel."
msgstr "ПовыÑить приоритет дела внутри панели дел."
@@ -1314,492 +1358,484 @@ msgid "Lower a task priority inside the todo panel."
msgstr "Понизить приоритет дела внутри ÑпиÑка дел."
msgid "FATAL ERROR: null file pointer."
-msgstr "FATAL ERROR: null file pointer."
+msgstr ""
+"Ðварийное завершение программы: указатель указывает на некорректные данные."
#, c-format
-msgid "When adding default key for \"%s\", \"%s\" was already assigned!"
-msgstr "При назначении клав. \"%s\", \"%s\" уже была назначена!"
+msgid "Default key(s) assigned to %d action%s."
+msgstr "По умолчанию иÑпользуетÑÑ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°(и) %d Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %s."
msgid "xmalloc: zero size"
-msgstr "xmalloc: zero size"
+msgstr "xmalloc: попытка выделить памÑÑ‚ÑŒ нулевого размера"
msgid "xmalloc: out of memory"
-msgstr "xmalloc: out of memory"
+msgstr "xmalloc: не хватает памÑти"
msgid "xcalloc: zero size"
-msgstr "xcalloc: zero size"
+msgstr "xcalloc: попытка выделить памÑÑ‚ÑŒ нулевого размера"
msgid "xcalloc: overflow"
-msgstr "xcalloc: overflow"
+msgstr "xcalloc: переполнение"
msgid "xcalloc: out of memory"
-msgstr "xcalloc: out of memory"
+msgstr "xcalloc: не хватает памÑти"
msgid "xrealloc: zero size"
-msgstr "xrealloc: zero size"
+msgstr "xrealloc: попытка выделить памÑÑ‚ÑŒ нулевого размера"
msgid "xrealloc: overflow"
-msgstr "xrealloc: overflow"
+msgstr "xrealloc: переполнение"
msgid "xrealloc: out of memory"
-msgstr "xrealloc: out of memory"
+msgstr "xrealloc: не хватает памÑти"
msgid "could not allocate memory to store block info"
-msgstr "could not allocate memory to store block info"
+msgstr "Ðе удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о блоке"
msgid "Block not found"
-msgstr "Block not found"
+msgstr "Блок не обнаружен"
#, c-format
msgid "overflow at %s"
-msgstr "overflow at %s"
+msgstr "Переполнение в %s"
#, c-format
msgid "dbg_free: null pointer at %s"
-msgstr "dbg_free: null pointer at %s"
+msgstr "dbg_free: нулевой указатель в %s"
#, c-format
msgid "block seems already freed at %s"
-msgstr "block seems already freed at %s"
+msgstr "Блок памÑти уже был выÑвобожден в %s"
#, c-format
msgid "corrupt block header at %s"
-msgstr "corrupt block header at %s"
+msgstr "Повреждённый заголовок блока в %s"
#, c-format
msgid "corrupt block end at %s, (end = %u, should be %d)"
-msgstr "corrupt block end at %s, (end = %u, should be %d)"
+msgstr "Повреждённый конец блока в %s, (окончание = %u, ожидалоÑÑŒ %d)"
msgid "---==== MEMORY BLOCK ====----------------\n"
-msgstr "---==== MEMORY BLOCK ====----------------\n"
+msgstr "---==== БЛОК ПÐМЯТИ ====-----------------\n"
#, c-format
msgid " id: %u\n"
-msgstr " id: %u\n"
+msgstr " Идентификатор: %u\n"
#, c-format
msgid " size: %u\n"
-msgstr " size: %u\n"
+msgstr " Размер: %u\n"
#, c-format
msgid " allocated in: %s\n"
-msgstr " allocated in: %s\n"
+msgstr " Выделено в: %s\n"
msgid "-----------------------------------------\n"
msgstr "-----------------------------------------\n"
msgid "+------------------------------+\n"
-msgstr "+------------------------------+\n"
+msgstr "+----------------------------------------+\n"
msgid "| calcurse memory usage report |\n"
-msgstr "| calcurse memory usage report |\n"
+msgstr "| отчёт об иÑпользовании памÑти calcurse |\n"
#, c-format
msgid " number of calls: %u\n"
-msgstr " number of calls: %u\n"
+msgstr " КоличеÑтво вызовов: %u\n"
#, c-format
msgid " allocated blocks: %u\n"
-msgstr " allocated blocks: %u\n"
+msgstr " Выделенные блоки Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %u\n"
#, c-format
msgid " unfreed blocks: %u\n"
-msgstr " unfreed blocks: %u\n"
+msgstr " Ðе выÑбождённые блоки: %u\n"
#, c-format
msgid "Warning: could not open %s, Aborting..."
msgstr "Внимание: невозможно открыть %s, Завершение..."
-msgid "error while launching command: could not fork"
-msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды: невозможно разделитьÑÑ (fork)"
-
-msgid "error while launching command"
-msgstr "ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды"
-
msgid "(if set to YES, notify-bar will be displayed)"
-msgstr "(ЕÑли выбрано yes, будет выводитÑÑ Ð¾ÐºÐ½Ð¾ уведомлениÑ)"
+msgstr "(да/нет) Выводить окно уведомлениÑ"
msgid "(Format of the date to be displayed inside notify-bar)"
-msgstr "(Формат даты выводитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ окна уведомлениÑ)"
+msgstr "Формат даты внутри окна уведомлениÑ"
msgid "(Format of the time to be displayed inside notify-bar)"
-msgstr "(Формат времени выводитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ окна уведомлениÑ)"
+msgstr "Формат времени внутри окна уведомлениÑ"
msgid ""
"(Warn user if an appointment is within next 'notify-bar_warning' seconds)"
-msgstr "(Предупреждать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾ Ñобытии за 'notify-bar_warning' Ñекунд)"
+msgstr "Предупреждать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾ мероприÑтии за n Ñекунд"
msgid "(Command used to notify user of an upcoming appointment)"
-msgstr "(Команда уведомлÑет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾ грÑдущем Ñобытии)"
+msgstr "Команда уведомлÑет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾ грÑдущем Ñобытии"
msgid "(Notify all appointments instead of flagged ones only)"
-msgstr ""
-"(Извещать обо вÑех задачах, вмеÑто тех, которые помечены Ð´Ð»Ñ Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ)"
+msgstr "Извещать обо вÑех задачах, вмеÑто тех, которые помечены Ð´Ð»Ñ Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ"
msgid "(Run in background to get notifications after exiting)"
-msgstr "(ЗапуÑтить в фоновом режиме, Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти получать уведомлениÑ)"
+msgstr "(да/нет) ЗапуÑтить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² фоновом режиме"
msgid "(Log activity when running in background)"
-msgstr "(Лог активен во Ð²Ñ€ÐµÐ¼Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ режима)"
-
-msgid "Enter the time format (see 'man 3 strftime' for possible formats) "
-msgstr "Задайте формат времени (Ñм. 'man 3 strftime' Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ñ… форматов) "
+msgstr "(да/нет) ВеÑти журналирование во Ð²Ñ€ÐµÐ¼Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ режима"
msgid "Enter the number of seconds (0 not to be warned before an appointment)"
-msgstr "Введите количеÑтво Ñекунд (0 - отмена Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð¾ ÑобытиÑ)"
+msgstr "Введите количеÑтво Ñекунд (0 - отмена Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð¾ мероприÑтиÑ)"
msgid "Enter the notification command "
msgstr "Введите команду ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ "
msgid "notification options"
-msgstr "наÑтройки уведомлениÑ"
+msgstr "ÐаÑтройки уведомлениÑ"
msgid "incoherent repetition type"
-msgstr "беÑÑвÑзный тип повторениÑ"
+msgstr "БеÑÑвÑзный тип повторениÑ."
msgid "System event"
-msgstr ""
+msgstr "СиÑтемное Ñобытие."
msgid "unknown character"
-msgstr "неизвеÑтный Ñимвол"
+msgstr "ÐеизвеÑтный Ñимвол."
#, c-format
msgid "recurrence error: not on start day (%s)"
-msgstr ""
+msgstr "Ошибка при повторении: не Ñовпадение Ñ Ð´Ð½Ñ‘Ð¼ начала (%s). "
-#, fuzzy
msgid "illegel date in event"
-msgstr "ошибка даты в Ñобытии"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ ÑобытиÑ"
msgid "date error in event"
-msgstr "ошибка даты в Ñобытии"
+msgstr "Ошибка при запиÑи даты ÑобытиÑ"
msgid "month day is zero"
-msgstr ""
+msgstr "Ошибка при чиÑленном обозначении Ð´Ð½Ñ Ð¼ÐµÑÑца."
-#, fuzzy
msgid "no daily frequency check"
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота."
+msgstr "ОтÑутÑтвует контроль за повторениÑми."
msgid "illegal BYDAY value"
-msgstr ""
+msgstr "ÐедопуÑтимое значение Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð½Ñ"
msgid "event not found"
-msgstr "Ñобытие не найдено"
+msgstr "Событий не найдено"
msgid "appointment not found"
-msgstr "задача не найдена"
+msgstr "МероприÑтий не найдено"
-#, fuzzy
msgid "syntax error in bymonthday"
-msgstr "опечатка в запиÑи даты"
+msgstr "Ошибка при запиÑи Ð´Ð½Ñ Ð¼ÐµÑÑца."
-#, fuzzy
msgid "syntax error in bywday"
-msgstr "опечатка в запиÑи даты"
+msgstr "Ошибка при запиÑи Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸."
-#, fuzzy
msgid "syntax error in bymonth"
-msgstr "опечатка в запиÑи даты"
+msgstr "Ошибка при запиÑи меÑÑца."
msgid "illegal bymonth value"
-msgstr ""
+msgstr "ÐедопуÑтимое значение Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑца."
msgid "syntax error in item date"
-msgstr "опечатка в запиÑи даты"
+msgstr "Ошибка при запиÑи даты."
msgid "date error in item exception"
-msgstr "ошибка даты в значении"
+msgstr "Ошибка в дате при обозначении иÑключений."
#, c-format
msgid "Error setting signal #%d : %s\n"
-msgstr "Сигнал ошибки наÑтройки #%d : %s\n"
+msgstr "Ошибка уÑтановки Ñигнала #%d : %s\n"
msgid "no note attached"
-msgstr "запиÑка отÑутÑтвует"
+msgstr "Заметка отÑутÑтвует"
msgid "no such todo"
-msgstr "дело не найдено"
+msgstr "Дел не найдено"
msgid "ERROR setting first day of week"
msgstr "ОШИБКРнаÑтройки первого Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸"
msgid "The day you entered is not valid"
-msgstr "День введён вами Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹"
+msgstr "Введённые данные о желаемом дне не ÑвлÑÑŽÑ‚ÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼Ð¸."
#, c-format
msgid "Enter the day to go to [ENTER for today] : %s"
-msgstr "Переход на N-ый день [ENTER Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ днÑ] : %s"
+msgstr "Переход [Enter Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ днÑ] на n-ый день: %s"
#, c-format
msgid "The move failed (%d/%d/%d)."
-msgstr ""
+msgstr "Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° (%d/%d/%d)."
#, c-format
msgid "Enter start date [%s] and/or time ([hh:mm] or [hhmm]):"
-msgstr ""
+msgstr "Введите дату [%s] и/или Ð²Ñ€ÐµÐ¼Ñ ([ЧЧ:ММ] или [ЧЧММ]) начала:"
msgid "Press [Enter] to continue"
-msgstr "Ðажмите [Enter]"
+msgstr "Ðажмите [Enter] Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ..."
msgid "Invalid date or time."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° или времÑ."
+msgstr "Ðекорректно задано дата или времÑ."
msgid "Invalid time: start time must come before end time!"
-msgstr "Ðеверное времÑ: Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° должно идти до времени конца"
+msgstr ""
+"Ðекорректно задано времÑ: начальное Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ идти до времени окончаниÑ!"
#, c-format
msgid "Repetition must begin on start day (%s)."
-msgstr ""
+msgstr "Повторение должно начинатьÑÑ Ñ Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾ указанного Ð´Ð½Ñ (%s)."
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
-"Введите конечную дату (и/или времÑ) или продолжительноÑÑ‚ÑŒ ('?' Ñм. форматы):"
+"Введите дату Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ (и/или времÑ) или продолжительноÑÑ‚ÑŒ ('?' Ñм. Ñправку):"
#, c-format
msgid "Date: %s, year or month may be omitted."
-msgstr ""
+msgstr "Дата: %s, год или меÑÑц можно пропуÑтить."
msgid "Time: hh:mm (hh: or :mm) or hhmm. Duration: +mm, +hh:mm, +??d??h??m."
msgstr ""
-"ВремÑ: hh:mm (hh: или :mm) или hhmm. ПродолжительноÑÑ‚ÑŒ: +mm, +hh:mm, +??d??"
-"h??m."
+"ВремÑ: ЧЧ:ММ (ЧЧ: или :ММ) или ЧЧММ. ПродолжительноÑÑ‚ÑŒ: +ММ, +ЧЧ:ММ, +??д??"
+"ч??м"
msgid "Invalid time or duration."
-msgstr "Ðеверное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
+msgstr "Ðекорректно задано Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð»Ð¸ продолжительноÑÑ‚ÑŒ."
msgid "Invalid date: end time must come after start time."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: конечное Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ идти поÑле начального времени."
+msgstr "Ðекорректно задана дата: окончание должно идти поÑле начала."
msgid "Enter the new item description:"
-msgstr "ОпиÑание: "
+msgstr "ОпиÑание:"
msgid "Exception days:"
-msgstr ""
+msgstr "ИÑключаемые дни:"
msgid "Invalid date format - try again:."
-msgstr ""
+msgstr "Ðекорректный формат даты - попробуйте Ñнова."
msgid "Limit repetition to listed days."
-msgstr ""
+msgstr "Ð’ краткой запиÑи обозначить по каким именно днÑм ограничить."
msgid "Expand repetition to listed days."
-msgstr ""
+msgstr "Ð’ краткой запиÑи обозначить по каким именно днÑм повторÑÑ‚ÑŒ."
msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
msgstr ""
+"ЧиÑленно обозначить по каким именно днÑм в меÑÑце повторÑÑ‚ÑŒ: 1 2 .. 22 .."
msgid "Note: limit to monthdays, if any."
-msgstr ""
+msgstr "Примечание: Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ конкретным днÑм меÑÑца (опционально)."
msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
msgstr ""
+"ЧиÑленно обозначить по каким именно днÑм в году повторÑÑ‚ÑŒ: 1 2 .. 322 .."
msgid "Note: expand to listed months, if any; limit to monthdays, if any."
msgstr ""
+"Примечание: раÑширить по меÑÑцам и/или ограничить по днÑм (опционально)."
msgid "Limit repetition to listed months."
-msgstr ""
+msgstr "ЧиÑленно обозначить по каким именно меÑÑцам ограничить."
msgid "Expand repetition to listed months."
-msgstr ""
+msgstr "ЧиÑленно обозначить по каким именно меÑÑцам повторÑÑ‚ÑŒ."
msgid "Limit repetition to listed days of month."
-msgstr ""
+msgstr "ЧиÑленно обозначить по каким именно днÑм в меÑÑце ограничить."
msgid "Expand repetition to listed days of month."
-msgstr ""
+msgstr "ЧиÑленно обозначить по каким именно днÑм в меÑÑце повторÑÑ‚ÑŒ."
#, c-format
msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
-msgstr ""
+msgstr "Задайте днÑми %s .. %s, разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм. Ñправку):"
#, c-format
msgid ""
"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
msgstr ""
+"Задайте днÑми [n]%s .. [n]%s (-5<=n<=5), разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм. Ñправку):"
#, c-format
msgid ""
"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
"help:"
msgstr ""
+"Задайте днÑми [n]%s .. [n]%s (-53<=n<=53), разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм. "
+"Ñправку):"
msgid "Months 1|..|12, space-separated list, '?' for help:"
msgstr ""
+"Задайте меÑÑцы 1 2 .. n (1<=n<=12), разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм. Ñправку):"
msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
msgstr ""
+"Задайте дни меÑÑца 1 2 .. 31 или -1 .. -31, разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм."
+"Ñправку):"
-#, fuzzy
msgid "Invalid format - try again."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° или времÑ."
+msgstr "Указан некорректный формат. ПожалуйÑта, попробуйте ещё раз."
-#, fuzzy
msgid "Press any key to continue."
msgstr "Ðажмите любую клавишу..."
msgid "Base period:"
-msgstr ""
+msgstr "Базовый период:"
-#, fuzzy
msgid "day"
-msgstr "СегоднÑ"
+msgstr "(d)день"
msgid "week"
-msgstr ""
+msgstr "(w)неделÑ"
-#, fuzzy
msgid "month"
-msgstr "(m)ежемеÑÑчно"
+msgstr "(m)меÑÑц"
msgid "year"
-msgstr ""
+msgstr "(y)год"
msgid "[dwmy]"
-msgstr "[днмг]"
+msgstr "[dwmy]"
msgid "Frequency:"
-msgstr ""
+msgstr "ЧаÑтота повторов:"
msgid "Invalid frequency."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота."
+msgstr "Указано некорректное значение Ð´Ð»Ñ Ñ‡Ð°Ñтоты повторов."
-#, fuzzy
msgid "Until date, increment or repeat count ('?' for input formats):"
-msgstr "Введите конечную дату или продолжительноÑÑ‚ÑŒ ('?' Ñм. форматы):"
+msgstr ""
+"Задайте дату Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ð¹, период. или кол-во повтор. ('?' Ñм. "
+"Ñправку)"
#, c-format
msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
+"Дата: %s (год, меÑÑц могут быть опущены или впиÑать \"0\" - беÑконечно)."
msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
+"ПовторÑÑ‚ÑŒ: +?? (дней) или: +??н??д (недель). Кол-во повторений: #?? (чиÑлом)"
-#, fuzzy, c-format
+#, c-format
msgid "Invalid date: until date must come after start date (%s)."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° должны идти поÑле начальной даты (%s)."
+msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° Ñледовать за датой начала (%s)."
msgid "Invalid date."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°."
+msgstr "Указано некорректное значение даты."
msgid "Repeat count is too big."
-msgstr ""
+msgstr "Элементов в поÑледовательноÑти мероприÑтий Ñлишком много."
#, c-format
msgid "Repetition must begin on start day (%s); any change discarded."
-msgstr ""
+msgstr "ПоÑледовательноÑÑ‚ÑŒ должна идти от начала (%s); ÑÐ±Ñ€Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹."
msgid "Description"
-msgstr "ОпиÑание"
+msgstr "опиÑание"
msgid "Repetition"
-msgstr "Повторение"
+msgstr "поÑлед."
msgid "Edit: "
-msgstr "Редактировать:"
+msgstr "Изм.:"
msgid "Start time"
-msgstr "Ðачальное времÑ"
+msgstr "начало"
msgid "End time"
-msgstr "Конечное времÑ"
+msgstr "окончание"
msgid "Move"
-msgstr "Вперёд"
+msgstr "Ñдвиг"
msgid "Pipe item to external command:"
-msgstr "Программный канал (pipe) во внешнюю команду:"
+msgstr "Передать Ñлемент во внешнюю команду:"
msgid "Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event:"
msgstr ""
-"Ðачало ([чч:мм] или [ччмм]). ОÑтавьте пуÑтым еÑли Ñобытие займёт веÑÑŒ день: "
+"Ðачало ([ЧЧ:ММ] или [ЧЧММ]). ОÑтавьте пуÑтым еÑли Ñобытие займёт веÑÑŒ день:"
msgid ""
"Enter end time as date (and/or time) or duration ('?' for input formats):"
msgstr ""
+"Введите дату Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ (и/или времÑ) или продолжительноÑÑ‚ÑŒ ('?' Ñм. Ñправку):"
msgid "Enter description:"
-msgstr "ОпиÑание: "
+msgstr "Введите опиÑание:"
#, c-format
msgid "Date: %s (and/or time), year or month may be omitted."
-msgstr ""
+msgstr "Дата: %s (и/или времÑ), год и меÑÑц можно опуÑтить."
msgid "Invalid start time."
-msgstr "Ðеверное начальное времÑ."
+msgstr "Указан некорректный формат Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ начала мероприÑтиÑ."
-#, fuzzy
msgid ""
"This item is recurrent and has a note attached to it. Delete (s)elected "
"occurrence, (a)ll occurrences, or just its (n)ote?"
-msgstr "Эта запиÑÑŒ Ñодержит заметку. Удалить (i)запиÑÑŒ или только (n)заметку ?"
+msgstr ""
+"ПоÑледов. мероприÑтий Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¾Ð¹. УдалÑем (s)одно, (a)вÑÑ‘ или (n)заметку?"
msgid "[san]"
-msgstr ""
+msgstr "[san]"
-#, fuzzy
msgid ""
"This item has a note attached to it. Delete (s)elected occurrence or just "
"its (n)ote?"
-msgstr "Эта запиÑÑŒ Ñодержит заметку. Удалить (i)запиÑÑŒ или только (n)заметку ?"
+msgstr "МероприÑтие Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¾Ð¹. УдалÑем вÑÑ‘ (s)выбранное или (n)заметку?"
msgid "[sn]"
-msgstr ""
+msgstr "[sn]"
-#, fuzzy
msgid ""
"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
-msgstr ""
-"Эта запиÑÑŒ имеет повторениÑ. Удалить (a)вÑе подобные запиÑи или только "
-"(o)Ñту ?"
+msgstr "ПоÑледовательноÑÑ‚ÑŒ мероприÑтий. УдалÑем (s)одно или (a)вÑÑ‘?"
msgid "[sa]"
-msgstr ""
+msgstr "[sa]"
msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
-msgstr ""
+msgstr "Подтвердите удаление. Удалить (s)выбранное?"
msgid "[s]"
-msgstr ""
+msgstr "[s]"
-#, fuzzy
msgid "Already repeated."
-msgstr "Эта запиÑÑŒ уже повторÑетÑÑ."
+msgstr "Уже повторÑетÑÑ."
msgid "A (s)imple or (a)dvanced repetition?"
-msgstr ""
+msgstr "ТребуетÑÑ (s)проÑтое или (a)замыÑловатое повторение?"
msgid "Enter the new TODO item:"
msgstr "Дело: "
msgid "Enter the TODO priority [0 (none), 1 (highest) - 9 (lowest)]:"
-msgstr "Введите приоритет Дела [0 (без приоритета), 1 (выÑокий) - 9 (низкий)]:"
+msgstr ""
+"Введите приоритет Ð´Ð»Ñ Ð”ÐµÐ»Ð° [0 (без приоритета), 1 (выÑокий), … , 9 (низкий)]:"
msgid "Do you really want to delete this task?"
msgstr "Удалить Ñту запиÑÑŒ?"
msgid "This item has a note attached to it. Delete (t)odo or just its (n)ote?"
-msgstr "К делу прикреплена запиÑка. Удалить (t)дело или только (n)запиÑку ?"
+msgstr "К делу прикреплена заметка. Удалить вÑÑ‘ (t)дело или (n)заметку?"
msgid "[tn]"
msgstr "[tn]"
msgid "Enter the new TODO description:"
-msgstr "ОпиÑание дела: "
+msgstr "ОпиÑание Дела:"
msgid "TODO:"
-msgstr "Дело:"
+msgstr "Дела:"
#, c-format
msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Ðевозможно удалить занÑтый файл: %s\n"
+msgstr "Ðевозможно удалить файл блокировки Ð´Ð»Ñ calcurse: %s\n"
msgid "/!\\ INTERNAL ERROR /!\\"
-msgstr "/!\\ INTERNAL ERROR /!\\"
+msgstr "/!\\ ÐЕПОÐЯТÐÐЯ ОШИБКР/!\\"
msgid "Please report the following bug:"
-msgstr "Сообщите об ошибке:"
+msgstr "ПожалуйÑта, Ñообщите об ошибке:"
msgid "[yn]"
msgstr "[yn]"
@@ -1808,60 +1844,62 @@ msgid "Press any key to continue..."
msgstr "Ðажмите любую клавишу..."
msgid "failure in mktime"
-msgstr "ошибка в mktime"
+msgstr "Сбой в mktime"
msgid "error in mktime"
-msgstr "ошибка в mktime"
+msgstr "Ошибка в mktime"
msgid "yes"
-msgstr "yes"
+msgstr "Да"
msgid "no"
-msgstr "no"
+msgstr "Ðет"
msgid "option not defined"
-msgstr "параметр не уÑтановлен"
+msgstr "ÐžÐ¿Ñ†Ð¸Ñ Ð½Ðµ определена"
#, c-format
msgid "temporary file \"%s\" could not be created"
-msgstr "временный файл \"%s\" не может быть Ñоздан"
+msgstr "Временный файл \"%s\" не может быть Ñоздан"
#, c-format
msgid "Error when closing file at %s"
-msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %s"
+msgstr "Ошибка в процеÑÑе Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %s"
msgid "No note file found\n"
msgstr "Файл Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¾Ð¹ не найден\n"
msgid "mm/dd/yyyy"
-msgstr "мм/дд/гггг"
+msgstr "ММ/ДД/ГГГГ"
msgid "dd/mm/yyyy"
-msgstr "дд/мм/гггг"
+msgstr "ДД/ММ/ГГГГ"
msgid "yyyy/mm/dd"
-msgstr "гггг/мм/дд"
+msgstr "ГГГГ/ММ/ДД"
msgid "yyyy-mm-dd"
-msgstr "гггг-мм-дд"
+msgstr "ГГГГ-ММ-ДД"
msgid "unknown panel"
-msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ"
+msgstr "ÐераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ"
msgid "Usage: calcurse-upgrade [-h|-v|--config <file>]"
-msgstr "ИÑпользовать: calcurse-upgrade [-h|-v|--config <file>]"
+msgstr "ИÑпользуйте: calcurse-upgrade [ -h | -v | --config <file> ]"
-#, fuzzy
msgid ""
"\n"
-"Copyright (c) 2004-2020 calcurse Development Team.\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
"This is free software; see the source for copying conditions.\n"
msgstr ""
-"Это Ñвободное ПО. Ð”Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑƒÑловиÑми ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐŸÐž, ознакомьтеÑÑŒ "
-"Ñ Ð¸Ñходным кодом."
+"\n"
+"Copyright (c) 2004-2023 calcurse Development Team.\n"
+"Это Ñвободное программное обеÑпечение.\n"
+"Ð”Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÑƒÑловиÑми ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого программного обеÑпечениÑ,\n"
+"ознакомьтеÑÑŒ Ñ Ð¸Ñходным кодом.\n"
msgid "unrecognized option:"
-msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ:"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ:"
msgid "Configuration file not found:"
msgstr "Файл конфигурации не найден:"
@@ -1873,7 +1911,7 @@ msgid "Create temporary backup of the configuration file..."
msgstr "Создать временную архивную копию файла конфигурации..."
msgid "Old backup file found:"
-msgstr "Предыдущий файл архивной копии найден:"
+msgstr "ÐÐ°Ð¹Ð´ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° данных:"
msgid ""
"\n"
@@ -1881,14 +1919,14 @@ msgid ""
"configuration from this backup and then remove the backup file."
msgstr ""
"\n"
-"ЕÑли Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ðµ завершилаÑÑŒ, воÑÑтановите вашу конфигурацию "
-"из Ñтого архивного файла, затем его удалив."
+"ЕÑли Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ðµ завершилаÑÑŒ,\n"
+"воÑÑтановите вашу конфигурацию из Ñтого архивного файла, затем его удалив."
msgid "done"
-msgstr "завершено"
+msgstr "Готово"
msgid "Old temporary file found:"
-msgstr "Обнаружен предыдущий временный файл данных:"
+msgstr "Ðайденный предыдущий временный файл:"
msgid ""
"\n"
@@ -1897,94 +1935,11 @@ msgid ""
"start over with a backup of your old configuration file."
msgstr ""
"\n"
-"ЕÑли Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ðµ завершилаÑÑŒ, удалите файл и попробуйте Ñнова, "
-"иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð°Ñ€Ñ…Ð¸Ð²Ð½Ñ‹Ð¹ файл Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ конфигурацией."
+"ЕÑли Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ðµ завершилаÑÑŒ, удалите файл и\n"
+"попробуйте Ñнова, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð°Ñ€Ñ…Ð¸Ð²Ð½Ñ‹Ð¹ файл Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ конфигурацией."
msgid "Upgrade configuration directives..."
msgstr "Обновление конфигурации..."
msgid "Remove temporary backup..."
-msgstr "Удалить временный архивный файл..."
-
-#~ msgid ""
-#~ "(if set to YES, messages about loaded and saved data will be displayed)"
-#~ msgstr "(yes/no) Отображение ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ загрузке и Ñохранении данных"
-
-#~ msgid "date error in the event\n"
-#~ msgstr "ошибка даты в Ñобытии\n"
-
-#~ msgid "recurrence frequency not recognized."
-#~ msgstr "Ñ€ÐµÐºÑƒÑ€Ñ€ÐµÐ½Ñ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота не раÑпознана"
-
-#, fuzzy
-#~ msgid "empty description."
-#~ msgstr "ОпиÑание: "
-
-#~ msgid "item has a negative duration."
-#~ msgstr "значение имеет отрицательную продолжительноÑÑ‚ÑŒ."
-
-#~ msgid "item duration malformed."
-#~ msgstr "значение продолжительноÑти повреждено."
-
-#~ msgid "Welcome to Calcurse. Missing data files were created."
-#~ msgstr ""
-#~ "Добро пожаловать в Calcurse. ОтÑутÑтвующие файлы данных будут Ñозданы."
-
-#~ msgid "Data files found. Data will be loaded now."
-#~ msgstr "Данные найдены и будут загружены"
-
-#~ msgid "unknown repetition type"
-#~ msgstr "неизвеÑтный тип повторениÑ"
-
-#~ msgid "Enter the new repetition type:"
-#~ msgstr "Введите тип повторениÑ:"
-
-#~ msgid "(d)aily"
-#~ msgstr "(d)ежедневно"
-
-#~ msgid "(w)eekly"
-#~ msgstr "(w)еженедельно"
-
-#~ msgid "(y)early"
-#~ msgstr "(y)ежегодно"
-
-#, c-format
-#~ msgid "(currently using %s)"
-#~ msgstr "(иÑпользуетÑÑ %s)"
-
-#~ msgid "Enter the repetition frequency:"
-#~ msgstr "Введите чаÑтоту повторениÑ:"
-
-#~ msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
-#~ msgstr ""
-#~ "ПродолжительноÑÑ‚ÑŒ в днÑÑ…: +dd. ПродолжительноÑÑ‚ÑŒ в неделÑÑ… и днÑÑ…: +??w??d"
-
-#~ msgid "Do you really want to delete this item?"
-#~ msgstr "Удалить?"
-
-#~ msgid "[ao]"
-#~ msgstr "[ао]"
-
-#~ msgid "[in]"
-#~ msgstr "[в]"
-
-#~ msgid "Enter the repetition type:"
-#~ msgstr "Ðазначить тип повторениÑ:"
-
-#~ msgid "wrong item type"
-#~ msgstr "неправильный тип запиÑи"
-
-#~ msgid "recurrence rule malformed."
-#~ msgstr "рекуррентные правила повреждены."
-
-#~ msgid "recurrence exception dates malformed."
-#~ msgstr "рекурентные ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚ повреждены."
-
-#~ msgid "could not get entire item description."
-#~ msgstr "невозможно получить опиÑание полноÑтью."
-
-#~ msgid "event start time malformed."
-#~ msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾ оформлено"
-
-#~ msgid "event end time malformed."
-#~ msgstr "Ñобытие и Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾ оформлены"
+msgstr "Удаление временной копии архива данных..."
diff --git a/scripts/calcurse-upgrade.sh.in b/scripts/calcurse-upgrade.sh.in
index c9c9c78..b6a7438 100644
--- a/scripts/calcurse-upgrade.sh.in
+++ b/scripts/calcurse-upgrade.sh.in
@@ -15,7 +15,7 @@ if [ "$#" -gt 0 ]; then
elif [ "$1" = "-v" -o "$1" = "--version" ]; then
echo "calcurse-upgrade @PACKAGE_VERSION@"
echo "$(gettext "
-Copyright (c) 2004-2020 calcurse Development Team.
+Copyright (c) 2004-2023 calcurse Development Team.
This is free software; see the source for copying conditions.
")"
else
diff --git a/src/apoint.c b/src/apoint.c
index 4cb77f6..e138e5e 100644
--- a/src/apoint.c
+++ b/src/apoint.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,8 @@
#include "calcurse.h"
#include "sha1.h"
+#define APPT_TIME_LENGTH 25
+
llist_ts_t alist_p;
void apoint_free(struct apoint *apt)
@@ -134,16 +136,14 @@ void apoint_sec2str(struct apoint *o, time_t day, char *start, char *end)
} else {
t = o->start;
localtime_r(&t, &lt);
- snprintf(start, HRMIN_SIZE, "%02u:%02u", lt.tm_hour,
- lt.tm_min);
+ strftime(start, APPT_TIME_LENGTH, conf.timefmt, &lt);
}
if (o->start + o->dur > day + DAYLEN(day)) {
strncpy(end, "..:..", 6);
} else {
t = o->start + o->dur;
localtime_r(&t, &lt);
- snprintf(end, HRMIN_SIZE, "%02u:%02u", lt.tm_hour,
- lt.tm_min);
+ strftime(end, APPT_TIME_LENGTH, conf.timefmt, &lt);
}
}
diff --git a/src/args.c b/src/args.c
index abcc70a..57cbe63 100644
--- a/src/args.c
+++ b/src/args.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -112,7 +112,7 @@ static void version_arg(void)
{
printf(_("calcurse %s -- text-based organizer\n"), VERSION);
putchar('\n');
- printf("%s\n", _("Copyright (c) 2004-2020 calcurse Development Team."));
+ printf("%s\n", _("Copyright (c) 2004-2023 calcurse Development Team."));
printf("%s\n", _("This is free software; see the source for copying conditions."));
}
@@ -428,7 +428,7 @@ int parse_args(int argc, char **argv)
const char *cfile = NULL, *confdir = NULL;
char *ifile = NULL;
- int non_interactive = 1;
+ int ret, non_interactive = 1;
int ch, cpid, type;
regex_t reg;
char buf[BUFSIZ];
@@ -963,10 +963,12 @@ int parse_args(int argc, char **argv)
fmt_apt = fmt_rapt = fmt_ev = fmt_rev = NULL;
fmt_todo = NULL;
}
- io_import_data(IO_IMPORT_ICAL, ifile, fmt_ev, fmt_rev, fmt_apt,
- fmt_rapt, fmt_todo);
+ ret = io_import_data(IO_IMPORT_ICAL, ifile, fmt_ev, fmt_rev,
+ fmt_apt, fmt_rapt, fmt_todo);
io_save_apts(path_apts);
io_save_todo(path_todo);
+ if (!ret)
+ exit_calcurse(EXIT_FAILURE);
} else if (export) {
io_check_file(path_apts);
io_check_file(path_todo);
diff --git a/src/calcurse.c b/src/calcurse.c
index 3083f86..c89d1dd 100644
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,37 +41,6 @@
#define HANDLE_KEY(key, fn) case key: fn(); break;
int count, reg;
-/*
- * Store events and appointments for a range of days in the day vector -
- * beginning with the selected day - and load them into the APP listbox. If no
- * day-change occurs, reset the selected APP item and with it the selected day,
- * thereby storing and loading the same range of days.
- */
-static void do_storage(int day_changed)
-{
- int pre_sel;
- /*
- * Save the selected item before rebuilding the day vector -
- * unless a preselection is already set.
- */
- if (!(pre_sel = day_check_sel_data()))
- day_set_sel_data(ui_day_get_sel());
-
- if (!day_changed)
- ui_day_sel_reset();
-
- /* The day_items vector. */
- day_store_items(get_slctd_day(), 1, day_get_days());
- /* The APP listbox. */
- ui_day_load_items();
-
- if (day_changed && !pre_sel)
- ui_day_sel_reset();
- else
- ui_day_find_sel();
-
- day_set_sel_data(&empty_day);
-}
static inline void key_generic_change_view(void)
{
@@ -80,6 +49,13 @@ static inline void key_generic_change_view(void)
wins_update(FLAG_ALL);
}
+static inline void key_generic_prev_view(void)
+{
+ wins_reset_status_page();
+ wins_slctd_prev();
+ wins_update(FLAG_ALL);
+}
+
static inline void key_generic_other_cmd(void)
{
wins_other_status_page();
@@ -91,7 +67,7 @@ static inline void key_generic_goto(void)
wins_erase_status_bar();
ui_calendar_set_current_date();
ui_calendar_change_day(conf.input_datefmt);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -100,7 +76,7 @@ static inline void key_generic_goto_today(void)
wins_erase_status_bar();
ui_calendar_set_current_date();
ui_calendar_goto_today();
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -118,14 +94,14 @@ static inline void key_generic_config_menu(void)
wins_erase_status_bar();
wins_reset_status_page();
custom_config_main();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_ALL);
}
static inline void key_generic_add_appt(void)
{
ui_day_item_add();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
@@ -141,7 +117,7 @@ static inline void key_add_item(void)
case APP:
case CAL:
ui_day_item_add();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
break;
case TOD:
@@ -157,7 +133,7 @@ static inline void key_edit_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_edit();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
} else if (wins_slctd() == TOD) {
ui_todo_edit();
@@ -169,7 +145,7 @@ static inline void key_del_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_delete(reg);
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
} else if (wins_slctd() == TOD) {
ui_todo_delete();
@@ -187,7 +163,7 @@ static inline void key_generic_paste(void)
{
if (wins_slctd() == APP) {
ui_day_item_paste(reg);
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -196,7 +172,7 @@ static inline void key_repeat_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_item_repeat();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_CAL | FLAG_APP | FLAG_STA);
}
}
@@ -205,7 +181,7 @@ static inline void key_flag_item(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_flag();
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_APP);
} else if (wins_slctd() == TOD) {
ui_todo_flag();
@@ -244,7 +220,7 @@ static inline void key_edit_note(void)
{
if (wins_slctd() == APP && !event_dummy(ui_day_get_sel())) {
ui_day_edit_note();
- do_storage(0);
+ day_do_storage(0);
} else if (wins_slctd() == TOD) {
ui_todo_edit_note();
}
@@ -284,7 +260,7 @@ static inline void key_generic_save(void)
if (ret == IO_SAVE_RELOAD) {
ui_todo_load_items();
ui_todo_sel_reset();
- do_storage(0);
+ day_do_storage(0);
notify_check_next_app(1);
ui_calendar_monthly_view_cache_set_invalid();
}
@@ -319,7 +295,7 @@ static inline void key_generic_reload(void)
ret == IO_RELOAD_MERGE) {
ui_todo_load_items();
ui_todo_sel_reset();
- do_storage(0);
+ day_do_storage(0);
notify_check_next_app(1);
ui_calendar_monthly_view_cache_set_invalid();
}
@@ -349,7 +325,7 @@ static inline void key_generic_import(void)
wins_erase_status_bar();
io_import_data(IO_IMPORT_ICAL, NULL, NULL, NULL, NULL, NULL, NULL);
ui_calendar_monthly_view_cache_set_invalid();
- do_storage(0);
+ day_do_storage(0);
ui_todo_load_items();
wins_update(FLAG_ALL);
}
@@ -374,14 +350,14 @@ static inline void key_generic_export()
break;
}
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_ALL);
}
static inline void key_generic_prev_day(void)
{
ui_calendar_move(DAY_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -394,7 +370,7 @@ static inline void key_move_left(void)
static inline void key_generic_next_day(void)
{
ui_calendar_move(DAY_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -407,7 +383,7 @@ static inline void key_move_right(void)
static inline void key_generic_prev_week(void)
{
ui_calendar_move(WEEK_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -418,7 +394,7 @@ static inline void key_move_up(void)
} else if (wins_slctd() == APP) {
if (!ui_day_sel_move(-1)) {
ui_calendar_move(DAY_PREV, 1);
- do_storage(1);
+ day_do_storage(1);
ui_day_sel_dayend();
}
wins_update(FLAG_APP | FLAG_CAL);
@@ -431,7 +407,7 @@ static inline void key_move_up(void)
static inline void key_generic_next_week(void)
{
ui_calendar_move(WEEK_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -442,7 +418,7 @@ static inline void key_move_down(void)
} else if (wins_slctd() == APP) {
if (!ui_day_sel_move(1)) {
ui_calendar_move(DAY_PREV, day_get_days() - 2);
- do_storage(1);
+ day_do_storage(1);
ui_day_sel_daybegin(day_get_days() - 1);
}
wins_update(FLAG_APP | FLAG_CAL);
@@ -455,28 +431,28 @@ static inline void key_move_down(void)
static inline void key_generic_prev_month(void)
{
ui_calendar_move(MONTH_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_next_month(void)
{
ui_calendar_move(MONTH_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_prev_year(void)
{
ui_calendar_move(YEAR_PREV, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
static inline void key_generic_next_year(void)
{
ui_calendar_move(YEAR_NEXT, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
@@ -484,7 +460,7 @@ static inline void key_start_of_week(void)
{
if (wins_slctd() == CAL) {
ui_calendar_move(WEEK_START, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -493,7 +469,7 @@ static inline void key_end_of_week(void)
{
if (wins_slctd() == CAL) {
ui_calendar_move(WEEK_END, count);
- do_storage(1);
+ day_do_storage(1);
wins_update(FLAG_CAL | FLAG_APP);
}
}
@@ -623,8 +599,12 @@ static inline void key_generic_cmd(void)
warnbox(error_msg);
goto cleanup;
}
- day = date2sec(*ui_calendar_get_slctd_day(), 0, 0);
item = ui_day_get_sel();
+ /*
+ * The selected day need not be the (item) start day
+ * for multi-day occurrences.
+ */
+ day = DAY(item->start);
if (item->type == RECUR_EVNT) {
rev = item->item.rev;
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,
@@ -646,7 +626,7 @@ static inline void key_generic_cmd(void)
item->order = next;
ui_calendar_set_slctd_day(sec2date(next));
day_set_sel_data(item);
- do_storage(1);
+ day_do_storage(1);
valid = 1;
}
@@ -668,7 +648,7 @@ static inline void key_generic_cmd(void)
* The selected day need not be the (item) start day
* for multi-day occurrences.
*/
- day = update_time_in_date(item->start, 0, 0);
+ day = DAY(item->start);
if (item->type == RECUR_EVNT) {
rev = item->item.rev;
more = recur_prev_occurrence(rev->day, -1, rev->rpt,
@@ -691,7 +671,7 @@ static inline void key_generic_cmd(void)
item->order = prev;
ui_calendar_set_slctd_day(sec2date(prev));
day_set_sel_data(item);
- do_storage(1);
+ day_do_storage(1);
valid = 1;
}
@@ -801,7 +781,7 @@ int main(int argc, char **argv)
*/
wins_wrefresh(win[KEY].p);
ui_calendar_monthly_view_cache_set_invalid();
- do_storage(1);
+ day_do_storage(1);
ui_todo_load_items();
ui_todo_sel_reset();
wins_update(FLAG_ALL);
@@ -821,7 +801,7 @@ int main(int argc, char **argv)
que_show();
if (conf.systemevents) {
que_save();
- do_storage(0);
+ day_do_storage(0);
}
wins_update(FLAG_ALL);
que_rem();
@@ -831,7 +811,7 @@ int main(int argc, char **argv)
resize = 0;
wins_reset();
if (conf.multiple_days) {
- do_storage(0);
+ day_do_storage(0);
wins_update(FLAG_APP);
}
}
@@ -847,6 +827,7 @@ int main(int argc, char **argv)
wtimeout(win[KEY].p, -1);
switch (key) {
HANDLE_KEY(KEY_GENERIC_CHANGE_VIEW, key_generic_change_view);
+ HANDLE_KEY(KEY_GENERIC_PREV_VIEW, key_generic_prev_view);
HANDLE_KEY(KEY_GENERIC_OTHER_CMD, key_generic_other_cmd);
HANDLE_KEY(KEY_GENERIC_GOTO, key_generic_goto);
HANDLE_KEY(KEY_GENERIC_GOTO_TODAY, key_generic_goto_today);
diff --git a/src/calcurse.h b/src/calcurse.h
index 763264d..8322416 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -111,9 +111,6 @@
#define STATUSHEIGHT 2
#define MAX_NOTESIZ 40
-/* Format for appointment hours is: HH:MM */
-#define HRMIN_SIZE 6
-
/* Maximum number of colors available. */
#define NBUSERCOLORS 6
@@ -142,9 +139,11 @@
*/
#define DAYINSEC (DAYINMIN * MININSEC)
#define NEXTDAY(date) date_sec_change((date), 0, 1)
+#define PREVDAY(date) date_sec_change((date), 0, -1)
#define DAYLEN(date) (NEXTDAY(date) - (date))
#define ENDOFDAY(date) (NEXTDAY(date) - 1)
#define HOURINSEC (HOURINMIN * MININSEC)
+#define DAY(date) (update_time_in_date(date, 0, 0))
/* Calendar window. */
#define CALHEIGHT 8
@@ -153,7 +152,7 @@
* The argument (d) is the "Sunday"-numbering of member tm_wday in struct tm.
*/
#define WDAY(d) \
- (ui_calendar_week_begins_on_monday() ? ((d ? d : WEEKINDAYS) - 1) : d)
+ (modify_wday(d, -ui_calendar_get_wday_start()))
/* Key definitions. */
#define CTRLVAL 0x1F
@@ -304,9 +303,11 @@ struct conf {
int input_datefmt; /* format for reading date */
enum pos heading_pos; /* left/center/right for heading in appts panel */
char day_heading[BUFSIZ]; /* format for displaying heading in appts panel */
+ char timefmt[BUFSIZ]; /* format for displaying time in appts panel*/
};
#define EMPTY_DAY_DEFAULT "--"
+#define EMPTY_EVENT_DESC_DEFAULT _("(empty description)")
/* Daemon-related configuration. */
struct dmon_conf {
@@ -336,6 +337,9 @@ enum datefmt {
/* Day heading default format. */
#define DAY_HEADING_DEFAULT "%B %e, %Y"
+/* Appointment time default format. */
+#define APPT_TIME_DEFAULT "%H:%M"
+
/*
* Calcurse representation of the date of a day in the calendar.
* When time_t is a 32-bit signed integer, the year range is 1902 - 2037.
@@ -513,8 +517,8 @@ struct io_file {
char *name;
};
-/* Available keys. */
-enum key {
+/* Virtual keys. */
+enum vkey {
KEY_GENERIC_CANCEL,
KEY_GENERIC_SELECT,
KEY_GENERIC_CREDITS,
@@ -525,6 +529,7 @@ enum key {
KEY_GENERIC_COPY,
KEY_GENERIC_PASTE,
KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_IMPORT,
KEY_GENERIC_EXPORT,
KEY_GENERIC_GOTO,
@@ -564,7 +569,7 @@ enum key {
KEY_RAISE_PRIORITY,
KEY_LOWER_PRIORITY,
- NBKEYS,
+ NBVKEYS,
KEY_UNDEF,
/* Non-configurable, context sensitive key bindings. */
@@ -669,7 +674,6 @@ struct nbar {
char datefmt[BUFSIZ]; /* format for displaying date */
char timefmt[BUFSIZ]; /* format for displaying time */
char cmd[BUFSIZ]; /* notification command */
- const char *shell; /* user shell to launch notif. cmd */
unsigned notify_all; /* notify all appointments */
pthread_mutex_t mutex;
};
@@ -808,7 +812,7 @@ void ui_calendar_set_current_date(void);
struct date *ui_calendar_get_today(void);
void ui_calendar_set_first_day_of_week(enum wday);
void ui_calendar_change_first_day_of_week(void);
-unsigned ui_calendar_week_begins_on_monday(void);
+int ui_calendar_get_wday_start(void);
void ui_calendar_store_current_date(struct date *);
void ui_calendar_init_slctd_day(void);
struct date *ui_calendar_get_slctd_day(void);
@@ -854,6 +858,7 @@ void day_display_item_date(struct day_item *, WINDOW *, int, time_t, int, int);
void day_display_item(struct day_item *, WINDOW *, int, int, int, int);
void day_write_stdout(time_t, const char *, const char *, const char *,
const char *, int *);
+void day_do_storage(int day_changed);
void day_popup_item(struct day_item *);
int day_check_if_item(struct date);
unsigned day_chk_busy_slices(struct date, int, int *);
@@ -924,7 +929,7 @@ unsigned io_file_exists(const char *);
int io_check_file(const char *);
int io_check_data_files(void);
void io_export_data(enum export_type, int);
-void io_import_data(enum import_type, char *, const char *, const char *,
+int io_import_data(enum import_type, char *, const char *, const char *,
const char *, const char *, const char *);
struct io_file *io_log_init(void);
void io_log_print(struct io_file *, int, const char *);
@@ -936,7 +941,6 @@ void io_set_lock(void);
unsigned io_dump_pid(char *);
unsigned io_get_pid(char *);
int io_files_equal(const char *, const char *);
-int io_file_is_empty(char *);
int io_file_cp(const char *, const char *);
void io_unset_modified(void);
void io_set_modified(void);
@@ -946,24 +950,26 @@ int io_get_modified(void);
void keys_init(void);
void keys_free(void);
void keys_dump_defaults(char *);
-const char *keys_get_label(enum key);
-enum key keys_get_action(int);
+const char *keys_get_label(enum vkey);
+const char *keys_get_binding(enum vkey);
+enum vkey keys_get_action(int);
int keys_wgetch(WINDOW *);
void keys_wait_for_any_key(WINDOW *);
-enum key keys_get(WINDOW *, int *, int *);
-int keys_assign_binding(int, enum key);
-void keys_remove_binding(int, enum key);
+enum vkey keys_get(WINDOW * win, int *, int *);
+int keys_assign_binding(int, enum vkey);
+void keys_remove_binding(int, enum vkey);
int keys_str2int(const char *);
char *keys_int2str(int);
-int keys_action_count_keys(enum key);
-const char *keys_action_firstkey(enum key);
-const char *keys_action_nkey(enum key, int);
-char *keys_action_allkeys(enum key);
+int keys_action_count_keys(enum vkey);
+const char *keys_action_firstkey(enum vkey);
+const char *keys_action_nkey(enum vkey, int);
+char *keys_action_allkeys(enum vkey);
void keys_display_bindings_bar(WINDOW *, int *, int, int, int);
-void keys_popup_info(enum key);
+void keys_popup_info(enum vkey);
void keys_save_bindings(FILE *);
-int keys_check_missing_bindings(void);
-void keys_fill_missing(void);
+int keys_check_missing(void);
+int keys_check_undefined(void);
+int keys_fill_missing(void);
/* listbox.c */
void listbox_init(struct listbox *, int, int, int, int, const char *,
@@ -1230,6 +1236,8 @@ time_t date_sec_change(time_t, int, int);
time_t update_time_in_date(time_t, unsigned, unsigned);
time_t get_sec_date(struct date);
long min2sec(unsigned);
+int modify_wday(int,int);
+char *get_wday_default_string(int);
void draw_scrollbar(struct scrollwin *, int);
void item_in_popup(const char *, const char *, const char *, const char *);
time_t get_today(void);
@@ -1250,9 +1258,9 @@ int parse_date_increment(const char *, unsigned *, time_t);
int parse_datetime(const char *, time_t *, time_t);
void file_close(FILE *, const char *);
void psleep(unsigned);
-int fork_exec(int *, int *, const char *, const char *const *);
-int shell_exec(int *, int *, const char *, const char *const *);
-int child_wait(int *, int *, int);
+int fork_exec(int *, int *, int *, int, const char *, const char *const *);
+int shell_exec(int *, int *, int *, int, const char *, const char *const *);
+int child_wait(int *, int *, int *, int);
void press_any_key(void);
void print_apoint(const char *, time_t, struct apoint *);
void print_event(const char *, time_t, struct event *);
@@ -1325,6 +1333,7 @@ void wins_sbar_wdec(void);
enum win wins_slctd(void);
void wins_slctd_set(enum win);
void wins_slctd_next(void);
+void wins_slctd_prev(void);
void wins_init(void);
void wins_scrollwin_init(struct scrollwin *, int, int, int, int, const char *);
void wins_scrollwin_resize(struct scrollwin *, int, int, int, int);
diff --git a/src/config.c b/src/config.c
index f621320..4e0f7db 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -36,6 +36,8 @@
#include <ctype.h>
#include <unistd.h>
+#include <string.h>
+#include <strings.h>
#include "calcurse.h"
@@ -109,6 +111,7 @@ static const struct confvar confmap[] = {
{"format.inputdate", config_parse_input_datefmt, config_serialize_input_datefmt, NULL},
{"format.notifydate", CONFIG_HANDLER_STR(nbar.datefmt)},
{"format.notifytime", CONFIG_HANDLER_STR(nbar.timefmt)},
+ {"format.appointmenttime", CONFIG_HANDLER_STR(conf.timefmt)},
{"format.outputdate", config_parse_output_datefmt, config_serialize_output_datefmt, NULL},
{"format.dayheading", CONFIG_HANDLER_STR(conf.day_heading)},
{"general.autogc", CONFIG_HANDLER_BOOL(conf.auto_gc)},
@@ -260,14 +263,16 @@ static int config_parse_default_panel(void *dummy, const char *val)
static int config_parse_first_day_of_week(void *dummy, const char *val)
{
- if (!strcmp(val, "monday"))
- ui_calendar_set_first_day_of_week(MONDAY);
- else if (!strcmp(val, "sunday"))
- ui_calendar_set_first_day_of_week(SUNDAY);
- else
- return 0;
+ int i;
- return 1;
+ for (i = 0; i < WEEKINDAYS; i++) {
+ if(!strcasecmp(val, get_wday_default_string(i))) {
+ ui_calendar_set_first_day_of_week(i);
+ return 1;
+ }
+ }
+
+ return 0;
}
static int config_parse_color_theme(void *dummy, const char *val)
@@ -467,10 +472,9 @@ static int config_serialize_default_panel(char **buf, void *dummy)
static int config_serialize_first_day_of_week(char **buf, void *dummy)
{
- if (ui_calendar_week_begins_on_monday())
- *buf = mem_strdup("monday");
- else
- *buf = mem_strdup("sunday");
+ *buf = mem_strdup(get_wday_default_string(ui_calendar_get_wday_start()));
+ /* now stores string with uppercase first letter, changing to lower */
+ **buf = tolower(**buf);
return 1;
}
diff --git a/src/custom.c b/src/custom.c
index 0e5e554..2cd385c 100644
--- a/src/custom.c
+++ b/src/custom.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,7 @@
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
+#include <langinfo.h>
#include "calcurse.h"
@@ -545,6 +546,7 @@ enum {
INPUT_DATE_FMT,
HEADING_POS,
DAY_HEADING_FMT,
+ APPOINTMENT_TIME_FMT,
NB_OPTIONS
};
@@ -573,7 +575,8 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
"format.outputdate = ",
"format.inputdate = ",
"appearance.headingposition = ",
- "format.dayheading = "
+ "format.dayheading = ",
+ "format.appointmenttime = "
};
const char *panel;
const char *position;
@@ -700,8 +703,7 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
case FIRST_DAY_OF_WEEK:
custom_apply_attr(win, ATTR_HIGHEST);
mvwaddstr(win, y, XPOS + strlen(opt[FIRST_DAY_OF_WEEK]),
- ui_calendar_week_begins_on_monday()? _("Monday") :
- _("Sunday"));
+ nl_langinfo(DAY_1 + ui_calendar_get_wday_start()));
custom_remove_attr(win, ATTR_HIGHEST);
mvwaddstr(win, y + 1, XPOS,
_("(specifies the first day of week in the calendar view)"));
@@ -746,6 +748,14 @@ static void print_general_option(int i, WINDOW *win, int y, int hilt, void *cb_d
mvwaddstr(win, y + 1, XPOS,
_("(Format of the date displayed in the appointments panel)"));
break;
+ case APPOINTMENT_TIME_FMT:
+ custom_apply_attr(win, ATTR_HIGHEST);
+ mvwaddstr(win, y, XPOS + strlen(opt[APPOINTMENT_TIME_FMT]),
+ conf.timefmt);
+ custom_remove_attr(win, ATTR_HIGHEST);
+ mvwaddstr(win, y + 1, XPOS,
+ _("(Format of the time displayed in the appointments panel)"));
+ break;
}
if (hilt)
@@ -771,6 +781,8 @@ static void general_option_edit(int i)
_("Enter a text string (an empty string for the default text)");
const char *output_datefmt_str =
_("Enter the date format (see 'man 3 strftime' for possible formats) ");
+ const char *output_timefmt_str =
+ _("Enter the time format (see 'man 3 strftime' for possible formats) ");
const char *input_datefmt_prefix = _("Enter the date format: ");
const char *periodic_save_str =
_("Enter the delay, in minutes, between automatic saves (0 to disable) ");
@@ -893,6 +905,15 @@ static void general_option_edit(int i)
conf.day_heading[BUFSIZ - 1] = '\0';
}
break;
+ case APPOINTMENT_TIME_FMT:
+ status_mesg(output_timefmt_str, "");
+ strncpy(buf, conf.timefmt, BUFSIZ);
+ buf[BUFSIZ - 1] = '\0';
+ if (updatestring(win[STA].p, &buf, 0, 1) == 0) {
+ strncpy(conf.timefmt, buf, BUFSIZ);
+ conf.timefmt[BUFSIZ - 1] = '\0';
+ }
+ break;
}
mem_free(buf);
@@ -975,10 +996,11 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
const int XPOS = 1;
const int EQUALPOS = 23;
const int KEYPOS = 25;
- int noelm, action, y;
+ int noelm, action, y, pos;
+ const char *key = NULL;
noelm = y = 0;
- for (action = 0; action < NBKEYS; action++) {
+ for (action = 0; action < NBVKEYS; action++) {
char *actionstr;
int nbkeys;
@@ -990,18 +1012,15 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
mem_free(actionstr);
mvwaddstr(win, y, EQUALPOS, "=");
if (nbkeys == 0)
- mvwaddstr(win, y, KEYPOS, _("undefined"));
+ mvwaddstr(win, y, KEYPOS, _("UNDEFINED"));
if (action == selected_row)
custom_remove_attr(win, ATTR_HIGHEST);
if (nbkeys > 0) {
if (action == selected_row) {
- const char *key;
- int pos;
-
+ /* Elements may have been added or deleted. */
+ wclrtoeol(win);
pos = KEYPOS;
- while ((key =
- keys_action_nkey(action,
- noelm)) != NULL) {
+ while ((key = keys_action_nkey(action, noelm))) {
if (noelm == selected_elm)
print_key_incolor(win, key,
y, pos);
@@ -1012,8 +1031,9 @@ print_keys_bindings(WINDOW * win, int selected_row, int selected_elm,
pos += utf8_strwidth((char *)key) + 1;
}
} else {
- mvwaddstr(win, y, KEYPOS,
- keys_action_allkeys(action));
+ key = keys_action_allkeys(action);
+ mvwaddstr(win, y, KEYPOS, key);
+ mem_free((char *)key);
}
}
y += yoff;
@@ -1045,9 +1065,11 @@ void custom_keys_config(void)
const int LABELLINES = 3;
clear();
- nbdisplayed = ((notify_bar() ? row - 3 : row - 2) - LABELLINES) / LINESPERKEY;
- wins_scrollwin_init(&kwin, 0, 0, notify_bar() ? row - 3 : row - 2, col, _("keys configuration"));
- wins_scrollwin_set_pad(&kwin, NBKEYS * LINESPERKEY);
+ nbdisplayed = ((notify_bar() ? row - 3 : row - 2) -
+ LABELLINES) / LINESPERKEY;
+ wins_scrollwin_init(&kwin, 0, 0, notify_bar() ? row - 3 : row - 2, col,
+ _("keys configuration"));
+ wins_scrollwin_set_pad(&kwin, NBVKEYS * LINESPERKEY);
wins_scrollwin_draw_deco(&kwin, 0);
custom_keys_config_bar();
selrow = selelm = 0;
@@ -1072,7 +1094,7 @@ void custom_keys_config(void)
}
break;
case KEY_MOVE_DOWN:
- if (selrow < NBKEYS - 1) {
+ if (selrow < NBVKEYS - 1) {
selrow++;
selelm = 0;
if (selrow == lastrow) {
@@ -1103,7 +1125,7 @@ void custom_keys_config(void)
keys_get_label(selrow), 0);
for (;;) {
ch = keys_wgetch(grabwin);
- enum key action = keys_get_action(ch);
+ enum vkey action = keys_get_action(ch);
/* Is the key already used by this action? */
if (action == selrow)
break;
@@ -1142,10 +1164,8 @@ void custom_keys_config(void)
selelm--;
break;
case KEY_GENERIC_QUIT:
- if (keys_check_missing_bindings() != 0) {
- WARN_MSG(_("Some actions do not have any associated "
- "key bindings!"));
- }
+ if (keys_check_undefined())
+ WARN_MSG(_("Some actions are left undefined!"));
wins_scrollwin_delete(&kwin);
return;
}
@@ -1222,7 +1242,7 @@ void custom_config_main(void)
old_layout = wins_layout();
custom_layout_config();
if (wins_layout() != old_layout)
- wins_reset();
+ wins_resize();
break;
case 'G':
case 'g':
@@ -1248,7 +1268,11 @@ void custom_config_main(void)
resize = 0;
wins_reset();
}
-
+
+ /* needed to update app list */
+ day_do_storage(0);
+
+ /* wins_update(FLAG_ALL), but with custom bindings */
wins_set_bindings(bindings, ARRAY_SIZE(bindings));
wins_update_border(FLAG_ALL);
wins_update_panels(FLAG_ALL);
diff --git a/src/day.c b/src/day.c
index 5bf84c4..78f4acf 100644
--- a/src/day.c
+++ b/src/day.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -58,7 +58,7 @@ static struct day_item sel_data = { 0, 0, 0, {NULL}};
/*
* Save the item to become the selected APP item.
- * Public function used to override the setting in do_storage().
+ * Public function used to override the setting in day_do_storage().
*/
int day_set_sel_data(struct day_item *d)
{
@@ -100,7 +100,7 @@ int day_sel_index(void)
/* If still not found, stay on the same day. */
VECTOR_FOREACH(&day_items, i) {
p = VECTOR_NTH(&day_items, i);
- if (p->order == update_time_in_date(sel_data.order, 0, 0))
+ if (p->order == DAY(sel_data.order))
return i;
}
return -1;
@@ -198,7 +198,8 @@ static void day_add_item(int type, time_t start, time_t order, union aptev_ptr i
/* Get the message of an item. */
char *day_item_get_mesg(struct day_item *day)
{
- switch (day->type) {
+ switch (day->type)
+ {
case APPT:
return day->item.apt->mesg;
case EVNT:
@@ -212,6 +213,15 @@ char *day_item_get_mesg(struct day_item *day)
}
}
+/* Get the display message of an item. */
+char *day_item_get_display_mesg(struct day_item *day)
+{
+ char *msg = day_item_get_mesg(day);
+ if (msg[0] == '\0')
+ return EMPTY_EVENT_DESC_DEFAULT;
+ return msg;
+}
+
/* Get the note attached to an item. */
char *day_item_get_note(struct day_item *day)
{
@@ -529,7 +539,7 @@ day_display_item(struct day_item *day, WINDOW *win, int incolor, int width,
if (width <= 0)
return;
- char *mesg = day_item_get_mesg(day);
+ char *mesg = day_item_get_display_mesg(day);
ch_recur = (day->type == RECUR_EVNT) ? '*' : ' ';
ch_note = day_item_get_note(day) ? '>' : ' ';
@@ -578,6 +588,38 @@ void day_write_stdout(time_t date, const char *fmt_apt, const char *fmt_rapt,
}
}
+/*
+ * Store events and appointments for a range of days in the day vector -
+ * beginning with the selected day - and load them into the APP listbox. If no
+ * day-change occurs, reset the selected APP item and with it the selected day,
+ * thereby storing and loading the same range of days.
+ */
+void day_do_storage(int day_changed)
+{
+ int pre_sel;
+ /*
+ * Save the selected item before rebuilding the day vector -
+ * unless a preselection is already set.
+ */
+ if(!(pre_sel = day_check_sel_data()))
+ day_set_sel_data(ui_day_get_sel());
+
+ if (!day_changed)
+ ui_day_sel_reset();
+
+ /* The day_items vector. */
+ day_store_items(get_slctd_day(), 1, day_get_days());
+ /* The APP listbox. */
+ ui_day_load_items();
+
+ if (day_changed && !pre_sel)
+ ui_day_sel_reset();
+ else
+ ui_day_find_sel();
+
+ day_set_sel_data(&empty_day);
+}
+
/* Display an item inside a popup window. */
void day_popup_item(struct day_item *day)
{
@@ -592,15 +634,19 @@ void day_popup_item(struct day_item *day)
asprintf(&notepath, "%s%s", path_notes, day_item_get_note(day));
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(NULL, NULL, day_item_get_mesg(day), _("Event:"));
+ return;
+ }
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
- asprintf(&msg, "%s\n\n%s\n%s", day_item_get_mesg(day), note_heading, note);
+ asprintf(&msg, "%s\n\n%s\n%s", day_item_get_display_mesg(day), note_heading, note);
item_in_popup(NULL, NULL, msg, _("Event:"));
mem_free(msg);
} else {
- item_in_popup(NULL, NULL, day_item_get_mesg(day), _("Event:"));
+ item_in_popup(NULL, NULL, day_item_get_display_mesg(day), _("Event:"));
}
} else if (day->type == APPT || day->type == RECUR_APPT) {
char a_st[100], a_end[100];
@@ -619,15 +665,19 @@ void day_popup_item(struct day_item *day)
asprintf(&notepath, "%s%s", path_notes, day_item_get_note(day));
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(a_st, a_end, day_item_get_mesg(day), _("Appointment:"));
+ return;
+ }
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
- asprintf(&msg, "%s\n\n%s\n%s", day_item_get_mesg(day), note_heading, note);
+ asprintf(&msg, "%s\n\n%s\n%s", day_item_get_display_mesg(day), note_heading, note);
item_in_popup(a_st, a_end, msg, _("Appointment:"));
mem_free(msg);
} else {
- item_in_popup(a_st, a_end, day_item_get_mesg(day), _("Appointment:"));
+ item_in_popup(a_st, a_end, day_item_get_display_mesg(day), _("Appointment:"));
}
} else {
EXIT(_("unknown item type"));
@@ -832,7 +882,7 @@ int day_paste_item(struct day_item *p, time_t date)
/* wanted: until = shift + old_until */
if (p->item.rapt->rpt->until &&
overflow_add(
- date - update_time_in_date(p->item.rapt->start, 0, 0),
+ date - DAY(p->item.rapt->start),
p->item.rapt->rpt->until,
&until)
)
diff --git a/src/dmon.c b/src/dmon.c
index e61caf5..cb51de7 100644
--- a/src/dmon.c
+++ b/src/dmon.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -54,7 +54,7 @@
#define DMON_ABRT(...) do { \
DMON_LOG (__VA_ARGS__); \
- if (kill (getpid (), SIGINT) < 0) \
+ if (kill (getpid (), SIGINT) == -1) \
{ \
DMON_LOG (_("Could not stop daemon properly: %s\n"), \
strerror (errno)); \
diff --git a/src/event.c b/src/event.c
index e0da4c1..7c371e4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/getstring.c b/src/getstring.c
index 7cdb84e..8ea5df5 100644
--- a/src/getstring.c
+++ b/src/getstring.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -241,9 +241,11 @@ enum getstr getstring(WINDOW * win, char *str, int l, int x, int y)
st.len = st.pos;
break;
case CTRL('A'): /* go to beginning of string */
+ case KEY_HOME:
st.pos = 0;
break;
case CTRL('E'): /* go to end of string */
+ case KEY_END:
st.pos = st.len;
break;
case KEY_LEFT: /* move one char backward */
diff --git a/src/help.c b/src/help.c
index 398fb6d..3f2c94f 100644
--- a/src/help.c
+++ b/src/help.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -105,7 +105,7 @@ int display_help(const char *topic)
if (!io_file_exists(path)) {
int ch = keys_str2int(topic);
- enum key action = keys_get_action(ch);
+ enum vkey action = keys_get_action(ch);
if (ch > 0 && action > 0 && action != KEY_UNDEF) {
topic = keys_get_label(action);
mem_free(path);
@@ -134,6 +134,8 @@ int display_help(const char *topic)
topic = "copy-paste";
else if (!strcmp(topic, "generic-change-view"))
topic = "tab";
+ else if (!strcmp(topic, "generic-prev-view"))
+ topic = "tab";
else if (!strcmp(topic, "generic-import"))
topic = "import";
else if (!strcmp(topic, "generic-export"))
diff --git a/src/hooks.c b/src/hooks.c
index b4933af..f649076 100644
--- a/src/hooks.c
+++ b/src/hooks.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,20 +41,18 @@
int run_hook(const char *name)
{
- char *hook_path = NULL, *hook_cmd = NULL, *mesg;
+ char *hook_path = NULL, *mesg;
+ int pid, pin, pout, perr, ret = -127;
char const *arg[2];
- int pid, ret = -127;
asprintf(&hook_path, "%s/%s", path_hooks, name);
if (!io_file_exists(hook_path))
goto cleanup;
-
- asprintf(&hook_cmd, "%s <&- >&- 2>&-", hook_path);
- arg[0] = hook_cmd;
+ arg[0] = hook_path;
arg[1] = NULL;
- if ((pid = shell_exec(NULL, NULL, *arg, arg))) {
- ret = child_wait(NULL, NULL, pid);
+ if ((pid = shell_exec(&pin, &pout, &perr, 1, *arg, arg))) {
+ ret = child_wait(&pin, &pout, &perr, pid);
if (ret > 0 && WIFEXITED(ret)) {
asprintf(&mesg, "%s hook: exit status %d",
name,
@@ -71,6 +69,5 @@ int run_hook(const char *name)
cleanup:
mem_free(hook_path);
- mem_free(hook_cmd);
return ret;
}
diff --git a/src/htable.h b/src/htable.h
index 5266213..92be6e2 100644
--- a/src/htable.h
+++ b/src/htable.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/ical.c b/src/ical.c
index 5847b88..a8ce0a4 100644
--- a/src/ical.c
+++ b/src/ical.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -213,8 +213,11 @@ static void ical_export_note(FILE *stream, char *name)
int has_desc, has_prop, i;
asprintf(&note_file, "%s/%s", path_notes, name);
- if (!(fp = fopen(note_file, "r")))
+ if (!(fp = fopen(note_file, "r")) || ungetc(getc(fp), fp) == EOF) {
+ if (fp)
+ fclose(fp);
return;
+ }
string_init(&note);
while (fgets(lbuf, BUFSIZ, fp))
string_catf(&note, "%s", lbuf);
@@ -518,6 +521,10 @@ ical_store_event(char *mesg, char *note, time_t day, time_t end,
struct event *ev;
struct recur_event *rev;
+ if (!mesg)
+ mesg = mem_strdup(_("(empty)"));
+ EXIT_IF(!mesg, _("ical_store_event: out of memory"));
+
/*
* Repeating event. The end day is ignored, and the event becomes
* one-day even if multi-day.
@@ -570,6 +577,10 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
struct recur_apoint *rapt;
time_t day;
+ if (!mesg)
+ mesg = mem_strdup(_("(empty)"));
+ EXIT_IF(!mesg, _("ical_store_event: out of memory"));
+
if (has_alarm)
state |= APOINT_NOTIFY;
if (rpt) {
@@ -582,7 +593,7 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
* calcurse until day must be changed to the day before.
*/
if (rpt->until) {
- day = update_time_in_date(rpt->until, 0, 0);
+ day = DAY(rpt->until);
if (recur_item_find_occurrence(start, dur, rpt, NULL,
day, NULL) &&
get_item_time(rpt->until) < get_item_time(start))
@@ -680,7 +691,7 @@ static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln)
while (fgets(lstore, BUFSIZ, fdi) != NULL) {
(*ln)++;
if ((eol = strchr(lstore, '\n')) != NULL) {
- if (*(eol - 1) == '\r')
+ if (strlen(lstore) > 1 && *(eol - 1) == '\r')
*(eol - 1) = '\0';
else
*eol = '\0';
@@ -1053,7 +1064,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
time_t start,
int *count)
{
- char freqstr[8];
+ char freqstr[8], datestr[17];
struct rpt *rpt;
char *p, *q;
@@ -1082,7 +1093,7 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
/* FREQ rule part */
if ((p = strstr(rrulestr, "FREQ="))) {
- if (sscanf(p, "FREQ=%s", freqstr) != 1) {
+ if (sscanf(p, "FREQ=%7s", freqstr) != 1) {
ical_log(log, ICAL_VEVENT, itemline,
_("frequency not set in rrule."));
(*noskipped)++;
@@ -1134,7 +1145,14 @@ static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
}
if ((p = strstr(rrulestr, "UNTIL="))) {
- rpt->until = ical_datetime2time_t(strchr(p, '=') + 1, NULL, type);
+ if (sscanf(p, "UNTIL=%16s", datestr) != 1) {
+ ical_log(log, ICAL_VEVENT, itemline,
+ _("missing until value."));
+ (*noskipped)++;
+ mem_free(rpt);
+ return NULL;
+ }
+ rpt->until = ical_datetime2time_t(datestr, NULL, type);
if (!rpt->until) {
ical_log(log, ICAL_VEVENT, itemline,
_("invalid until format."));
@@ -1218,11 +1236,6 @@ ical_read_exdate(llist_t * exc, FILE * log, char *exstr, unsigned *noskipped,
time_t t;
int n;
- if (type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, itemline,
- _("need DTSTART to determine event type."));
- goto cleanup;
- }
if (type != ical_get_type(exstr)) {
ical_log(log, ICAL_VEVENT, itemline,
_("invalid exception date value type."));
@@ -1327,12 +1340,9 @@ static char *ical_read_summary(char *line, unsigned *noskipped,
}
/* An event summary is one line only. */
- if (strchr(summary, '\n')) {
- ical_log(log, item_type, itemline, _("line break in summary."));
- (*noskipped)++;
- mem_free(summary);
- summary = NULL;
- }
+ for (p = summary; *p; p++)
+ if (*p == '\n')
+ *p = ' ';
leave:
return summary;
}
@@ -1346,8 +1356,9 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
const int ITEMLINE = *lineno - !feof(fdi);
ical_vevent_e vevent_type;
ical_property_e property;
- char *p, *note = NULL, *tmp, *tzid;
- struct string s;
+ char *p, *note, *tzid;
+ char *dtstart, *dtend, *duration, *rrule;
+ struct string s, exdate;
struct {
llist_t exc;
struct rpt *rpt;
@@ -1357,12 +1368,13 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
long dur;
int has_alarm;
} vevent;
- int skip_alarm, has_note, separator;
+ int skip_alarm, has_note, separator, has_exdate;
vevent_type = UNDEFINED;
memset(&vevent, 0, sizeof vevent);
LLIST_INIT(&vevent.exc);
- skip_alarm = has_note = separator = 0;
+ note = dtstart = dtend = duration = rrule = NULL;
+ skip_alarm = has_note = separator = has_exdate =0;
while (ical_readline(fdi, buf, lstore, lineno)) {
note = NULL;
property = NO_PROPERTY;
@@ -1376,16 +1388,112 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
continue;
}
if (starts_with_ci(buf, "END:VEVENT")) {
- if (!vevent.mesg) {
+ /* DTSTART and related properties (picked up earlier). */
+ if (!dtstart) {
ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("could not retrieve item summary."));
+ _("item start date not defined."));
goto skip;
}
- if (vevent.start == 0) {
+ vevent_type = ical_get_type(dtstart);
+ if ((tzid = ical_get_tzid(dtstart)) &&
+ vevent_type == APPOINTMENT) {
+ if (vevent.imp) {
+ asprintf(&p, "%s, TZID=%s",
+ vevent.imp, tzid);
+ mem_free(vevent.imp);
+ vevent.imp = p;
+ } else
+ asprintf(&vevent.imp, "TZID=%s", tzid);
+ has_note = separator = 1;
+ }
+ p = ical_get_value(dtstart);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed start time line."));
+ goto skip;
+ }
+ vevent.start = ical_datetime2time_t(p, tzid, vevent_type);
+ if (tzid) {
+ mem_free(tzid);
+ tzid = NULL;
+ }
+ if (!vevent.start) {
ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("item start date is not defined."));
+ _("invalid or malformed event "
+ "start time."));
goto skip;
}
+ /* DTEND */
+ if (!dtend)
+ goto duration;
+ if (vevent_type != ical_get_type(dtend)) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("invalid end time value type."));
+ goto skip;
+ }
+ tzid = ical_get_tzid(dtend);
+ p = ical_get_value(dtend);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed end time line."));
+ goto skip;
+ }
+ vevent.end = ical_datetime2time_t(p, tzid, vevent_type);
+ if (tzid) {
+ mem_free(tzid);
+ tzid = NULL;
+ }
+ if (!vevent.end) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed event end time."));
+ goto skip;
+ }
+ if (vevent.end <= vevent.start) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("end must be later than start."));
+ goto skip;
+ }
+ duration:
+ if (!duration)
+ goto rrule;
+ if (vevent.end) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("either end or duration."));
+ goto skip;
+ }
+ p = ical_get_value(duration);
+ if (!p) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("malformed duration line."));
+ goto skip;
+ }
+ vevent.dur = ical_dur2long(p, vevent_type);
+ if (!vevent.dur) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("invalid duration."));
+ goto skip;
+ }
+ rrule:
+ if (!rrule)
+ goto exdate;
+ vevent.rpt = ical_read_rrule(log, rrule, noskipped,
+ ITEMLINE, vevent_type, vevent.start,
+ &vevent.count);
+ if (!vevent.rpt)
+ goto cleanup;
+ exdate:
+ if (!has_exdate)
+ goto duration_end;
+ if (!rrule) {
+ ical_log(log, ICAL_VEVENT, ITEMLINE,
+ _("exception date, but no recurrence "
+ "rule."));
+ goto skip;
+ }
+ if (!ical_read_exdate(&vevent.exc, log, exdate.buf,
+ noskipped, ITEMLINE, vevent_type))
+ goto cleanup;
+ duration_end:
/* An APPOINTMENT must always have a duration. */
if (vevent_type == APPOINTMENT && !vevent.dur) {
vevent.dur = vevent.end ?
@@ -1402,10 +1510,10 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
char *md = _("multi-day event changed "
"to one-day event");
if (vevent.imp) {
- asprintf(&tmp, "%s, %s",
+ asprintf(&p, "%s, %s",
vevent.imp, md);
mem_free(vevent.imp);
- vevent.imp = tmp;
+ vevent.imp = p;
} else
asprintf(&vevent.imp, "%s", md);
has_note = separator = 1;
@@ -1417,6 +1525,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
if (vevent.desc) {
string_catf(&s, "%s", vevent.desc);
mem_free(vevent.desc);
+ vevent.desc = NULL;
}
if (separator)
string_catf(&s, SEPARATOR);
@@ -1424,16 +1533,19 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
string_catf(&s, _("Location: %s"),
vevent.loc);
mem_free(vevent.loc);
+ vevent.loc = NULL;
}
if (vevent.comm) {
string_catf(&s, _("Comment: %s"),
vevent.comm);
mem_free(vevent.comm);
+ vevent.comm = NULL;
}
if (vevent.imp) {
string_catf(&s, ("Import: %s\n"),
vevent.imp);
mem_free(vevent.imp);
+ vevent.imp = NULL;
}
vevent.note = generate_note(string_buf(&s));
mem_free(s.buf);
@@ -1444,7 +1556,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
char *msg;
dur = vevent_type == EVENT ? -1 : vevent.dur;
- day = update_time_in_date(vevent.start, 0, 0);
+ day = DAY(vevent.start);
msg = _("rrule does not match start day (%s).");
if (vevent.count) {
@@ -1494,115 +1606,28 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
}
if (starts_with_ci(buf, "DTSTART")) {
/*
- * DTSTART has a value type: either DATE-TIME (by
- * default) or DATE. Properties DTEND, DURATION and
- * EXDATE and rrule part UNTIL must agree.
- * Assume that DTSTART comes before the others even
- * though RFC 5545 allows any order.
+ * DTSTART has a value type: either DATE-TIME or DATE.
* In calcurse DATE-TIME implies an appointment, DATE an
* event.
+ * Properties DTEND, DURATION and EXDATE and rrule part
+ * UNTIL must match the DTSTART value type.
*/
- vevent_type = ical_get_type(buf);
- if ((tzid = ical_get_tzid(buf)) &&
- vevent_type == APPOINTMENT) {
- /* Add note on TZID. */
- if (vevent.imp) {
- asprintf(&tmp, "%s, TZID=%s",
- vevent.imp, tzid);
- mem_free(vevent.imp);
- vevent.imp = tmp;
- } else
- asprintf(&vevent.imp, "TZID=%s", tzid);
- has_note = separator = 1;
- }
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed start time line."));
- goto skip;
- }
-
- vevent.start = ical_datetime2time_t(p, tzid, vevent_type);
- if (tzid)
- mem_free(tzid);
- if (!vevent.start) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid or malformed event "
- "start time."));
- goto skip;
- }
+ asprintf(&dtstart, "%s", buf);
} else if (starts_with_ci(buf, "DTEND")) {
- if (vevent.dur) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("either end or duration."));
- goto skip;
- }
- if (vevent_type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("need DTSTART to determine "
- "event type."));
- goto skip;
- }
- if (vevent_type != ical_get_type(buf)) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid end time value type."));
- goto skip;
- }
- tzid = ical_get_tzid(buf);
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed end time line."));
- goto skip;
- }
-
- vevent.end = ical_datetime2time_t(p, tzid, vevent_type);
- if (tzid)
- mem_free(tzid);
- if (!vevent.end) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed event end time."));
- goto skip;
- }
- if (vevent.end <= vevent.start) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("end must be later than start."));
- goto skip;
- }
+ asprintf(&dtend, "%s", buf);
} else if (starts_with_ci(buf, "DURATION")) {
- if (vevent.end) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("either end or duration."));
- goto skip;
- }
- if (vevent_type == UNDEFINED) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("need DTSTART to determine "
- "event type."));
- goto skip;
- }
- p = ical_get_value(buf);
- if (!p) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("malformed duration line."));
- goto skip;
- }
- vevent.dur = ical_dur2long(p, vevent_type);
- if (!vevent.dur) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid duration."));
- goto skip;
- }
+ asprintf(&duration, "%s", buf);
} else if (starts_with_ci(buf, "RRULE")) {
- vevent.rpt = ical_read_rrule(log, buf, noskipped,
- ITEMLINE, vevent_type, vevent.start,
- &vevent.count);
- if (!vevent.rpt)
- goto cleanup;
+ asprintf(&rrule, "%s", buf);
} else if (starts_with_ci(buf, "EXDATE")) {
- if (!ical_read_exdate(&vevent.exc, log, buf, noskipped,
- ITEMLINE, vevent_type))
- goto cleanup;
+ if (!has_exdate) {
+ has_exdate = 1;
+ string_init(&exdate);
+ string_catf(&exdate, "%s", buf);
+ } else {
+ p = ical_get_value(buf);
+ string_catf(&exdate, ",%s", p);
+ }
} else if (starts_with_ci(buf, "SUMMARY")) {
vevent.mesg = ical_read_summary(buf, noskipped,
ICAL_VEVENT, ITEMLINE, log);
@@ -1646,10 +1671,10 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
case COMMENT:
/* There may be more than one. */
if (vevent.comm) {
- asprintf(&tmp, "%sComment: %s",
+ asprintf(&p, "%sComment: %s",
vevent.comm, note);
mem_free(vevent.comm);
- vevent.comm = tmp;
+ vevent.comm = p;
} else
vevent.comm = note;
break;
@@ -1663,6 +1688,16 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
skip:
(*noskipped)++;
cleanup:
+ if (dtstart)
+ mem_free(dtstart);
+ if (dtend)
+ mem_free(dtend);
+ if (duration)
+ mem_free(duration);
+ if (rrule)
+ mem_free(rrule);
+ if (has_exdate)
+ mem_free(exdate.buf);
if (note)
mem_free(note);
if (vevent.desc)
@@ -1686,7 +1721,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
{
const int ITEMLINE = *lineno - !feof(fdi);
ical_property_e property;
- char *note = NULL, *tmp;
+ char *p, *note;
struct string s;
struct {
char *mesg, *desc, *loc, *comm, *note;
@@ -1696,6 +1731,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
int skip_alarm, has_note, separator;
memset(&vtodo, 0, sizeof vtodo);
+ note = NULL;
skip_alarm = has_note = separator = 0;
while (ical_readline(fdi, buf, lstore, lineno)) {
note = NULL;
@@ -1721,6 +1757,7 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
if (vtodo.desc) {
string_catf(&s, "%s", vtodo.desc);
mem_free(vtodo.desc);
+ vtodo.desc = NULL;
}
if (separator)
string_catf(&s, SEPARATOR);
@@ -1728,11 +1765,13 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
string_catf(&s, _("Location: %s"),
vtodo.loc);
mem_free(vtodo.loc);
+ vtodo.loc = NULL;
}
if (vtodo.comm) {
string_catf(&s, _("Comment: %s"),
vtodo.comm);
mem_free(vtodo.comm);
+ vtodo.comm = NULL;
}
vtodo.note = generate_note(string_buf(&s));
mem_free(s.buf);
@@ -1796,10 +1835,10 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
case COMMENT:
/* There may be more than one. */
if (vtodo.comm) {
- asprintf(&tmp, "%sComment: %s",
+ asprintf(&p, "%sComment: %s",
vtodo.comm, note);
mem_free(vtodo.comm);
- vtodo.comm = tmp;
+ vtodo.comm = p;
} else
vtodo.comm = note;
break;
diff --git a/src/io.c b/src/io.c
index 43c9b28..d596aab 100644
--- a/src/io.c
+++ b/src/io.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -50,8 +50,8 @@
struct ht_keybindings_s {
const char *label;
- enum key key;
- HTABLE_ENTRY(ht_keybindings_s);
+ enum vkey key;
+ HTABLE_ENTRY(ht_keybindings_s);
};
static void load_keys_ht_getkey(struct ht_keybindings_s *, const char **,
@@ -237,25 +237,25 @@ void io_dump_apts(const char *fmt_apt, const char *fmt_rapt,
LLIST_FOREACH(&recur_elist, i) {
struct recur_event *rev = LLIST_GET_DATA(i);
- time_t day = update_time_in_date(rev->day, 0, 0);
+ time_t day = DAY(rev->day);
print_recur_event(fmt_rev, day, rev);
}
LLIST_TS_FOREACH(&recur_alist_p, i) {
struct recur_apoint *rapt = LLIST_GET_DATA(i);
- time_t day = update_time_in_date(rapt->start, 0, 0);
+ time_t day = DAY(rapt->start);
print_recur_apoint(fmt_rapt, day, rapt->start, rapt);
}
LLIST_TS_FOREACH(&alist_p, i) {
struct apoint *apt = LLIST_TS_GET_DATA(i);
- time_t day = update_time_in_date(apt->start, 0, 0);
+ time_t day = DAY(apt->start);
print_apoint(fmt_apt, day, apt);
}
LLIST_FOREACH(&eventlist, i) {
struct event *ev = LLIST_TS_GET_DATA(i);
- time_t day = update_time_in_date(ev->day, 0, 0);
+ time_t day = DAY(ev->day);
print_event(fmt_ev, day, ev);
}
}
@@ -940,16 +940,6 @@ load_keys_ht_compare(struct ht_keybindings_s *data1,
}
/*
- * isblank(3) is protected by the __BSD_VISIBLE macro and this fails to be
- * visible in some specific cases. Thus replace it by the following is_blank()
- * function.
- */
-static int is_blank(int c)
-{
- return c == ' ' || c == '\t';
-}
-
-/*
* Load user-definable keys from file.
* A hash table is used to speed up loading process in avoiding string
* comparisons.
@@ -958,21 +948,21 @@ static int is_blank(int c)
*/
void io_load_keys(const char *pager)
{
- struct ht_keybindings_s keys[NBKEYS];
+ struct ht_keybindings_s virt_keys[NBVKEYS], *ht_elm, ht_entry;
FILE *keyfp;
- char buf[BUFSIZ];
+ char buf[BUFSIZ], key_label[BUFSIZ], key_str[BUFSIZ];
+ char *p, *msg;
struct io_file *log;
- int i, skipped, loaded, line;
- const int MAX_ERRORS = 5;
+ int i, n, skipped, loaded, line, assigned, undefined, key;
keys_init();
struct ht_keybindings ht_keys = HTABLE_INITIALIZER(&ht_keys);
- for (i = 0; i < NBKEYS; i++) {
- keys[i].key = (enum key)i;
- keys[i].label = keys_get_label((enum key)i);
- HTABLE_INSERT(ht_keybindings, &ht_keys, &keys[i]);
+ for (i = 0; i < NBVKEYS; i++) {
+ virt_keys[i].key = (enum vkey)i;
+ virt_keys[i].label = keys_get_label((enum vkey)i);
+ HTABLE_INSERT(ht_keybindings, &ht_keys, &virt_keys[i]);
}
keyfp = fopen(path_keys, "r");
@@ -981,111 +971,97 @@ void io_load_keys(const char *pager)
log = io_log_init();
skipped = loaded = line = 0;
while (fgets(buf, BUFSIZ, keyfp) != NULL) {
- char key_label[BUFSIZ], *p;
- struct ht_keybindings_s *ht_elm, ht_entry;
- const int AWAITED = 1;
- int assigned;
-
line++;
- if (skipped > MAX_ERRORS) {
- const char *too_many =
- _("\nToo many errors while reading configuration file!\n"
- "Please backup your keys file, remove it from directory, "
- "and launch calcurse again.\n");
-
- io_log_print(log, line, too_many);
- break;
- }
- for (p = buf; is_blank((int)*p); p++) ;
- if (p != buf)
- memmove(buf, p, strlen(p));
- if (buf[0] == '#' || buf[0] == '\n')
+ p = buf;
+ while (*p == ' ' || *p == '\t') p++;
+ if (*p == '#' || *p == '\n')
continue;
- if (sscanf(buf, "%s", key_label) != AWAITED) {
+ /* Find the virtual key by key label. */
+ if (sscanf(p, "%s", key_label) != 1) {
skipped++;
io_log_print(log, line,
_("Could not read key label"));
continue;
}
-
- /* Skip legacy entries. */
- if (strcmp(key_label, "generic-cut") == 0)
- continue;
-
+ p += strlen(key_label);
ht_entry.label = key_label;
- p = buf + strlen(key_label) + 1;
- ht_elm =
- HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
+ ht_elm = HTABLE_LOOKUP(ht_keybindings, &ht_keys, &ht_entry);
if (!ht_elm) {
skipped++;
- io_log_print(log, line,
- _("Key label not recognized"));
+ asprintf(&msg,
+ _("Key label not recognized: \"%s\""),
+ key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
continue;
}
- assigned = 0;
- for (;;) {
- char key_ch[BUFSIZ], tmpbuf[BUFSIZ];
-
- while (*p == ' ')
- p++;
- (void)strncpy(tmpbuf, p, BUFSIZ);
- tmpbuf[BUFSIZ - 1] = '\0';
- if (sscanf(tmpbuf, "%s", key_ch) == AWAITED) {
- int ch;
-
- if ((ch = keys_str2int(key_ch)) < 0) {
- char *unknown_key;
+ /* Assign keyboard keys to the virtual key. */
+ assigned = undefined = 0;
+ for (;;) {
+ if (sscanf(p, "%s%n", key_str, &n) != 1) {
+ if (assigned || undefined)
+ loaded++;
+ else {
skipped++;
- asprintf(&unknown_key,
- _("Error reading key: \"%s\""),
- key_ch);
- io_log_print(log, line, unknown_key);
- mem_free(unknown_key);
- } else {
- int used;
-
- used =
- keys_assign_binding(ch,
- ht_elm->
- key);
- if (used) {
- char *already_assigned;
-
- skipped++;
- asprintf(&already_assigned,
- _("\"%s\" assigned multiple times!"),
- key_ch);
- io_log_print(log, line,
- already_assigned);
- mem_free(already_assigned);
- } else {
- assigned++;
- }
+ asprintf(&msg,
+ _("No keys assigned to "
+ "\"%s\"."),
+ key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
}
- p += strlen(key_ch) + 1;
- } else {
- if (assigned)
- loaded++;
break;
}
+ p += n;
+ if (!strcmp(key_str, "UNDEFINED")) {
+ undefined++;
+ keys_assign_binding(-1, ht_elm->key);
+ } else if ((key = keys_str2int(key_str)) < 0) {
+ skipped++;
+ asprintf(&msg,
+ _("Keyname not recognized: \"%s\""),
+ key_str);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ } else if (keys_assign_binding(key, ht_elm->key)) {
+ skipped++;
+ asprintf(&msg,
+ _("\"%s\" assigned twice: \"%s\"."),
+ key_str, key_label);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ } else
+ assigned++;
}
}
file_close(keyfp, __FILE_POS__);
+ if (loaded < NBVKEYS && (i = keys_fill_missing()) < 1) {
+ skipped++;
+ strcpy(key_label, keys_get_label((enum vkey)(-i)));
+ strcpy(key_str, keys_get_binding((enum vkey)(-i)));
+ asprintf(&msg, _("Action \"%s\" absent, but default key \"%s\" "
+ "assigned to another action."),
+ key_label, key_str);
+ io_log_print(log, line, msg);
+ mem_free(msg);
+ }
file_close(log->fd, __FILE_POS__);
if (skipped > 0) {
- const char *view_log =
- _("There were some errors when loading keys file.");
- io_log_display(log, view_log, pager);
+ msg = _("Errors in the keys file.");
+ io_log_display(log, msg, pager);
+ WARN_MSG(_("Remove offending line(s) from the keys file, "
+ "aborting..."));
+ exit_calcurse(EXIT_FAILURE);
}
io_log_free(log);
- EXIT_IF(skipped > MAX_ERRORS,
- _("Too many errors while reading keys file, aborting..."));
- if (loaded < NBKEYS)
- keys_fill_missing();
- if (keys_check_missing_bindings())
- WARN_MSG(_("Some actions do not have any associated key bindings!"));
+ /* Default keys were inserted. */
+ if (loaded < NBVKEYS)
+ io_save_keys();
+ /* Should never occur. */
+ EXIT_IF(keys_check_missing(),
+ _("Some actions do not have any associated key bindings!"));
}
int io_check_dir(const char *dir)
@@ -1277,7 +1253,7 @@ static FILE *get_import_stream(enum import_type type, char **stream_name)
* A temporary log file is created in /tmp to store the import process report,
* and is cleared at the end.
*/
-void io_import_data(enum import_type type, char *stream_name,
+int io_import_data(enum import_type type, char *stream_name,
const char *fmt_ev, const char *fmt_rev,
const char *fmt_apt, const char *fmt_rapt,
const char *fmt_todo)
@@ -1312,7 +1288,7 @@ void io_import_data(enum import_type type, char *stream_name,
}
if (stream == NULL)
- return;
+ return 0;
memset(&stats, 0, sizeof stats);
@@ -1320,7 +1296,7 @@ void io_import_data(enum import_type type, char *stream_name,
if (log == NULL) {
if (stream != stdin)
file_close(stream, __FILE_POS__);
- return;
+ return 0;
}
if (type == IO_IMPORT_ICAL)
@@ -1377,8 +1353,11 @@ void io_import_data(enum import_type type, char *stream_name,
mem_free(stats_str[3]);
if (ui_mode == UI_CURSES)
mem_free(stream_name);
- if (!stats.skipped)
+ if (!stats.skipped) {
io_log_free(log);
+ return 1;
+ } else
+ return 0;
}
struct io_file *io_log_init(void)
@@ -1576,22 +1555,6 @@ unsigned io_get_pid(char *file)
}
/*
- * Check whether a file is empty.
- */
-int io_file_is_empty(char *file)
-{
- FILE *fp;
- int ret = -1;
-
- if (file && (fp = fopen(file, "r"))) {
- ret = (fgetc(fp) == '\n' && fgetc(fp) == EOF) || feof(fp);
- fclose(fp);
- }
-
- return ret;
-}
-
-/*
* Check whether two files are equal.
*/
int io_files_equal(const char *file1, const char *file2)
diff --git a/src/keys.c b/src/keys.c
index 3a25a0b..a5e9470 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -39,26 +39,73 @@
#include "calcurse.h"
-#define MAXKEYVAL KEY_MAX /* ncurses defines KEY_MAX as maximum key value */
-
-struct keydef_s {
- const char *label;
- const char *binding;
- const char *sb_label;
-};
+/*
+ * The interactive calcurse interface is controlled by "virtual keys", aka
+ * actions or commands. The virtual keys are defined by the type 'enum vkey',
+ * see calcurse.h. To each virtual key is assigned (or bound) zero or more
+ * keyboard keys/characters. A character (generated by a keyboard key) may be
+ * either an ordinary character or a pseudo-character. [An ordinary character
+ * is either a singlebyte ASCII character or a multibyte, UTF-8 encoded
+ * character; a pseudo-character (as supported by curses) is an escape sequence
+ * generated by a key.] A keyboard key/character is uniquely identified by its
+ * keyname (a character string) or by an integer (the Unicode code point of the
+ * character with a slight modification to accomodate the range of curses
+ * pseudo-characters). Mapping between the two forms is performed by the
+ * functions keys_str2int() and keys_int2str().
+ */
-static llist_t keys[NBKEYS];
-static enum key actions[MAXKEYVAL];
+/*
+ * Assignment of keys to virtual keys is held in the tabel keys[]. The entry for
+ * each virtual key is a linked list of keyboard keys (bindings); each list
+ * element is the keyname as returned by keys_int2str().
+ *
+ * At the very first run default keys are assigned to all virtual keys from a
+ * built-in table keydef[] and saved to disk in the calcurse config directory.
+ * Later the user may edit the key configuration and change the key bindings by
+ * adding/removing keys. If all keys are removed, the virtual key is left
+ * undefined. This state is also saved in the configuration file. The linked
+ * list for an undefined virtual key contains a single element with a null
+ * pointer as data.
+ */
+static llist_t keys[NBVKEYS];
+/*
+ * To cater for the other direction (which virtual key is a keyboard key
+ * assigned to), two constructions are needed: a table actions[] for the
+ * keyboard keys in the curses range, and a linked list actions_ext for
+ * multi-byte UTF-8 encoded keyboard characters.
+ *
+ * For each keyboard key (integer) in the curses key range, the virtual key
+ * (action) it is assigned to or, if not assigned, KEY_UNDEF.
+ */
+static enum vkey actions[KEY_MAX];
+/*
+ * For the millions of possible keyboard keys above the curses range, a linked
+ * list of keys which are actually bound to a virtual key.
+ * Each list element is a key_ext structure.
+ */
+llist_t actions_ext;
struct key_ext {
- int ch;
- enum key action;
+ int key;
+ enum vkey action;
};
-llist_t actions_ext;
+/*
+ * Assigning a keyboard key to a virtual key is accomplished by
+ * 1) either inserting the virtual key in the actions[] entry for the keyboard key
+ * or adding the pair (key, virtual key) to the list actions_ext
+ * 2) adding it in keys[] to the list for the virtual key
+ * See keys_assign_binding() below.
+ */
+/* The default key bindings for the virtual keys. */
+struct keydef_s {
+ const char *label; /* Name of the virtual key (action). */
+ const char *binding; /* String of space-separated keynames bound to it. */
+ const char *sb_label; /* Display name in the status bar menu. */
+};
#define gettext_noop(s) s
-static struct keydef_s keydef[NBKEYS] = {
+static struct keydef_s keydef[NBVKEYS] = {
{ "generic-cancel", "ESC", gettext_noop("Cancel") },
{ "generic-select", "SPC", gettext_noop("Select") },
{ "generic-credits", "@", gettext_noop("Credits") },
@@ -69,6 +116,7 @@ static struct keydef_s keydef[NBKEYS] = {
{ "generic-copy", "c", gettext_noop("Copy") },
{ "generic-paste", "p ^V", gettext_noop("Paste") },
{ "generic-change-view", "TAB", gettext_noop("Chg Win") },
+ { "generic-prev-view", "KEY_BTAB", gettext_noop("Prev Win") },
{ "generic-import", "i I", gettext_noop("Import") },
{ "generic-export", "x X", gettext_noop("Export") },
{ "generic-goto", "g G", gettext_noop("Go to") },
@@ -114,6 +162,47 @@ static struct keydef_s keydef[NBKEYS] = {
*/
static char *keynames[KEY_MAX];
+/* Maps a key code to a custom key name */
+struct custom_keyname_s {
+ int keycode;
+ char* keyname;
+};
+
+#define CUSTOM_KEYS 26
+
+/*
+ * Customized key names with calcurse short forms
+ */
+static struct custom_keyname_s custom_keynames[CUSTOM_KEYS] = {
+ { TAB, "TAB" },
+ { RETURN, "RET" },
+ { ESCAPE, "ESC" },
+ { SPACE, "SPC" },
+ { KEY_UP, "UP" },
+ { KEY_DOWN, "DWN" },
+ { KEY_LEFT, "LFT" },
+ { KEY_RIGHT, "RGT" },
+ { KEY_HOME, "HOM" },
+ { KEY_END, "END" },
+ { KEY_NPAGE, "PgD" },
+ { KEY_PPAGE, "PgU" },
+ { KEY_IC, "INS" },
+ { KEY_DC, "DEL" },
+ { KEY_F(1), "F1" },
+ { KEY_F(2), "F2" },
+ { KEY_F(3), "F3" },
+ { KEY_F(4), "F4" },
+ { KEY_F(5), "F5" },
+ { KEY_F(6), "F6" },
+ { KEY_F(7), "F7" },
+ { KEY_F(8), "F8" },
+ { KEY_F(9), "F9" },
+ { KEY_F(10), "F10" },
+ { KEY_F(11), "F11" },
+ { KEY_F(12), "F12" },
+};
+
+
static void dump_intro(FILE * fd)
{
const char *intro =
@@ -127,15 +216,26 @@ static void dump_intro(FILE * fd)
fprintf(fd, "%s\n", intro);
}
+static bool is_customized(int c) {
+ int i;
+
+ for (i = 0; i < CUSTOM_KEYS; i++)
+ if (c == custom_keynames[i].keycode)
+ return true;
+
+ return false;
+}
+
void keys_init(void)
{
int i;
const char *cp;
- for (i = 0; i < MAXKEYVAL; i++)
+ /* All keys unassigned. */
+ for (i = 0; i < KEY_MAX; i++)
actions[i] = KEY_UNDEF;
LLIST_INIT(&actions_ext);
- for (i = 0; i < NBKEYS; i++)
+ for (i = 0; i < NBVKEYS; i++)
LLIST_INIT(&keys[i]);
/* Initialization of the keynames table. */
@@ -144,40 +244,20 @@ void keys_init(void)
/* Insertion of ncurses names in the ASCII range ... */
for (i = 1; i < 128; i++)
- if ((cp = keyname(i)))
- keynames[i] = mem_strdup(cp);
- /* ... and for the ncurses escape keys (pseudokeys). */
+ if (!is_customized(i))
+ if ((cp = keyname(i)))
+ keynames[i] = mem_strdup(cp);
+
+ /* ... and for the ncurses pseudo-characters. */
for (i = KEY_MIN; i < KEY_MAX; i++)
- if ((cp = keyname(i)))
- keynames[i] = mem_strdup(cp);
+ if (!is_customized(i))
+ if ((cp = keyname(i)))
+ keynames[i] = mem_strdup(cp);
/* Replace some with calcurse short forms. */
- keynames[TAB] = "TAB";
- keynames[RETURN] = "RET";
- keynames[ESCAPE] = "ESC";
- keynames[SPACE] = "SPC";
- keynames[KEY_UP] = "UP";
- keynames[KEY_DOWN] = "DWN";
- keynames[KEY_LEFT] = "LFT";
- keynames[KEY_RIGHT] = "RGT";
- keynames[KEY_HOME] = "HOM";
- keynames[KEY_END] = "END";
- keynames[KEY_NPAGE] = "PgD";
- keynames[KEY_PPAGE] = "PgU";
- keynames[KEY_IC] = "INS";
- keynames[KEY_DC] = "DEL";
- keynames[KEY_F(1)] = "F1";
- keynames[KEY_F(2)] = "F2";
- keynames[KEY_F(3)] = "F3";
- keynames[KEY_F(4)] = "F4";
- keynames[KEY_F(5)] = "F5";
- keynames[KEY_F(6)] = "F6";
- keynames[KEY_F(7)] = "F7";
- keynames[KEY_F(8)] = "F8";
- keynames[KEY_F(9)] = "F9";
- keynames[KEY_F(10)] = "F10";
- keynames[KEY_F(11)] = "F11";
- keynames[KEY_F(12)] = "F12";
+ for (i = 0; i < CUSTOM_KEYS; i++) {
+ keynames[custom_keynames[i].keycode] = custom_keynames[i].keyname;
+ }
}
static void key_free(char *s)
@@ -189,7 +269,7 @@ void keys_free(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
+ for (i = 0; i < NBVKEYS; i++) {
LLIST_FREE_INNER(&keys[i], key_free);
LLIST_FREE(&keys[i]);
}
@@ -205,31 +285,40 @@ void keys_dump_defaults(char *file)
_("FATAL ERROR: could not create default keys file."));
dump_intro(fd);
- for (i = 0; i < NBKEYS; i++)
+ for (i = 0; i < NBVKEYS; i++)
fprintf(fd, "%s %s\n", keydef[i].label,
keydef[i].binding);
file_close(fd, __FILE_POS__);
}
-const char *keys_get_label(enum key key)
+const char *keys_get_label(enum vkey key)
{
EXIT_IF(key < 0
- || key > NBKEYS,
+ || key > NBVKEYS,
_("FATAL ERROR: key value out of bounds"));
return keydef[key].label;
}
+const char *keys_get_binding(enum vkey key)
+{
+ EXIT_IF(key < 0
+ || key > NBVKEYS,
+ _("FATAL ERROR: key value out of bounds"));
+
+ return keydef[key].binding;
+}
+
static int key_ext_hasch(struct key_ext *k, void *cbdata)
{
- return (k->ch == *((int *)cbdata));
+ return (k->key == *((int *)cbdata));
}
-enum key keys_get_action(int pressed)
+enum vkey keys_get_action(int pressed)
{
if (pressed < 0) {
return -1;
- } else if (pressed > MAXKEYVAL) {
+ } else if (pressed > KEY_MAX) {
llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &pressed,
key_ext_hasch);
if (!i)
@@ -274,7 +363,7 @@ void keys_wait_for_any_key(WINDOW *win)
keys_wgetch(win);
}
-enum key keys_get(WINDOW *win, int *count, int *reg)
+enum vkey keys_get(WINDOW *win, int *count, int *reg)
{
int ch = '0';
@@ -312,60 +401,89 @@ enum key keys_get(WINDOW *win, int *count, int *reg)
}
}
-static void add_key_str(enum key action, int key)
+static void add_if_undefined(enum vkey action)
{
- if (action > NBKEYS)
- return;
+ /* If list is empty, mark action as UNDEFINED. */
+ if (!keys[action].head)
+ LLIST_ADD(&keys[action], NULL);
+}
- LLIST_ADD(&keys[action], keys_int2str(key));
+static void del_if_undefined(enum vkey action)
+{
+ /* Action UNDEFINED? */
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ LLIST_REMOVE(&keys[action], keys[action].head);
}
-int keys_assign_binding(int key, enum key action)
+static void free_key_str(char *str)
{
- if (key < 0)
- return 1;
- if (key > KEY_MAX) {
- llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &key, key_ext_hasch);
- if (i)
- return 1;
- struct key_ext *k = mem_malloc(sizeof(struct key_ext));
- k->ch = key;
- k->action = action;
- LLIST_ADD(&actions_ext, k);
- } else {
- if (actions[key] != KEY_UNDEF)
- return 1;
- actions[key] = action;
- }
- add_key_str(action, key);
- return 0;
+ mem_free(str);
}
-static void del_key_str(enum key action, int key)
+static void add_key_str(enum vkey action, int key)
+{
+ if (action > NBVKEYS)
+ return;
+
+ del_if_undefined(action);
+ LLIST_ADD(&keys[action], keys_int2str(key));
+}
+
+static void del_key_str(enum vkey action, int key)
{
llist_item_t *i;
- char *oldstr = keys_int2str(key);;
+ char *oldstr = keys_int2str(key), *j;
- if (action > NBKEYS)
+ if (action > NBVKEYS)
return;
LLIST_FOREACH(&keys[action], i) {
- if (strcmp(LLIST_GET_DATA(i), oldstr) == 0) {
+ if (strcmp((j = LLIST_GET_DATA(i)), oldstr) == 0) {
LLIST_REMOVE(&keys[action], i);
+ free_key_str(j);
goto cleanup;
}
}
cleanup:
+ add_if_undefined(action);
mem_free(oldstr);
}
-void keys_remove_binding(int key, enum key action)
+/*
+ * Assign keyboard key "key" to virtual key "action" by
+ *
+ * - marking keyboard key "key" as used for virtual key "actual"
+ * - adding "key" to the list of assigned keys for "action" in the tabel keys[]
+ *
+ * The former is done by either inserting "action" in the "key" entry of tabel
+ * actions[], or for keys above the curses range, inserting (key, action) in the
+ * list actions_ext.
+ */
+int keys_assign_binding(int key, enum vkey action)
+{
+ if (key > KEY_MAX) {
+ if (LLIST_FIND_FIRST(&actions_ext, &key, key_ext_hasch))
+ return 1;
+ struct key_ext *k = mem_malloc(sizeof(struct key_ext));
+ k->key = key;
+ k->action = action;
+ LLIST_ADD(&actions_ext, k);
+ } else if (key > -1) {
+ if (actions[key] != KEY_UNDEF)
+ return 1;
+ actions[key] = action;
+ }
+ add_key_str(action, key);
+ return 0;
+}
+
+void keys_remove_binding(int key, enum vkey action)
{
if (key < 0)
return;
- if (key <= MAXKEYVAL) {
+ if (key <= KEY_MAX) {
actions[key] = KEY_UNDEF;
} else {
llist_item_t *i = LLIST_FIND_FIRST(&actions_ext, &key,
@@ -410,6 +528,8 @@ char *keys_int2str(int key)
{
char *res;
+ if (key == -1)
+ return NULL;
if (key < KEY_MAX) {
if (strcmp(keynames[key], "") == 0)
return NULL;
@@ -421,50 +541,44 @@ char *keys_int2str(int key)
}
}
-int keys_action_count_keys(enum key action)
+int keys_action_count_keys(enum vkey action)
{
llist_item_t *i;
int n = 0;
+ /* Action UNDEFINED? */
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ return 0;
+
LLIST_FOREACH(&keys[action], i)
- n++;
+ n++;
return n;
}
-const char *keys_action_firstkey(enum key action)
+const char *keys_action_firstkey(enum vkey action)
{
const char *s = LLIST_GET_DATA(LLIST_FIRST(&keys[action]));
return (s != NULL) ? s : "XXX";
}
-const char *keys_action_nkey(enum key action, int keynum)
+const char *keys_action_nkey(enum vkey action, int keynum)
{
return LLIST_GET_DATA(LLIST_NTH(&keys[action], keynum));
}
-char *keys_action_allkeys(enum key action)
+char *keys_action_allkeys(enum vkey action)
{
llist_item_t *i;
- static char keystr[BUFSIZ];
- int keystrlen = 0;
- int entrylen;
-
- if (!LLIST_FIRST(&keys[action]))
- return NULL;
-
- keystr[0] = '\0';
- LLIST_FOREACH(&keys[action], i) {
- entrylen = strlen(LLIST_GET_DATA(i)) + 1;
- if (keystrlen + entrylen >= BUFSIZ)
- break;
- memcpy(keystr + keystrlen, LLIST_GET_DATA(i), entrylen - 1);
- keystr[keystrlen + entrylen - 1] = ' ';
- keystrlen += entrylen;
- }
-
- keystr[keystrlen] = '\0';
- return keystr;
+ struct string keystr;
+
+ string_init(&keystr);
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[action])))
+ string_catf(&keystr, "%s", "UNDEFINED");
+ else
+ LLIST_FOREACH(&keys[action], i)
+ string_catf(&keystr, "%s ", LLIST_GET_DATA(i));
+ return string_buf(&keystr);
}
/* Need this to display keys properly inside status bar. */
@@ -509,7 +623,7 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
const char *label;
- if (binding_key < NBKEYS) {
+ if (binding_key < NBVKEYS) {
strncpy(key, keys_action_firstkey(binding_key), UTF8_MAXLEN);
key[UTF8_MAXLEN] = '\0';
label = gettext(keydef[binding_key].sb_label);
@@ -561,9 +675,9 @@ keys_display_bindings_bar(WINDOW * win, int *bindings, int count,
* Display information about the given key.
* (could not add the keys descriptions to keydef variable, because of i18n).
*/
-void keys_popup_info(enum key key)
+void keys_popup_info(enum vkey key)
{
- char *info[NBKEYS];
+ char *info[NBVKEYS];
WINDOW *infowin;
info[KEY_GENERIC_CANCEL] = _("Cancel the ongoing action.");
@@ -582,6 +696,8 @@ void keys_popup_info(enum key key)
_("Paste an item at the current position.");
info[KEY_GENERIC_CHANGE_VIEW] =
_("Select next panel in calcurse main screen.");
+ info[KEY_GENERIC_PREV_VIEW] =
+ _("Select previous panel in calcurse main screen.");
info[KEY_GENERIC_IMPORT] = _("Import data from an external file.");
info[KEY_GENERIC_EXPORT] = _("Export data to a new file format.");
info[KEY_GENERIC_GOTO] = _("Select the day to go to.");
@@ -651,7 +767,7 @@ void keys_popup_info(enum key key)
info[KEY_LOWER_PRIORITY] =
_("Lower a task priority inside the todo panel.");
- if (key > NBKEYS)
+ if (key > NBVKEYS)
return;
#define WINROW 10
@@ -668,59 +784,75 @@ void keys_popup_info(enum key key)
void keys_save_bindings(FILE * fd)
{
int i;
- char *action;
+ char *keys;
EXIT_IF(fd == NULL, _("FATAL ERROR: null file pointer."));
dump_intro(fd);
- for (i = 0; i < NBKEYS; i++) {
- action = keys_action_allkeys(i);
- if (action)
- fprintf(fd, "%s %s\n", keydef[i].label, action);
+ for (i = 0; i < NBVKEYS; i++) {
+ if ((keys = keys_action_allkeys(i)))
+ fprintf(fd, "%s %s\n", keydef[i].label, keys);
}
+ mem_free(keys);
}
-int keys_check_missing_bindings(void)
+int keys_check_undefined(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
- if (!LLIST_FIRST(&keys[i]))
+ for (i = 0; i < NBVKEYS; i++) {
+ if (!LLIST_GET_DATA(LLIST_FIRST(&keys[i])))
return 1;
}
return 0;
}
-void keys_fill_missing(void)
+int keys_check_missing(void)
{
int i;
- for (i = 0; i < NBKEYS; i++) {
- if (!LLIST_FIRST(&keys[i])) {
- char *p, tmpbuf[BUFSIZ];
-
- strncpy(tmpbuf, keydef[i].binding, BUFSIZ);
- tmpbuf[BUFSIZ - 1] = '\0';
- p = tmpbuf;
- for (;;) {
- char key_ch[BUFSIZ];
-
- while (*p == ' ')
- p++;
- if (sscanf(p, "%s", key_ch) == 1) {
- int ch, used;
-
- ch = keys_str2int(key_ch);
- used = keys_assign_binding(ch, i);
- if (used)
- WARN_MSG(_("When adding default key for \"%s\", "
- "\"%s\" was already assigned!"),
- keydef[i].label,
- key_ch);
- p += strlen(key_ch);
- } else {
- break;
- }
- }
+ for (i = 0; i < NBVKEYS; i++) {
+ if (!LLIST_FIRST(&keys[i]))
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Insert default keybindings for missing actions.
+ * Return either the number of actions assigned to (on success) or, if default
+ * keys could not be assigned, the negative index into the keydef[] table of the
+ * failing action.
+ */
+int keys_fill_missing(void)
+{
+ int i, ch, assign, assigned;
+ char *p, key_ch[BUFSIZ];
+
+ for (i = assigned = 0; i < NBVKEYS; i++) {
+ if (LLIST_FIRST(&keys[i]))
+ continue;
+
+ p = (char *)keydef[i].binding;
+ for (assign = 0;;) {
+ while (*p == ' ')
+ p++;
+ if (sscanf(p, "%s", key_ch) == 1) {
+ ch = keys_str2int(key_ch);
+ if (keys_assign_binding(ch, i))
+ return -i;
+ else
+ assign = 1;
+ p += strlen(key_ch);
+ } else
+ break;
}
+ assigned += assign;
+ }
+
+ if (assigned) {
+ p = (assigned == 1) ? "": "s";
+ WARN_MSG(_("Default key(s) assigned to %d action%s."),
+ assigned, p);
}
+ return assigned;
}
diff --git a/src/listbox.c b/src/listbox.c
index 2b39aa8..d86f540 100644
--- a/src/listbox.c
+++ b/src/listbox.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/llist.c b/src/llist.c
index aca0a9d..d31f004 100644
--- a/src/llist.c
+++ b/src/llist.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -109,6 +109,34 @@ llist_item_t *llist_next(llist_item_t * i)
}
/*
+ * Return the predecessor of a list item or, if head, the list item itself,
+ * or if not in the list, NULL.
+ * The list item may be supplied either directly (i) or as a pointer to
+ * the contents (data); the first case takes precedence.
+ */
+static llist_item_t *llist_prev(llist_t *l, llist_item_t *i, void *data)
+{
+ llist_item_t *j;
+
+ if (!i && !data)
+ return NULL;
+
+ if (l->head == i || l->head->data == data)
+ return l->head;
+
+ if (i) {
+ for (j = l->head; j; j = j->next)
+ if (j->next == i)
+ return j;
+ } else {
+ for (j = l->head; j && j->next; j = j->next)
+ if (j->next->data == data)
+ return j;
+ }
+ return NULL;
+}
+
+/*
* Return the successor of a list item if it is matched by some filter
* callback. Return NULL otherwise.
*/
@@ -150,34 +178,94 @@ void llist_add(llist_t * l, void *data)
}
/*
+ * Insert an existing item in a sorted list.
+ */
+static void llist_relink(llist_t *l, llist_item_t *i, llist_fn_cmp_t fn_cmp)
+{
+ llist_item_t *j;
+
+ if (!i)
+ return;
+
+ i->next = NULL;
+ if (!l->head) {
+ l->head = l->tail = i;
+ } else if (fn_cmp(i->data, l->tail->data) >= 0) {
+ l->tail->next = i;
+ l->tail = i;
+ } else if (fn_cmp(i->data, l->head->data) < 0) {
+ i->next = l->head;
+ l->head = i;
+ } else {
+ j = l->head;
+ while (j->next && fn_cmp(i->data, j->next->data) >= 0)
+ j = j->next;
+ i->next = j->next;
+ j->next = i;
+ }
+}
+
+/*
+ * Unlink an item from a list and return it.
+ */
+static llist_item_t *llist_unlink(llist_t *l, llist_item_t *i)
+{
+ llist_item_t *p;
+
+ if (!i)
+ return NULL;
+
+ p = llist_prev(l, i, NULL);
+ if (!p)
+ return NULL;
+
+ if (i == l->tail)
+ l->tail = (i == l->head) ? NULL : p;
+ if (i == l->head)
+ l->head = i->next;
+ else
+ p->next = i->next;
+ i->next = NULL;
+ return i;
+}
+
+/*
+ * Find an item matched by some filter callback; start from a specified item.
+ */
+static llist_item_t *llist_find_from(llist_item_t *i, void *data,
+ llist_fn_match_t fn_match)
+{
+ if (!i)
+ return NULL;
+
+ if (fn_match) {
+ for (; i; i = i->next) {
+ if (fn_match(i->data, data))
+ return i;
+ }
+ } else {
+ for (; i; i = i->next) {
+ if (i->data == data)
+ return i;
+ }
+ }
+
+ return NULL;
+}
+
+/*
* Add an item to a sorted list.
*/
void llist_add_sorted(llist_t * l, void *data, llist_fn_cmp_t fn_cmp)
{
llist_item_t *o = mem_malloc(sizeof(llist_item_t));
- llist_item_t *i;
if (o) {
o->data = data;
o->next = NULL;
-
- if (!l->head) {
- l->head = l->tail = o;
- } else if (fn_cmp(o->data, l->tail->data) >= 0) {
- l->tail->next = o;
- l->tail = o;
- } else if (fn_cmp(o->data, l->head->data) < 0) {
- o->next = l->head;
- l->head = o;
- } else {
- i = l->head;
- while (i->next
- && fn_cmp(o->data, i->next->data) >= 0)
- i = i->next;
- o->next = i->next;
- i->next = o;
- }
}
+
+ llist_relink(l, o, fn_cmp);
}
/*
@@ -209,21 +297,7 @@ void llist_remove(llist_t * l, llist_item_t * i)
llist_item_t *llist_find_first(llist_t * l, void *data,
llist_fn_match_t fn_match)
{
- llist_item_t *i;
-
- if (fn_match) {
- for (i = l->head; i; i = i->next) {
- if (fn_match(i->data, data))
- return i;
- }
- } else {
- for (i = l->head; i; i = i->next) {
- if (i->data == data)
- return i;
- }
- }
-
- return NULL;
+ return l ? llist_find_from(l->head, data, fn_match) : NULL;
}
/*
@@ -232,22 +306,7 @@ llist_item_t *llist_find_first(llist_t * l, void *data,
llist_item_t *llist_find_next(llist_item_t * i, void *data,
llist_fn_match_t fn_match)
{
- if (i) {
- i = i->next;
- if (fn_match) {
- for (; i; i = i->next) {
- if (fn_match(i->data, data))
- return i;
- }
- } else {
- for (; i; i = i->next) {
- if (i->data == data)
- return i;
- }
- }
- }
-
- return NULL;
+ return i ? llist_find_from(i->next, data, fn_match) : NULL;
}
/*
@@ -261,17 +320,42 @@ llist_item_t *llist_find_nth(llist_t * l, int n, void *data,
if (n < 0)
return NULL;
- if (fn_match) {
- for (i = l->head; i; i = i->next) {
- if (fn_match(i->data, data) && (n-- == 0))
- return i;
- }
- } else {
- for (i = l->head; i; i = i->next) {
- if ((i->data == data) && (n-- == 0))
- return i;
- }
+ for (i = l->head; i; i = i->next, n--) {
+ i = llist_find_from(i, data, fn_match);
+ if (!i || !n)
+ return i;
}
return NULL;
}
+
+/*
+ * Reorder a sorted linked list when an item has changed.
+ */
+void llist_reorder(llist_t *l, void *data, llist_fn_cmp_t fn_cmp)
+{
+ llist_item_t *o, *p;
+
+ if (!(p = llist_prev(l, NULL, data)))
+ return;
+
+ /* List head? */
+ if (p->data == data)
+ o = p;
+ else
+ o = p->next;
+
+ /* Sorted already?
+ * Note: p is either the previous element or o itself.
+ */
+ if (o->next &&
+ fn_cmp(p->data, o->data) <= 0 &&
+ fn_cmp(o->data, o->next->data) <= 0)
+ return;
+ if (!o->next &&
+ fn_cmp(p->data, o->data) <= 0)
+ return;
+
+ /* Link manipulation only. */
+ llist_relink(l, llist_unlink(l, o), fn_cmp);
+}
diff --git a/src/llist.h b/src/llist.h
index 9533819..0dd15bf 100644
--- a/src/llist.h
+++ b/src/llist.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -99,8 +99,11 @@ void *llist_get_data(llist_item_t *);
void llist_add(llist_t *, void *);
void llist_add_sorted(llist_t *, void *, llist_fn_cmp_t);
void llist_remove(llist_t *, llist_item_t *);
+void llist_reorder(llist_t *, void *, llist_fn_cmp_t);
#define LLIST_ADD(l, data) llist_add(l, data)
#define LLIST_ADD_SORTED(l, data, fn_cmp) \
llist_add_sorted(l, data, (llist_fn_cmp_t)fn_cmp)
#define LLIST_REMOVE(l, i) llist_remove(l, i)
+#define LLIST_REORDER(l, data, fn_cmp) \
+ llist_reorder(l, data, (llist_fn_cmp_t)fn_cmp)
diff --git a/src/llist_ts.h b/src/llist_ts.h
index 6597cde..a4b6184 100644
--- a/src/llist_ts.h
+++ b/src/llist_ts.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -90,3 +90,5 @@ struct llist_ts {
#define LLIST_TS_REMOVE(l_ts, i) llist_remove ((llist_t *)l_ts, i)
#define LLIST_TS_ADD_SORTED(l_ts, data, fn_cmp) \
llist_add_sorted ((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
+#define LLIST_TS_REORDER(l_ts, data, fn_cmp) \
+ llist_reorder((llist_t *)l_ts, data, (llist_fn_cmp_t)fn_cmp)
diff --git a/src/mem.c b/src/mem.c
index 8b8a5d5..ce3cf80 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/note.c b/src/note.c
index 40e0882..655ad89 100644
--- a/src/note.c
+++ b/src/note.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -94,9 +94,7 @@ void edit_note(char **note, const char *editor)
const char *arg[] = { editor, tmppath, NULL };
wins_launch_external(arg);
- if (io_file_is_empty(tmppath) > 0) {
- erase_note(note);
- } else if ((fp = fopen(tmppath, "r"))) {
+ if ((fp = fopen(tmppath, "r"))) {
sha1_stream(fp, sha1);
fclose(fp);
*note = sha1;
diff --git a/src/notify.c b/src/notify.c
index 036af0f..6eda361 100644
--- a/src/notify.c
+++ b/src/notify.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -137,9 +137,6 @@ void notify_init_vars(void)
strncpy(nbar.cmd, cmd, BUFSIZ);
nbar.cmd[BUFSIZ - 1] = '\0';
- if ((nbar.shell = getenv("SHELL")) == NULL)
- nbar.shell = "/bin/sh";
-
nbar.notify_all = 0;
pthread_attr_init(&detached_thread_attr);
@@ -216,26 +213,18 @@ void notify_reinit_bar(void)
/* Launch user defined command as a notification. */
unsigned notify_launch_cmd(void)
{
- int pid;
+ char const *arg[2] = { nbar.cmd, NULL };
+ int pid, pin, pout, perr;
if (notify_app.state & APOINT_NOTIFIED)
return 1;
notify_app.state |= APOINT_NOTIFIED;
- pid = fork();
-
- if (pid < 0) {
- ERROR_MSG(_("error while launching command: could not fork"));
- return 0;
- } else if (pid == 0) {
- /* Child: launch user defined command */
- if (execlp(nbar.shell, nbar.shell, "-c", nbar.cmd, NULL) <
- 0) {
- ERROR_MSG(_("error while launching command"));
- _exit(1);
- }
- _exit(0);
+ if ((pid = shell_exec(&pin, &pout, &perr, 1, *arg, arg))) {
+ close(pin);
+ close(pout);
+ close(perr);
}
return 1;
diff --git a/src/pcal.c b/src/pcal.c
index 78da0bb..435656a 100644
--- a/src/pcal.c
+++ b/src/pcal.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -102,8 +102,8 @@ static void pcal_export_header(FILE * stream)
{
fputs("# calcurse pcal export\n", stream);
fputs("\n# =======\n# options\n# =======\n", stream);
- fprintf(stream, "opt -A -K -l -m -F %s\n",
- ui_calendar_week_begins_on_monday()? "Monday" : "Sunday");
+ fprintf(stream, "opt -A -K -l -m -F %s\n", get_wday_default_string(
+ ui_calendar_get_wday_start()));
fputs("# Display week number (i.e. 1-52) on every Monday\n",
stream);
fprintf(stream, "all monday in all week %%w\n");
diff --git a/src/queue.c b/src/queue.c
index a00ebad..41cb69b 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/recur.c b/src/recur.c
index 3a16d1e..10523ad 100644
--- a/src/recur.c
+++ b/src/recur.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -253,8 +253,13 @@ void recur_apoint_free(struct recur_apoint *rapt)
mem_free(rapt->mesg);
if (rapt->note)
mem_free(rapt->note);
- if (rapt->rpt)
+ if (rapt->rpt) {
+ recur_free_exc_list(&rapt->rpt->exc);
+ recur_free_int_list(&rapt->rpt->bywday);
+ recur_free_int_list(&rapt->rpt->bymonth);
+ recur_free_int_list(&rapt->rpt->bymonthday);
mem_free(rapt->rpt);
+ }
recur_free_exc_list(&rapt->exc);
mem_free(rapt);
}
@@ -264,8 +269,13 @@ void recur_event_free(struct recur_event *rev)
mem_free(rev->mesg);
if (rev->note)
mem_free(rev->note);
- if (rev->rpt)
+ if (rev->rpt) {
+ recur_free_exc_list(&rev->rpt->exc);
+ recur_free_int_list(&rev->rpt->bywday);
+ recur_free_int_list(&rev->rpt->bymonth);
+ recur_free_int_list(&rev->rpt->bymonthday);
mem_free(rev->rpt);
+ }
recur_free_exc_list(&rev->exc);
mem_free(rev);
}
@@ -517,8 +527,7 @@ char *recur_apoint_scan(FILE *f, struct tm start, struct tm end,
/* Does it occur on the start day? */
if (!recur_item_find_occurrence(tstart, tend - tstart, rpt, NULL,
- update_time_in_date(tstart, 0, 0),
- NULL)) {
+ DAY(tstart), NULL)) {
char *fmt = _("recurrence error: not on start day (%s)");
return day_ins(&fmt, tstart);
}
@@ -590,8 +599,7 @@ char *recur_event_scan(FILE * f, struct tm start, int id,
/* Does it occur on the start day? */
if (!recur_item_find_occurrence(tstart, -1, rpt, NULL,
- update_time_in_date(tstart, 0, 0),
- NULL)) {
+ DAY(tstart), NULL)) {
char *fmt = _("recurrence error: not on start day (%s)");
return day_ins(&fmt, tstart);
}
@@ -1005,14 +1013,20 @@ static int find_occurrence(time_t start, long dur, struct rpt *rpt, llist_t *exc
if (rpt->until && t >= NEXTDAY(rpt->until))
return 0;
- /* Does it span the given day? */
- if (t + DUR(t) < day)
+ /* Does it span the given day?
+ *
+ * NOTE: An appointment ending at 00:00 is not considered to span the
+ * given day, unless the appointment is an appointment without
+ * specified end time, which is internally treated as appointment with
+ * duration 0.
+ */
+ if (t + DUR(t) >= day || (t == day && dur == 0)) {
+ if (occurrence)
+ *occurrence = t;
+ return 1;
+ } else {
return 0;
-
- if (occurrence)
- *occurrence = t;
-
- return 1;
+ }
}
#undef DUR
@@ -1209,7 +1223,7 @@ static int expand_monthly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1243,7 +1257,7 @@ static int expand_monthly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1349,7 +1363,7 @@ static int expand_yearly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1394,7 +1408,7 @@ static int expand_yearly(time_t start, long dur, struct rpt *rpt, llist_t *exc,
-WEEKINDAYS
);
r.until = date_sec_change(
- update_time_in_date(nstart, 0, 0),
+ DAY(nstart),
0,
r.freq * WEEKINDAYS
);
@@ -1840,7 +1854,7 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
return 0;
for (n--, *nth = s; n > 0; n--) {
- day = update_time_in_date(*nth, 0, 0);
+ day = DAY(*nth);
if (!recur_next_occurrence(s, d, r, e, day, nth))
break;
}
@@ -1854,19 +1868,20 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
time_t day, time_t *prev)
{
- time_t prev_day, next;
+ int ret = 0;
- if (day <= update_time_in_date(s, 0, 0))
- return 0;
- next = *prev = s;
- while (update_time_in_date(next, 0, 0) < day) {
- /* Set new previous and next. */
- *prev = next;
- prev_day = update_time_in_date(*prev, 0, 0);
- recur_next_occurrence(s, d, r, e, prev_day, &next);
- /* Multi-day appointment */
- if (next == *prev)
- next = NEXTDAY(*prev);
+ if (day <= DAY(s))
+ return ret;
+
+ while (DAY(s) < day) {
+ day = PREVDAY(day);
+ if (recur_item_find_occurrence(s, d, r, e, day, prev)) {
+ /* Multi-day appointment. */
+ if (d != -1 && *prev < day && day < *prev + d)
+ continue;
+ ret = 1;
+ break;
+ }
}
- return 1;
+ return ret;
}
diff --git a/src/sha1.c b/src/sha1.c
index 3826c76..6ab63f8 100644
--- a/src/sha1.c
+++ b/src/sha1.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,7 @@
#include <stdlib.h>
#include <string.h>
+#include "config.h"
#include "sha1.h"
#define rol(val, n) (((val) << (n)) | ((val) >> (32 - (n))))
diff --git a/src/sha1.h b/src/sha1.h
index bdba4e8..25d60b9 100644
--- a/src/sha1.h
+++ b/src/sha1.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -52,6 +52,6 @@ typedef struct {
void sha1_init(sha1_ctx_t *);
void sha1_update(sha1_ctx_t *, const uint8_t *, unsigned int);
-void sha1_final(sha1_ctx_t *, uint8_t *);
+void sha1_final(sha1_ctx_t *, uint8_t[SHA1_DIGESTLEN]);
void sha1_digest(const char *, char *);
void sha1_stream(FILE *, char *);
diff --git a/src/sigs.c b/src/sigs.c
index fab4498..9320652 100644
--- a/src/sigs.c
+++ b/src/sigs.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/strings.c b/src/strings.c
index b3dc1c4..ed90bc7 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -85,6 +85,7 @@ int string_vcatf(struct string *sb, const char *format, va_list ap)
ap2);
}
sb->len += n;
+ va_end(ap2);
return n;
}
diff --git a/src/todo.c b/src/todo.c
index aa77b15..9bd8f8a 100644
--- a/src/todo.c
+++ b/src/todo.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -158,9 +158,7 @@ void todo_delete(struct todo *todo)
*/
void todo_resort(struct todo *t)
{
- llist_item_t *i = LLIST_FIND_FIRST(&todolist, t, NULL);
- LLIST_REMOVE(&todolist, i);
- LLIST_ADD_SORTED(&todolist, t, todo_cmp);
+ LLIST_REORDER(&todolist, t, todo_cmp);
}
/* Flag a todo item. */
diff --git a/src/ui-calendar.c b/src/ui-calendar.c
index 4a8ef44..c1719d8 100644
--- a/src/ui-calendar.c
+++ b/src/ui-calendar.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -45,14 +45,14 @@
#include "calcurse.h"
static struct date today, slctd_day;
-static unsigned ui_calendar_view, week_begins_on_monday;
+static unsigned ui_calendar_view;
+static int wday_start; /* this is used in signed arithmetic */
static pthread_mutex_t date_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
-static void draw_monthly_view(struct scrollwin *, struct date *, unsigned);
-static void draw_weekly_view(struct scrollwin *, struct date *, unsigned);
-static void (*draw_calendar[CAL_VIEWS]) (struct scrollwin *, struct date *,
- unsigned) = {
-draw_monthly_view, draw_weekly_view};
+static void draw_monthly_view(struct scrollwin *, struct date *);
+static void draw_weekly_view(struct scrollwin *, struct date *);
+static void (*draw_calendar[CAL_VIEWS]) (struct scrollwin *,
+ struct date *) = {draw_monthly_view, draw_weekly_view};
/* Six weeks cover a month. */
static int monthly_view_cache[WEEKINDAYS * 6];
@@ -148,30 +148,26 @@ struct date *ui_calendar_get_today(void)
/* Needed to display sunday or monday as the first day of week in calendar. */
void ui_calendar_set_first_day_of_week(enum wday first_day)
{
- switch (first_day) {
- case SUNDAY:
- week_begins_on_monday = 0;
- break;
- case MONDAY:
- week_begins_on_monday = 1;
- break;
- default:
+ if (first_day >= 0 && first_day <= 6)
+ wday_start = first_day;
+ else {
ERROR_MSG(_("ERROR setting first day of week"));
- week_begins_on_monday = 0;
- /* NOTREACHED */
+ wday_start = 0;
}
}
/* Swap first day of week in calendar. */
void ui_calendar_change_first_day_of_week(void)
{
- week_begins_on_monday = !week_begins_on_monday;
+ wday_start++;
+ if(wday_start >= WEEKINDAYS)
+ wday_start = 0;
}
/* Return 1 if week begins on monday, 0 otherwise. */
-unsigned ui_calendar_week_begins_on_monday(void)
+int ui_calendar_get_wday_start(void)
{
- return week_begins_on_monday;
+ return wday_start;
}
/* Fill in the given variable with the current date. */
@@ -219,18 +215,14 @@ void ui_calendar_monthly_view_cache_set_invalid(void)
monthly_view_cache_valid = 0;
}
-static int weeknum(const struct tm *t, int firstweekday)
+static int weeknum(const struct tm *t, int wday_start)
{
int wday, wnum;
wday = t->tm_wday;
- if (firstweekday == MONDAY) {
- if (wday == SUNDAY)
- wday = 6;
- else
- wday--;
- }
- wnum = ((t->tm_yday + WEEKINDAYS - wday) / WEEKINDAYS);
+ wnum = ((t->tm_yday + WEEKINDAYS + -modify_wday(wday, -wday_start))
+ / WEEKINDAYS);
+
if (wnum < 0)
wnum = 0;
@@ -296,7 +288,7 @@ static int ISO8601weeknum(const struct tm *t)
* Return the tm structure for the first day of the first week
* (containing a day) of the selected month.
*/
-static struct tm get_first_day(unsigned sunday_first)
+static struct tm get_first_day(int wday_start)
{
struct tm t;
struct date d;
@@ -308,26 +300,20 @@ static struct tm get_first_day(unsigned sunday_first)
t = date2tm(d, 0, 0);
mktime(&t);
/* get the first day of the week */
- date_change(&t, 0,
- -(sunday_first ?
- t.tm_wday :
- (t.tm_wday + WEEKINDAYS - 1) % WEEKINDAYS));
+ date_change(&t, 0, -modify_wday(t.tm_wday, -wday_start));
+
return t;
}
-static struct tm get_first_weekday(unsigned sunday_first)
+static struct tm get_first_weekday(int wday_start)
{
- int c_wday, days_to_remove;
+ int c_wday;
struct tm t;
c_wday = ui_calendar_get_wday(&slctd_day);
- if (sunday_first)
- days_to_remove = c_wday;
- else
- days_to_remove = c_wday == 0 ? WEEKINDAYS - 1 : c_wday - 1;
-
t = date2tm(slctd_day, 0, 0);
- date_change(&t, 0, -days_to_remove);
+
+ date_change(&t, 0, -modify_wday(c_wday, -wday_start));
return t;
}
@@ -346,8 +332,7 @@ static void draw_week_number(struct scrollwin *sw, struct tm t)
/* Draw the monthly view inside calendar panel. */
static void
-draw_monthly_view(struct scrollwin *sw, struct date *current_day,
- unsigned sunday_first)
+draw_monthly_view(struct scrollwin *sw, struct date *current_day)
{
struct date c_day;
int slctd, w_day, numdays, j, week = 0;
@@ -373,7 +358,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
* Step forward by week until past the last day of the month.
* The first day of the first week may belong to the previous month.
*/
- t = t_first = get_first_day(sunday_first);
+ t = t_first = get_first_day(wday_start);
t.tm_mday += WEEKINDAYS;
mktime(&t);
last_day += WEEKINDAYS;
@@ -423,7 +408,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
custom_apply_attr(sw->inner, ATTR_HIGHEST);
for (j = 0; j < WEEKINDAYS; j++) {
mvwaddstr(sw->inner, ofs_y, ofs_x + weekw + 4 * j,
- nl_langinfo(ABDAY_1 + (1 + j - sunday_first) % WEEKINDAYS));
+ nl_langinfo(ABDAY_1 + modify_wday(j, wday_start)));
}
custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK;
@@ -449,11 +434,9 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
if (j == first_day ||
(mo == 1 && j == WEEKINDAYS) ||
(mo == 12 && j >= 4 * WEEKINDAYS)) {
- if (sunday_first)
- date_change(&t, 0, 1);
+ date_change(&t, 0, WDAY(MONDAY));
week = ISO8601weeknum(&t);
- if (sunday_first)
- date_change(&t, 0, -1);
+ date_change(&t, 0, -WDAY(MONDAY));
} else
week++;
}
@@ -506,8 +489,7 @@ draw_monthly_view(struct scrollwin *sw, struct date *current_day,
/* Draw the weekly view inside calendar panel. */
static void
-draw_weekly_view(struct scrollwin *sw, struct date *current_day,
- unsigned sunday_first)
+draw_weekly_view(struct scrollwin *sw, struct date *current_day)
{
#define DAYSLICESNO 6
const int WCALWIDTH = 28;
@@ -520,14 +502,14 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
OFFX = (wins_sbar_width() - 2 - WCALWIDTH) / 2;
/* Print the week number, calculated from monday. */
- t = get_first_weekday(0);
+ t = get_first_weekday(MONDAY);
draw_week_number(sw, t);
/* Now draw calendar view. */
for (j = 0; j < WEEKINDAYS; j++) {
/* get next day */
if (j == 0)
- t = get_first_weekday(sunday_first);
+ t = get_first_weekday(wday_start);
else
date_change(&t, 0, 1);
@@ -538,7 +520,7 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
/* print the day names, with regards to the first day of the week */
custom_apply_attr(sw->inner, ATTR_HIGHEST);
mvwaddstr(sw->inner, OFFY, OFFX + 4 * j,
- nl_langinfo(ABDAY_1 + (1 + j - sunday_first) % WEEKINDAYS));
+ nl_langinfo(ABDAY_1 + modify_wday(j, wday_start)));
custom_remove_attr(sw->inner, ATTR_HIGHEST);
/* Check if the day to be printed has an item or not. */
@@ -578,9 +560,8 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
if (j != WEEKINDAYS - 1
&& i != DAYSLICESNO - 1) {
WINS_CALENDAR_LOCK;
- mvwhline(sw->inner, OFFY + 2 + i,
- OFFX + 3 + 4 * j, ACS_S9,
- 2);
+ mvwaddstr(sw->inner, OFFY + 2 + i,
+ OFFX + 3 + 4 * j, "__");
WINS_CALENDAR_UNLOCK;
}
if (slices[i]) {
@@ -611,9 +592,9 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
/* Draw marks to indicate midday on the sides of the calendar. */
WINS_CALENDAR_LOCK;
custom_apply_attr(sw->inner, ATTR_HIGHEST);
- mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2, OFFX, ACS_S9, 1);
- mvwhline(sw->inner, OFFY + 1 + DAYSLICESNO / 2,
- OFFX + WCALWIDTH - 1, ACS_S9, 1);
+ mvwaddch(sw->inner, OFFY + 1 + DAYSLICESNO / 2, OFFX, '<');
+ mvwaddch(sw->inner, OFFY + 1 + DAYSLICESNO / 2,
+ OFFX + WCALWIDTH - 1, '>');
custom_remove_attr(sw->inner, ATTR_HIGHEST);
WINS_CALENDAR_UNLOCK;
@@ -624,11 +605,9 @@ draw_weekly_view(struct scrollwin *sw, struct date *current_day,
void ui_calendar_update_panel(void)
{
struct date current_day;
- unsigned sunday_first;
ui_calendar_store_current_date(&current_day);
- sunday_first = !ui_calendar_week_begins_on_monday();
- draw_calendar[ui_calendar_view] (&sw_cal, &current_day, sunday_first);
+ draw_calendar[ui_calendar_view] (&sw_cal, &current_day);
wins_scrollwin_display(&sw_cal, NOHILT);
}
@@ -728,28 +707,14 @@ void ui_calendar_move(enum move move, int count)
ret = date_change(&t, count * YEARINMONTHS, 0);
break;
case WEEK_START:
- /* Normalize struct tm to get week day number. */
mktime(&t);
- if (ui_calendar_week_begins_on_monday())
- days_to_remove =
- ((t.tm_wday ==
- 0) ? WEEKINDAYS - 1 : t.tm_wday - 1);
- else
- days_to_remove =
- ((t.tm_wday == 0) ? 0 : t.tm_wday);
+ days_to_remove = WDAY(t.tm_wday);
days_to_remove += (count - 1) * WEEKINDAYS;
ret = date_change(&t, 0, -days_to_remove);
break;
case WEEK_END:
mktime(&t);
- if (ui_calendar_week_begins_on_monday())
- days_to_add =
- ((t.tm_wday ==
- 0) ? 0 : WEEKINDAYS - t.tm_wday);
- else
- days_to_add = ((t.tm_wday == 0) ?
- WEEKINDAYS - 1 : WEEKINDAYS - 1 -
- t.tm_wday);
+ days_to_add = modify_wday(-t.tm_wday, wday_start - 1);
days_to_add += (count - 1) * WEEKINDAYS;
ret = date_change(&t, 0, days_to_add);
break;
diff --git a/src/ui-day.c b/src/ui-day.c
index 613e242..6a038fa 100644
--- a/src/ui-day.c
+++ b/src/ui-day.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -79,7 +79,7 @@ void ui_day_find_sel(void)
*/
time_t ui_day_sel_date(void)
{
- return update_time_in_date(ui_day_get_sel()->order, 0, 0);
+ return DAY(ui_day_get_sel()->order);
}
/*
@@ -184,10 +184,9 @@ static void update_start_time(time_t *start, long *dur, struct rpt *rpt, int mov
newtime = day_edit_time(*start, *dur, move);
if (!newtime)
break;
- if (rpt && !recur_item_find_occurrence(
- newtime, *dur, rpt, NULL,
- update_time_in_date(newtime, 0, 0),
- NULL)) {
+ if (rpt && !recur_item_find_occurrence(newtime, *dur, rpt, NULL,
+ DAY(newtime),
+ NULL)) {
msg = day_ins(&msg_match, newtime);
status_mesg(msg, msg_enter);
mem_free(msg);
@@ -786,10 +785,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
continue;
}
/* Until is midnight of the day. */
- nrpt.until = date_sec_change(
- update_time_in_date(start, 0, 0),
- 0, days
- );
+ nrpt.until = date_sec_change(DAY(start), 0, days);
} else if (*timstr == '#') {
char *eos;
count = strtol(timstr + 1, &eos, 10);
@@ -802,7 +798,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
keys_wgetch(win[KEY].p);
continue;
}
- nrpt.until = update_time_in_date(until, 0, 0);
+ nrpt.until = DAY(until);
break;
} else {
int year, month, day;
@@ -816,7 +812,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
nrpt.until = date2sec(d, 0, 0);
}
/* Conmpare days (midnights) - until-day may equal start day. */
- if (nrpt.until >= update_time_in_date(start, 0, 0))
+ if (nrpt.until >= DAY(start))
break;
mem_free(timstr);
@@ -884,7 +880,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
keys_wgetch(win[KEY].p);
goto cleanup;
}
- nrpt.until = update_time_in_date(until, 0, 0);
+ nrpt.until = DAY(until);
}
/*
* Check whether the start occurrence matches the recurrence rule, in
@@ -895,8 +891,7 @@ static int update_rept(time_t start, long dur, struct rpt **rpt, llist_t *exc,
char *msg_match =
_("Repetition must begin on start day (%s); "
"any change discarded.");
- if (!recur_item_find_occurrence(start, dur, &nrpt, NULL,
- update_time_in_date(start, 0, 0),
+ if (!recur_item_find_occurrence(start, dur, &nrpt, NULL, DAY(start),
NULL)) {
mem_free(outstr);
outstr = day_ins(&msg_match, start);
@@ -1072,7 +1067,7 @@ void ui_day_item_pipe(void)
return;
wins_prepare_external();
- if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
+ if ((pid = shell_exec(NULL, &pout, NULL, 0, *arg, arg))) {
fpout = fdopen(pout, "w");
switch (p->type) {
@@ -1093,7 +1088,7 @@ void ui_day_item_pipe(void)
}
fclose(fpout);
- child_wait(NULL, &pout, pid);
+ child_wait(NULL, &pout, NULL, pid);
press_any_key();
}
wins_unprepare_external();
@@ -1525,7 +1520,7 @@ void ui_day_draw(int n, WINDOW *win, int y, int hilt, void *cb_data)
{
struct day_item *item = day_get_item(n);
/* The item order always indicates the date. */
- time_t date = update_time_in_date(item->order, 0, 0);
+ time_t date = DAY(item->order);
int width = lb_apt.sw.w - 2, is_slctd;
hilt = hilt && (wins_slctd() == APP);
diff --git a/src/ui-todo.c b/src/ui-todo.c
index 876f570..46933b3 100644
--- a/src/ui-todo.c
+++ b/src/ui-todo.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -158,11 +158,11 @@ void ui_todo_pipe(void)
return;
wins_prepare_external();
- if ((pid = shell_exec(NULL, &pout, *arg, arg))) {
+ if ((pid = shell_exec(NULL, &pout, NULL, 0, *arg, arg))) {
fpout = fdopen(pout, "w");
todo_write(item, fpout);
fclose(fpout);
- child_wait(NULL, &pout, pid);
+ child_wait(NULL, &pout, NULL, pid);
press_any_key();
}
wins_unprepare_external();
@@ -207,14 +207,16 @@ void ui_todo_draw(int n, WINDOW *win, int y, int hilt, void *cb_data)
if (hilt)
custom_apply_attr(win, ATTR_HIGHEST);
- if (utf8_strwidth(todo->mesg) < width) {
- mesg = todo->mesg;
- } else {
+ mesg = todo->mesg;
+ if (mesg[0] == '\0')
+ mesg = EMPTY_EVENT_DESC_DEFAULT;
+
+ if (utf8_strwidth(mesg) >= width) {
width -= 3;
- for (j = 0; todo->mesg[j] && width > 0; j++) {
- if (!UTF8_ISCONT(todo->mesg[j]))
- width -= utf8_width(&todo->mesg[j]);
- buf[j] = todo->mesg[j];
+ for (j = 0; mesg[j] && width > 0; j++) {
+ if (!UTF8_ISCONT(mesg[j]))
+ width -= utf8_width(&mesg[j]);
+ buf[j] = mesg[j];
}
if (j) {
buf[j - 1] = '.';
@@ -325,6 +327,11 @@ void ui_todo_popup_item(void)
asprintf(&notepath, "%s%s", path_notes, item->note);
fp = fopen(notepath, "r");
+ if (fp == NULL) {
+ item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
+ return;
+ }
+
note_read_contents(note, note_size, fp);
fclose(fp);
mem_free(notepath);
diff --git a/src/utf8.c b/src/utf8.c
index 1fd4c3b..997a4fa 100644
--- a/src/utf8.c
+++ b/src/utf8.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/utils.c b/src/utils.c
index 2d2f615..2d30bfc 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -626,6 +626,42 @@ long min2sec(unsigned minutes)
return minutes * MININSEC;
}
+int modify_wday(int wday, int shift)
+{
+ return (WEEKINDAYS + wday + shift) % WEEKINDAYS;
+}
+
+/* returns char* representing a wday, used for internal functions */
+char *get_wday_default_string(int wday)
+{
+ switch(wday) {
+ case MONDAY:
+ return "Monday";
+ break;
+ case TUESDAY:
+ return "Tuesday";
+ break;
+ case WEDNESDAY:
+ return "Wednesday";
+ break;
+ case THURSDAY:
+ return "Thursday";
+ break;
+ case FRIDAY:
+ return "Friday";
+ break;
+ case SATURDAY:
+ return "Saturday";
+ break;
+ case SUNDAY:
+ return "Sunday";
+ break;
+ default:
+ return "Sunday";
+ break;
+ }
+}
+
/*
* Display a scroll bar when there are so many items that they
* can not be displayed inside the corresponding panel.
@@ -1317,21 +1353,32 @@ void psleep(unsigned secs)
/*
* Fork and execute an external process.
*
- * If pfdin and/or pfdout point to a valid address, a pipe is created and the
- * appropriate file descriptors are written to pfdin/pfdout.
+ * If pfdin/pfdout/pfderr point to a valid address, a pipe is created and the
+ * appropriate file descriptors are written to pfdin/pfdout/pfderr.
+ *
+ * If new_session is non-zero, setsid() is called after forking.
*/
-int fork_exec(int *pfdin, int *pfdout, const char *path,
- const char *const *arg)
+int fork_exec(int *pfdin, int *pfdout, int *pfderr, int new_session,
+ const char *path, const char *const *arg)
{
- int pin[2], pout[2];
+ int pin[2], pout[2], perr[2];
int pid;
if (pfdin && (pipe(pin) == -1))
return 0;
if (pfdout && (pipe(pout) == -1))
return 0;
+ if (pfderr && (pipe(perr) == -1))
+ return 0;
if ((pid = fork()) == 0) {
+ if (pfderr) {
+ if (dup2(perr[0], STDERR_FILENO) < 0)
+ _exit(127);
+ close(perr[0]);
+ close(perr[1]);
+ }
+
if (pfdout) {
if (dup2(pout[0], STDIN_FILENO) < 0)
_exit(127);
@@ -1346,6 +1393,11 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
close(pin[1]);
}
+ if (new_session) {
+ if ((setsid() < 0))
+ _exit(127);
+ }
+
execvp(path, (char *const *)arg);
_exit(127);
} else {
@@ -1353,6 +1405,8 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
close(pin[1]);
if (pfdout)
close(pout[0]);
+ if (pfderr)
+ close(perr[0]);
if (pid > 0) {
if (pfdin) {
@@ -1363,11 +1417,17 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
fcntl(pout[1], F_SETFD, FD_CLOEXEC);
*pfdout = pout[1];
}
+ if (pfderr) {
+ fcntl(perr[1], F_SETFD, FD_CLOEXEC);
+ *pfderr = perr[1];
+ }
} else {
if (pfdin)
close(pin[0]);
if (pfdout)
close(pout[1]);
+ if (pfderr)
+ close(perr[1]);
return 0;
}
}
@@ -1376,8 +1436,8 @@ int fork_exec(int *pfdin, int *pfdout, const char *path,
/* Execute an external program in a shell. */
int
-shell_exec(int *pfdin, int *pfdout, const char *path,
- const char *const *arg)
+shell_exec(int *pfdin, int *pfdout, int *pfderr, int new_session,
+ const char *path, const char *const *arg)
{
int argc, i;
const char **narg;
@@ -1406,7 +1466,7 @@ shell_exec(int *pfdin, int *pfdout, const char *path,
narg[3] = NULL;
}
- ret = fork_exec(pfdin, pfdout, *narg, narg);
+ ret = fork_exec(pfdin, pfdout, pfderr, new_session, *narg, narg);
if (arg0)
mem_free(arg0);
@@ -1416,7 +1476,7 @@ shell_exec(int *pfdin, int *pfdout, const char *path,
}
/* Wait for a child process to terminate. */
-int child_wait(int *pfdin, int *pfdout, int pid)
+int child_wait(int *pfdin, int *pfdout, int *pfderr, int pid)
{
int stat;
@@ -1424,6 +1484,8 @@ int child_wait(int *pfdin, int *pfdout, int pid)
close(*pfdin);
if (pfdout)
close(*pfdout);
+ if (pfderr)
+ close(*pfderr);
if (waitpid(pid, &stat, 0) == pid)
return stat;
@@ -1643,7 +1705,7 @@ static void print_date(time_t date, time_t day, const char *extformat)
if (!strcmp(extformat, "epoch")) {
printf("%ld", (long)date);
} else {
- time_t day_start = update_time_in_date(day, 0, 0);
+ time_t day_start = DAY(day);
time_t day_end = date_sec_change(day_start, 0, 1);
struct tm lt;
@@ -2079,8 +2141,7 @@ char *day_ins(char **template, time_t t)
{
char *day, *msg;
- day = date_sec2date_str(update_time_in_date(t, 0 , 0),
- DATEFMT(conf.input_datefmt));
+ day = date_sec2date_str(DAY(t), DATEFMT(conf.input_datefmt));
asprintf(&msg, *template, day);
mem_free(day);
return msg;
diff --git a/src/vars.c b/src/vars.c
index 2c308e7..c8508e2 100644
--- a/src/vars.c
+++ b/src/vars.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -140,6 +140,7 @@ void vars_init(void)
conf.input_datefmt = 1;
conf.heading_pos = RIGHT;
strcpy(conf.day_heading, DAY_HEADING_DEFAULT);
+ strcpy(conf.timefmt, APPT_TIME_DEFAULT);
datefmt_str[0] = _("mm/dd/yyyy");
datefmt_str[1] = _("dd/mm/yyyy");
diff --git a/src/vector.c b/src/vector.c
index fd468ab..796ef8e 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/vector.h b/src/vector.h
index 86cb3b8..7648df2 100644
--- a/src/vector.h
+++ b/src/vector.h
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/src/wins.c b/src/wins.c
index 5f4c0ba..46ac98e 100644
--- a/src/wins.c
+++ b/src/wins.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -63,7 +63,7 @@ static int layout;
/*
* The screen_mutex mutex and wins_refresh(), wins_wrefresh(), wins_doupdate()
* functions are used to prevent concurrent updates of the screen.
- * It was observed that the display could get screwed up when mulitple threads
+ * It was observed that the display could get screwed up when multiple threads
* tried to refresh the screen at the same time.
*
* Note (2010-03-21):
@@ -229,7 +229,7 @@ void wins_sbar_winc(void)
void wins_sbar_wdec(void)
{
- if (sbarwidth_perc > 0)
+ if (col * sbarwidth_perc / 100 > SBARMINWIDTH)
sbarwidth_perc--;
}
@@ -254,6 +254,15 @@ void wins_slctd_next(void)
slctd_win++;
}
+/* Shift-TAB key was hit in the interface, need to select previous window. */
+void wins_slctd_prev(void)
+{
+ if (slctd_win == CAL)
+ slctd_win = TOD;
+ else
+ slctd_win--;
+}
+
static void wins_init_panels(void)
{
wins_scrollwin_init(&sw_cal, win[CAL].y, win[CAL].x,
@@ -624,8 +633,8 @@ void wins_launch_external(const char *arg[])
int pid;
wins_prepare_external();
- if ((pid = shell_exec(NULL, NULL, *arg, arg)))
- child_wait(NULL, NULL, pid);
+ if ((pid = shell_exec(NULL, NULL, NULL, 0, *arg, arg)))
+ child_wait(NULL, NULL, NULL, pid);
wins_unprepare_external();
}
@@ -651,6 +660,7 @@ void wins_update_bindings(void)
static int bindings_cal[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_SCROLL_DOWN, KEY_GENERIC_SCROLL_UP, KEY_MOVE_UP,
KEY_MOVE_DOWN, KEY_MOVE_LEFT, KEY_MOVE_RIGHT, KEY_GENERIC_GOTO,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_START_OF_WEEK,
@@ -666,6 +676,7 @@ void wins_update_bindings(void)
static int bindings_apoint[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
KEY_GENERIC_REDRAW, KEY_REPEAT_ITEM, KEY_FLAG_ITEM,
@@ -682,6 +693,7 @@ void wins_update_bindings(void)
static int bindings_todo[] = {
KEY_GENERIC_HELP, KEY_GENERIC_QUIT, KEY_GENERIC_SAVE,
KEY_GENERIC_RELOAD, KEY_GENERIC_CHANGE_VIEW,
+ KEY_GENERIC_PREV_VIEW,
KEY_GENERIC_SCROLL_DOWN, KEY_GENERIC_SCROLL_UP,
KEY_GENERIC_IMPORT, KEY_GENERIC_EXPORT, KEY_ADD_ITEM,
KEY_DEL_ITEM, KEY_EDIT_ITEM, KEY_VIEW_ITEM, KEY_PIPE_ITEM,
diff --git a/test/data/ical-009.ical b/test/data/ical-009.ical
index 3495223..14bf4eb 100644
--- a/test/data/ical-009.ical
+++ b/test/data/ical-009.ical
@@ -1,9 +1,9 @@
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
-DTSTART:20200318T084100
DURATION:PT1H30M0S
SUMMARY:A simple appointment
+DTSTART:20200318T084100
END:VEVENT
BEGIN:VTODO
PRIORITY:1
@@ -12,6 +12,10 @@ END:VTODO
BEGIN:VEVENT
DTSTART:
DURATION:PT1H30M0S
+SUMMARY:invalid start time
+END:VEVENT
+BEGIN:VEVENT
+DURATION:PT1H30M0S
SUMMARY:missing start time
END:VEVENT
BEGIN:VEVENT
@@ -39,6 +43,12 @@ END:VEVENT
BEGIN:VEVENT
DTSTART:20200318T084100
DURATION:PT1H30M0S
+EXDATE:20200324T084100
+SUMMARY:exdate\, missing rrule
+END:VEVENT
+BEGIN:VEVENT
+DTSTART:20200318T084100
+DURATION:PT1H30M0S
SUMMARY:Summary with more than\none line
END:VEVENT
BEGIN:VEVENT
diff --git a/test/ical-001.sh b/test/ical-001.sh
index 4ff1bfe..c8005a7 100755
--- a/test/ical-001.sh
+++ b/test/ical-001.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-001.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-001.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-002.sh b/test/ical-002.sh
index 0b74b19..eeecab4 100755
--- a/test/ical-002.sh
+++ b/test/ical-002.sh
@@ -3,11 +3,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-002.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r2
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-002.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/2000 -r2
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0028 lines read
diff --git a/test/ical-003.sh b/test/ical-003.sh
index cff65c0..ace0165 100755
--- a/test/ical-003.sh
+++ b/test/ical-003.sh
@@ -4,13 +4,13 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-003.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/2000 -r365
- "$CALCURSE" -D "$PWD/.calcurse" -s05/01/2020 --to 01/01/2023
- cat "$PWD/.calcurse/notes"/*
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-003.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/2000 -r365
+ "$CALCURSE" -D "$tmpdir" -s05/01/2020 --to 01/01/2023
+ cat "$tmpdir/notes"/*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0070 lines read
diff --git a/test/ical-004.sh b/test/ical-004.sh
index 7be6d1c..1d19d73 100755
--- a/test/ical-004.sh
+++ b/test/ical-004.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-004.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-004.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-005.sh b/test/ical-005.sh
index 5d38301..47891ee 100755
--- a/test/ical-005.sh
+++ b/test/ical-005.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-005.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s10/03/2013 -r3
- cat "$PWD/.calcurse/notes"/*
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-005.ical"
+ "$CALCURSE" -D "$tmpdir" -s10/03/2013 -r3
+ cat "$tmpdir/notes"/*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0023 lines read
diff --git a/test/ical-006.sh b/test/ical-006.sh
index 6899d42..b923712 100755
--- a/test/ical-006.sh
+++ b/test/ical-006.sh
@@ -3,11 +3,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-006.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s06/01/2012 -r2
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-006.ical"
+ "$CALCURSE" -D "$tmpdir" -s06/01/2012 -r2
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0063 lines read
diff --git a/test/ical-007.sh b/test/ical-007.sh
index 59b7bf8..82405c9 100755
--- a/test/ical-007.sh
+++ b/test/ical-007.sh
@@ -3,13 +3,13 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- TZ="America/New_York" "$CALCURSE" -D "$PWD/.calcurse" \
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ TZ="America/New_York" "$CALCURSE" -D "$tmpdir" \
-i "$DATA_DIR/ical-007.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s02/23/2015
- cat "$PWD/.calcurse/notes/"*
- rm -rf .calcurse || exit 1
+ "$CALCURSE" -D "$tmpdir" -s02/23/2015
+ cat "$tmpdir/notes/"*
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0018 lines read
diff --git a/test/ical-008.sh b/test/ical-008.sh
index b659eb0..344fa8a 100755
--- a/test/ical-008.sh
+++ b/test/ical-008.sh
@@ -3,12 +3,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-008.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s01/01/1980 -r2
- "$CALCURSE" -D "$PWD/.calcurse" -t
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-008.ical"
+ "$CALCURSE" -D "$tmpdir" -s01/01/1980 -r2
+ "$CALCURSE" -D "$tmpdir" -t
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0012 lines read
diff --git a/test/ical-009.sh b/test/ical-009.sh
index 9015323..6c1a0d4 100755
--- a/test/ical-009.sh
+++ b/test/ical-009.sh
@@ -4,40 +4,41 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- out=$("$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-009.ical" 2>&1)
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ out=$("$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-009.ical" 2>&1)
# Print the import report (stdout).
echo "$out" | awk '$1 == "Import"; $2 == "apps"'
# Find the log file and print the log messages (stderr).
logfile=$(echo "$out" | awk '$1 == "See" { print $2 }')
sed '1,18d' "$logfile"
# One empty note file.
- cat "$PWD/.calcurse/notes"/* | wc | awk '{ print $1 $2 $3 }'
- rm -rf .calcurse || exit 1
+ cat "$tmpdir/notes"/* | wc | awk '{ print $1 $2 $3 }'
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
-Import process report: 0121 lines read
-2 apps / 0 events / 1 todo / 19 skipped
+Import process report: 0131 lines read
+3 apps / 0 events / 1 todo / 20 skipped
VEVENT [12]: invalid or malformed event start time.
-VEVENT [17]: rrule frequency not supported.
-VEVENT [23]: malformed summary line.
-VTODO [28]: item priority is invalid (must be between 0 and 9).
-VEVENT [32]: malformed exceptions line.
-VEVENT [39]: line break in summary.
-VEVENT [44]: malformed description line.
-VEVENT [50]: malformed description.
-VTODO [62]: malformed summary.
-VEVENT [66]: only one location allowed.
-VEVENT [73]: invalid duration.
-VEVENT [78]: invalid or malformed event start time.
-VEVENT [83]: invalid end time value type.
-VEVENT [88]: invalid until format.
-VEVENT [94]: invalid exception date value type.
-VEVENT [101]: invalid exception.
-VEVENT [108]: either end or duration.
-VEVENT [114]: end must be later than start.
-VTODO [119]: The ical file seems to be malformed. The end of item was not found.
+VEVENT [17]: item start date not defined.
+VEVENT [21]: rrule frequency not supported.
+VEVENT [27]: malformed summary line.
+VTODO [32]: item priority is invalid (must be between 0 and 9).
+VEVENT [36]: malformed exceptions line.
+VEVENT [43]: exception date, but no recurrence rule.
+VEVENT [54]: malformed description line.
+VEVENT [60]: malformed description.
+VTODO [72]: malformed summary.
+VEVENT [76]: only one location allowed.
+VEVENT [83]: invalid duration.
+VEVENT [88]: invalid or malformed event start time.
+VEVENT [93]: invalid end time value type.
+VEVENT [98]: invalid until format.
+VEVENT [104]: invalid exception date value type.
+VEVENT [111]: invalid exception.
+VEVENT [118]: either end or duration.
+VEVENT [124]: end must be later than start.
+VTODO [129]: The ical file seems to be malformed. The end of item was not found.
101
EOD
else
diff --git a/test/ical-010.sh b/test/ical-010.sh
index 7cb1002..e66538c 100755
--- a/test/ical-010.sh
+++ b/test/ical-010.sh
@@ -4,12 +4,12 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- cp "$DATA_DIR/apts-export" .calcurse/apts || exit 1
- cp "$DATA_DIR/todo-export" .calcurse/todo || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" --export=ical | sed '/^PRODID/d'
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ cp "$DATA_DIR/apts-export" "$tmpdir"/apts || exit 1
+ cp "$DATA_DIR/todo-export" "$tmpdir"/todo || exit 1
+ "$CALCURSE" -D "$tmpdir" --export=ical | sed '/^PRODID/d'
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
BEGIN:VCALENDAR
diff --git a/test/ical-011.sh b/test/ical-011.sh
index 4b6c238..1b76e6d 100755
--- a/test/ical-011.sh
+++ b/test/ical-011.sh
@@ -3,18 +3,17 @@
. "${TEST_INIT:-./test-init.sh}"
-mkdir .calcurse || exit 1
-cp "$DATA_DIR/conf" .calcurse || exit 1
-cp "$DATA_DIR/apts-export" .calcurse/apts || exit 1
-cp "$DATA_DIR/todo-export" .calcurse/todo || exit 1
+tmpdir=$(mktemp -d)
+cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+cp "$DATA_DIR/apts-export" "$tmpdir"/apts || exit 1
+cp "$DATA_DIR/todo-export" "$tmpdir"/todo || exit 1
-"$CALCURSE" -D "$PWD/.calcurse" --export=ical > "$PWD"/.calcurse/export.ical &&
-(cd .calcurse; mv apts apts-export; mv todo todo-export) &&
-"$CALCURSE" -D "$PWD/.calcurse" --quiet --import \
- "$PWD"/.calcurse/export.ical &&
-(cd .calcurse; cmp -s apts-export apts) &&
-(cd .calcurse; cmp -s todo-export todo) &&
+"$CALCURSE" -D "$tmpdir" --export=ical >"$tmpdir"/export.ical &&
+(cd "$tmpdir"; mv apts apts-export; mv todo todo-export) &&
+"$CALCURSE" -D "$tmpdir" --quiet --import "$tmpdir"/export.ical &&
+(cd "$tmpdir"; cmp -s apts-export apts) &&
+(cd "$tmpdir"; cmp -s todo-export todo) &&
status=0 || status=1
-rm -rf .calcurse
+rm -rf "$tmpdir" || exit 1
exit $status
diff --git a/test/ical-012.sh b/test/ical-012.sh
index f4b27df..38ae673 100755
--- a/test/ical-012.sh
+++ b/test/ical-012.sh
@@ -7,11 +7,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse &&
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/ical-012.ical"
- (cd "$PWD/.calcurse/notes/"; cat $(ls -S1))
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/ical-012.ical"
+ (cd "$tmpdir/notes/"; cat $(ls -S1))
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0089 lines read
diff --git a/test/ical-013.sh b/test/ical-013.sh
index f5d012b..6509996 100755
--- a/test/ical-013.sh
+++ b/test/ical-013.sh
@@ -4,11 +4,11 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- TZ=America/New_York "$CALCURSE" -D "$PWD/.calcurse" -i "$DATA_DIR/rfc5545.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -s09/01/1997 -r365
- rm -rf .calcurse || exit 1
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ TZ=America/New_York "$CALCURSE" -D "$tmpdir" -i "$DATA_DIR/rfc5545.ical"
+ "$CALCURSE" -D "$tmpdir" -s09/01/1997 -r365
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat <<EOD
Import process report: 0238 lines read
diff --git a/test/ical-014.sh b/test/ical-014.sh
index 68f36a1..18134bf 100755
--- a/test/ical-014.sh
+++ b/test/ical-014.sh
@@ -4,17 +4,17 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- mkdir .calcurse || exit 1
- cp "$DATA_DIR/conf" .calcurse || exit 1
- "$CALCURSE" -q -D "$PWD/.calcurse" -i "$DATA_DIR/ical-014.ical"
- "$CALCURSE" -D "$PWD/.calcurse" -x |
+ tmpdir=$(mktemp -d)
+ cp "$DATA_DIR/conf" "$tmpdir" || exit 1
+ "$CALCURSE" -q -D "$tmpdir" -i "$DATA_DIR/ical-014.ical"
+ "$CALCURSE" -D "$tmpdir" -x |
sed -n '
/DESCRIPTION/p
/LOCATION/p
/COMMENT/p
' |
sort
- rm -rf .calcurse || exit 1
+ rm -rf "$tmpdir" || exit 1
elif [ "$1" = 'expected' ]; then
cat "$DATA_DIR/ical-014.ical" |
sed -n '
diff --git a/test/io-005.sh b/test/io-005.sh
index c5ebcc7..6b03908 100755
--- a/test/io-005.sh
+++ b/test/io-005.sh
@@ -3,7 +3,6 @@
. "${TEST_INIT:-./test-init.sh}"
home=$(mktemp -d)
-CALCURSE=$(readlink -f "$CALCURSE")
(unset -v XDG_DATA_HOME XDG_CONFIG_HOME; HOME="$home" "$CALCURSE" -a)
[ -f "$home/.local/share/calcurse/apts" ] && [ -f "$home/.config/calcurse/conf" ] && failed=0 || failed=1
diff --git a/test/io-006.sh b/test/io-006.sh
index 4184d9f..babcfcd 100755
--- a/test/io-006.sh
+++ b/test/io-006.sh
@@ -3,7 +3,6 @@
. "${TEST_INIT:-./test-init.sh}"
dir=$(mktemp -d)
-CALCURSE=$(readlink -f "$CALCURSE")
cd "$dir"
(unset -v HOME XDG_DATA_HOME XDG_CONFIG_HOME; "$CALCURSE" -a)
[ -f "$dir/.calcurse/apts" ] && [ -f "$dir/.calcurse/conf" ] && failed=0 || failed=1
diff --git a/test/run-test.c b/test/run-test.c
index d1db112..41d55ad 100644
--- a/test/run-test.c
+++ b/test/run-test.c
@@ -1,7 +1,7 @@
/*
* Calcurse - text-based organizer
*
- * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
+ * Copyright (c) 2004-2023 calcurse Development Team <misc@calcurse.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/test/test-init.sh b/test/test-init.sh
index c95c884..92ad779 100644
--- a/test/test-init.sh
+++ b/test/test-init.sh
@@ -2,3 +2,8 @@
CALCURSE=${CALCURSE:-../src/calcurse}
DATA_DIR=${DATA_DIR:-data/}
+
+case "$CALCURSE" in
+ /*) ;;
+ *) CALCURSE="${PWD}/${CALCURSE}" ;;
+esac