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--AUTHORS3
-rw-r--r--CHANGES.md150
-rw-r--r--COPYING2
-rw-r--r--README.md37
-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.pot388
-rw-r--r--po/de.po508
-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.po1772
-rw-r--r--po/es.po513
-rw-r--r--po/fr.po546
-rw-r--r--po/nl.po451
-rw-r--r--po/pt_BR.po558
-rw-r--r--po/ru.po1157
-rw-r--r--scripts/calcurse-upgrade.sh.in2
-rw-r--r--src/apoint.c10
-rw-r--r--src/args.c35
-rw-r--r--src/calcurse.c161
-rw-r--r--src/calcurse.h67
-rw-r--r--src/config.c28
-rw-r--r--src/custom.c81
-rw-r--r--src/day.c104
-rw-r--r--src/dmon.c12
-rw-r--r--src/event.c2
-rw-r--r--src/getstring.c4
-rw-r--r--src/help.c6
-rw-r--r--src/hooks.c37
-rw-r--r--src/htable.h2
-rw-r--r--src/ical.c854
-rw-r--r--src/io.c219
-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.c17
-rw-r--r--src/notify.c29
-rw-r--r--src/pcal.c6
-rw-r--r--src/queue.c2
-rw-r--r--src/recur.c77
-rw-r--r--src/sha1.c3
-rw-r--r--src/sha1.h4
-rw-r--r--src/sigs.c20
-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.c155
-rw-r--r--src/ui-todo.c49
-rw-r--r--src/utf8.c2
-rw-r--r--src/utils.c93
-rw-r--r--src/vars.c3
-rw-r--r--src/vector.c2
-rw-r--r--src/vector.h2
-rw-r--r--src/wins.c26
-rw-r--r--test/Makefile.am1
-rw-r--r--test/data/ical-005.ical2
-rw-r--r--test/data/ical-009.ical18
-rw-r--r--test/data/ical-012.ical26
-rw-r--r--test/data/ical-014.ical106
-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.sh15
-rwxr-xr-xtest/ical-006.sh10
-rwxr-xr-xtest/ical-007.sh13
-rwxr-xr-xtest/ical-008.sh12
-rwxr-xr-xtest/ical-009.sh52
-rwxr-xr-xtest/ical-010.sh12
-rwxr-xr-xtest/ical-011.sh21
-rwxr-xr-xtest/ical-012.sh29
-rwxr-xr-xtest/ical-013.sh10
-rwxr-xr-xtest/ical-014.sh28
-rwxr-xr-xtest/io-005.sh1
-rwxr-xr-xtest/io-006.sh1
-rwxr-xr-xtest/recur-008.sh2
-rwxr-xr-xtest/recur-009.sh6
-rwxr-xr-xtest/recur-010.sh23
-rw-r--r--test/run-test.c2
-rw-r--r--test/test-init.sh5
111 files changed, 5639 insertions, 4341 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/AUTHORS b/AUTHORS
index 4ce42ab..856f728 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,3 @@
-Lukas Fleischer <lfleischer@calcurse.org>
Frederic Culot <frederic@culot.org>
+Lars Henriksen <LarsHenriksen@get2net.dk>
+Lukas Fleischer <lfleischer@calcurse.org>
diff --git a/CHANGES.md b/CHANGES.md
index 263cf83..acc24e4 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,156 @@
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)
+--------------------------
+
+- Compatibility notes:
+
+ * Note file contents are now exported as DESCRIPTION in iCal exports. For
+ notes that should not be exported, please use the "-- " separator
+ (dash-dash-space-newline); everything below that separator (including the
+ separator itself) is ignored during export.
+
+ * The item deletion menu has been redesigned and now looks as follows:
+
+ Delete (s)elected occurrence, (a)ll occurrences, or only the (n)ote?
+
+ Options that are not available (e.g. because the item is not recurrent
+ or does not have a note) are omitted.
+
+ * The systemdialogs option has been removed from the configuration. The
+ welcome window has been removed, import/export status messages are now
+ always displayed unless the --quiet command line flag is used.
+
+- New features:
+
+ * Support for advanced recurrence rules (e.g. "every year on last Sunday in
+ October"). Supported in the UI and in iCal imports. For details on how to
+ use advanced recurrences, run :help repeat. Sample iCal files with
+ advanced recurrence rules can be found in contrib/import/ in the calcurse
+ source tree.
+
+ * Repeat counts are accepted in the UI as an alternative to repetition end
+ dates for recurrent items (e.g. "#3" to specify that an item should have
+ three occurrences).
+
+ * The :previous and :next commands can be used to jump to the previous/next
+ occurrence of the currently selected recurrent item. This is useful for
+ verifying that a new (advanced) recurrence rule works as intended.
+
+ * Various improvements in iCal imports: Location, comment and status of
+ iCal events are now imported as special fields in the note file. The time
+ zone identifier (TZID) is now recognized, time fields are converted to a
+ local time and the zone identifier is logged in the note file.
+
+ * Notes are now displayed in the item view dialog (implemented by Ambika
+ Eshwar).
+
+- Bug fixes:
+
+ * Fixed formatting of DTSTART for recurrent events (implemented by
+ Jerem-K).
+
+ * Improvements in hook execution. Hooks are background jobs and must not
+ interfere with the terminal (stdin, stdout, stderr).
+
+- calcurse-caldav bug fixes:
+
+ * Checks to make sure the config and data dirs exist (implemented by
+ Nitroretro).
+
Version 4.6.0 (2020-03-27)
--------------------------
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 0d44048..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,18 +45,17 @@ Package Overview
* `src`: the actual calcurse source files
* `test`: test suite and test cases for calcurse
-Authors
--------
+## Authors
-calcurse was originally authored by Frederic Culot and is currently maintained
-by Lukas Fleischer.
+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
+were designed and implemented by Lars Henriksen.
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 31209e2..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.6.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 cf9672d..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.6.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 a63d88a..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-03-27 18:58-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"
@@ -21,6 +21,12 @@ msgstr ""
msgid "null pointer"
msgstr ""
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr ""
@@ -33,7 +39,7 @@ msgid ""
"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>] | --"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
@@ -44,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."
@@ -119,7 +125,7 @@ msgstr ""
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
-msgid " -q, --quiet Suppress system dialogs"
+msgid " -q, --quiet Suppress import/export result message"
msgstr ""
msgid " --read-only Do not save configuration or data files"
@@ -269,7 +275,7 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr ""
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
msgid "Read-only mode - use w!"
@@ -282,6 +288,18 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr ""
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr ""
@@ -401,15 +419,6 @@ msgstr ""
msgid "(if set to YES, confirmation is required before deleting an event)"
msgstr ""
-msgid "(if set to YES, messages about loaded and saved data will be displayed)"
-msgstr ""
-
-msgid "Monday"
-msgstr ""
-
-msgid "Sunday"
-msgstr ""
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -434,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 ""
@@ -452,7 +467,7 @@ msgstr ""
msgid "Undefined option!"
msgstr ""
-msgid "undefined"
+msgid "UNDEFINED"
msgstr ""
msgid "keys configuration"
@@ -465,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 ""
@@ -480,6 +495,9 @@ msgstr ""
msgid "unknown item type"
msgstr ""
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr ""
@@ -548,10 +566,10 @@ msgstr ""
msgid "Could not stop calcurse daemon: %s\n"
msgstr ""
-msgid "date error in event"
+msgid "illegal date in event"
msgstr ""
-msgid "date error in the event\n"
+msgid "date error in event\n"
msgstr ""
msgid "Internal error: line too long"
@@ -563,66 +581,137 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
+msgid "frequency not set in rrule."
msgstr ""
-msgid "recurrence frequency not recognized."
+msgid "frequency absent in rrule."
msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-msgid "malformed description line."
+msgid "invalid interval."
msgstr ""
-msgid "malformed description."
+msgid "either until or count."
msgstr ""
-msgid "empty description."
+msgid "missing until value."
msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
+msgid "invalid bymonthday list."
msgstr ""
-msgid "item start date is not defined."
+msgid "invalid byday list."
msgstr ""
-msgid "item has a negative duration."
+msgid "invalid exception date value type."
msgstr ""
-msgid "item could not be identified."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
msgstr ""
msgid "malformed start time line."
msgstr ""
-msgid "could not retrieve event start time."
+msgid "invalid or malformed event start time."
+msgstr ""
+
+msgid "invalid end time value type."
msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
+msgstr ""
+
+msgid "exception date, but no recurrence rule."
msgstr ""
-msgid "item duration malformed."
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, c-format
+msgid "Location: %s"
+msgstr ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr ""
+
+msgid "only one description allowed."
+msgstr ""
+
+msgid "only one location allowed."
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 ""
@@ -693,6 +782,21 @@ msgstr ""
msgid "syntax error in item repetition"
msgstr ""
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr ""
@@ -702,49 +806,49 @@ 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 ""
-
msgid "Could not read key label"
msgstr ""
-msgid "Key label not recognized"
+#, c-format
+msgid "Key label not recognized: \"%s\""
msgstr ""
#, c-format
-msgid "Error reading key: \"%s\""
+msgid "No keys assigned to \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+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..."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
+msgid "Errors in the keys file."
msgstr ""
-msgid "Press [ENTER] to continue"
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
+msgid "Some actions do not have any associated key bindings!"
msgstr ""
-msgid "Data files found. Data will be loaded now."
+#, c-format
+msgid "FATAL ERROR: could not create %s: %s\n"
msgstr ""
msgid "The data were successfully exported"
msgstr ""
+msgid "Press [ENTER] to continue"
+msgstr ""
+
msgid "unknown export type"
msgstr ""
@@ -815,7 +919,9 @@ msgstr ""
msgid "Invalid delay"
msgstr ""
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -857,6 +963,9 @@ msgstr ""
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr ""
@@ -1035,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 ""
@@ -1155,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"
@@ -1248,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 ""
@@ -1279,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 ""
@@ -1297,10 +1400,26 @@ msgstr ""
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
+msgid "unknown character"
msgstr ""
-msgid "unknown character"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr ""
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
msgstr ""
msgid "event not found"
@@ -1309,14 +1428,22 @@ msgstr ""
msgid "appointment not found"
msgstr ""
-msgid "syntax error in item date"
+msgid "syntax error in bymonthday"
msgstr ""
-msgid "date error in item exception"
+msgid "syntax error in bywday"
msgstr ""
-#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
+msgid "syntax error in item date"
+msgstr ""
+
+msgid "date error in item exception"
msgstr ""
#, c-format
@@ -1356,6 +1483,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1381,51 +1512,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
+msgid "Limit repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days."
msgstr ""
-msgid "(d)aily"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
msgstr ""
-msgid "(w)eekly"
+msgid "Note: limit to monthdays, if any."
msgstr ""
-msgid "(m)onthly"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
msgstr ""
-msgid "(y)early"
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
+
+msgid "Limit repetition to listed months."
+msgstr ""
+
+msgid "Expand repetition to listed months."
+msgstr ""
+
+msgid "Limit repetition to listed days of month."
+msgstr ""
+
+msgid "Expand repetition to listed days of month."
+msgstr ""
+
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
msgstr ""
#, c-format
-msgid "(currently using %s)"
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
msgstr ""
msgid "[dwmy]"
msgstr ""
-msgid "Invalid frequency."
+msgid "Frequency:"
msgstr ""
-msgid "Enter the repetition frequency:"
+msgid "Invalid frequency."
msgstr ""
-msgid "Enter end date or duration ('?' for input formats):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr ""
@@ -1464,32 +1655,39 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-msgid "Do you really want to delete this item?"
+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 ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid "[san]"
msgstr ""
-msgid "[ao]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid "[sn]"
msgstr ""
-msgid "[in]"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-msgid "Enter the repetition type:"
+msgid "[sa]"
msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
msgstr ""
-msgid "This item is already a repeated one."
+msgid "[s]"
msgstr ""
-msgid "wrong item type"
+msgid "Already repeated."
+msgstr ""
+
+msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
msgid "Enter the new TODO item:"
@@ -1513,6 +1711,10 @@ msgstr ""
msgid "TODO:"
msgstr ""
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr ""
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr ""
@@ -1571,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 8900b4e..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-03-27 18:58-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,6 +28,12 @@ msgstr ""
msgid "null pointer"
msgstr "Null-Zeiger"
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr "Datumsfehler im Termin"
@@ -40,7 +46,7 @@ msgid ""
"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>] | --"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
@@ -51,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."
@@ -127,7 +132,7 @@ msgstr ""
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
-msgid " -q, --quiet Suppress system dialogs"
+msgid " -q, --quiet Suppress import/export result message"
msgstr ""
msgid " --read-only Do not save configuration or data files"
@@ -280,7 +285,7 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr "Möchten Sie das Programm wirklich beenden?"
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
msgid "Read-only mode - use w!"
@@ -293,6 +298,18 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr "Hilfethema existiert nicht: %s"
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr "Unbekannter Befehl: %s"
@@ -416,17 +433,6 @@ msgstr ""
"(Ist JA gewählt, ist eine Bestätigung erforderlich, um ein Ereignis zu "
"löschen)"
-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 "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)"
@@ -451,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:"
@@ -471,8 +483,8 @@ msgstr "Allgemeine Einstellungen"
msgid "Undefined option!"
msgstr "Unbestimmte Einstellung!"
-msgid "undefined"
-msgstr "unbestimmt"
+msgid "UNDEFINED"
+msgstr ""
msgid "keys configuration"
msgstr "Tasteneinstellung"
@@ -484,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"
@@ -501,6 +513,9 @@ msgstr ""
msgid "unknown item type"
msgstr "Unbekannte Position"
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr "Ereignis:"
@@ -569,11 +584,11 @@ msgstr "Aufgeweckt als %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "Kann den calcurse-Dienst nicht beenden: %s\n"
-msgid "date error in event"
-msgstr "Datumsfehler im Ereignis"
+msgid "illegal date in event"
+msgstr ""
-msgid "date error in the event\n"
-msgstr "Fehlerhafte Zeit für das Ereignis\n"
+msgid "date error in event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr "INTERNER FEHLER: Die Zeile ist zu lang"
@@ -584,70 +599,137 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
-msgstr "Wiederholung nicht gefunden."
+msgid "frequency not set in rrule."
+msgstr ""
-msgid "recurrence frequency not recognized."
-msgstr "Wiederholung nicht erkannt."
+msgid "frequency absent in rrule."
+msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
-msgid "malformed description line."
-msgstr "Beschreibung Fehlerhaft."
+msgid "invalid interval."
+msgstr ""
-#, fuzzy
-msgid "malformed description."
-msgstr "Beschreibung eingeben:"
+msgid "either until or count."
+msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "Beschreibung eingeben:"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "Kann die Zusammenfassung des Eintrags nicht lesen."
+msgid "invalid bymonthday list."
+msgstr ""
-msgid "item start date is not defined."
-msgstr "Anfangsdatum des Eintrags fehlt."
+msgid "invalid byday list."
+msgstr ""
-msgid "item has a negative duration."
-msgstr "Eintrag hat eine negative Dauer."
+msgid "invalid exception date value type."
+msgstr ""
-msgid "item could not be identified."
-msgstr "Element kann nicht erkannt werden."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
+msgstr ""
-#, fuzzy
msgid "malformed start time line."
-msgstr "Startzeit des Ereignisses hat ein ungültiges Format."
+msgstr ""
+
+msgid "invalid or malformed event start time."
+msgstr ""
-msgid "could not retrieve event start time."
-msgstr "Kann die Startzeit des Ereignis nicht lesen."
+msgid "invalid end time value type."
+msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
-msgstr "Kann die Endzeit des Ereignis nicht lesen."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
+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 ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "Element kann nicht erkannt werden."
+
+msgid "only one description allowed."
+msgstr ""
-msgid "item duration malformed."
-msgstr "Dauer des Eintrags fehlerhaft."
+msgid "only one location allowed."
+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)"
@@ -720,6 +802,21 @@ msgstr "Falsches Format für den Termin oder das Ereignis"
msgid "syntax error in item repetition"
msgstr "Syntaxfehler in Item-Wiederholung"
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr "konnte Aufgaben-Datei nicht öffnen"
@@ -729,53 +826,49 @@ 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 "Error reading key: \"%s\""
-msgstr "Fehler beim Lesen der Taste \"%s\""
+msgid "Key label not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" ist mehrfach zugeordnet!"
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Zu viele Fehler beim Lesen der 'keys'-Datei, Abbruch..."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "SCHWERER FEHLER Konnte %s nicht erstellen: %s\n"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "Press [ENTER] to continue"
-msgstr "[EINGABE]-Taste um fortzufahren"
+msgid "Errors in the keys file."
+msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
-msgstr "Willkommen zu calcurse. Fehlende Dateien werden erzeugt."
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
-msgid "Data files found. Data will be loaded now."
-msgstr "Benutzerdaten gefunden. Daten werden geladen."
+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"
+msgstr "SCHWERER FEHLER Konnte %s nicht erstellen: %s\n"
msgid "The data were successfully exported"
msgstr "Die Daten wurden erfolgreich exportiert"
+msgid "Press [ENTER] to continue"
+msgstr "[EINGABE]-Taste um fortzufahren"
+
msgid "unknown export type"
msgstr "Unbekanntes Exportformat"
@@ -846,7 +939,9 @@ msgstr "WARNUNG Kann temporäre Logdatei %s nicht löschen. Abbruch..."
msgid "Invalid delay"
msgstr "Ungültige Verzögerung"
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -893,6 +988,9 @@ msgstr "Einfügen"
msgid "Chg Win"
msgstr "Wechseln"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importieren"
@@ -1080,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."
@@ -1212,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"
@@ -1306,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)"
@@ -1338,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)."
@@ -1356,18 +1447,46 @@ msgstr "Unzusammenhängende Wiederholung"
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
-msgstr "Unbekannter Wiederholungstyp"
-
msgid "unknown character"
msgstr "Unbekanntes Zeichen"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr "Datumsfehler im Ereignis"
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
+msgstr ""
+
msgid "event not found"
msgstr "Ereignis nicht gefunden"
msgid "appointment not found"
msgstr "Termin nicht gefunden"
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
msgid "syntax error in item date"
msgstr "Eingabefehler im Datum"
@@ -1375,10 +1494,6 @@ msgid "date error in item exception"
msgstr "Abbruch wegen Datumsfehler"
#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Kann die Sperrdatei nicht löschen: %s\n"
-
-#, c-format
msgid "Error setting signal #%d : %s\n"
msgstr "Fehler bei Signal: #%d : %s\n"
@@ -1415,6 +1530,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1440,51 +1559,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
-msgstr "Neuen Wiederholungstyp eingeben:"
+msgid "Limit repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days."
+msgstr ""
-msgid "(d)aily"
-msgstr "(t)äglich"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
-msgid "(w)eekly"
-msgstr "(w)öchentlich"
+msgid "Note: limit to monthdays, if any."
+msgstr ""
-msgid "(m)onthly"
-msgstr "(m)onatlich"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
+msgstr ""
-msgid "(y)early"
-msgstr "(j)ährlich"
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
+
+msgid "Limit repetition to listed months."
+msgstr ""
+
+msgid "Expand repetition to listed months."
+msgstr ""
+
+msgid "Limit repetition to listed days of month."
+msgstr ""
+
+msgid "Expand repetition to listed days of month."
+msgstr ""
+
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
#, c-format
-msgid "(currently using %s)"
-msgstr "(verwende momentan %s)"
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
+msgstr ""
msgid "[dwmy]"
msgstr "[twmj]"
+msgid "Frequency:"
+msgstr ""
+
msgid "Invalid frequency."
msgstr "Ungültige Wiederholungsrate."
-msgid "Enter the repetition frequency:"
-msgstr "Eingabe der Wiederholungsrate:"
-
-msgid "Enter end date or duration ('?' for input formats):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr "Beschreibung"
@@ -1525,34 +1704,40 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-msgid "Do you really want to delete this item?"
-msgstr "Möchten Sie diesen Eintrag wirklich löschen?"
+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 ""
+
+msgid "[san]"
+msgstr ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
-msgstr "Dieser Eintrag ist wiederkehrend. Lösche (a)lle oder nur (e)inen?"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
+msgstr ""
-msgid "[ao]"
-msgstr "[ae]"
+msgid "[sn]"
+msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"An diesem Eintrag ist eine Notiz. E(i)ntrag löschen oder nur die (n)otiz?"
-msgid "[in]"
-msgstr "[in]"
+msgid "[sa]"
+msgstr ""
-msgid "Enter the repetition type:"
-msgstr "Wiederholungstyp eingeben:"
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
+msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "[s]"
msgstr ""
-msgid "This item is already a repeated one."
-msgstr "Es handelt sich bereits um einen wiederkehrenden Eintrag."
+msgid "Already repeated."
+msgstr ""
-msgid "wrong item type"
-msgstr "Falscher Typ des Eintrags"
+msgid "A (s)imple or (a)dvanced repetition?"
+msgstr ""
msgid "Enter the new TODO item:"
msgstr "Neue Aufgabe eingeben: "
@@ -1576,6 +1761,10 @@ msgstr "Beschreibung der neuen Aufgabe:"
msgid "TODO:"
msgstr "Zu erledigen:"
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr "Kann die Sperrdatei nicht löschen: %s\n"
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr "INTERNER FEHLER"
@@ -1632,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:"
@@ -1690,15 +1874,3 @@ msgstr "Aktualisiere Konfigurationsanweisungen..."
msgid "Remove temporary backup..."
msgstr "Entferne temporäres Backup..."
-
-#~ 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 bd645ee..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-03-27 18:58-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,17 +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 ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
-msgstr "Appointment :"
+msgstr ""
-#, fuzzy
msgid "no such appointment"
-msgstr "Appointment :"
+msgstr ""
msgid ""
"Usage:\n"
@@ -35,35 +38,25 @@ msgid ""
"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>] | --"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"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 ""
@@ -131,7 +124,7 @@ msgstr ""
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
-msgid " -q, --quiet Suppress system dialogs"
+msgid " -q, --quiet Suppress import/export result message"
msgstr ""
msgid " --read-only Do not save configuration or data files"
@@ -147,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 ""
@@ -184,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"
@@ -228,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 ""
@@ -248,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 ""
@@ -262,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 ""
@@ -289,11 +271,10 @@ 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(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
msgid "Read-only mode - use w!"
@@ -306,17 +287,27 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr ""
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
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\""
@@ -331,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 ""
@@ -356,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 ""
@@ -413,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 ""
@@ -425,20 +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)"
-
-#, 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)"
-
-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)"
@@ -465,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 ""
@@ -499,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 ""
@@ -509,63 +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 ""
+
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"
@@ -584,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 "date error in event"
+msgid "illegal date in event"
msgstr ""
-#, fuzzy
-msgid "date error in the event\n"
-msgstr "FATAL ERROR in event_scan: date error in the event\n"
+msgid "date error in event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr ""
@@ -601,74 +579,140 @@ 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 ""
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
+msgid "frequency not set in rrule."
msgstr ""
-msgid "recurrence frequency not recognized."
+msgid "frequency absent in rrule."
msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-msgid "malformed description line."
+msgid "invalid interval."
msgstr ""
-#, fuzzy
-msgid "malformed description."
-msgstr "Enter description :"
+msgid "either until or count."
+msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "Enter description :"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-#, fuzzy
-msgid "could not retrieve item summary."
-msgstr "Enter description :"
+msgid "invalid bymonthday list."
+msgstr ""
-#, fuzzy
-msgid "item start date is not defined."
-msgstr "The day you entered is not valid"
+msgid "invalid byday list."
+msgstr ""
-msgid "item has a negative duration."
+msgid "invalid exception date value type."
msgstr ""
-msgid "item could not be identified."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
msgstr ""
msgid "malformed start time line."
msgstr ""
-msgid "could not retrieve event start time."
+msgid "invalid or malformed event start time."
+msgstr ""
+
+msgid "invalid end time value type."
msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
msgstr ""
-msgid "item duration malformed."
+msgid "exception date, but no recurrence rule."
+msgstr ""
+
+msgid "multi-day event changed to one-day event"
+msgstr ""
+
+#, c-format
+msgid "Location: %s"
+msgstr ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr ""
+
+msgid "only one description allowed."
+msgstr ""
+
+msgid "only one location allowed."
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 ""
@@ -681,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 ""
@@ -704,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 ""
@@ -720,88 +762,93 @@ 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 ""
+
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+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 "Error reading key: \"%s\""
+msgid "No keys assigned to \"%s\"."
msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
+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..."
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
msgstr ""
-#, fuzzy, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "FATAL ERROR in todo_delete_bynum: no such todo\n"
+msgid "Errors in the keys file."
+msgstr ""
-msgid "Press [ENTER] to continue"
-msgstr "Press [ENTER] to continue"
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
-msgstr "Welcome to Calcurse. Missing data files were created."
+msgid "Some actions do not have any associated key bindings!"
+msgstr ""
-msgid "Data files found. Data will be loaded now."
-msgstr "Data files found. Data will be loaded now."
+#, c-format
+msgid "FATAL ERROR: could not create %s: %s\n"
+msgstr ""
-#, fuzzy
msgid "The data were successfully exported"
-msgstr "The data files were successfully saved"
+msgstr ""
+
+msgid "Press [ENTER] to continue"
+msgstr ""
msgid "unknown export type"
msgstr ""
@@ -822,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"
@@ -874,7 +920,9 @@ msgstr ""
msgid "Invalid delay"
msgstr ""
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -896,13 +944,13 @@ msgid "Credits"
msgstr ""
msgid "Help"
-msgstr "Help"
+msgstr ""
msgid "Quit"
-msgstr "Quit"
+msgstr ""
msgid "Save"
-msgstr "Save"
+msgstr ""
msgid "Reload"
msgstr ""
@@ -913,9 +961,11 @@ msgstr ""
msgid "Paste"
msgstr ""
-#, fuzzy
msgid "Chg Win"
-msgstr "Chg View"
+msgstr ""
+
+msgid "Prev Win"
+msgstr ""
msgid "Import"
msgstr ""
@@ -923,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 ""
@@ -971,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 ""
@@ -991,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 ""
@@ -1053,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 ""
@@ -1079,9 +1112,8 @@ msgstr ""
msgid "Keys"
msgstr ""
-#, fuzzy
msgid "Unknown"
-msgstr "Colour"
+msgstr ""
msgid "Cancel the ongoing action."
msgstr ""
@@ -1113,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 ""
@@ -1125,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 ""
@@ -1230,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"
@@ -1265,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"
@@ -1329,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 ""
@@ -1362,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 ""
@@ -1380,30 +1401,51 @@ msgstr ""
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
+msgid "unknown character"
msgstr ""
-msgid "unknown character"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr ""
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
msgstr ""
msgid "event not found"
msgstr ""
-#, fuzzy
msgid "appointment not found"
-msgstr "Appointment :"
+msgstr ""
+
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+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"
-
-#, fuzzy, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Enter description :"
+msgstr ""
#, c-format
msgid "Error setting signal #%d : %s\n"
@@ -1419,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 ""
@@ -1442,6 +1484,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1452,82 +1498,134 @@ 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 ""
+
+msgid "Expand repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
+
+msgid "Note: limit to monthdays, if any."
+msgstr ""
-#, fuzzy
-msgid "Enter the new repetition type:"
-msgstr "Enter description :"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
+msgstr ""
+
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
-msgid "(d)aily"
+msgid "Limit repetition to listed months."
msgstr ""
-msgid "(w)eekly"
+msgid "Expand repetition to listed months."
msgstr ""
-msgid "(m)onthly"
+msgid "Limit repetition to listed days of month."
msgstr ""
-msgid "(y)early"
+msgid "Expand repetition to listed days of month."
msgstr ""
#, c-format
-msgid "(currently using %s)"
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
msgstr ""
msgid "[dwmy]"
msgstr ""
-msgid "Invalid frequency."
+msgid "Frequency:"
msgstr ""
-#, fuzzy
-msgid "Enter the repetition frequency:"
-msgstr "Enter description :"
+msgid "Invalid frequency."
+msgstr ""
-#, fuzzy
-msgid "Enter end date or duration ('?' for input formats):"
-msgstr "Possible argument formats are : 'mm/dd/yyyy' or 'n'\n"
+msgid "Until date, increment or repeat count ('?' for input formats):"
+msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
-#, fuzzy
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
-msgstr "Enter description :"
+msgstr ""
msgid "Repetition"
msgstr ""
-#, fuzzy
msgid "Edit: "
-msgstr "Add Item"
+msgstr ""
msgid "Start time"
msgstr ""
@@ -1541,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."
@@ -1561,46 +1656,49 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-#, fuzzy
-msgid "Do you really want to delete this item?"
-msgstr "Do you really want to delete this item ?"
+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 ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid "[san]"
msgstr ""
-msgid "[ao]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid "[sn]"
msgstr ""
-msgid "[in]"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-#, fuzzy
-msgid "Enter the repetition type:"
-msgstr "Enter description :"
+msgid "[sa]"
+msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
msgstr ""
-msgid "This item is already a repeated one."
+msgid "[s]"
msgstr ""
-msgid "wrong item type"
+msgid "Already repeated."
+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 ""
@@ -1608,13 +1706,16 @@ msgstr ""
msgid "[tn]"
msgstr ""
-#, fuzzy
msgid "Enter the new TODO description:"
-msgstr "Enter the new ToDo item : "
+msgstr ""
msgid "TODO:"
msgstr ""
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr ""
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr ""
@@ -1625,7 +1726,7 @@ msgid "[yn]"
msgstr ""
msgid "Press any key to continue..."
-msgstr "Press any key to continue..."
+msgstr ""
msgid "failure in mktime"
msgstr ""
@@ -1634,10 +1735,10 @@ msgid "error in mktime"
msgstr ""
msgid "yes"
-msgstr "yes"
+msgstr ""
msgid "no"
-msgstr "no"
+msgstr ""
msgid "option not defined"
msgstr ""
@@ -1671,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 ""
@@ -1723,993 +1817,3 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-
-#, 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 "May"
-#~ msgstr "May"
-
-#~ 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 4b6cf5c..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,20 +12,27 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-03-27 18:58-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"
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr "error en la fecha de la cita"
@@ -38,7 +45,7 @@ msgid ""
"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>] | --"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
@@ -49,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 ""
@@ -129,7 +135,7 @@ msgstr ""
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
-msgid " -q, --quiet Suppress system dialogs"
+msgid " -q, --quiet Suppress import/export result message"
msgstr ""
msgid " --read-only Do not save configuration or data files"
@@ -284,7 +290,7 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr "¿Está seguro de que quiere salir?"
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
msgid "Read-only mode - use w!"
@@ -297,6 +303,18 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr "El tema de ayuda no existe: %s"
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr "No existe el comando: %s"
@@ -421,16 +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 "(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 "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)"
@@ -455,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 ""
@@ -463,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:"
@@ -477,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"
@@ -490,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"
@@ -507,6 +523,9 @@ msgstr ""
msgid "unknown item type"
msgstr "tipo de elemento desconocido"
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr "Evento:"
@@ -566,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"
@@ -575,11 +595,11 @@ msgstr "despertado %s\n"
msgid "Could not stop calcurse daemon: %s\n"
msgstr "No pudo detenerse el demonio de calcurse: %s\n"
-msgid "date error in event"
-msgstr "error de fecha en evento"
+msgid "illegal date in event"
+msgstr ""
-msgid "date error in the event\n"
-msgstr "error de fecha en el evento\n"
+msgid "date error in event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Error interno: línea demasiado larga"
@@ -590,72 +610,139 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
-msgstr "frecuencia recurrente no encontrada."
+msgid "frequency not set in rrule."
+msgstr ""
-msgid "recurrence frequency not recognized."
-msgstr "frecuencia recurrente no reconocida."
+msgid "frequency absent in rrule."
+msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
-msgid "malformed description line."
-msgstr "descripción mal formada."
+msgid "invalid interval."
+msgstr ""
-#, fuzzy
-msgid "malformed description."
-msgstr "Ingrese descripción:"
+msgid "either until or count."
+msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "Ingrese descripción:"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "no se pudo recuperar el resumen del elemento."
+msgid "invalid bymonthday list."
+msgstr ""
-msgid "item start date is not defined."
-msgstr "la fecha de comienzo del elemento no está definida."
+msgid "invalid byday list."
+msgstr ""
-msgid "item has a negative duration."
-msgstr "el elemento tiene una duración negativa."
+msgid "invalid exception date value type."
+msgstr ""
-msgid "item could not be identified."
-msgstr "el elemento no pudo ser identificado."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
+msgstr ""
-#, fuzzy
msgid "malformed start time line."
-msgstr "fecha de comienzo del evento mal formada."
+msgstr ""
+
+msgid "invalid or malformed event start time."
+msgstr ""
-msgid "could not retrieve event start time."
-msgstr "no se pudo recuperar la fecha de comienzo del evento."
+msgid "invalid end time value type."
+msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
-msgstr "no se pudo recuperar la fecha de finalización del evento."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
+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 ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "el elemento no pudo ser identificado."
+
+msgid "only one description allowed."
+msgstr ""
-msgid "item duration malformed."
-msgstr "duración del elemento mal formada."
+msgid "only one location allowed."
+msgstr ""
msgid "The ical file seems to be malformed. The end of item was not found."
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)."
@@ -728,6 +815,21 @@ 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"
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr "No pudo abrirse archivo de tareas"
@@ -737,54 +839,49 @@ 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 "Error reading key: \"%s\""
-msgstr "Error leyendo tecla: \"%s\""
+msgid "Key label not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "¡\"%s\" asignado múltiples veces!"
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Demasiados errores al leer archivo de teclas, abortando..."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "ERROR FATAL: no pudo crearse %s: %s\n"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "Press [ENTER] to continue"
-msgstr "Pulse [INTRO] para continuar"
+msgid "Errors in the keys file."
+msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
+msgid "Remove offending line(s) from the keys file, aborting..."
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 "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"
+msgstr "ERROR FATAL: no pudo crearse %s: %s\n"
msgid "The data were successfully exported"
msgstr "Los datos se han exportado correctamente"
+msgid "Press [ENTER] to continue"
+msgstr "Pulse [INTRO] para continuar"
+
msgid "unknown export type"
msgstr "tipo de exportación desconocido"
@@ -812,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"
@@ -859,7 +959,9 @@ msgstr ""
msgid "Invalid delay"
msgstr "Demora inválida"
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -906,6 +1008,9 @@ msgstr "Pegar"
msgid "Chg Win"
msgstr "CmbVent"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1093,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."
@@ -1236,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"
@@ -1330,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)"
@@ -1363,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)"
@@ -1384,18 +1480,46 @@ msgstr "tipo de repetición incoherente"
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
-msgstr "tipo de repetición desconocido"
-
msgid "unknown character"
msgstr "carácter inválido"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr "error de fecha en evento"
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
+msgstr ""
+
msgid "event not found"
msgstr "evento no encontrado"
msgid "appointment not found"
msgstr "cita no encontrada"
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
msgid "syntax error in item date"
msgstr "error de sintaxis en la fecha del elemento"
@@ -1403,10 +1527,6 @@ msgid "date error in item exception"
msgstr "error en la fecha de la excepción del elemento"
#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "No pudo borrarse el archivo lock de calcurse: %s\n"
-
-#, c-format
msgid "Error setting signal #%d : %s\n"
msgstr "Error fijando señal #%d : %s\n"
@@ -1443,6 +1563,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1468,51 +1592,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
-msgstr "Ingrese el tipo de repetición:"
+msgid "Limit repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days."
+msgstr ""
-msgid "(d)aily"
-msgstr "(d)iario"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
-msgid "(w)eekly"
-msgstr "semanal (w)"
+msgid "Note: limit to monthdays, if any."
+msgstr ""
-msgid "(m)onthly"
-msgstr "(m)ensual"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
+msgstr ""
-msgid "(y)early"
-msgstr "anual (y)"
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
+
+msgid "Limit repetition to listed months."
+msgstr ""
+
+msgid "Expand repetition to listed months."
+msgstr ""
+
+msgid "Limit repetition to listed days of month."
+msgstr ""
+
+msgid "Expand repetition to listed days of month."
+msgstr ""
#, c-format
-msgid "(currently using %s)"
-msgstr "(actualmente utilizando %s)"
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
+msgstr ""
msgid "[dwmy]"
msgstr "[dwmy]"
+msgid "Frequency:"
+msgstr ""
+
msgid "Invalid frequency."
msgstr "Frecuencia inválida."
-msgid "Enter the repetition frequency:"
-msgstr "Introduzca la frecuencia de repetición:"
-
-msgid "Enter end date or duration ('?' for input formats):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr "Descripción"
@@ -1553,36 +1737,40 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-msgid "Do you really want to delete this item?"
-msgstr "¿Quiere eliminar este elemento?"
+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 ""
+
+msgid "[san]"
+msgstr ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
msgstr ""
-"Este elemento es recurrente. ¿Eliminar tod(a)s las ocurrencias o sól(o) ésta?"
-msgid "[ao]"
-msgstr "[ao]"
+msgid "[sn]"
+msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"Este elemento tiene una nota adjunta. ¿Eliminar el elemento m(i)smo o sólo "
-"su (n)ota?"
-msgid "[in]"
-msgstr "[in]"
+msgid "[sa]"
+msgstr ""
-msgid "Enter the repetition type:"
-msgstr "Ingrese el tipo de repetición:"
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
+msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "[s]"
msgstr ""
-msgid "This item is already a repeated one."
-msgstr "Este elemento es ya un elemento repetido."
+msgid "Already repeated."
+msgstr ""
-msgid "wrong item type"
-msgstr "tipo de elemento inválido"
+msgid "A (s)imple or (a)dvanced repetition?"
+msgstr ""
msgid "Enter the new TODO item:"
msgstr "Ingrese la nueva tarea:"
@@ -1607,6 +1795,10 @@ msgstr "Ingrese la descripción de la nueva tarea:"
msgid "TODO:"
msgstr "PENDIENTE:"
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr "No pudo borrarse el archivo lock de calcurse: %s\n"
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr "/!\\ ERROR INTERNO /!\\"
@@ -1663,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:"
@@ -1723,15 +1910,3 @@ msgstr "Actualizar directivas de configuración..."
msgid "Remove temporary backup..."
msgstr "Eliminar respaldo temporal..."
-
-#~ 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 6711f1f..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,20 +14,27 @@ msgid ""
msgstr ""
"Project-Id-Version: calcurse\n"
"Report-Msgid-Bugs-To: bugs@calcurse.org\n"
-"POT-Creation-Date: 2020-03-27 18:58-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"
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr "erreur de date sur ce rendez-vous"
@@ -40,16 +47,9 @@ msgid ""
"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>] | --"
+"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"
@@ -58,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 ""
@@ -145,8 +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"
-msgid " -q, --quiet Suppress system dialogs"
-msgstr " -q, --quiet Supprime les messages système"
+msgid " -q, --quiet Suppress import/export result message"
+msgstr ""
msgid " --read-only Do not save configuration or data files"
msgstr ""
@@ -306,8 +304,8 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr "Voulez-vous vraiment quitter?"
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
-msgstr "Commande : [ h (aide) | w(!) (écrire) | q(!) (quitter) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
+msgstr ""
msgid "Read-only mode - use w!"
msgstr "Mode écriture seule - utiliser w!"
@@ -319,6 +317,18 @@ 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"
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr "Commande inconnue : %s"
@@ -445,17 +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 "(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 "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)"
@@ -480,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 ""
@@ -487,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 : "
@@ -501,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"
@@ -514,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"
@@ -531,6 +538,9 @@ msgstr "N'a pu sauvegarder %s."
msgid "unknown item type"
msgstr "type d'élément inconnu"
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr "Événement :"
@@ -590,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"
@@ -599,11 +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"
-msgid "date error in event"
-msgstr "date erronée dans l'événement"
+msgid "illegal date in event"
+msgstr ""
-msgid "date error in the event\n"
-msgstr "erreur dans la date de l'événement\n"
+msgid "date error in event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Erreur interne : ligne trop longue"
@@ -614,71 +625,138 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
-msgstr "fréquence de répétition introuvable."
+msgid "frequency not set in rrule."
+msgstr ""
-msgid "recurrence frequency not recognized."
-msgstr "fréquence de répétition non reconnue."
+msgid "frequency absent in rrule."
+msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
-msgid "malformed description line."
-msgstr "description mal formée."
+msgid "invalid interval."
+msgstr ""
-#, fuzzy
-msgid "malformed description."
-msgstr "Saisir la description :"
+msgid "either until or count."
+msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "Saisir la description :"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "impossible de récupérer le résumé de l'événement."
+msgid "invalid bymonthday list."
+msgstr ""
-msgid "item start date is not defined."
-msgstr "la date de début de l'élément n'est pas définie."
+msgid "invalid byday list."
+msgstr ""
-msgid "item has a negative duration."
-msgstr "l'élément a une durée négative."
+msgid "invalid exception date value type."
+msgstr ""
-msgid "item could not be identified."
-msgstr "l'élément n'a pu être identifié."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
+msgstr ""
-#, fuzzy
msgid "malformed start time line."
-msgstr "Heure de départ non valide."
+msgstr ""
-msgid "could not retrieve event start time."
-msgstr "impossible de récupérer l'heure de début de l'événement."
+msgid "invalid or malformed event start time."
+msgstr ""
+
+msgid "invalid end time value type."
+msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
-msgstr "impossible de récupérer l'heure de fin de l'événement."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
+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 ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
-msgid "item duration malformed."
-msgstr "durée de l'élément mal formée."
+msgid "item could not be identified."
+msgstr "l'élément n'a pu être identifié."
+
+msgid "only one description allowed."
+msgstr ""
+
+msgid "only one location allowed."
+msgstr ""
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)"
@@ -753,6 +831,21 @@ 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"
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr "impossible d'ouvrir le fichier des tâches"
@@ -762,57 +855,49 @@ 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 "Error reading key: \"%s\""
-msgstr "Erreur de lecture de la touche : \"%s\""
+msgid "Key label not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" est assignée plusieurs fois !"
-
-msgid "There were some errors when loading keys file."
+msgid "No keys assigned to \"%s\"."
msgstr ""
-"Il y a eu des erreurs au chargement du fichier de configuration des "
-"raccourcis."
-msgid "Too many errors while reading keys file, aborting..."
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
-"Trop d'erreurs durant la lecture du fichier de raccourcis, annulation..."
#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "ERREUR FATALE : impossible de créer %s : %s\n"
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
-msgid "Press [ENTER] to continue"
-msgstr "Appuyer sur [ENTRÉE] pour continuer"
+#, c-format
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
-msgstr "Bienvenue dans Calcurse. Les fichiers manquants ont été créés."
+msgid "Errors in the keys file."
+msgstr ""
-msgid "Data files found. Data will be loaded now."
+msgid "Remove offending line(s) from the keys file, aborting..."
msgstr ""
-"Fichiers de données trouvés. Les données seront chargées immédiatement."
+
+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"
+msgstr "ERREUR FATALE : impossible de créer %s : %s\n"
msgid "The data were successfully exported"
msgstr "Les données ont été correctement exportées"
+msgid "Press [ENTER] to continue"
+msgstr "Appuyer sur [ENTRÉE] pour continuer"
+
msgid "unknown export type"
msgstr "type d'exportation inconnu"
@@ -840,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"
@@ -883,10 +971,10 @@ msgstr "Attention : impossible d'effacer le journal temporaire %s, Abandon..."
msgid "Invalid delay"
msgstr "Délai invalide"
-msgid "Periodic save: data files have changed. Save cancelled."
+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 ""
@@ -934,6 +1022,9 @@ msgstr "Coller"
msgid "Chg Win"
msgstr "Chg.Fen."
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importer"
@@ -1123,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."
@@ -1262,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"
@@ -1358,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)"
@@ -1396,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 "
@@ -1418,18 +1499,46 @@ msgstr "type de répétition incohérent"
msgid "System event"
msgstr "Événement système"
-msgid "unknown repetition type"
-msgstr "type de répétition inconnu"
-
msgid "unknown character"
msgstr "caractère inconnu"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr "date erronée dans l'événement"
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
+msgstr ""
+
msgid "event not found"
msgstr "événement introuvable"
msgid "appointment not found"
msgstr "rendez-vous introuvable"
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
msgid "syntax error in item date"
msgstr "erreur de syntaxe dans la date de l'élément"
@@ -1437,10 +1546,6 @@ msgid "date error in item exception"
msgstr "erreur dans la date de l'exception de l'événement"
#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Impossible d'effacer le fichier verrou de calcurse : %s\n"
-
-#, c-format
msgid "Error setting signal #%d : %s\n"
msgstr "Erreur d'affectation du signal #%d : %s\n"
@@ -1480,6 +1585,10 @@ msgid "Invalid time: start time must come before end time!"
msgstr ""
"Heure non valide : l'heure de départ doit être antérieure à l'heure de fin!"
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
"Entrer la date de fin (et/ou l'heure) ou la durée ('?' pour les formats "
@@ -1508,53 +1617,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
-msgstr "Saisir le nouveau type de répétition :"
+msgid "Limit repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
+
+msgid "Note: limit to monthdays, if any."
+msgstr ""
+
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
+msgstr ""
+
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
-msgid "(d)aily"
-msgstr "(q)uotidien"
+msgid "Limit repetition to listed months."
+msgstr ""
-msgid "(w)eekly"
-msgstr "(h)ebdomadaire"
+msgid "Expand repetition to listed months."
+msgstr ""
-msgid "(m)onthly"
-msgstr "(m)ensuel"
+msgid "Limit repetition to listed days of month."
+msgstr ""
-msgid "(y)early"
-msgstr "(a)nnuel"
+msgid "Expand repetition to listed days of month."
+msgstr ""
+
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
#, c-format
-msgid "(currently using %s)"
-msgstr "(actuellement : %s)"
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
+msgstr ""
msgid "[dwmy]"
msgstr "[qhma]"
+msgid "Frequency:"
+msgstr ""
+
msgid "Invalid frequency."
msgstr "Fréquence invalide."
-msgid "Enter the repetition frequency:"
-msgstr "Saisir la fréquence de répétition :"
-
-msgid "Enter end date or duration ('?' for input formats):"
-msgstr "Entrer la date de fin ou la durée ('?' pour les formats d'entrée) :"
+msgid "Until date, increment or repeat count ('?' for input formats):"
+msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
-msgstr "Date : %s (année ou mois peuvent être omis). Durée infinie : 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
+msgstr ""
-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 "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
+msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+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."
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr "Description"
@@ -1597,37 +1764,40 @@ msgstr "Date : %s (et/ou heure), année ou mois peuvent être omis."
msgid "Invalid start time."
msgstr "Heure de départ non valide."
-msgid "Do you really want to delete this item?"
-msgstr "Voulez-vous vraiment effacer cet élément ?"
+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 ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid "[san]"
msgstr ""
-"Cet élément est répétitif. Effacer (t)outes les occurrences ou seulement "
-"(c)elle-ci ?"
-msgid "[ao]"
-msgstr "[tc]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
+msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid "[sn]"
+msgstr ""
+
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-"Une note est associée à cet élément. Effacer l'élém(e)nt ou seulement la "
-"(n)ote ?"
-msgid "[in]"
-msgstr "[en]"
+msgid "[sa]"
+msgstr ""
-msgid "Enter the repetition type:"
-msgstr "Saisir le type de répétition :"
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
+msgstr ""
-#, 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 "[s]"
+msgstr ""
-msgid "This item is already a repeated one."
-msgstr "Cet élément est déjà répétitif."
+msgid "Already repeated."
+msgstr ""
-msgid "wrong item type"
-msgstr "type d'élément incorrect"
+msgid "A (s)imple or (a)dvanced repetition?"
+msgstr ""
msgid "Enter the new TODO item:"
msgstr "Saisir la nouvelle tâche :"
@@ -1654,6 +1824,10 @@ msgstr "Saisir la description de la nouvelle tâche :"
msgid "TODO:"
msgstr "À FAIRE:"
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr "Impossible d'effacer le fichier verrou de calcurse : %s\n"
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr "/!\\ ERREUR INTERNE /!\\"
@@ -1710,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 :"
@@ -1768,18 +1937,3 @@ msgstr "Mise à jour des instructions de configuration..."
msgid "Remove temporary backup..."
msgstr "Suppression de la sauvegarde temporaire..."
-
-#~ 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 6378235..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-03-27 18:58-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,6 +25,12 @@ msgstr ""
msgid "null pointer"
msgstr "null pointer"
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr "datumfout in de afspraak"
@@ -37,7 +43,7 @@ msgid ""
"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>] | --"
+"calcurse -h | -v | --status | -G | -P | -g | -i <file> | -x[<format>] | --"
"daemon"
msgstr ""
@@ -48,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."
@@ -123,7 +129,7 @@ msgstr ""
msgid " -i, --import <file> Import iCal data from file"
msgstr ""
-msgid " -q, --quiet Suppress system dialogs"
+msgid " -q, --quiet Suppress import/export result message"
msgstr ""
msgid " --read-only Do not save configuration or data files"
@@ -273,7 +279,7 @@ msgstr ""
msgid "Do you really want to quit?"
msgstr ""
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
msgstr ""
msgid "Read-only mode - use w!"
@@ -286,6 +292,18 @@ msgstr ""
msgid "Help topic does not exist: %s"
msgstr ""
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr "Geen dergelijk commando: %s"
@@ -407,15 +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 "(if set to YES, messages about loaded and saved data will be displayed)"
-msgstr ""
-
-msgid "Monday"
-msgstr "maandag"
-
-msgid "Sunday"
-msgstr "zondag"
-
msgid "(specifies the first day of week in the calendar view)"
msgstr ""
@@ -440,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 ""
@@ -460,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"
@@ -473,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 ""
@@ -490,6 +505,9 @@ msgstr ""
msgid "unknown item type"
msgstr "ongekend type item"
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr ""
@@ -558,10 +576,10 @@ msgstr ""
msgid "Could not stop calcurse daemon: %s\n"
msgstr ""
-msgid "date error in event"
-msgstr "datumfout in gebeurtenis"
+msgid "illegal date in event"
+msgstr ""
-msgid "date error in the event\n"
+msgid "date error in event\n"
msgstr ""
msgid "Internal error: line too long"
@@ -573,68 +591,137 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
+msgid "frequency not set in rrule."
msgstr ""
-msgid "recurrence frequency not recognized."
+msgid "frequency absent in rrule."
msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
-msgid "malformed description line."
-msgstr "omschrijving beschadigd"
+msgid "invalid interval."
+msgstr ""
-msgid "malformed description."
+msgid "either until or count."
msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "omschrijving beschadigd"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "kan item onderwerp niet ophalen"
+msgid "invalid bymonthday list."
+msgstr ""
-msgid "item start date is not defined."
+msgid "invalid byday list."
msgstr ""
-msgid "item has a negative duration."
-msgstr "item heeft een negatieve tijdsduur"
+msgid "invalid exception date value type."
+msgstr ""
-msgid "item could not be identified."
-msgstr "item onbekend"
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
+msgstr ""
msgid "malformed start time line."
msgstr ""
-msgid "could not retrieve event start time."
-msgstr "kan begintijd van gebeurtenis niet ophalen"
+msgid "invalid or malformed event start time."
+msgstr ""
+
+msgid "invalid end time value type."
+msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
-msgstr "kan eindtijd van gebeurtenis niet ophalen"
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
+
+msgid "invalid duration."
+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 ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "item onbekend"
+
+msgid "only one description allowed."
+msgstr ""
-msgid "item duration malformed."
-msgstr "item tijdsduur onjuist"
+msgid "only one location allowed."
+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 ""
@@ -705,6 +792,21 @@ msgstr "fout formaat in de afspraak of gebeurtenis"
msgid "syntax error in item repetition"
msgstr "syntaxfout in de herhaling van het item"
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr "kon het todo-bestand niet openen"
@@ -714,54 +816,49 @@ 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 ""
+
+#, c-format
+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 ""
-"Teveel fouten bij het laden van het sneltoetsenbestand, wordt afgebroken ..."
#, c-format
msgid "FATAL ERROR: could not create %s: %s\n"
msgstr "FATALE FOUT: kan %s niet aanmaken: %s\n"
-msgid "Press [ENTER] to continue"
-msgstr "Druk op [ENTER] om door te gaan)"
-
-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 "The data were successfully exported"
msgstr "De data is met succes geëxporteerd"
+msgid "Press [ENTER] to continue"
+msgstr "Druk op [ENTER] om door te gaan)"
+
msgid "unknown export type"
msgstr "onbekend exporttype"
@@ -833,7 +930,9 @@ msgstr ""
msgid "Invalid delay"
msgstr ""
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -875,6 +974,9 @@ msgstr "Plak"
msgid "Chg Win"
msgstr ""
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Import"
@@ -1053,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."
@@ -1175,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"
@@ -1268,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)"
@@ -1301,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)."
@@ -1319,18 +1415,46 @@ msgstr "Herhalingstype is niet coherent"
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
-msgstr ""
-
msgid "unknown character"
msgstr "onbekend karakter"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr "datumfout in gebeurtenis"
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
+msgstr ""
+
msgid "event not found"
msgstr "Gebeurtenis niet gevonden"
msgid "appointment not found"
msgstr "afspraak niet gevonden"
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
msgid "syntax error in item date"
msgstr "syntaxfout in datum van item"
@@ -1338,10 +1462,6 @@ msgid "date error in item exception"
msgstr ""
#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr ""
-
-#, c-format
msgid "Error setting signal #%d : %s\n"
msgstr ""
@@ -1378,6 +1498,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1403,51 +1527,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
+msgid "Limit repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days."
+msgstr ""
+
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
+
+msgid "Note: limit to monthdays, if any."
+msgstr ""
+
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
msgstr ""
-msgid "(d)aily"
-msgstr "(d)agelijks"
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
-msgid "(w)eekly"
-msgstr "(w)ekelijks"
+msgid "Limit repetition to listed months."
+msgstr ""
-msgid "(m)onthly"
-msgstr "(m)aandelijks"
+msgid "Expand repetition to listed months."
+msgstr ""
-msgid "(y)early"
-msgstr "(y)aarlijks"
+msgid "Limit repetition to listed days of month."
+msgstr ""
+
+msgid "Expand repetition to listed days of month."
+msgstr ""
+
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
#, c-format
-msgid "(currently using %s)"
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
msgstr ""
msgid "[dwmy]"
msgstr "[dwmy]"
-msgid "Invalid frequency."
+msgid "Frequency:"
msgstr ""
-msgid "Enter the repetition frequency:"
+msgid "Invalid frequency."
msgstr ""
-msgid "Enter end date or duration ('?' for input formats):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr ""
@@ -1486,32 +1670,39 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-msgid "Do you really want to delete this item?"
+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 ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid "[san]"
msgstr ""
-msgid "[ao]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid "[sn]"
msgstr ""
-msgid "[in]"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
msgstr ""
-msgid "Enter the repetition type:"
+msgid "[sa]"
msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
msgstr ""
-msgid "This item is already a repeated one."
-msgstr "Dit item wordt al herhaald."
+msgid "[s]"
+msgstr ""
-msgid "wrong item type"
+msgid "Already repeated."
+msgstr ""
+
+msgid "A (s)imple or (a)dvanced repetition?"
msgstr ""
msgid "Enter the new TODO item:"
@@ -1535,6 +1726,10 @@ msgstr ""
msgid "TODO:"
msgstr ""
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr ""
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr "/!\\ INTERNE FOUT /!\\"
@@ -1591,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 ""
@@ -1637,12 +1831,3 @@ msgstr ""
msgid "Remove temporary backup..."
msgstr ""
-
-#~ 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 ed45126..bcee694 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1,28 +1,36 @@
# 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-03-27 18:58-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"
+msgid "illegal date in appointment"
+msgstr ""
+
+msgid "error in appointment description"
+msgstr ""
+
msgid "date error in appointment"
msgstr "erro de data no agendamento"
@@ -35,16 +43,9 @@ msgid ""
"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>] | --"
+"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."
@@ -53,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 ""
@@ -123,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"
@@ -140,8 +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"
-msgid " -q, --quiet Suppress system dialogs"
-msgstr " -q, --quiet Esconde os diálogos do sistema"
+msgid " -q, --quiet Suppress import/export result message"
+msgstr ""
msgid " --read-only Do not save configuration or data files"
msgstr ""
@@ -297,8 +297,8 @@ msgstr "Existem alterações não salvas. Salvar?"
msgid "Do you really want to quit?"
msgstr "Você certeza que deseja sair?"
-msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) ]"
-msgstr "Comando: [ h(ajuda) | w(escrever)(!) | q(sair)(!) | wq(!) ]"
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
+msgstr ""
msgid "Read-only mode - use w!"
msgstr "Modo somente-leitura - usar w!"
@@ -310,6 +310,18 @@ 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"
+msgid "Select a repeating item in the appointments panel."
+msgstr ""
+
+msgid "Not a repeating item."
+msgstr ""
+
+msgid "Last occurrence."
+msgstr ""
+
+msgid "First occurrence."
+msgstr ""
+
#, c-format
msgid "No such command: %s"
msgstr "Comando inexistente: %s"
@@ -333,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"
@@ -439,17 +451,6 @@ msgstr ""
"(se definida como SIM, uma confirmação será necessária antes da exclusão de "
"um evento)"
-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 "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)"
@@ -474,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"
@@ -495,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"
@@ -508,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"
@@ -525,6 +532,9 @@ msgstr "Não foi possível salvarCould not save %s."
msgid "unknown item type"
msgstr "tipo de item desconhecido"
+msgid "Note:"
+msgstr ""
+
msgid "Event:"
msgstr "Evento:"
@@ -584,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"
@@ -593,11 +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"
-msgid "date error in event"
-msgstr "erro na data em evento"
+msgid "illegal date in event"
+msgstr ""
-msgid "date error in the event\n"
-msgstr "erro de data no evento\n"
+msgid "date error in event\n"
+msgstr ""
msgid "Internal error: line too long"
msgstr "Erro interno: linha muito comprida"
@@ -608,70 +619,138 @@ 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 ""
+
msgid "malformed recurrence line."
msgstr ""
-msgid "recurrence frequency not found."
-msgstr "periodicidade de recorrência não encontrada."
+msgid "frequency not set in rrule."
+msgstr ""
-msgid "recurrence frequency not recognized."
-msgstr "periodicidade de recorrência não reconhecida."
+msgid "frequency absent in rrule."
+msgstr ""
-msgid "malformed exceptions line."
+msgid "rrule frequency not supported."
msgstr ""
-#, fuzzy
-msgid "malformed description line."
-msgstr "descrição mal-formulada."
+msgid "invalid interval."
+msgstr ""
-#, fuzzy
-msgid "malformed description."
-msgstr "Insera uma descrição:"
+msgid "either until or count."
+msgstr ""
-#, fuzzy
-msgid "empty description."
-msgstr "Insera uma descrição:"
+msgid "missing until value."
+msgstr ""
-msgid "malformed summary line"
+msgid "invalid until format."
msgstr ""
-msgid "malformed summary."
+msgid "invalid count value."
msgstr ""
-msgid "line break in summary."
+msgid "invalid bymonth list."
msgstr ""
-msgid "could not retrieve item summary."
-msgstr "não foi possível adquirir sumário do item."
+msgid "invalid bymonthday list."
+msgstr ""
-msgid "item start date is not defined."
-msgstr "data de início do ítem não foi definida."
+msgid "invalid byday list."
+msgstr ""
-msgid "item has a negative duration."
-msgstr "item tem uma duração negativa."
+msgid "invalid exception date value type."
+msgstr ""
-msgid "item could not be identified."
-msgstr "item não pôde ser identificado."
+msgid "malformed exceptions line."
+msgstr ""
+
+msgid "invalid exception."
+msgstr ""
+
+#, c-format
+msgid "malformed %s line."
+msgstr ""
+
+#, c-format
+msgid "malformed %s."
+msgstr ""
+
+msgid "malformed summary line."
+msgstr ""
+
+msgid "malformed summary."
+msgstr ""
+
+msgid "item start date not defined."
+msgstr ""
msgid "malformed start time line."
msgstr ""
-msgid "could not retrieve event start time."
-msgstr "não foi possível adquirir hora de início do evento."
+msgid "invalid or malformed event start time."
+msgstr ""
+
+msgid "invalid end time value type."
+msgstr ""
msgid "malformed end time line."
msgstr ""
-msgid "could not retrieve event end time."
-msgstr "não foi possível adquirir hora de término do evento."
+msgid "malformed event end time."
+msgstr ""
+
+msgid "end must be later than start."
+msgstr ""
+
+msgid "either end or duration."
+msgstr ""
+
+msgid "malformed duration line."
+msgstr ""
-msgid "item duration malformed."
-msgstr "duração de item mal-formulada."
+msgid "invalid duration."
+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 ""
+
+#, c-format
+msgid "Comment: %s"
+msgstr ""
+
+#, c-format
+msgid "rrule does not match start day (%s)."
+msgstr ""
+
+msgid "item could not be identified."
+msgstr "item não pôde ser identificado."
+
+msgid "only one description allowed."
+msgstr ""
+
+msgid "only one location allowed."
+msgstr ""
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 ""
@@ -744,6 +823,21 @@ msgstr "formato errado no agendamento ou evento"
msgid "syntax error in item repetition"
msgstr "erro de sintaxe na repetição do item"
+msgid "syntax error in until date"
+msgstr ""
+
+msgid "until date error"
+msgstr ""
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr ""
+
+msgid "missing end of recurrence"
+msgstr ""
+
+msgid "syntax error in item state"
+msgstr ""
+
msgid "failed to open todo file"
msgstr "falha na abertura do arquivo de tarefas"
@@ -753,54 +847,49 @@ 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 "Error reading key: \"%s\""
-msgstr "Erro na leitura da tecla: \"%s\""
+msgid "Key label not recognized: \"%s\""
+msgstr ""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" alocada múltiplas vezes!"
+msgid "No keys assigned to \"%s\"."
+msgstr ""
-msgid "There were some errors when loading keys file."
+#, c-format
+msgid "Keyname not recognized: \"%s\""
msgstr ""
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Erros demais na leitura do arquivo de chaves, abortando..."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr ""
#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "ERRO FATAL: não foi possível criar %s: %s\n"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
-msgid "Press [ENTER] to continue"
-msgstr "Pressione [ENTER] para continuar"
+msgid "Errors in the keys file."
+msgstr ""
-msgid "Welcome to Calcurse. Missing data files were created."
+msgid "Remove offending line(s) from the keys file, aborting..."
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 "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"
+msgstr "ERRO FATAL: não foi possível criar %s: %s\n"
msgid "The data were successfully exported"
msgstr "Os dados foram exportados com sucesso"
+msgid "Press [ENTER] to continue"
+msgstr "Pressione [ENTER] para continuar"
+
msgid "unknown export type"
msgstr "tipo de exportação desconhecido"
@@ -808,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"
@@ -828,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"
@@ -873,7 +965,9 @@ msgstr ""
msgid "Invalid delay"
msgstr "Atraso inválido"
-msgid "Periodic save: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
#, c-format
@@ -920,6 +1014,9 @@ msgstr "Colar"
msgid "Chg Win"
msgstr "MudarJan"
+msgid "Prev Win"
+msgstr ""
+
msgid "Import"
msgstr "Importar"
@@ -1040,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."
@@ -1098,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."
@@ -1243,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"
@@ -1336,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)"
@@ -1354,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)"
@@ -1369,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"
@@ -1392,18 +1490,46 @@ msgstr ""
msgid "System event"
msgstr ""
-msgid "unknown repetition type"
-msgstr "tipo de repetição desconhecida"
-
msgid "unknown character"
msgstr "caractere desconhecido"
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr ""
+
+msgid "illegel date in event"
+msgstr ""
+
+msgid "date error in event"
+msgstr "erro na data em evento"
+
+msgid "month day is zero"
+msgstr ""
+
+msgid "no daily frequency check"
+msgstr ""
+
+msgid "illegal BYDAY value"
+msgstr ""
+
msgid "event not found"
msgstr "evento não encontrado"
msgid "appointment not found"
msgstr "agendamento não encontrado"
+msgid "syntax error in bymonthday"
+msgstr ""
+
+msgid "syntax error in bywday"
+msgstr ""
+
+msgid "syntax error in bymonth"
+msgstr ""
+
+msgid "illegal bymonth value"
+msgstr ""
+
msgid "syntax error in item date"
msgstr "erro de sintaxe no item data"
@@ -1411,10 +1537,6 @@ msgid "date error in item exception"
msgstr "erro de data em exceção de item"
#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Não foi possível excluir arquivo de trava do Calcurse: %s\n"
-
-#, c-format
msgid "Error setting signal #%d : %s\n"
msgstr "Erro na definição de sinal #%d : %s\n"
@@ -1451,6 +1573,10 @@ msgstr ""
msgid "Invalid time: start time must come before end time!"
msgstr ""
+#, c-format
+msgid "Repetition must begin on start day (%s)."
+msgstr ""
+
msgid "Enter end date (and/or time) or duration ('?' for input formats):"
msgstr ""
@@ -1476,51 +1602,111 @@ msgstr ""
msgid "Invalid date format - try again:."
msgstr ""
-msgid "Enter the new repetition type:"
-msgstr "Insira o novo tipo de repetição:"
+msgid "Limit repetition to listed days."
+msgstr ""
-msgid "(d)aily"
-msgstr "(d)iária"
+msgid "Expand repetition to listed days."
+msgstr ""
-msgid "(w)eekly"
-msgstr "(s)emanal"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of month."
+msgstr ""
-msgid "(m)onthly"
-msgstr "(m)ensal"
+msgid "Note: limit to monthdays, if any."
+msgstr ""
-msgid "(y)early"
-msgstr "(a)nual"
+msgid "Expand repetition to listed days, either all or 1st, 2nd, ... of year."
+msgstr ""
+
+msgid "Note: expand to listed months, if any; limit to monthdays, if any."
+msgstr ""
+
+msgid "Limit repetition to listed months."
+msgstr ""
+
+msgid "Expand repetition to listed months."
+msgstr ""
+
+msgid "Limit repetition to listed days of month."
+msgstr ""
+
+msgid "Expand repetition to listed days of month."
+msgstr ""
+
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,5,-5, '?' for help:"
+msgstr ""
#, c-format
-msgid "(currently using %s)"
-msgstr "(atualmente usando %s)"
+msgid ""
+"Weekdays [n]%s|..|[n]%s, space-separated list, n=1,-1,..,53,-53, '?' for "
+"help:"
+msgstr ""
+
+msgid "Months 1|..|12, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Monthdays 1|..|31 or -1|..|-31, space-separated list, '?' for help:"
+msgstr ""
+
+msgid "Invalid format - try again."
+msgstr ""
+
+msgid "Press any key to continue."
+msgstr ""
+
+msgid "Base period:"
+msgstr ""
+
+msgid "day"
+msgstr ""
+
+msgid "week"
+msgstr ""
+
+msgid "month"
+msgstr ""
+
+msgid "year"
+msgstr ""
msgid "[dwmy]"
msgstr "[dsma]"
-msgid "Invalid frequency."
+msgid "Frequency:"
msgstr ""
-msgid "Enter the repetition frequency:"
+msgid "Invalid frequency."
msgstr ""
-msgid "Enter end date or duration ('?' for input formats):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
msgstr ""
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
msgstr ""
msgid "Invalid date."
msgstr ""
+msgid "Repeat count is too big."
+msgstr ""
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+msgstr ""
+
msgid "Description"
msgstr "Descrição"
@@ -1552,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."
@@ -1561,36 +1747,40 @@ msgstr ""
msgid "Invalid start time."
msgstr ""
-msgid "Do you really want to delete this item?"
-msgstr "Tem certeza que deseja excluir este item?"
+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 ""
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+msgid "[san]"
msgstr ""
-"Este item é recorrente. Excluir (t)odas as ocorrências ou (s)omente esta?"
-msgid "[ao]"
-msgstr "[ts]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
+msgstr ""
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
+msgid "[sn]"
msgstr ""
-"Este item tem uma anotação anexada a ele. Excluir o (i)tem ou somente sua "
-"(n)ota?"
-msgid "[in]"
-msgstr "[in]"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
+msgstr ""
-msgid "Enter the repetition type:"
-msgstr "Insira o tipo da repetição:"
+msgid "[sa]"
+msgstr ""
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
+msgstr ""
+
+msgid "[s]"
msgstr ""
-msgid "This item is already a repeated one."
-msgstr "Este é um item repetido."
+msgid "Already repeated."
+msgstr ""
-msgid "wrong item type"
-msgstr "tipo de item errado"
+msgid "A (s)imple or (a)dvanced repetition?"
+msgstr ""
msgid "Enter the new TODO item:"
msgstr "Insira o novo item da TAREFA:"
@@ -1615,6 +1805,10 @@ msgstr "Insira a nova descrição da TAREFA:"
msgid "TODO:"
msgstr "TAREFA:"
+#, c-format
+msgid "Could not remove calcurse lock file: %s\n"
+msgstr "Não foi possível excluir arquivo de trava do Calcurse: %s\n"
+
msgid "/!\\ INTERNAL ERROR /!\\"
msgstr "/!\\ ERRO INTERNO /!\\"
@@ -1671,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:"
@@ -1726,12 +1917,3 @@ msgstr "Atualizar diretivas de configuração..."
msgid "Remove temporary backup..."
msgstr "Excluir backup temporário..."
-
-#~ 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 4dd4dae..7243440 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -1,37 +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-03-27 18:58-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 (указатель не указывает на "
+"корректные данные)."
+
+msgid "illegal date in appointment"
+msgstr "ÐеÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸ÑтиÑ."
+
+msgid "error in appointment description"
+msgstr "Ошибка в опиÑании мероприÑтиÑ."
msgid "date error in appointment"
-msgstr "ошибка даты в задаче"
+msgstr ""
+"Ошибка в работе программы: date error in appointment (некорректно указана "
+"дата мероприÑтиÑ)."
msgid "no such appointment"
-msgstr "задача отÑутÑтвует"
+msgstr ""
+"Ошибка в работе программы: no such appointment (мероприÑтие не найдено)."
msgid ""
"Usage:\n"
@@ -39,9 +55,16 @@ msgid ""
"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>] | --"
+"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' Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки."
@@ -50,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 ""
@@ -72,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 system dialogs"
-msgstr ""
+msgid " -q, --quiet Suppress import/export result message"
+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."
@@ -153,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>."
@@ -177,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?"
@@ -280,37 +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(!) ]"
-msgstr ""
+msgid "Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"
+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."
+
+msgid "Select a repeating item in the appointments panel."
+msgstr "Выберете повторÑющуюÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ на панели МероприÑтий."
+
+msgid "Not a repeating item."
+msgstr "Ðе повторÑющаÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ."
+
+msgid "Last occurrence."
+msgstr "ПоÑледний пункт из поÑледовательноÑти."
+
+msgid "First occurrence."
+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 "
@@ -321,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 "ÐаÑтройки раÑположениÑ"
@@ -351,85 +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 "(if set to YES, messages about loaded and saved data will be displayed)"
-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 "Формат даты отображаетÑÑ Ð² неинтерактивном режиме"
@@ -447,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 "ÐаÑтройка клавиш"
@@ -481,28 +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 "ÐеизвеÑтный тип запиÑи"
+
+msgid "Note:"
+msgstr "Заметка:"
msgid "Event:"
msgstr "Событие:"
msgid "Appointment:"
-msgstr "Задача:"
+msgstr "МероприÑтие:"
#, c-format
msgid "Could not stop daemon properly: %s\n"
@@ -510,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"
@@ -526,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"
@@ -540,119 +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"
-msgid "date error in event"
-msgstr "ошибка даты в Ñобытии"
+msgid "illegal date in event"
+msgstr "Ошибка в дате мероприÑтиÑ."
-msgid "date error in the event\n"
-msgstr "ошибка даты в Ñобытии\n"
+msgid "date error in event\n"
+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 "Ðеобходим DTSTART Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° мероприÑтиÑ."
msgid "malformed recurrence line."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð² Ñтрочке поÑледовательноÑÑ‚ÑŒ."
+
+msgid "frequency not set in rrule."
+msgstr "Ðе задана продолжительноÑÑ‚ÑŒ повторений Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
+
+msgid "frequency absent in rrule."
msgstr ""
+"Ðе ÑоответÑтвует Ñтандарту продолжительноÑÑ‚ÑŒ повторений Ð´Ð»Ñ "
+"поÑледовательноÑти."
-msgid "recurrence frequency not found."
-msgstr "Ñ€ÐµÐºÑƒÑ€Ñ€ÐµÐ½Ñ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота не найдена"
+msgid "rrule frequency not supported."
+msgstr "Ð”Ð»Ñ Ð¿Ð¾ÑледовательноÑти Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ‡Ð°Ñтота повторений не поддерживаетÑÑ."
-msgid "recurrence frequency not recognized."
-msgstr "Ñ€ÐµÐºÑƒÑ€Ñ€ÐµÐ½Ñ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота не раÑпознана"
+msgid "invalid interval."
+msgstr "Ðекорректный интервал."
-msgid "malformed exceptions line."
-msgstr ""
+msgid "either until or count."
+msgstr "Выберете дату или продолжительноÑÑ‚ÑŒ."
-#, fuzzy
-msgid "malformed description line."
-msgstr "опиÑание повреждено."
+msgid "missing until value."
+msgstr "ОтÑутÑтвует Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
-#, fuzzy
-msgid "malformed description."
-msgstr "ОпиÑание: "
+msgid "invalid until format."
+msgstr "Ðекорректный формат Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти."
-#, fuzzy
-msgid "empty description."
-msgstr "ОпиÑание: "
+msgid "invalid count value."
+msgstr "Ðекорректное значение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти."
-msgid "malformed summary line"
-msgstr ""
+msgid "invalid bymonth list."
+msgstr "Ðекорректно задан ÑпиÑок по меÑÑцам."
-msgid "malformed summary."
-msgstr ""
+msgid "invalid bymonthday list."
+msgstr "Ðекорректно задан ÑпиÑок по днÑм в меÑÑце."
-msgid "line break in summary."
-msgstr ""
+msgid "invalid byday list."
+msgstr "Ðекорректно задан ÑпиÑок по днÑм."
-msgid "could not retrieve item summary."
-msgstr "невозможно воÑÑтановить Ñуммарные запиÑи."
+msgid "invalid exception date value type."
+msgstr "Ðекорректный тип Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹ иÑключениÑ."
-msgid "item start date is not defined."
-msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ðµ определено."
+msgid "malformed exceptions line."
+msgstr "Ðекорректно Ñформированное в Ñтроке иÑключение."
-msgid "item has a negative duration."
-msgstr "значение имеет отрицательную продолжительноÑÑ‚ÑŒ."
+msgid "invalid exception."
+msgstr "Ðекорректное иÑключение."
-msgid "item could not be identified."
-msgstr "значение не может быть раÑпознано."
+#, c-format
+msgid "malformed %s line."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ %s Ñтрока."
+
+#, c-format
+msgid "malformed %s."
+msgstr "Ðекорректно Ñформированный %s."
+
+msgid "malformed summary line."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð² Ñтроке ÐºÑ€Ð°Ñ‚ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ "
+
+msgid "malformed summary."
+msgstr "Ðекорректно ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÑ€Ð°Ñ‚ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ."
+
+msgid "item start date not defined."
+msgstr "Дата начала мероприÑÑ‚Ð¸Ñ Ð½Ðµ определена."
-#, fuzzy
msgid "malformed start time line."
-msgstr "Ðеверное начальное времÑ."
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°."
-msgid "could not retrieve event start time."
-msgstr "невозможно воÑÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° ÑобытиÑ."
+msgid "invalid or malformed event start time."
+msgstr "ÐедопуÑтимое или некорректно Ñформированное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° мероприÑтиÑ."
+
+msgid "invalid end time value type."
+msgstr "Ðекорректный тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ окончаниÑ."
msgid "malformed end time line."
-msgstr ""
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ."
+
+msgid "malformed event end time."
+msgstr "Ðекорректно Ñформировано Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸ÑтиÑ. "
+
+msgid "end must be later than start."
+msgstr "Окончание должно быть поÑле начала."
+
+msgid "either end or duration."
+msgstr "Либо окончание, либо продолжительноÑÑ‚ÑŒ."
+
+msgid "malformed duration line."
+msgstr "Ðе правильный формат Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти."
+
+msgid "invalid duration."
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ."
+
+msgid "exception date, but no recurrence rule."
+msgstr "Дата-иÑключение, но не задано правило повтора."
+
+msgid "multi-day event changed to one-day event"
+msgstr "Многодневное мероприÑтие изменено на однодневное."
-msgid "could not retrieve event end time."
-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 "ЗапиÑÑŒ не может быть идентифицирована."
+
+msgid "only one description allowed."
+msgstr "ДопуÑтимо лишь одно опиÑание. "
-msgid "item duration malformed."
-msgstr "значение продолжительноÑти повреждено."
+msgid "only one location allowed."
+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:"
@@ -662,145 +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 "Опечатка в запиÑи повторениÑ."
+
+msgid "syntax error in until date"
+msgstr "Опечатка в дате Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
+
+msgid "until date error"
+msgstr "Ошибка в дате Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
+
+msgid "BYMONTHDAY illegal with WEEKLY"
+msgstr "ÐеÑовмеÑтимые параметры."
+
+msgid "missing end of recurrence"
+msgstr "ОтÑутÑтвует дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти."
+
+msgid "syntax error in item state"
+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 "Ðевозможно раÑпознать клавишу"
-
-msgid "Key label not recognized"
-msgstr "Клавиша не опознана"
+msgstr "Ðекорректный формат Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющей клавиши."
#, c-format
-msgid "Error reading key: \"%s\""
-msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸: \"%s\""
+msgid "Key label not recognized: \"%s\""
+msgstr "ÐераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÑÑŽÑ‰Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°: \"%s\""
#, c-format
-msgid "\"%s\" assigned multiple times!"
-msgstr "\"%s\" определено множеÑтво времён!"
+msgid "No keys assigned to \"%s\"."
+msgstr "Ðе назначено управлÑющей клавиши Ð´Ð»Ñ \"%s\"."
-msgid "There were some errors when loading keys file."
-msgstr ""
+#, c-format
+msgid "Keyname not recognized: \"%s\""
+msgstr "УправлÑÑŽÑ‰Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° не раÑпознана: \"%s\"."
-msgid "Too many errors while reading keys file, aborting..."
-msgstr "Обнаружены ошибки при чтении keys-файла, отмена..."
+#, c-format
+msgid "\"%s\" assigned twice: \"%s\"."
+msgstr "\"%s\" приÑвоена дважды: \"%s\"."
#, c-format
-msgid "FATAL ERROR: could not create %s: %s\n"
-msgstr "ФÐТÐЛЬÐÐЯ ОШИБКÐ: невозможно Ñоздать %s: %s\n"
+msgid ""
+"Action \"%s\" absent, but default key \"%s\" assigned to another action."
+msgstr ""
+"Команда \"%s\" невыполнима, управ. клавиша \"%s\" назначена Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ "
+"команды."
-msgid "Press [ENTER] to continue"
-msgstr "Ðажмите [ENTER]"
+msgid "Errors in the keys file."
+msgstr "Ошибки в файле Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими клавишами."
+
+msgid "Remove offending line(s) from the keys file, aborting..."
+msgstr ""
+"Удалите некорректную Ñтроку(и) из файла Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющими клавишами. "
+"Завершение..."
-msgid "Welcome to Calcurse. Missing data files were created."
-msgstr "Добро пожаловать в Calcurse. ОтÑутÑтвующие файлы данных будут Ñозданы."
+msgid "Some actions do not have any associated key bindings!"
+msgstr "Ð”Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… дейÑтвий не назначены клавиши!"
-msgid "Data files found. Data will be loaded now."
-msgstr "Данные найдены и будут загружены"
+#, c-format
+msgid "FATAL ERROR: could not create %s: %s\n"
+msgstr "Ðварийное завершение программы: не удалоÑÑŒ Ñоздать %s: %s\n"
msgid "The data were successfully exported"
-msgstr "Данные уÑпешно ÑкÑпортированы"
+msgstr "Данные уÑпешно ÑкÑпортированы."
+
+msgid "Press [ENTER] to continue"
+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"
@@ -808,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 ÑобытиÑ"
@@ -816,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-файл. Завершение..."
@@ -839,20 +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: data files have changed. Save cancelled."
+msgid ""
+"Periodic save cancelled. Data files have changed. Save and merge "
+"interactively"
msgstr ""
+"ÐвтоÑохранение не выполнено. Данные изменены. Сохр./объедините данные "
+"вручную."
#, c-format
msgid ""
@@ -896,7 +1042,10 @@ msgid "Paste"
msgstr "Ð’Ñтавить"
msgid "Chg Win"
-msgstr "Панель"
+msgstr "След.Панель"
+
+msgid "Prev Win"
+msgstr "Пред.Панель"
msgid "Import"
msgstr "Импорт"
@@ -908,7 +1057,7 @@ msgid "Go to"
msgstr "Переход"
msgid "OtherCmd"
-msgstr "..."
+msgstr ". . ."
msgid "Config"
msgstr "ÐаÑтройки"
@@ -917,7 +1066,7 @@ msgid "Redraw"
msgstr "Обновить"
msgid "Add Appt"
-msgstr "Доб.Задачу"
+msgstr "Доб.Меропр."
msgid "Add Todo"
msgstr "Доб.Дело"
@@ -986,10 +1135,10 @@ msgid "Edit Itm"
msgstr "Изм.ЗапиÑÑŒ"
msgid "View"
-msgstr "Смотреть"
+msgstr "ПроÑмотреть"
msgid "Pipe"
-msgstr "Программный канал (pipe)"
+msgstr "Передать ->"
msgid "Flag Itm"
msgstr "Флаг"
@@ -1021,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 "ОÑновные"
@@ -1054,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 "Импортированть данные Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ файла."
@@ -1090,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 "Добавить Дело. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
@@ -1145,7 +1302,7 @@ msgid "Go to today, whichever panel is selected."
msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð°. Может быть выбрана Ð»ÑŽÐ±Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ."
msgid "Enter command mode."
-msgstr "Введите командный режим."
+msgstr "Введите в командном режиме."
msgid "Move to the right."
msgstr "Вправо"
@@ -1185,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 "ПовыÑить приоритет дела внутри панели дел."
@@ -1202,380 +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 ""
-
-msgid "unknown repetition type"
-msgstr "неизвеÑтный тип повторениÑ"
+msgstr "СиÑтемное Ñобытие."
msgid "unknown character"
-msgstr "неизвеÑтный Ñимвол"
+msgstr "ÐеизвеÑтный Ñимвол."
+
+#, c-format
+msgid "recurrence error: not on start day (%s)"
+msgstr "Ошибка при повторении: не Ñовпадение Ñ Ð´Ð½Ñ‘Ð¼ начала (%s). "
+
+msgid "illegel date in event"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ ÑобытиÑ"
+
+msgid "date error in event"
+msgstr "Ошибка при запиÑи даты ÑобытиÑ"
+
+msgid "month day is zero"
+msgstr "Ошибка при чиÑленном обозначении Ð´Ð½Ñ Ð¼ÐµÑÑца."
+
+msgid "no daily frequency check"
+msgstr "ОтÑутÑтвует контроль за повторениÑми."
+
+msgid "illegal BYDAY value"
+msgstr "ÐедопуÑтимое значение Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð½Ñ"
msgid "event not found"
-msgstr "Ñобытие не найдено"
+msgstr "Событий не найдено"
msgid "appointment not found"
-msgstr "задача не найдена"
+msgstr "МероприÑтий не найдено"
+
+msgid "syntax error in bymonthday"
+msgstr "Ошибка при запиÑи Ð´Ð½Ñ Ð¼ÐµÑÑца."
+
+msgid "syntax error in bywday"
+msgstr "Ошибка при запиÑи Ð´Ð½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸."
+
+msgid "syntax error in bymonth"
+msgstr "Ошибка при запиÑи меÑÑца."
+
+msgid "illegal bymonth value"
+msgstr "ÐедопуÑтимое значение Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑца."
msgid "syntax error in item date"
-msgstr "опечатка в запиÑи даты"
+msgstr "Ошибка при запиÑи даты."
msgid "date error in item exception"
-msgstr "ошибка даты в значении"
-
-#, c-format
-msgid "Could not remove calcurse lock file: %s\n"
-msgstr "Ðевозможно удалить занÑтый файл: %s\n"
+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 "Повторение должно начинатьÑÑ Ñ Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾ указанного Ð´Ð½Ñ (%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 "Ðекорректный формат даты - попробуйте Ñнова."
+
+msgid "Limit repetition to listed days."
+msgstr "Ð’ краткой запиÑи обозначить по каким именно днÑм ограничить."
+
+msgid "Expand repetition to listed days."
+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 "Примечание: Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ конкретным днÑм меÑÑца (опционально)."
+
+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 "ЧиÑленно обозначить по каким именно меÑÑцам ограничить."
-msgid "Enter the new repetition type:"
-msgstr "Введите тип повторениÑ:"
+msgid "Expand repetition to listed months."
+msgstr "ЧиÑленно обозначить по каким именно меÑÑцам повторÑÑ‚ÑŒ."
-msgid "(d)aily"
-msgstr "(d)ежедневно"
+msgid "Limit repetition to listed days of month."
+msgstr "ЧиÑленно обозначить по каким именно днÑм в меÑÑце ограничить."
-msgid "(w)eekly"
-msgstr "(w)еженедельно"
+msgid "Expand repetition to listed days of month."
+msgstr "ЧиÑленно обозначить по каким именно днÑм в меÑÑце повторÑÑ‚ÑŒ."
-msgid "(m)onthly"
-msgstr "(m)ежемеÑÑчно"
+#, c-format
+msgid "Weekdays %s|..|%s, space-separated list, '?' for help:"
+msgstr "Задайте днÑми %s .. %s, разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм. Ñправку):"
-msgid "(y)early"
-msgstr "(y)ежегодно"
+#, 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 "(currently using %s)"
-msgstr "(иÑпользуетÑÑ %s)"
+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, разделÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼ ('?' Ñм."
+"Ñправку):"
+
+msgid "Invalid format - try again."
+msgstr "Указан некорректный формат. ПожалуйÑта, попробуйте ещё раз."
+
+msgid "Press any key to continue."
+msgstr "Ðажмите любую клавишу..."
+
+msgid "Base period:"
+msgstr "Базовый период:"
+
+msgid "day"
+msgstr "(d)день"
+
+msgid "week"
+msgstr "(w)неделÑ"
+
+msgid "month"
+msgstr "(m)меÑÑц"
+
+msgid "year"
+msgstr "(y)год"
msgid "[dwmy]"
-msgstr "[днмг]"
+msgstr "[dwmy]"
-msgid "Invalid frequency."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота."
+msgid "Frequency:"
+msgstr "ЧаÑтота повторов:"
-msgid "Enter the repetition frequency:"
-msgstr "Введите чаÑтоту повторениÑ:"
+msgid "Invalid frequency."
+msgstr "Указано некорректное значение Ð´Ð»Ñ Ñ‡Ð°Ñтоты повторов."
-msgid "Enter end date or duration ('?' for input formats):"
-msgstr "Введите конечную дату или продолжительноÑÑ‚ÑŒ ('?' Ñм. форматы):"
+msgid "Until date, increment or repeat count ('?' for input formats):"
+msgstr ""
+"Задайте дату Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ð¹, период. или кол-во повтор. ('?' Ñм. "
+"Ñправку)"
#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: 0."
+msgid "Date: %s (year, month may be omitted, endless: 0)."
msgstr ""
+"Дата: %s (год, меÑÑц могут быть опущены или впиÑать \"0\" - беÑконечно)."
-msgid "Duration in days: +dd. Duration in weeks and days: +??w??d."
+msgid "Increment: +?? (days) or: +??w??d (weeks). Repeat count: #?? (number)."
msgstr ""
-"ПродолжительноÑÑ‚ÑŒ в днÑÑ…: +dd. ПродолжительноÑÑ‚ÑŒ в неделÑÑ… и днÑÑ…: +??w??d"
+"ПовторÑÑ‚ÑŒ: +?? (дней) или: +??н??д (недель). Кол-во повторений: #?? (чиÑлом)"
#, c-format
-msgid "Invalid date: end date must come after start date (%s)."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°: ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° должны идти поÑле начальной даты (%s)."
+msgid "Invalid date: until date must come after start date (%s)."
+msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° Ñледовать за датой начала (%s)."
msgid "Invalid date."
-msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð°."
+msgstr "Указано некорректное значение даты."
+
+msgid "Repeat count is too big."
+msgstr "Элементов в поÑледовательноÑти мероприÑтий Ñлишком много."
+
+#, c-format
+msgid "Repetition must begin on start day (%s); any change discarded."
+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 "Указан некорректный формат Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ начала мероприÑтиÑ."
-msgid "Do you really want to delete this item?"
-msgstr "Удалить?"
-
-msgid "This item is recurrent. Delete (a)ll occurences or just this (o)ne?"
+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 ""
-"Эта запиÑÑŒ имеет повторениÑ. Удалить (a)вÑе подобные запиÑи или только "
-"(o)Ñту ?"
+"ПоÑледов. мероприÑтий Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¾Ð¹. УдалÑем (s)одно, (a)вÑÑ‘ или (n)заметку?"
+
+msgid "[san]"
+msgstr "[san]"
-msgid "[ao]"
-msgstr "[ао]"
+msgid ""
+"This item has a note attached to it. Delete (s)elected occurrence or just "
+"its (n)ote?"
+msgstr "МероприÑтие Ñ Ð·Ð°Ð¼ÐµÑ‚ÐºÐ¾Ð¹. УдалÑем вÑÑ‘ (s)выбранное или (n)заметку?"
-msgid "This item has a note attached to it. Delete (i)tem or just its (n)ote?"
-msgstr "Эта запиÑÑŒ Ñодержит заметку. Удалить (i)запиÑÑŒ или только (n)заметку ?"
+msgid "[sn]"
+msgstr "[sn]"
-msgid "[in]"
-msgstr "[в]"
+msgid ""
+"This item is recurrent. Delete (s)elected occurrence or (a)ll occurrences?"
+msgstr "ПоÑледовательноÑÑ‚ÑŒ мероприÑтий. УдалÑем (s)одно или (a)вÑÑ‘?"
-msgid "Enter the repetition type:"
-msgstr "Ðазначить тип повторениÑ:"
+msgid "[sa]"
+msgstr "[sa]"
-#, c-format
-msgid "Date: %s (year or month may be omitted). Endless duration: '0'."
-msgstr ""
+msgid "Confirm deletion. Delete (s)elected occurrence? Press (s) to confirm."
+msgstr "Подтвердите удаление. Удалить (s)выбранное?"
-msgid "This item is already a repeated one."
-msgstr "Эта запиÑÑŒ уже повторÑетÑÑ."
+msgid "[s]"
+msgstr "[s]"
-msgid "wrong item type"
-msgstr "неправильный тип запиÑи"
+msgid "Already repeated."
+msgstr "Уже повторÑетÑÑ."
+
+msgid "A (s)imple or (a)dvanced repetition?"
+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 "Ðевозможно удалить файл блокировки Ð´Ð»Ñ calcurse: %s\n"
msgid "/!\\ INTERNAL ERROR /!\\"
-msgstr "/!\\ INTERNAL ERROR /!\\"
+msgstr "/!\\ ÐЕПОÐЯТÐÐЯ ОШИБКР/!\\"
msgid "Please report the following bug:"
-msgstr "Сообщите об ошибке:"
+msgstr "ПожалуйÑта, Ñообщите об ошибке:"
msgid "[yn]"
msgstr "[yn]"
@@ -1584,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 "Файл конфигурации не найден:"
@@ -1649,7 +1911,7 @@ msgid "Create temporary backup of the configuration file..."
msgstr "Создать временную архивную копию файла конфигурации..."
msgid "Old backup file found:"
-msgstr "Предыдущий файл архивной копии найден:"
+msgstr "ÐÐ°Ð¹Ð´ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° данных:"
msgid ""
"\n"
@@ -1657,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"
@@ -1673,26 +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 "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 886429d..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."));
}
@@ -398,7 +398,7 @@ cleanup:
/*
* Parse the command-line arguments and call the appropriate
* routines to handle those arguments. Also initialize the data paths.
- * Returns the non-interactive value.
+ * Exit here in case of errors else return the non-interactive value.
*/
int parse_args(int argc, char **argv)
{
@@ -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];
@@ -515,6 +515,10 @@ int parse_args(int argc, char **argv)
case 'c':
cfile = optarg;
break;
+ case '?':
+ usage();
+ usage_try();
+ exit(EXIT_FAILURE); \
}
}
io_init(cfile, datadir, confdir);
@@ -557,7 +561,7 @@ int parse_args(int argc, char **argv)
break;
case 'h':
help_arg();
- goto cleanup;
+ exit(EXIT_SUCCESS);
case 'g':
gc = 1;
break;
@@ -615,7 +619,7 @@ int parse_args(int argc, char **argv)
break;
case 'v':
version_arg();
- goto cleanup;
+ exit(EXIT_SUCCESS);
case 'x':
export = 1;
if (optarg) {
@@ -860,10 +864,6 @@ int parse_args(int argc, char **argv)
'\0';
cmd_line = 1;
break;
- default:
- usage();
- usage_try();
- goto cleanup;
}
}
@@ -876,12 +876,8 @@ int parse_args(int argc, char **argv)
(format_opt && !(grep + query + dump_imported)) ||
(query_range && !query) ||
(purge && !filter.invert)
- ) {
- ERROR_MSG(_("invalid argument combination"));
- usage();
- usage_try();
- goto cleanup;
- }
+ )
+ EXIT(_("invalid argument combination"));
EXIT_IF(to >= 0 && range, _("cannot specify a range and an end date"));
if (from == -1)
@@ -967,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);
@@ -984,7 +982,6 @@ int parse_args(int argc, char **argv)
non_interactive = 0;
}
-cleanup:
/* Free filter parameters. */
if (filter.regex)
regfree(filter.regex);
diff --git a/src/calcurse.c b/src/calcurse.c
index 8a65fba..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);
}
}
@@ -557,7 +533,8 @@ static inline void key_generic_cmd(void)
int valid = 0, force = 0, ret;
char *error_msg;
- status_mesg(_("Command: [ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) ]"), "");
+ status_mesg(_("Command: "
+ "[ h(elp) | w(rite)(!) | q(uit)(!) | wq(!) | n(ext) | p(rev) ]"), "");
if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID)
goto cleanup;
cmd_name = strtok(cmd, " ");
@@ -622,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,
@@ -638,14 +619,59 @@ static inline void key_generic_cmd(void)
goto cleanup;
}
if (!more) {
- error_msg = _("Last repetition.");
+ error_msg = _("Last occurrence.");
warnbox(error_msg);
goto cleanup;
}
- item->start = next;
+ item->order = next;
ui_calendar_set_slctd_day(sec2date(next));
day_set_sel_data(item);
- do_storage(1);
+ day_do_storage(1);
+
+ valid = 1;
+ }
+ if (!strcmp(cmd_name, "prev") || !strcmp(cmd_name, "p")) {
+ struct day_item *item;
+ time_t day, prev;
+ struct recur_apoint *rapt;
+ struct recur_event *rev;
+ int more = 0;
+
+ if (wins_slctd() != APP) {
+ error_msg = _("Select a repeating item in the"
+ " appointments panel.");
+ warnbox(error_msg);
+ goto cleanup;
+ }
+ 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_prev_occurrence(rev->day, -1, rev->rpt,
+ &rev->exc, day, &prev);
+ } else if (item->type == RECUR_APPT) {
+ rapt = item->item.rapt;
+ more = recur_prev_occurrence(rapt->start, rapt->dur,
+ rapt->rpt, &rapt->exc,
+ day, &prev);
+ } else {
+ error_msg = _("Not a repeating item.");
+ warnbox(error_msg);
+ goto cleanup;
+ }
+ if (!more) {
+ error_msg = _("First occurrence.");
+ warnbox(error_msg);
+ goto cleanup;
+ }
+ item->order = prev;
+ ui_calendar_set_slctd_day(sec2date(prev));
+ day_set_sel_data(item);
+ day_do_storage(1);
valid = 1;
}
@@ -755,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);
@@ -775,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();
@@ -785,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);
}
}
@@ -801,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 39a2af1..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.
@@ -510,11 +514,11 @@ struct notify_app {
struct io_file {
FILE *fd;
- char name[BUFSIZ];
+ 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 *,
@@ -1019,6 +1025,7 @@ void edit_note(char **, const char *);
void view_note(const char *, const char *);
void erase_note(char **);
void note_read(char *, FILE *);
+void note_read_contents(char *, size_t, FILE *);
void note_gc(void);
/* notify.c */
@@ -1105,6 +1112,7 @@ void recur_event_paste_item(struct recur_event *, time_t);
void recur_apoint_paste_item(struct recur_apoint *, time_t);
int recur_next_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *);
int recur_nth_occurrence(time_t, long, struct rpt *, llist_t *, int, time_t *);
+int recur_prev_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *);
/* sigs.c */
@@ -1228,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);
@@ -1248,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 *);
@@ -1323,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 c699797..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;
}
@@ -1201,7 +1221,10 @@ void custom_config_main(void)
wmove(win[STA].p, 0, 0);
wins_doupdate();
- while ((ch = keys_wgetch(win[KEY].p)) != 'q') {
+ while (1) {
+ ch = keys_wgetch(win[KEY].p);
+ if (keys_get_action(ch) == KEY_GENERIC_QUIT)
+ break;
switch (ch) {
case 'C':
case 'c':
@@ -1219,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':
@@ -1245,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 2a1e1a8..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,12 +588,66 @@ 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)
{
+ const char *note_heading = _("Note:");
+ size_t note_size = 3500;
+
if (day->type == EVNT || day->type == RECUR_EVNT) {
- item_in_popup(NULL, NULL, day_item_get_mesg(day),
- _("Event:"));
+ if (day_item_get_note(day)) {
+ char note[note_size];
+ char *notepath, *msg;
+ FILE *fp;
+
+ 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_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_display_mesg(day), _("Event:"));
+ }
} else if (day->type == APPT || day->type == RECUR_APPT) {
char a_st[100], a_end[100];
@@ -593,8 +657,28 @@ void day_popup_item(struct day_item *day)
apt_tmp.start = day->start;
apt_tmp.dur = day_item_get_duration(day);
apoint_sec2str(&apt_tmp, ui_day_sel_date(), a_st, a_end);
- item_in_popup(a_st, a_end, day_item_get_mesg(day),
- _("Appointment:"));
+
+ if (day_item_get_note(day)) {
+ char note[note_size];
+ char *notepath, *msg;
+ FILE *fp;
+
+ 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_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_display_mesg(day), _("Appointment:"));
+ }
} else {
EXIT(_("unknown item type"));
/* NOTREACHED */
@@ -798,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 f9bbfd2..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
@@ -34,7 +34,7 @@
*
*/
-#include <sys/types.h>
+#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <paths.h>
@@ -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)); \
@@ -143,8 +143,7 @@ static unsigned daemonize(int status)
|| !sigs_set_hdlr(SIGTERM, dmon_sigs_hdlr)
|| !sigs_set_hdlr(SIGALRM, dmon_sigs_hdlr)
|| !sigs_set_hdlr(SIGQUIT, dmon_sigs_hdlr)
- || !sigs_set_hdlr(SIGUSR1, dmon_sigs_hdlr)
- || !sigs_set_hdlr(SIGCHLD, SIG_IGN))
+ || !sigs_set_hdlr(SIGUSR1, dmon_sigs_hdlr))
return 0;
return 1;
@@ -203,6 +202,9 @@ void dmon_start(int parent_exit_status)
DMON_SLEEP_TIME);
psleep(DMON_SLEEP_TIME);
DMON_LOG(_("awakened at %s\n"), nowstr());
+ /* Reap the user-defined notifications. */
+ while (waitpid(0, NULL, WNOHANG) > 0)
+ ;
}
}
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 20aed69..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
@@ -35,35 +35,38 @@
*/
#include <stddef.h>
+#include <sys/wait.h>
#include "calcurse.h"
int run_hook(const char *name)
{
- char *hook_path = NULL;
+ char *hook_path = NULL, *mesg;
+ int pid, pin, pout, perr, ret = -127;
char const *arg[2];
- int pid, ret = -127;
- int prepare_wins = (ui_mode == UI_CURSES);
asprintf(&hook_path, "%s/%s", path_hooks, name);
- arg[0] = hook_path;
- arg[1] = NULL;
-
if (!io_file_exists(hook_path))
goto cleanup;
+ arg[0] = hook_path;
+ arg[1] = NULL;
- if (prepare_wins)
- wins_prepare_external();
-
- if ((pid = shell_exec(NULL, NULL, *arg, arg))) {
- ret = child_wait(NULL, NULL, pid);
- if (ret)
- press_any_key();
+ 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,
+ WEXITSTATUS(ret));
+ que_ins(mesg, now(), 3);
+ mem_free(mesg);
+ } else if (ret != 0) {
+ asprintf(&mesg, "%s hook: abnormal termination",
+ name);
+ que_ins(mesg, now(), 4);
+ mem_free(mesg);
+ }
}
- if (prepare_wins)
- wins_unprepare_external();
-
cleanup:
mem_free(hook_path);
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 2946412..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
@@ -36,11 +36,14 @@
#include <strings.h>
#include <sys/types.h>
+#include <ctype.h>
#include "calcurse.h"
#define ICALDATEFMT "%Y%m%d"
#define ICALDATETIMEFMT "%Y%m%dT%H%M%S"
+#define SEPARATOR "-- \n"
+#define INDENT " "
typedef enum {
ICAL_VEVENT,
@@ -59,20 +62,9 @@ typedef enum {
SUMMARY,
DESCRIPTION,
LOCATION,
- COMMENT,
- STATUS
+ COMMENT
} ical_property_e;
-typedef struct {
- enum recur_type type;
- unsigned freq;
- time_t until;
- unsigned count;
- llist_t bymonth;
- llist_t bywday;
- llist_t bymonthday;
-} ical_rpt_t;
-
static void ical_export_header(FILE *);
static void ical_export_recur_events(FILE *, int);
static void ical_export_events(FILE *, int);
@@ -84,22 +76,29 @@ static void ical_export_footer(FILE *);
static const char *ical_recur_type[NBRECUR] =
{ "DAILY", "WEEKLY", "MONTHLY", "YEARLY" };
-/* Escape characters in field before printing */
-static void ical_format_line(FILE * stream, char * field, char * msg)
+static const char *ical_wday[] =
+ {"SU", "MO", "TU", "WE", "TH", "FR", "SA"};
+
+/*
+ * Encode a string as a property value of type TEXT (RFC 5545, 3.3.11).
+ */
+static void ical_format_line(FILE *stream, char *property, char *msg)
{
char * p;
- fputs(field, stream);
+ fputs(property, stream);
for (p = msg; *p; p++) {
switch (*p) {
+ case '\n':
+ fprintf(stream, "\\%c", 'n');
+ break;
case ',':
case ';':
case '\\':
fprintf(stream, "\\%c", *p);
break;
default:
- fputc(*p, stream);
- break;
+ fputc(*p, stream);
}
}
fputc('\n', stream);
@@ -116,12 +115,157 @@ static void ical_export_valarm(FILE * stream)
fputs("END:VALARM\n", stream);
}
+static void ical_export_rrule(FILE *stream, struct rpt *rpt, ical_vevent_e item,
+ char *buf)
+{
+ llist_item_t *j;
+ int d;
+ char *fmt = item == EVENT ? ICALDATEFMT :
+ item == APPOINTMENT ? ICALDATETIMEFMT :
+ NULL;
+
+ fprintf(stream, "RRULE:FREQ=%s", ical_recur_type[rpt->type]);
+ if (rpt->freq > 1)
+ fprintf(stream, ";INTERVAL=%d", rpt->freq);
+ if (rpt->until) {
+ date_sec2date_fmt(rpt->until, fmt, buf);
+ fprintf(stream, ";UNTIL=%s", buf);
+ }
+ if (LLIST_FIRST(&rpt->bymonth)) {
+ fputs(";BYMONTH=", stream);
+ LLIST_FOREACH(&rpt->bymonth, j) {
+ d = *(int *)LLIST_GET_DATA(j);
+ fprintf(stream, "%d", d);
+ if (LLIST_NEXT(j))
+ fputc(',', stream);
+ }
+ }
+ if (LLIST_FIRST(&rpt->bywday)) {
+ int ord;
+ char sign;
+
+ fputs(";BYDAY=", stream);
+ LLIST_FOREACH(&rpt->bywday, j) {
+ d = *(int *)LLIST_GET_DATA(j);
+ sign = d < 0 ? '-' : '+';
+ d = abs(d);
+ ord = d / 7;
+ d = d % 7;
+ if (ord == 0)
+ fprintf(stream, "%s", ical_wday[d]);
+ else
+ fprintf(stream, "%c%d%s", sign, ord, ical_wday[d]);
+ if (LLIST_NEXT(j))
+ fputc(',', stream);
+ }
+ }
+ if (LLIST_FIRST(&rpt->bymonthday)) {
+ fputs(";BYMONTHDAY=", stream);
+ LLIST_FOREACH(&rpt->bymonthday, j) {
+ d = *(int *)LLIST_GET_DATA(j);
+ fprintf(stream, "%d", d);
+ if (LLIST_NEXT(j))
+ fputc(',', stream);
+ }
+ }
+ fputc('\n', stream);
+}
+
+/*
+ * Copy the characters (lines) between "a" and "z" into an allocated string,
+ * un-indent it and return it. Note that the final character, a newline, is
+ * overwritten with '\0'.
+ */
+static char *ical_unindent(char *a, char *z)
+{
+ char *p, *q; int len;
+
+ len = z - a + 1;
+
+ p = mem_malloc(len);
+ strncpy(p, a, len);
+ p[len - 1] = '\0';
+ while ((q = strstr(p, "\n" INDENT))) {
+ while (*(q + 1 + strlen(INDENT))) {
+ *(q + 1) = *(q + 1 + strlen(INDENT));
+ q++;
+ }
+ *(q + 1) = '\0';
+ }
+ return p;
+}
+
+static void ical_export_note(FILE *stream, char *name)
+{
+ char *note_file, *p, *q, *r, *rest;
+ char *property[] = {
+ "Location: ",
+ "Comment: ",
+ NULL
+ };
+ char *PROPERTY[] = {
+ "LOCATION:",
+ "COMMENT:"
+ };
+ struct string note;
+ char lbuf[BUFSIZ];
+ FILE *fp;
+ int has_desc, has_prop, i;
+
+ asprintf(&note_file, "%s/%s", path_notes, name);
+ 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);
+ fclose(fp);
+
+ has_desc = has_prop = 0;
+ rest = note.buf;
+ if ((p = strstr(note.buf, SEPARATOR))) {
+ has_prop = 1;
+ rest = p + strlen(SEPARATOR);
+ if (p != note.buf) {
+ has_desc = 1;
+ *(--p) = '\0';
+ }
+ } else {
+ has_desc = 1;
+ note.buf[strlen(note.buf) - 1] = '\0';
+ }
+
+ if (has_desc)
+ ical_format_line(stream, "DESCRIPTION:", note.buf);
+
+ if (!has_prop)
+ goto cleanup;
+ for (i = 0; property[i]; i++) {
+ if ((p = strstr(rest, property[i])))
+ p += strlen(property[i]);
+ else
+ continue;
+ /* Find end of property. */
+ for (q = p;
+ (q = strchr(q, '\n')) && starts_with(q + 1, INDENT);
+ q++) ;
+ /* Extract property line(s). */
+ r = ical_unindent(p, q);
+ ical_format_line(stream, PROPERTY[i], r);
+ mem_free(r);
+ }
+cleanup:
+ mem_free(note.buf);
+}
+
/* Export header. */
static void ical_export_header(FILE * stream)
{
fputs("BEGIN:VCALENDAR\n", stream);
- fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION);
fputs("VERSION:2.0\n", stream);
+ fprintf(stream, "PRODID:-//calcurse//NONSGML v%s//EN\n", VERSION);
}
/* Export footer. */
@@ -134,26 +278,21 @@ static void ical_export_footer(FILE * stream)
static void ical_export_recur_events(FILE * stream, int export_uid)
{
llist_item_t *i, *j;
- char ical_date[BUFSIZ];
+ char ical_date[BUFSIZ], *hash;
LLIST_FOREACH(&recur_elist, i) {
struct recur_event *rev = LLIST_GET_DATA(i);
- date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date);
fputs("BEGIN:VEVENT\n", stream);
- fprintf(stream, "DTSTART;VALUE=DATE:%s\n", ical_date);
- fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
- ical_recur_type[rev->rpt->type], rev->rpt->freq);
-
- if (rev->rpt->until != 0) {
- date_sec2date_fmt(rev->rpt->until, ICALDATEFMT,
- ical_date);
- fprintf(stream, ";UNTIL=%s\n", ical_date);
- } else {
- fputc('\n', stream);
+ if (export_uid) {
+ hash = recur_event_hash(rev);
+ fprintf(stream, "UID:%s\n", hash);
+ mem_free(hash);
}
-
+ date_sec2date_fmt(rev->day, ICALDATEFMT, ical_date);
+ fprintf(stream, "DTSTART;VALUE=DATE:%s\n", ical_date);
+ ical_export_rrule(stream, rev->rpt, EVENT, ical_date);
if (LLIST_FIRST(&rev->exc)) {
- fputs("EXDATE:", stream);
+ fputs("EXDATE;VALUE=DATE:", stream);
LLIST_FOREACH(&rev->exc, j) {
struct excp *exc = LLIST_GET_DATA(j);
date_sec2date_fmt(exc->st, ICALDATETIMEFMT,
@@ -162,15 +301,9 @@ static void ical_export_recur_events(FILE * stream, int export_uid)
fputc(LLIST_NEXT(j) ? ',' : '\n', stream);
}
}
-
ical_format_line(stream, "SUMMARY:", rev->mesg);
-
- if (export_uid) {
- char *hash = recur_event_hash(rev);
- fprintf(stream, "UID:%s\n", hash);
- mem_free(hash);
- }
-
+ if (rev->note)
+ ical_export_note(stream, rev->note);
fputs("END:VEVENT\n", stream);
}
}
@@ -179,21 +312,21 @@ static void ical_export_recur_events(FILE * stream, int export_uid)
static void ical_export_events(FILE * stream, int export_uid)
{
llist_item_t *i;
- char ical_date[BUFSIZ];
+ char ical_date[BUFSIZ], *hash;
LLIST_FOREACH(&eventlist, i) {
struct event *ev = LLIST_TS_GET_DATA(i);
- date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date);
fputs("BEGIN:VEVENT\n", stream);
- fprintf(stream, "DTSTART;VALUE=DATE:%s\n", ical_date);
- ical_format_line(stream, "SUMMARY:", ev->mesg);
-
if (export_uid) {
- char *hash = event_hash(ev);
+ hash = event_hash(ev);
fprintf(stream, "UID:%s\n", hash);
mem_free(hash);
}
-
+ date_sec2date_fmt(ev->day, ICALDATEFMT, ical_date);
+ fprintf(stream, "DTSTART;VALUE=DATE:%s\n", ical_date);
+ ical_format_line(stream, "SUMMARY:", ev->mesg);
+ if (ev->note)
+ ical_export_note(stream, ev->note);
fputs("END:VEVENT\n", stream);
}
}
@@ -202,16 +335,30 @@ static void ical_export_events(FILE * stream, int export_uid)
static void ical_export_recur_apoints(FILE * stream, int export_uid)
{
llist_item_t *i, *j;
- char ical_datetime[BUFSIZ];
- char ical_date[BUFSIZ];
+ char ical_datetime[BUFSIZ], *hash;
+ time_t tod;
LLIST_TS_LOCK(&recur_alist_p);
LLIST_TS_FOREACH(&recur_alist_p, i) {
struct recur_apoint *rapt = LLIST_TS_GET_DATA(i);
+ /*
+ * Add time-of-day to UNTIL/EXDATE.
+ * In calcurse until/exception is a date (midnight), but in
+ * RFC 5545 UNTIL/EXDATE is a DATE-TIME value type by default.
+ */
+ tod = get_item_time(rapt->start);
+ if (rapt->rpt->until)
+ rapt->rpt->until += tod;
+
date_sec2date_fmt(rapt->start, ICALDATETIMEFMT,
ical_datetime);
fputs("BEGIN:VEVENT\n", stream);
+ if (export_uid) {
+ hash = recur_apoint_hash(rapt);
+ fprintf(stream, "UID:%s\n", hash);
+ mem_free(hash);
+ }
fprintf(stream, "DTSTART:%s\n", ical_datetime);
if (rapt->dur > 0) {
fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n",
@@ -220,38 +367,22 @@ static void ical_export_recur_apoints(FILE * stream, int export_uid)
(rapt->dur / MININSEC) % HOURINMIN,
rapt->dur % MININSEC);
}
- fprintf(stream, "RRULE:FREQ=%s;INTERVAL=%d",
- ical_recur_type[rapt->rpt->type], rapt->rpt->freq);
-
- if (rapt->rpt->until != 0) {
- date_sec2date_fmt(rapt->rpt->until + HOURINSEC,
- ICALDATEFMT, ical_date);
- fprintf(stream, ";UNTIL=%s\n", ical_date);
- } else {
- fputc('\n', stream);
- }
-
+ ical_export_rrule(stream, rapt->rpt, APPOINTMENT, ical_datetime);
if (LLIST_FIRST(&rapt->exc)) {
fputs("EXDATE:", stream);
LLIST_FOREACH(&rapt->exc, j) {
struct excp *exc = LLIST_GET_DATA(j);
- date_sec2date_fmt(exc->st, ICALDATETIMEFMT,
- ical_date);
- fprintf(stream, "%s", ical_date);
+ date_sec2date_fmt(exc->st + tod, ICALDATETIMEFMT,
+ ical_datetime);
+ fprintf(stream, "%s", ical_datetime);
fputc(LLIST_NEXT(j) ? ',' : '\n', stream);
}
}
-
ical_format_line(stream, "SUMMARY:", rapt->mesg);
+ if (rapt->note)
+ ical_export_note(stream, rapt->note);
if (rapt->state & APOINT_NOTIFY)
ical_export_valarm(stream);
-
- if (export_uid) {
- char *hash = recur_apoint_hash(rapt);
- fprintf(stream, "UID:%s\n", hash);
- mem_free(hash);
- }
-
fputs("END:VEVENT\n", stream);
}
LLIST_TS_UNLOCK(&recur_alist_p);
@@ -261,14 +392,19 @@ static void ical_export_recur_apoints(FILE * stream, int export_uid)
static void ical_export_apoints(FILE * stream, int export_uid)
{
llist_item_t *i;
- char ical_datetime[BUFSIZ];
+ char ical_datetime[BUFSIZ], *hash;
LLIST_TS_LOCK(&alist_p);
LLIST_TS_FOREACH(&alist_p, i) {
struct apoint *apt = LLIST_TS_GET_DATA(i);
+ fputs("BEGIN:VEVENT\n", stream);
+ if (export_uid) {
+ hash = apoint_hash(apt);
+ fprintf(stream, "UID:%s\n", hash);
+ mem_free(hash);
+ }
date_sec2date_fmt(apt->start, ICALDATETIMEFMT,
ical_datetime);
- fputs("BEGIN:VEVENT\n", stream);
fprintf(stream, "DTSTART:%s\n", ical_datetime);
if (apt->dur > 0) {
fprintf(stream, "DURATION:P%ldDT%ldH%ldM%ldS\n",
@@ -278,15 +414,10 @@ static void ical_export_apoints(FILE * stream, int export_uid)
apt->dur % MININSEC);
}
ical_format_line(stream, "SUMMARY:", apt->mesg);
+ if (apt->note)
+ ical_export_note(stream, apt->note);
if (apt->state & APOINT_NOTIFY)
ical_export_valarm(stream);
-
- if (export_uid) {
- char *hash = apoint_hash(apt);
- fprintf(stream, "UID:%s\n", hash);
- mem_free(hash);
- }
-
fputs("END:VEVENT\n", stream);
}
LLIST_TS_UNLOCK(&alist_p);
@@ -296,22 +427,23 @@ static void ical_export_apoints(FILE * stream, int export_uid)
static void ical_export_todo(FILE * stream, int export_uid)
{
llist_item_t *i;
+ char *hash;
LLIST_FOREACH(&todolist, i) {
struct todo *todo = LLIST_TS_GET_DATA(i);
fputs("BEGIN:VTODO\n", stream);
- if (todo->completed)
- fprintf(stream, "STATUS:COMPLETED\n");
- fprintf(stream, "PRIORITY:%d\n", todo->id);
- ical_format_line(stream, "SUMMARY:", todo->mesg);
-
if (export_uid) {
- char *hash = todo_hash(todo);
+ hash = todo_hash(todo);
fprintf(stream, "UID:%s\n", hash);
mem_free(hash);
}
-
+ fprintf(stream, "PRIORITY:%d\n", todo->id);
+ ical_format_line(stream, "SUMMARY:", todo->mesg);
+ if (todo->note)
+ ical_export_note(stream, todo->note);
+ if (todo->completed)
+ fprintf(stream, "STATUS:COMPLETED\n");
fputs("END:VTODO\n", stream);
}
}
@@ -380,32 +512,26 @@ static void ical_store_todo(int priority, int completed, char *mesg,
* Calcurse limitation: events are one-day (all-day), and all multi-day events
* are turned into one-day events; a note has been added by ical_read_event().
*/
-static int
+static void
ical_store_event(char *mesg, char *note, time_t day, time_t end,
- ical_rpt_t *irpt, llist_t *exc, const char *fmt_ev,
+ struct rpt *rpt, llist_t *exc, const char *fmt_ev,
const char *fmt_rev)
{
const int EVENTID = 1;
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.
*/
- if (irpt) {
- struct rpt rpt;
- rpt.type = irpt->type;
- rpt.freq = irpt->freq;
- rpt.until = irpt->until;
- rpt.bymonth = irpt->bymonth;
- rpt.bywday = irpt->bywday;
- rpt.bymonthday = irpt->bymonthday;
- rpt.exc = *exc;
- if (!recur_item_find_occurrence(day, -1, &rpt, NULL, day, NULL))
- return 0;
- mem_free(irpt);
- rev = recur_event_new(mesg, note, day, EVENTID, &rpt);
+ if (rpt) {
+ rpt->exc = *exc;
+ rev = recur_event_new(mesg, note, day, EVENTID, rpt);
if (fmt_rev)
print_recur_event(fmt_rev, day, rev);
goto cleanup;
@@ -424,27 +550,26 @@ ical_store_event(char *mesg, char *note, time_t day, time_t end,
* event until the day before the end. In iCal, the end day is
* exclusive, the until day inclusive.
*/
- struct rpt rpt;
- rpt.type = RECUR_DAILY;
- rpt.freq = 1;
- rpt.until = day + ((end - day - 1) / DAYINSEC) * DAYINSEC;
- LLIST_INIT(&rpt.bymonth);
- LLIST_INIT(&rpt.bywday);
- LLIST_INIT(&rpt.bymonthday);
- rpt.exc = *exc;
- rev = recur_event_new(mesg, note, day, EVENTID, &rpt);
+ struct rpt tmp;
+ tmp.type = RECUR_DAILY;
+ tmp.freq = 1;
+ tmp.until = day + ((end - day - 1) / DAYINSEC) * DAYINSEC;
+ LLIST_INIT(&tmp.bymonth);
+ LLIST_INIT(&tmp.bywday);
+ LLIST_INIT(&tmp.bymonthday);
+ tmp.exc = *exc;
+ rev = recur_event_new(mesg, note, day, EVENTID, &tmp);
if (fmt_rev)
print_recur_event(fmt_rev, day, rev);
cleanup:
mem_free(mesg);
erase_note(&note);
- return 1;
}
-static int
+static void
ical_store_apoint(char *mesg, char *note, time_t start, long dur,
- ical_rpt_t * irpt, llist_t * exc, int has_alarm,
+ struct rpt *rpt, llist_t *exc, int has_alarm,
const char *fmt_apt, const char *fmt_rapt)
{
char state = 0L;
@@ -452,21 +577,13 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
struct recur_apoint *rapt;
time_t day;
- day = update_time_in_date(start, 0, 0);
+ if (!mesg)
+ mesg = mem_strdup(_("(empty)"));
+ EXIT_IF(!mesg, _("ical_store_event: out of memory"));
+
if (has_alarm)
state |= APOINT_NOTIFY;
- if (irpt) {
- struct rpt rpt;
- rpt.type = irpt->type;
- rpt.freq = irpt->freq;
- rpt.until = irpt->until;
- rpt.bymonth = irpt->bymonth;
- rpt.bywday = irpt->bywday;
- rpt.bymonthday = irpt->bymonthday;
- rpt.exc = *exc;
- if (!recur_item_find_occurrence(start, dur, &rpt, NULL,
- day, NULL))
- return 0;
+ if (rpt) {
/*
* In calcurse, "until" is interpreted as a day (DATE) - hours,
* minutes and seconds are ignored - whereas in iCal the full
@@ -475,17 +592,17 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
* day, and the start time is after the until value, the
* calcurse until day must be changed to the day before.
*/
- if (rpt.until) {
- day = update_time_in_date(rpt.until, 0, 0);
- if (recur_item_find_occurrence(start, dur, &rpt, NULL,
+ if (rpt->until) {
+ day = DAY(rpt->until);
+ if (recur_item_find_occurrence(start, dur, rpt, NULL,
day, NULL) &&
- get_item_time(rpt.until) < get_item_time(start))
- rpt.until = date_sec_change(day, 0, -1);
+ get_item_time(rpt->until) < get_item_time(start))
+ rpt->until = date_sec_change(day, 0, -1);
else
- rpt.until = day;
+ rpt->until = day;
}
- mem_free(irpt);
- rapt = recur_apoint_new(mesg, note, start, dur, state, &rpt);
+ rpt->exc = *exc;
+ rapt = recur_apoint_new(mesg, note, start, dur, state, rpt);
if (fmt_rapt)
print_recur_apoint(fmt_rapt, start, rapt->start, rapt);
} else {
@@ -495,7 +612,6 @@ ical_store_apoint(char *mesg, char *note, time_t start, long dur,
}
mem_free(mesg);
erase_note(&note);
- return 1;
}
/*
@@ -508,7 +624,6 @@ static char *ical_unformat_line(char *line, int eol, int indentation)
{
struct string s;
char *p;
- const char *INDENT = " ";
string_init(&s);
for (p = line; *p; p++) {
@@ -576,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';
@@ -788,26 +903,6 @@ static long ical_dur2long(char *durstr, ical_vevent_e type)
}
/*
- * Set repetition until date from repetition count
- * for an ical recurrence rule (s, d, i, e).
- */
-static void ical_count2until(time_t s, long d, ical_rpt_t *i, llist_t *e,
- ical_vevent_e type)
-{
- struct rpt rpt;
-
- if (type == EVENT)
- d = -1;
- rpt.type = i->type;
- rpt.freq = i->freq;
- rpt.until = 0;
- rpt.bymonth = i->bymonth;
- rpt.bywday = i->bywday;
- rpt.bymonthday = i->bymonthday;
- recur_nth_occurrence(s, d, &rpt, e, i->count, &i->until);
-}
-
-/*
* Skip to the value part of an iCalendar content line.
*/
static char *ical_get_value(char *p)
@@ -962,14 +1057,15 @@ static int ical_bywday(llist_t *ll, char *cl)
* / ( "BYSETPOS" "=" bysplist )
* / ( "WKST" "=" weekday )
*/
-static ical_rpt_t *ical_read_rrule(FILE *log, char *rrulestr,
+static struct rpt *ical_read_rrule(FILE *log, char *rrulestr,
unsigned *noskipped,
const int itemline,
ical_vevent_e type,
- time_t start)
+ time_t start,
+ int *count)
{
- char freqstr[8];
- ical_rpt_t *rpt;
+ char freqstr[8], datestr[17];
+ struct rpt *rpt;
char *p, *q;
if (type == UNDEFINED) {
@@ -989,15 +1085,15 @@ static ical_rpt_t *ical_read_rrule(FILE *log, char *rrulestr,
for (q = p; (q = strchr(q, ';')); *q = ' ', q++)
;
- rpt = mem_malloc(sizeof(ical_rpt_t));
- memset(rpt, 0, sizeof(ical_rpt_t));
+ rpt = mem_malloc(sizeof(struct rpt));
+ memset(rpt, 0, sizeof(struct rpt));
LLIST_INIT(&rpt->bymonth);
LLIST_INIT(&rpt->bywday);
LLIST_INIT(&rpt->bymonthday);
/* 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)++;
@@ -1031,7 +1127,7 @@ static ical_rpt_t *ical_read_rrule(FILE *log, char *rrulestr,
/* INTERVAL rule part */
rpt->freq = 1;
if ((p = strstr(rrulestr, "INTERVAL="))) {
- if (sscanf(p, "INTERVAL=%u", &rpt->freq) != 1) {
+ if (sscanf(p, "INTERVAL=%d", &rpt->freq) != 1) {
ical_log(log, ICAL_VEVENT, itemline, _("invalid interval."));
(*noskipped)++;
mem_free(rpt);
@@ -1049,7 +1145,14 @@ static ical_rpt_t *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."));
@@ -1065,7 +1168,7 @@ static ical_rpt_t *ical_read_rrule(FILE *log, char *rrulestr,
*/
if ((p = strstr(rrulestr, "COUNT="))) {
p = strchr(p, '=') + 1;
- if (!(sscanf(p, "%u", &rpt->count) == 1 && rpt->count)) {
+ if (!(sscanf(p, "%d", count) == 1 && *count)) {
ical_log(log, ICAL_VEVENT, itemline,
_("invalid count value."));
(*noskipped)++;
@@ -1133,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."));
@@ -1181,7 +1279,7 @@ static char *ical_read_note(char *line, ical_property_e property, unsigned *nosk
FILE * log)
{
const int EOL = 1,
- INDENT = (property != DESCRIPTION);
+ IND = (property != DESCRIPTION);
char *p, *pname, *notestr;
switch (property) {
@@ -1194,9 +1292,6 @@ static char *ical_read_note(char *line, ical_property_e property, unsigned *nosk
case COMMENT:
pname = "comment";
break;
- case STATUS:
- pname = "status";
- break;
default:
pname = "no property";
@@ -1211,7 +1306,7 @@ static char *ical_read_note(char *line, ical_property_e property, unsigned *nosk
goto leave;
}
- notestr = ical_unformat_line(p, EOL, INDENT);
+ notestr = ical_unformat_line(p, EOL, IND);
if (!notestr) {
asprintf(&p, _("malformed %s."), pname);
ical_log(log, item_type, itemline, p);
@@ -1227,7 +1322,7 @@ static char *ical_read_summary(char *line, unsigned *noskipped,
ical_types_e item_type, const int itemline,
FILE * log)
{
- const int EOL = 0, INDENT = 0;
+ const int EOL = 0, IND = 0;
char *p, *summary = NULL;
p = ical_get_value(line);
@@ -1237,7 +1332,7 @@ static char *ical_read_summary(char *line, unsigned *noskipped,
goto leave;
}
- summary = ical_unformat_line(p, EOL, INDENT);
+ summary = ical_unformat_line(p, EOL, IND);
if (!summary) {
ical_log(log, item_type, itemline, _("malformed summary."));
(*noskipped)++;
@@ -1245,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;
}
@@ -1264,23 +1356,25 @@ 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;
- const char *SEPARATOR = "-- \n";
- struct string s;
+ char *p, *note, *tzid;
+ char *dtstart, *dtend, *duration, *rrule;
+ struct string s, exdate;
struct {
llist_t exc;
- ical_rpt_t *rpt;
- char *mesg, *desc, *loc, *comm, *stat, *imp, *note;
+ struct rpt *rpt;
+ int count;
+ char *mesg, *desc, *loc, *comm, *imp, *note;
time_t start, end;
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;
@@ -1294,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;
+ }
+ 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,
+ _("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;
}
- if (vevent.start == 0) {
+ 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,
- _("item start date is not defined."));
+ _("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 ?
@@ -1320,82 +1510,90 @@ 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;
}
}
- if (vevent.rpt && vevent.rpt->count)
- ical_count2until(vevent.start, vevent.dur,
- vevent.rpt, &vevent.exc,
- vevent_type);
if (has_note) {
/* Construct string with note file contents. */
string_init(&s);
if (vevent.desc) {
string_catf(&s, "%s", vevent.desc);
mem_free(vevent.desc);
- if (separator)
- string_catf(&s, SEPARATOR);
+ vevent.desc = NULL;
}
+ if (separator)
+ string_catf(&s, SEPARATOR);
if (vevent.loc) {
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);
- }
- if (vevent.stat) {
- string_catf(&s, _("Status: %s"),
- vevent.stat);
- mem_free(vevent.stat);
+ 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);
- /*
- * Necessary to prevent double-free if item
- * creation fails below.
- */
- vevent.desc = vevent.loc = vevent.comm =
- vevent.stat = vevent.imp = NULL;
}
- char *msg = _("rrule does not match start day (%s).");
- switch (vevent_type) {
- case APPOINTMENT:
- if (!ical_store_apoint(vevent.mesg, vevent.note,
- vevent.start, vevent.dur,
- vevent.rpt, &vevent.exc,
- vevent.has_alarm,
- fmt_apt, fmt_rapt)) {
+ if (vevent.rpt) {
+ time_t day, until;
+ long dur;
+ char *msg;
+
+ dur = vevent_type == EVENT ? -1 : vevent.dur;
+ day = DAY(vevent.start);
+ msg = _("rrule does not match start day (%s).");
+
+ if (vevent.count) {
+ recur_nth_occurrence(vevent.start,
+ dur,
+ vevent.rpt,
+ &vevent.exc,
+ vevent.count,
+ &until);
+ vevent.rpt->until = until;
+ }
+ if (!recur_item_find_occurrence(vevent.start,
+ dur,
+ vevent.rpt,
+ NULL,
+ day,
+ NULL)) {
char *l = day_ins(&msg, vevent.start);
ical_log(log, ICAL_VEVENT, ITEMLINE, l);
mem_free(l);
goto skip;
}
+ }
+ switch (vevent_type) {
+ case APPOINTMENT:
+ ical_store_apoint(vevent.mesg, vevent.note,
+ vevent.start, vevent.dur,
+ vevent.rpt, &vevent.exc,
+ vevent.has_alarm,
+ fmt_apt, fmt_rapt);
(*noapoints)++;
break;
case EVENT:
- if (!ical_store_event(vevent.mesg, vevent.note,
+ ical_store_event(vevent.mesg, vevent.note,
vevent.start, vevent.end,
vevent.rpt, &vevent.exc,
- fmt_ev, fmt_rev)) {
- char *l = day_ins(&msg, vevent.start);
- ical_log(log, ICAL_VEVENT, ITEMLINE, l);
- mem_free(l);
- goto skip;
- }
+ fmt_ev, fmt_rev);
(*noevents)++;
break;
case UNDEFINED:
@@ -1408,114 +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);
- 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);
@@ -1529,8 +1641,6 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents,
property = LOCATION;
} else if (starts_with_ci(buf, "COMMENT")) {
property = COMMENT;
- } else if (starts_with_ci(buf, "STATUS")) {
- property = STATUS;
}
if (property) {
note = ical_read_note(buf, property, noskipped,
@@ -1561,28 +1671,13 @@ 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;
- case STATUS:
- if (vevent.stat) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("only one status allowed."));
- goto skip;
- }
- if (!(starts_with(note, "TENTATIVE") ||
- starts_with(note, "CONFIRMED") ||
- starts_with(note, "CANCELLED"))) {
- ical_log(log, ICAL_VEVENT, ITEMLINE,
- _("invalid status value."));
- goto skip;
- }
- vevent.stat = note;
- break;
default:
break;
}
@@ -1593,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)
@@ -1601,8 +1706,6 @@ cleanup:
mem_free(vevent.loc);
if (vevent.comm)
mem_free(vevent.comm);
- if (vevent.stat)
- mem_free(vevent.stat);
if (vevent.imp)
mem_free(vevent.imp);
if (vevent.mesg)
@@ -1618,17 +1721,17 @@ 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;
- const char *SEPARATOR = "-- \n";
+ char *p, *note;
struct string s;
struct {
- char *mesg, *desc, *loc, *comm, *stat, *note;
+ char *mesg, *desc, *loc, *comm, *note;
int priority;
int completed;
} vtodo;
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;
@@ -1654,23 +1757,21 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
if (vtodo.desc) {
string_catf(&s, "%s", vtodo.desc);
mem_free(vtodo.desc);
- if (separator)
- string_catf(&s, SEPARATOR);
+ vtodo.desc = NULL;
}
+ if (separator)
+ string_catf(&s, SEPARATOR);
if (vtodo.loc) {
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);
- }
- if (vtodo.stat) {
- string_catf(&s, _("Status: %s"),
- vtodo.stat);
- mem_free(vtodo.stat);
+ vtodo.comm = NULL;
}
vtodo.note = generate_note(string_buf(&s));
mem_free(s.buf);
@@ -1690,7 +1791,6 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
}
} else if (starts_with_ci(buf, "STATUS:COMPLETED")) {
vtodo.completed = 1;
- property = STATUS;
} else if (starts_with_ci(buf, "SUMMARY")) {
vtodo.mesg =
ical_read_summary(buf, noskipped, ICAL_VTODO,
@@ -1705,8 +1805,6 @@ ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped,
property = LOCATION;
} else if (starts_with_ci(buf, "COMMENT")) {
property = COMMENT;
- } else if (starts_with_ci(buf, "STATUS")) {
- property = STATUS;
}
if (property) {
note = ical_read_note(buf, property, noskipped,
@@ -1737,29 +1835,13 @@ 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;
- case STATUS:
- if (vtodo.stat) {
- ical_log(log, ICAL_VTODO, ITEMLINE,
- _("only one status allowed."));
- goto skip;
- }
- if (!(starts_with(note, "NEEDS-ACTION") ||
- starts_with(note, "COMPLETED") ||
- starts_with(note, "IN-PROCESS") ||
- starts_with(note, "CANCELLED"))) {
- ical_log(log, ICAL_VTODO, ITEMLINE,
- _("invalid status value."));
- goto skip;
- }
- vtodo.stat = note;
- break;
default:
break;
}
@@ -1778,8 +1860,6 @@ cleanup:
mem_free(vtodo.loc);
if (vtodo.comm)
mem_free(vtodo.comm);
- if (vtodo.stat)
- mem_free(vtodo.stat);
if (vtodo.mesg)
mem_free(vtodo.mesg);
}
diff --git a/src/io.c b/src/io.c
index 663c858..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)
@@ -1396,7 +1375,7 @@ struct io_file *io_log_init(void)
ERROR_MSG(_("Warning: could not create temporary log file, Aborting..."));
goto error;
}
- strncpy(log->name, logname, sizeof(log->name));
+ log->name = mem_strdup(logname);
log->fd = fopen(log->name, "w");
if (log->fd == NULL) {
ERROR_MSG(_("Warning: could not open temporary log file, Aborting..."));
@@ -1446,6 +1425,7 @@ void io_log_free(struct io_file *log)
EXIT_IF(unlink(log->name) != 0,
_("Warning: could not erase temporary log file %s, Aborting..."),
log->name);
+ mem_free(log->name);
mem_free(log);
}
@@ -1454,7 +1434,8 @@ static void *io_psave_thread(void *arg)
{
int delay = conf.periodic_save;
EXIT_IF(delay < 0, _("Invalid delay"));
- char *mesg = _("Periodic save: data files have changed. Save cancelled.");
+ char *mesg = _("Periodic save cancelled. Data files have changed. "
+ "Save and merge interactively");
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
for (;;) {
@@ -1574,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 92c1ecf..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;
@@ -155,6 +153,17 @@ void note_read(char *buffer, FILE * fp)
buffer[MAX_NOTESIZ] = '\0';
}
+/* Read the contents of a note file */
+void note_read_contents(char *buffer, size_t buffer_len, FILE * fp)
+{
+ size_t read_count = fread(buffer, 1, buffer_len, fp);
+ if (read_count != buffer_len)
+ buffer[read_count] = '\0';
+ else
+ memcpy(&buffer[buffer_len - 4], "...\0", 4);
+}
+
+
static void
note_gc_extract_key(struct note_gc_hash *data, const char **key, int *len)
{
diff --git a/src/notify.c b/src/notify.c
index a24beb2..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
@@ -34,6 +34,7 @@
*
*/
+#include <sys/wait.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
@@ -136,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);
@@ -215,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;
@@ -358,6 +348,9 @@ static void *notify_main_thread(void *arg)
pthread_mutex_unlock(&notify.mutex);
notify_update_bar();
psleep(thread_sleep);
+ /* Reap the user-defined notifications. */
+ while (waitpid(0, NULL, WNOHANG) > 0)
+ ;
elapse += thread_sleep;
if (elapse >= check_app) {
elapse = 0;
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 3c93de2..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,9 +1854,34 @@ 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;
}
return !n;
}
+
+/*
+ * Finds the previous occurrence - the most recent before day - and returns it
+ * in the provided buffer.
+ */
+int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
+ time_t day, time_t *prev)
+{
+ int ret = 0;
+
+ 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 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 02457ae..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
@@ -68,27 +68,18 @@
/*
* General signal handling routine.
- * Catch return values from children (user-defined notification commands).
- * This is needed to avoid zombie processes running on system.
- * Also catch CTRL-C (SIGINT), and SIGWINCH to resize screen automatically.
+ * Catch SIGWINCH to resize screen automatically.
*/
static void generic_hdlr(int sig)
{
switch (sig) {
- case SIGCHLD:
- while (waitpid(WAIT_MYPGRP, NULL, WNOHANG) > 0) ;
- break;
case SIGWINCH:
resize = 1;
clearok(curscr, TRUE);
ungetch(KEY_RESIZE);
break;
case SIGTERM:
- if (unlink(path_cpid) != 0) {
- EXIT(_("Could not remove calcurse lock file: %s\n"),
- strerror(errno));
- }
- exit(EXIT_SUCCESS);
+ exit_calcurse(EXIT_SUCCESS);
break;
case SIGUSR1:
want_reload = 1;
@@ -117,12 +108,11 @@ unsigned sigs_set_hdlr(int sig, void (*handler) (int))
/* Signal handling init. */
void sigs_init()
{
- if (!sigs_set_hdlr(SIGCHLD, generic_hdlr)
- || !sigs_set_hdlr(SIGWINCH, generic_hdlr)
+ if (!sigs_set_hdlr(SIGWINCH, generic_hdlr)
|| !sigs_set_hdlr(SIGTERM, generic_hdlr)
|| !sigs_set_hdlr(SIGUSR1, generic_hdlr)
|| !sigs_set_hdlr(SIGINT, SIG_IGN))
- exit_calcurse(1);
+ exit_calcurse(EXIT_FAILURE);
}
/* Ignore SIGWINCH and SIGTERM signals. */
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 76efc9a..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();
@@ -1229,77 +1224,85 @@ void ui_day_item_add(void)
/* Delete an item from the appointment list. */
void ui_day_item_delete(unsigned reg)
{
- const char *del_app_str =
- _("Do you really want to delete this item?");
-
- const char *erase_warning =
- _("This item is recurrent. "
- "Delete (a)ll occurences or just this (o)ne?");
- const char *erase_choices = _("[ao]");
- const int nb_erase_choices = 2;
-
- const char *note_warning =
- _("This item has a note attached to it. "
- "Delete (i)tem or just its (n)ote?");
- const char *note_choices = _("[in]");
- const int nb_note_choices = 2;
+ const char *msg, *choices;
+ int nb_choices;
+
time_t occurrence;
if (day_item_count(0) <= 0)
return;
struct day_item *p = ui_day_get_sel();
-
- if (conf.confirm_delete) {
- if (status_ask_bool(del_app_str) != 1) {
- wins_erase_status_bar();
- return;
- }
+ int has_note = (day_item_get_note(p) != NULL);
+ int is_recur = (p->type == RECUR_EVNT || p->type == RECUR_APPT);
+
+ if (has_note && is_recur) {
+ msg = _("This item is recurrent and has a note attached to it. "
+ "Delete (s)elected occurrence, (a)ll occurrences, "
+ "or just its (n)ote?");
+ choices = _("[san]");
+ nb_choices = 3;
+ } else if (has_note) {
+ msg = _("This item has a note attached to it. "
+ "Delete (s)elected occurrence or just its (n)ote?");
+ choices = _("[sn]");
+ nb_choices = 2;
+ } else if (is_recur) {
+ msg = _("This item is recurrent. "
+ "Delete (s)elected occurrence or (a)ll occurrences?");
+ choices = _("[sa]");
+ nb_choices = 2;
+ } else {
+ msg = _("Confirm deletion. "
+ "Delete (s)elected occurrence? Press (s) to confirm.");
+ choices = _("[s]");
+ nb_choices = 1;
}
- if (day_item_get_note(p)) {
- switch (status_ask_choice
- (note_warning, note_choices, nb_note_choices)) {
- case 1:
- break;
- case 2:
- day_item_erase_note(p);
- io_set_modified();
- return;
- default: /* User escaped */
- return;
- }
+ int answer = 1;
+ if (nb_choices > 1 || conf.confirm_delete) {
+ answer = status_ask_choice(msg, choices, nb_choices);
}
- if (p->type == RECUR_EVNT || p->type == RECUR_APPT) {
- switch (status_ask_choice
- (erase_warning, erase_choices, nb_erase_choices)) {
- case 1:
- break;
- case 2:
- if (p->type == RECUR_EVNT) {
- day_item_add_exc(p, ui_day_sel_date());
- } else {
- recur_apoint_find_occurrence(p->item.rapt,
- ui_day_sel_date(),
- &occurrence);
- day_item_add_exc(p, occurrence);
- }
+ /* Always map "all occurrences" to 2 and "note" to 3. */
+ if (has_note && !is_recur && answer == 2)
+ answer = 3;
+ /*
+ * The option "selected occurrence" should be treated like "all
+ * occurrences" for a non-recurrent item (delete the whole item).
+ */
+ if (!is_recur && answer == 1)
+ answer = 2;
- io_set_modified();
- ui_calendar_monthly_view_cache_set_invalid();
- /* Keep the selection on the same day. */
- day_set_sel_data(
- day_get_item(listbox_get_sel(&lb_apt) - 1)
- );
- return;
- default:
- return;
+ switch (answer) {
+ case 1:
+ /* Delete selected occurrence (of a recurrent item) only. */
+ if (p->type == RECUR_EVNT) {
+ day_item_add_exc(p, ui_day_sel_date());
+ } else {
+ recur_apoint_find_occurrence(p->item.rapt,
+ ui_day_sel_date(),
+ &occurrence);
+ day_item_add_exc(p, occurrence);
}
+ /* Keep the selection on the same day. */
+ day_set_sel_data(day_get_item(listbox_get_sel(&lb_apt) - 1));
+ break;
+ case 2:
+ /* Delete all occurrences (or a non-recurrent item). */
+ ui_day_item_cut(reg);
+ /* Keep the selection on the same day. */
+ day_set_sel_data(day_get_item(listbox_get_sel(&lb_apt) - 1));
+ break;
+ case 3:
+ /* Delete note. */
+ day_item_erase_note(p);
+ break;
+ default:
+ /* User escaped, do nothing. */
+ return;
}
- ui_day_item_cut(reg);
- /* Keep the selection on the same day. */
- day_set_sel_data(day_get_item(listbox_get_sel(&lb_apt) - 1));
+
io_set_modified();
ui_calendar_monthly_view_cache_set_invalid();
}
@@ -1517,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 b546720..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] = '.';
@@ -314,7 +316,32 @@ void ui_todo_popup_item(void)
if (!item)
return;
- item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
+ if (item->note) {
+ /* Assign a sane default note size that will cleanly
+ * truncate long notes */
+ const char *note_heading = _("Note:");
+ size_t note_size = 3500;
+ char note[note_size];
+ char *notepath, *msg;
+ FILE *fp;
+
+ 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);
+
+ asprintf(&msg, "%s\n\n%s\n%s", item->mesg, note_heading, note);
+ item_in_popup(NULL, NULL, msg, _("TODO:"));
+ mem_free(msg);
+ } else {
+ item_in_popup(NULL, NULL, item->mesg, _("TODO:"));
+ }
}
void ui_todo_flag(void)
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 0a98ce0..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,9 +1484,13 @@ int child_wait(int *pfdin, int *pfdout, int pid)
close(*pfdin);
if (pfdout)
close(*pfdout);
+ if (pfderr)
+ close(*pfderr);
- waitpid(pid, &stat, 0);
- return stat;
+ if (waitpid(pid, &stat, 0) == pid)
+ return stat;
+ else
+ return -1;
}
/* Display "Press any key to continue..." and wait for a key press. */
@@ -1641,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;
@@ -2077,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 485c59b..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,
@@ -593,8 +602,6 @@ void wins_prepare_external(void)
{
if (notify_bar())
notify_stop_main_thread();
- if (conf.periodic_save > 0)
- io_stop_psave_thread();
def_prog_mode();
ui_mode = UI_CMDLINE;
clear();
@@ -615,8 +622,6 @@ void wins_unprepare_external(void)
wins_resize();
if (notify_bar())
notify_start_main_thread();
- if (conf.periodic_save > 0)
- io_start_psave_thread();
}
/*
@@ -628,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();
}
@@ -655,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,
@@ -670,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,
@@ -686,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/Makefile.am b/test/Makefile.am
index dfb97c3..daa6e77 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -61,6 +61,7 @@ TESTS = \
ical-011.sh \
ical-012.sh \
ical-013.sh \
+ ical-014.sh \
next-001.sh \
next-002.sh \
next-003.sh \
diff --git a/test/data/ical-005.ical b/test/data/ical-005.ical
index 5f20f48..e417779 100644
--- a/test/data/ical-005.ical
+++ b/test/data/ical-005.ical
@@ -18,6 +18,6 @@ TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
SUMMARY:On day 2
-DTSTART;VALUE=DATE:20131003
+DTSTART;VALUE=DATE:20131004
END:VEVENT
END:VCALENDAR
diff --git a/test/data/ical-009.ical b/test/data/ical-009.ical
index b5a6575..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
@@ -66,12 +76,6 @@ END:VTODO
BEGIN:VEVENT
DTSTART:20200406T221300
DURATION:PT0H15M0S
-SUMMARY:Invalid STATUS
-STATUS:confirmed
-END:VEVENT
-BEGIN:VEVENT
-DTSTART:20200406T221300
-DURATION:PT0H15M0S
SUMMARY:LOCATION twice
LOCATION:first
LOCATION:second
diff --git a/test/data/ical-012.ical b/test/data/ical-012.ical
index 09385fb..05604af 100644
--- a/test/data/ical-012.ical
+++ b/test/data/ical-012.ical
@@ -19,9 +19,8 @@ END:VEVENT
BEGIN:VEVENT
DTSTART:20200404T084100
DURATION:PT1H30M0S
-SUMMARY:No description. Comment and status
+SUMMARY:no description\, but comment
COMMENT:Event without description: a comment\nstreching over\nthree lines
-STATUS:CONFIRMED
END:VEVENT
BEGIN:VEVENT
@@ -42,11 +41,10 @@ END:VEVENT
BEGIN:VEVENT
DTSTART:20200404T204500
DURATION:PT1H30M0S
-SUMMARY:description\, status\, comment and location
-DESCRIPTION:event with\ndescription\nstatus\ncomment\nand location
+SUMMARY:description\, comment and location
+DESCRIPTION:event with\ndescription\ncomment\nand location
LOCATION: Right here
-COMMENT:just a repetition of description:\nevent with\ndescription\nstatus\ncomment\nand location
-STATUS:CANCELLED
+COMMENT:just a repetition of description:\nevent with\ndescription\ncomment\nand location
END:VEVENT
BEGIN:VTODO
@@ -64,9 +62,8 @@ END:VTODO
BEGIN:VTODO
PRIORITY:4
-SUMMARY:Comment and status
-COMMENT:Todo with out description. A comment\nstreching over\nthree lines
-STATUS:NEEDS-ACTION
+SUMMARY:no description\, but comment
+COMMENT:Todo without description. A comment\nstreching over\nthree lines
END:VTODO
BEGIN:VTODO
@@ -77,17 +74,16 @@ END:VTODO
BEGIN:VTODO
PRIORITY:6
-SUMMARY:Empty description\,but status
+SUMMARY:Empty description
DESCRIPTION:
-STATUS:COMPLETED
END:VTODO
BEGIN:VTODO
-SUMMARY:todo with description\, status\, comment and location
-DESCRIPTION:todo with\ndescription\nstatus\ncomment\nand location\,\nbut no priority
+SUMMARY:todo with description\, comment and location
+DESCRIPTION:todo with\ndescription\ncomment\nand location\,\nbut no priority
LOCATION: Right here
-COMMENT:mostly a repetition of description:\ntodo with\ndescription\nstatus\ncomment\nand location
-STATUS:IN-PROCESS
+COMMENT:mostly a repetition of description:\ntodo with\ndescription\ncomment\nand location
+STATUS:COMPLETED
END:VTODO
END:VCALENDAR
diff --git a/test/data/ical-014.ical b/test/data/ical-014.ical
new file mode 100644
index 0000000..19076bc
--- /dev/null
+++ b/test/data/ical-014.ical
@@ -0,0 +1,106 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+
+BEGIN:VEVENT
+DTSTART:20200404T204500
+DURATION:PT1H30M0S
+SUMMARY:event with one-line description
+DESCRIPTION:event with one-line description
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20200404T204500
+DURATION:PT1H30M0S
+SUMMARY:description and location
+DESCRIPTION:event with description\nand location
+LOCATION:Right here
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20200404T084100
+DURATION:PT1H30M0S
+SUMMARY:no description\, but comment
+COMMENT:Event without description: a comment\nstreching over\nthree lines
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20200404T084100
+DURATION:PT1H30M0S
+SUMMARY:Empty description
+DESCRIPTION:
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20200404T084100
+DURATION:PT1H30M0S
+SUMMARY:Empty description\, but comment
+DESCRIPTION:
+COMMENT:event with empty description
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTART:20200404T204500
+DURATION:PT1H30M0S
+SUMMARY:description\, comment and location
+DESCRIPTION:event with\ndescription\ncomment\nand location
+LOCATION:Right here
+COMMENT:just a repetition of description:\nevent with\ndescription\ncomment\nand location
+END:VEVENT
+
+BEGIN:VTODO
+PRIORITY:2
+SUMMARY:todo with one-line description
+DESCRIPTION:todo with one-line description
+END:VTODO
+
+BEGIN:VTODO
+PRIORITY:3
+SUMMARY:description and location
+DESCRIPTION:todo with description\nand location
+LOCATION:Right here
+END:VTODO
+
+BEGIN:VTODO
+PRIORITY:4
+SUMMARY:no description\, but comment
+COMMENT:Todo without description. A comment\nstreching over\nthree lines
+END:VTODO
+
+BEGIN:VTODO
+PRIORITY:5
+SUMMARY:Empty description
+DESCRIPTION:
+END:VTODO
+
+BEGIN:VTODO
+PRIORITY:6
+SUMMARY:Empty description
+DESCRIPTION:
+END:VTODO
+
+BEGIN:VTODO
+SUMMARY:todo with description\, comment and location
+DESCRIPTION:todo with\ndescription\ncomment\nand location\,\nbut no priority
+LOCATION:Right here
+COMMENT:mostly a repetition of description:\ntodo with\ndescription\ncomment\nand location
+STATUS:COMPLETED
+END:VTODO
+
+BEGIN:VEVENT
+SUMMARY:Five days
+DESCRIPTION:A five-day event turned into a recurring one-day event
+COMMENT:Note file has Comment: and Import:
+DTSTART;VALUE=DATE:20200819
+DTEND;VALUE=DATE:20200824
+END:VEVENT
+
+BEGIN:VEVENT
+SUMMARY:CET
+DESCRIPTION:Date with local time and time zone reference
+LOCATION:Central Europe
+COMMENT:\nCET\n\n
+DTSTART;TZID=CET:20150223T110000
+DURATION:PT1H
+END:VEVENT
+
+END:VCALENDAR
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 a73b90f..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
@@ -16,11 +16,12 @@ Import process report: 0023 lines read
10/03/13:
* All day
* On day 1
- * On day 2
* Two days
10/04/13:
+ * On day 2
* Two days
+--
Import: multi-day event changed to one-day event
EOD
else
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 da5002c..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
@@ -21,6 +21,7 @@ Import process report: 0018 lines read
UTC
- 11:00 -> 12:00
Local time
+--
Import: TZID=CET
EOD
else
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 f397044..6c1a0d4 100755
--- a/test/ical-009.sh
+++ b/test/ical-009.sh
@@ -4,41 +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: 0127 lines read
-2 apps / 0 events / 1 todo / 20 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]: invalid status value.
-VEVENT [72]: only one location allowed.
-VEVENT [79]: invalid duration.
-VEVENT [84]: invalid or malformed event start time.
-VEVENT [89]: invalid end time value type.
-VEVENT [94]: invalid until format.
-VEVENT [100]: invalid exception date value type.
-VEVENT [107]: invalid exception.
-VEVENT [114]: either end or duration.
-VEVENT [120]: end must be later than start.
-VTODO [125]: 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 9175db9..38ae673 100755
--- a/test/ical-012.sh
+++ b/test/ical-012.sh
@@ -7,18 +7,17 @@
. "${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: 0093 lines read
+Import process report: 0089 lines read
6 apps / 0 events / 6 todos / 0 skipped
todo with
description
-status
comment
and location,
but no priority
@@ -27,13 +26,10 @@ Location: Right here
Comment: mostly a repetition of description:
todo with
description
- status
comment
and location
-Status: IN-PROCESS
event with
description
-status
comment
and location
--
@@ -41,18 +37,16 @@ Location: Right here
Comment: just a repetition of description:
event with
description
- status
comment
and location
-Status: CANCELLED
-Comment: Todo with out description. A comment
+--
+Comment: Event without description: a comment
streching over
three lines
-Status: NEEDS-ACTION
-Comment: Event without description: a comment
+--
+Comment: Todo without description. A comment
streching over
three lines
-Status: CONFIRMED
event with description
and location
--
@@ -67,9 +61,6 @@ Comment: event with empty description
event with one-line description
todo with one-line description
---
-Status: COMPLETED
-
EOD
else
./run-test "$0"
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
new file mode 100755
index 0000000..18134bf
--- /dev/null
+++ b/test/ical-014.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Import followed by export and comparison
+
+. "${TEST_INIT:-./test-init.sh}"
+
+if [ "$1" = 'actual' ]; then
+ 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 "$tmpdir" || exit 1
+elif [ "$1" = 'expected' ]; then
+ cat "$DATA_DIR/ical-014.ical" |
+ sed -n '
+ /DESCRIPTION/p
+ /LOCATION/p
+ /COMMENT/p
+ ' |
+ sort
+else
+ ./run-test "$0"
+fi
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/recur-008.sh b/test/recur-008.sh
index c66bf12..75e4f5a 100755
--- a/test/recur-008.sh
+++ b/test/recur-008.sh
@@ -4,7 +4,7 @@
if [ "$1" = 'actual' ]; then
TZ='Europe/Copenhagen' "$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/apts-dst" \
- -Q --from 03/24/2019 --to 03/31/2020 --filter-type recur-apt
+ -Q --from 03/24/2019 --to 03/31/2020 --filter-type recur-apt
elif [ "$1" = 'expected' ]; then
cat <<EOD
03/24/19:
diff --git a/test/recur-009.sh b/test/recur-009.sh
index 2558b4c..8cfe896 100755
--- a/test/recur-009.sh
+++ b/test/recur-009.sh
@@ -5,13 +5,13 @@
if [ "$1" = 'actual' ]; then
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/rfc5545" \
- -Q --from 1/1/1996 --to 12/31/2007 --filter-type recur
+ -Q --from 1/1/1996 --to 12/31/2007 --filter-type recur
echo ""
echo "Floating point exception?"
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/rfc5545" \
- -Q --day 8/1/2020 --filter-type recur &&
+ -Q --day 8/1/2020 --filter-type recur &&
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/rfc5545" \
- -Q --day 11/1/2020 --filter-type recur &&
+ -Q --day 11/1/2020 --filter-type recur &&
echo "No Floating point exception on November 1, 2020"
elif [ "$1" = 'expected' ]; then
cat <<EOD
diff --git a/test/recur-010.sh b/test/recur-010.sh
index 5567a40..84cc581 100755
--- a/test/recur-010.sh
+++ b/test/recur-010.sh
@@ -5,14 +5,21 @@
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
- TMP=tmp
- mkdir "$TMP"
- cp "$DATA_DIR"/conf "$TMP"
- sed -n '/page 131/p' "$DATA_DIR"/rfc5545 > "$TMP"/apts
- "$CALCURSE" -D "$TMP" -Q --filter-type cal --startday=08/01/1997 --range=31
- sed 's/=monday/=sunday/' "$DATA_DIR"/conf > "$TMP"/conf
- "$CALCURSE" -D "$TMP" -Q --filter-type cal --startday=08/01/1997 --range=31
- rm -rf "$TMP"
+ tmpdir=$(mktemp -d)
+ grep 'page 131' "$DATA_DIR"/rfc5545 >"$tmpdir"/apts
+ cp "$DATA_DIR"/conf "$DATA_DIR"/todo "$tmpdir"
+ "$CALCURSE" --read-only -D "$tmpdir" -Q --filter-type cal \
+ --startday=08/01/1997 --range=31
+ rm -rf "$tmpdir"
+
+ tmpdir=$(mktemp -d)
+ grep 'page 131' "$DATA_DIR"/rfc5545 >"$tmpdir"/apts
+ cp "$DATA_DIR"/todo "$tmpdir"
+ sed 's/general.firstdayofweek=monday/general.firstdayofweek=sunday/' \
+ "$DATA_DIR"/conf >"$tmpdir"/conf
+ "$CALCURSE" --read-only -D "$tmpdir" -Q --filter-type cal \
+ --startday=08/01/1997 --range=31
+ rm -rf "$tmpdir"
elif [ "$1" = 'expected' ]; then
cat <<EOD
08/05/97:
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