pax_global_header00006660000000000000000000000064145607234130014517gustar00rootroot0000000000000052 comment=7b25a621bd3c4cd4d6641f64c1fbdd826bfc7a86 mrvladus-Errands-7b25a62/000077500000000000000000000000001456072341300153025ustar00rootroot00000000000000mrvladus-Errands-7b25a62/.github/000077500000000000000000000000001456072341300166425ustar00rootroot00000000000000mrvladus-Errands-7b25a62/.github/workflows/000077500000000000000000000000001456072341300206775ustar00rootroot00000000000000mrvladus-Errands-7b25a62/.github/workflows/CI.yml000066400000000000000000000010001456072341300217040ustar00rootroot00000000000000on: push: branches: [main] pull_request: name: CI jobs: flatpak-builder: name: "Flatpak Builder" runs-on: ubuntu-latest container: image: bilelmoussaoui/flatpak-github-actions:gnome-45 options: --privileged steps: - uses: actions/checkout@v3 - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6 with: bundle: "errands.flatpak" manifest-path: "io.github.mrvladus.List.Devel.json" cache-key: flatpak-builder-${{ github.sha }} mrvladus-Errands-7b25a62/.gitignore000066400000000000000000000000621456072341300172700ustar00rootroot00000000000000.flatpak-builder/ .flatpak/ _build/ .vscode/ venv/mrvladus-Errands-7b25a62/DONATIONS.md000066400000000000000000000005231456072341300171620ustar00rootroot00000000000000# Donations If you like **Errands** and want to support it, you can send your donations here: - BTC ``` 14pPYfZohS61PyGyXJyiGQHDFai4JR2q9w ``` - USDT ``` TCQn85c3vrRR7yMAfJABZmCXBa7gQvUcX5 ``` - TON ``` UQBrhmho9259KsNZ8wYx6y_eeOwdcAo9aroOTRWRtnmcUmdr ``` Thank you! Currently, due to some restrictions only cryptocurrency is supported.mrvladus-Errands-7b25a62/Errands.doap000066400000000000000000000020441456072341300175450ustar00rootroot00000000000000 Errands Manage your tasks Python GTK 4 Libadwaita Vlad Krupinski mrvladus mrvladus-Errands-7b25a62/LICENSE000066400000000000000000000021051456072341300163050ustar00rootroot00000000000000MIT License Copyright (c) 2023 Vlad Krupinskii Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. mrvladus-Errands-7b25a62/README.md000066400000000000000000000052541456072341300165670ustar00rootroot00000000000000
# Errands Manage your tasks ![CI](https://github.com/mrvladus/Errands/actions/workflows/CI.yml/badge.svg)

## Features - Add, remove, edit, complete tasks and sub-tasks - Sync tasks with Nextcloud or other CalDAV providers - Multiple task lists support - Add accent color for each task - Drag and Drop support - Customizable UI ## Sync Errands is using [python-caldav](https://github.com/python-caldav/caldav) library for syncing with Nextcloud Tasks and other CalDAV providers. For now, only **Nextcloud** is supported and known to work well. Other providers **may not work**. See [python-caldav documentation](https://caldav.readthedocs.io/en/latest/#compatibility) for more info on compatibility. ## Install ### Flatpak Errands is available as a Flatpak on Flathub: Download on Flathub It's the **only** supported verion. ### Build flatpak using GNOME Builder 1. Install [GNOME Builder](https://flathub.org/apps/org.gnome.Builder). 2. Click "Clone Repository" with `https://github.com/mrvladus/Errands.git` as the URL. 3. Click on the build button at the top. ## Contribute ### Report a bug - Make sure you are using latest version from [flathub](https://flathub.org/apps/details/io.github.mrvladus.List). - See the log file at `~/.var/app/io.github.mrvladus.List/data/errands/log.txt` if it has any errors. - If there is no errors in log file, then launch app from terminal with `flatpak run io.github.mrvladus.List` and copy the output. - Create new issue. - Add steps to reproduce the bug if needed. ### Translate To translate **Errands** to your language see **[TRANSLATIONS.md](TRANSLATIONS.md)** ### Package The only officially supported format is **flatpak** on [Flathub](https://flathub.org/apps/details/io.github.mrvladus.List)! Please, **do not package** it in other formats, but if you do, these are dependencies: - `libadwaita >= 1.4` - `libsecret` - `gtksourceview5` - `PyGObject` - `python3-caldav` - `gnome-online-accounts (optional)` ### Donate If you like this app, you can support its development. See **[DONATIONS.md](DONATIONS.md)** ## Code of conduct Errands follows the GNOME project [Code of Conduct](https://wiki.gnome.org/Foundation/CodeOfConduct). mrvladus-Errands-7b25a62/TRANSLATIONS.md000066400000000000000000000010751456072341300175500ustar00rootroot00000000000000# Translation To translate Errands to your language you can use [Poedit]("https://flathub.org/apps/net.poedit.Poedit") 1. Fork and clone repo. 2. Open Poedit. - Open `po/errands.pot` file. - Select your language and start translation. Remember to add your name and email in settings. - Save it in `po` directory. Turn off compilation to `.mo` files on save in settings. We dont need those. - Add your language in `po/LINGUAS` file separated by new line. 4. Commit your changes and open a pull request. 5. Watch for updates in the future to provide additional translations.mrvladus-Errands-7b25a62/build-aux/000077500000000000000000000000001456072341300171745ustar00rootroot00000000000000mrvladus-Errands-7b25a62/build-aux/flathub/000077500000000000000000000000001456072341300206215ustar00rootroot00000000000000mrvladus-Errands-7b25a62/build-aux/flathub/io.github.mrvladus.List.json000066400000000000000000000032211456072341300261500ustar00rootroot00000000000000{ "id": "io.github.mrvladus.List", "runtime": "org.gnome.Platform", "runtime-version": "45", "sdk": "org.gnome.Sdk", "command": "errands", "finish-args": [ "--device=dri", "--socket=wayland", "--socket=fallback-x11", "--share=ipc", "--share=network", "--talk-name=org.freedesktop.secrets", "--talk-name=org.gnome.OnlineAccounts" ], "cleanup": [ "/include", "/lib/pkgconfig", "/man", "/share/aclocal", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "/share/vala", "*.la", "*.a" ], "modules": [ { "name": "gnome-online-accounts", "buildsystem": "meson", "config-opts": [ "-Dgoabackend=false", "-Dexchange=false", "-Dgoogle=false", "-Dimap_smtp=false", "-Dwebdav=false", "-Dkerberos=false", "-Dwindows_live=false", "-Dvapi=false" ], "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/gnome-online-accounts.git", "tag": "3.49.0" } ] }, "python3-modules.json", { "name": "errands", "buildsystem": "meson", "sources": [ { "type": "git", "url": "https://github.com/mrvladus/Errands.git", "tag": "45.1.9" } ] } ] }mrvladus-Errands-7b25a62/build-aux/python3-modules.json000066400000000000000000000146431456072341300231510ustar00rootroot00000000000000{ "name": "python3-modules", "buildsystem": "simple", "build-commands": [], "modules": [ { "name": "python3-caldav", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"caldav\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/f1/e0/0a3762eea7b1d4d855639f7eaee3a0006169fd79d86ae0c660ae5d1d4c60/caldav-1.3.9-py3-none-any.whl", "sha256": "7c38f1def110809bd50acd3d648f6115b33b8f5395c457215b3b1147c70564d9" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ba/06/a07f096c664aeb9f01624f858c3add0a4e913d6c96257acb4fce61e7de14/certifi-2024.2.2-py3-none-any.whl", "sha256": "dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", "sha256": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/56/df/da62437403ceafea8e5b6a03ca08d4c574eb4d13eec6b5dc7018200696e5/icalendar-5.0.11-py3-none-any.whl", "sha256": "81864971ac43a1b7d0a555dc1b667836ce59fc719a7f845a96f2f03205fb83b9" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", "sha256": "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/2b/b4/bbccb250adbee490553b6a52712c46c20ea1ba533a643f1424b27ffc6845/lxml-5.1.0.tar.gz", "sha256": "3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/9c/3d/a121f284241f08268b21359bd425f7d4825cffc5ac5cd0e1b3d82ffd2b10/pytz-2024.1-py2.py3-none-any.whl", "sha256": "328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/50/2e/840094f0635bab147fb429ab07352c9e9de142aeec82672ee3c6bdd7befa/recurring_ical_events-2.1.2-py3-none-any.whl", "sha256": "b510d6d46e54381df1d6b35fcf2a727b71ecc510c85701b15c57312a5f172eff" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", "sha256": "58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/97/3f/c4c51c55ff8487f2e6d0e618dba917e3c3ee2caae6cf0fbb59c9b1876f2e/tzlocal-5.2-py3-none-any.whl", "sha256": "49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/88/75/311454fd3317aefe18415f04568edc20218453b709c63c58b9292c71be17/urllib3-2.2.0-py3-none-any.whl", "sha256": "ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/da/ce/27c48c0e39cc69ffe7f6e3751734f6073539bf18a0cfe564e973a3709a52/vobject-0.9.6.1.tar.gz", "sha256": "96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/f0/e0/bb85ef1170f3d7fc6b5d14452426e14e0f6ec2e0650bb882895cbc8c43db/x_wr_timezone-0.0.6-py3-none-any.whl", "sha256": "26d98b5f5ae190b68df8b9b9856c4867389956f5b295e0e14f632d7341b60f67" } ] }, { "name": "python3-lxml", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"lxml\" --ignore-installed --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/2b/b4/bbccb250adbee490553b6a52712c46c20ea1ba533a643f1424b27ffc6845/lxml-5.1.0.tar.gz", "sha256": "3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca" } ] }, { "name": "python3-pycryptodomex", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"pycryptodomex\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/31/a4/b03a16637574312c1b54c55aedeed8a4cb7d101d44058d46a0e5706c63e1/pycryptodomex-3.20.0.tar.gz", "sha256": "7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e" } ] } ] }mrvladus-Errands-7b25a62/build-aux/regenerate-translations.sh000077500000000000000000000004421456072341300243730ustar00rootroot00000000000000#!/usr/bin/bash flatpak run --filesystem=home org.gnome.Sdk//45 < mrvladus-Errands-7b25a62/data/icons/io.github.mrvladus.List.Devel.svg000066400000000000000000000217051456072341300255500ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/icons/io.github.mrvladus.List.Source.svg000066400000000000000000000641251456072341300257540ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template Hicolor Symbolic mrvladus-Errands-7b25a62/data/icons/io.github.mrvladus.List.svg000066400000000000000000000074501456072341300245130ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/icons/meson.build000066400000000000000000000006311456072341300214700ustar00rootroot00000000000000scalable_dir = join_paths('hicolor', 'scalable', 'apps') install_data( ('@0@.svg').format(app_id), install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir) ) symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') install_data( 'io.github.mrvladus.List-symbolic.svg', rename: ('@0@-symbolic.svg').format(app_id), install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir) )mrvladus-Errands-7b25a62/data/io.github.mrvladus.List.desktop.in.in000066400000000000000000000004111456072341300252520ustar00rootroot00000000000000[Desktop Entry] Name=Errands Comment=Manage your tasks Exec=errands Icon=@APP_ID@ Terminal=false Type=Application Categories=GNOME;GTK;Utility; Keywords=errands;tasks;list;todo;todos;caldav;nextcloud;sync; StartupNotify=true X-Purism-FormFactor=Workstation;Mobile; mrvladus-Errands-7b25a62/data/io.github.mrvladus.List.gschema.xml.in000066400000000000000000000030721456072341300254100ustar00rootroot00000000000000 1000 700 false false false 0 "" 0 "" "" "" "" false true true true 1000 700 mrvladus-Errands-7b25a62/data/io.github.mrvladus.List.metainfo.xml.in.in000066400000000000000000000641661456072341300262230ustar00rootroot00000000000000 @APP_ID@ CC0-1.0 MIT Vlad Krupinski Vlad Krupinski https://github.com/mrvladus/Errands https://github.com/mrvladus/Errands/issues https://github.com/mrvladus/Errands/ https://github.com/mrvladus/Errands/blob/main/TRANSLATIONS.md https://github.com/mrvladus/Errands/blob/main/DONATIONS.md @APP_ID@.desktop errands touch keyboard pointing always errands Errands Manage your tasks

Todo application for those who prefer simplicity.

Features:

  • Multiple task lists support
  • Add, remove, edit tasks and sub-tasks
  • Mark task and sub-tasks as completed
  • Add accent color for each task
  • Sync tasks with Nextcloud or other CalDAV providers
  • Drag and Drop support
  • Import .ics files
https://raw.githubusercontent.com/mrvladus/Errands/main/screenshots/main.png https://raw.githubusercontent.com/mrvladus/Errands/main/screenshots/secondary.png

Fixed:

  • Notes white background with dark theme

Translations:

  • Updated Ukranian translation (Volkov)

Added:

  • Moving tasks to different lists with Drag and Drop
  • Markdown syntax highlighting in the task notes (using gtksourceview5)
  • Progress bar that shows completion percent. It can be disabled in settings.

Fixed:

  • Reduced sync requests resulting in faster sync
  • Editing notes or task text with sync enabled. Now if sync is enabled and text or notes are changed Save button appears for confirmation to avoid cursor jumping and text not saving properly.

Translations:

  • Added Greek translation (itsnotAZ)
  • Added Hungarian translation (zoli111)
  • Added Persian translation (Danial Behzadi)
  • Updated Italian translation (Albano Battistella)
  • Updated Spanish translation (Vicente015)
  • Updated Occitan translation (ensag-dev)
  • Updated Dutch translation (Heimen Stoffels)

Added:

  • Preference for complete button size
  • Details now saved automatically
  • Copy text button for notes
  • UI improvements

Fixed:

  • Gnome Online Accounts usernames containing '@' symbol
  • Apostrophs in CalDav calendar names
  • Completion percent with sync enabled

Translations:

  • Added French translation (Irénée THIRION)
  • Updated Occitan translation (ensag-dev)
  • Updated German translation (Philipp Kiemle)
  • Updated Dutch translation (Heimen Stoffels)
  • Updated Italian translation (Albano Battistella)
  • Updated Japanese translation (Gnuey56)

Added:

  • If Gnome Online Accounts is installed, Nextcloud credentials will be pulled from it
  • Nextcloud url prefix will autocomplete to "https" instead of "http"
  • Sidebar can be closed with click on empty space in the task list
  • Completion percent changes with completion of sub-tasks

Fixed:

  • Drag and drop deleting tasks
  • Dark theme contrast

Thanks to the work of @david-swift Errands now has:

  • Preference for side of the Details panel
  • Preference for task click primary action. Now you can either expand task (and show details button) or open details panel.

Also added:

  • Sync indicator
  • Increased max width of tasks

Fixed:

  • Delete completed tasks button not activating

Translations:

  • Added Danish translation (Peter Normann)
  • Updated Brazilian Portuguese translation (Guilherme Berbet)

Added:

  • Time presets for date and time picker

Fixed:

  • Lists export
  • Details not showing
  • Flatpak permissions

Added:

  • Deleting task with drag and drop on top of the trash button

Fixed:

  • App icon having black background on KDE
  • Drag and Drop bug on KDE, where task's "+" drop area stays shown
  • Some strange Details behaviour

Translations:

  • Updated Russian translation
  • Updated Italian translation (Albano Battistella)
  • Updated Dutch translation (Heimen Stoffels)
  • Updated Spanish translation (Clay Gomera)

Added:

  • More options in the date picker
  • Ctrl+S shortcut to save changed details
  • Ctrl+F shortcut to sync
  • Increased max sidebar sizes
  • Second click on task will close details panel now

Fixed:

  • Some icons not being shown
  • SSL error when connecting to Nextcloud with self-signed certificate
  • Calendar widget background on dark theme

Translations:

  • Added Japanese translation (Gnuey56)
  • Updated French translation (Irénée THIRION)
  • Updated Turkish translation (Sabri Ünal)
  • Updated German translation (Philipp Kiemle)
  • Updated Ukrainian translation (volkov)

Fixed:

  • Typos
  • Icons in dark style
  • Tags sync

Translations:

  • Updated Russian translation
  • Updated Italian translation (Albano Battistella)

It's a BIG update!

New features:

  • Multiple task lists
  • Improved Nextcloud Tasks and CalDAV sync with support for multiple calendars and task properties
  • Import and Export lists and tasks in universal .ics format
  • Task properies panel: Notes, Start Date, End Date, Priority, Complete %, Tags
  • Tasks remembers their "expanded" / "folded" state
  • Better adaptivity for mobile screens
  • Accessebility improvements
  • Tweaked accent colors for better contrast with dark mode

Translations:

  • Added Simplified Chinese translation (Petalzu)
  • Updated German translation (Milo Ivir, Philipp Kiemle)
  • Updated Croatian translation (Milo Ivir)
  • Updated Spanish translation (Sergio Varela)

Fixed:

  • Task status not being updated when deleting completed tasks button is clicked

Translations:

  • Updated Catalan translation (Arnau Ferreres)

Improved:

  • Store password safely using libsecret (Thanks to Rafael Mardojai CM)
  • Startup with sync enabled is now async and faster
  • Sync button appears when sync provider is selected now

Fixed:

  • Contrast for links in dark mode

Translations:

  • Added Chinese Traditional translation
  • Updated German translation (Philipp Kiemle)
  • Updated Occitan translation (ensag-dev)
  • Updated French translation (Irénée THIRION)
  • Updated Italian translation (Albano Battistella)
  • Updated Brazilian Portuguese translation (Leandro Cunha)

Fixed:

  • Sync errors

Fixed:

  • Bug when all sub-tasks becomes unfinished when new sub-task added or moved.
  • Some sync errors

Fixed:

  • CalDAV: changing calendar name now updates UI

Translations:

  • Updated Ukranian translation (Volkov)
  • Updated French translation (Irénée THIRION)
  • Updated Italian translation (Albano Battistella)

Fixed bug with empty list

Sync is here!

If you have a Nextcloud or any CalDAV server you can go to settings and enter your server credentials, including URL, username, password and name of the calendar you wish to sync ("Errands" by default). Then test your connection and you are ready to sync!

It's using CalDAV protocol and python3-caldav library.

Other updates:

  • New libadwaita-1.4 look, including new sidebar
  • Using new GNOME 45 flatpak runtime
  • More adaptive controls
  • Improved Import/Export for non-latin languages
  • A bit faster app startup

Translations:

  • Added Ukranian translation (volkov)
  • Updated Italian translation (Albano Battistella)
  • Updated German translation

UI/UX:

  • Added setting to expand Tasks on startup

Translations:

  • Added Polish translation (Szymon Zielonka)
  • Added Occitan translation (Quentin PAGÈS)
  • Updated Italian translation (Albano Battistella)
  • Updated Dutch translation (Heimen Stoffels)
  • Updated Spanish translation (Ian Jose Ferrero)

UI/UX:

  • Now you can add sub-tasks to sub-tasks! As a result of that, it is possible to add accent colors to sub-tasks now.
  • Remove statusbars and replaced width subtitles.
  • Removed "Delete Completed Sub-Tasks" button. Now it's only one button inside of headerbar to delete any completed tasks. New shortcut for this: "Ctrl+Delete"
  • Improvements to drag and drop. Now it's possible to move tasks as you want, including moving tasks inside sub-tasks and back.
  • Improve contrast with accent colors
  • Added theme switcher to preferences window for those who use window managers.
  • Fixed couple of bugs with UI

Translations:

  • Added Spanish translation (Ian Jose Ferrero)
  • Updated Italian translation (Albano Battistella)
  • Updated Dutch translation (Heimen Stoffels)
  • Updated Italian translation (Davide Ferracin)
  • Updated Turkish translation (Sabri Ünal)
  • Updated French translation (CastelJeremy)
  • Updated Czech translation (Amerey)
  • Updated Brazilian Portuguese translation (Leandro Cunha)
  • Fixed translations

UI/UX:

  • Added confirmation dialog before clearing trash
  • Added button to close trash

Translations:

  • Updated Italian translation (Albano Battistella)

UI/UX:

  • New cool app icon. Big thanks to Tobias Bernard!
  • Added shortcuts window
  • Improved contrast and accessibility

Translations:

  • Updated Turkish translation (Sabri Ünal)

UI/UX:

  • App renamed to Errands
  • Added sidebar with history of deleted tasks. You can restore them individually or all at once. Supports Drag and Drop.
  • Cleaner UI with task menus
  • Accent colors selector moved to task's menu
  • Added menu item for quick text copy to clipboard
  • Improved Drag and Drop experience. Now you don't need to click edit button to access it. Just drag tasks as you want!
  • Removed expand button. Click everywhere on Task to expand it.
  • Added expand indicator on mouseover
  • Moved "Delete completed tasks" button to the headerbar
  • Removed unnecessary settings
  • Added toast notifications
  • Added "Export Tasks..." item to the main menu
  • Added "Import Tasks..." item to the main menu

Translations:

  • Added Czech translation (Amerey.eu)
  • Added Portuguese translation (Vitor Gabriel Gomes)
  • Added German translation (Christoph Bähr)
  • Improved text alignment
  • Fixed Drag and Drop widget being too long
  • UI improvements
  • Added support for Drag and Drop operations. Now you can easily move tasks around. Moving sub-tasks between tasks now works too.
  • Removed "Quit" menu as unnecessary
  • "Undo" button renamed to "Undo deletion" for clearer understanding of its purpose
  • Minor preferences window improvements
  • Added smooth fade effect on top of the tasks list
  • Tasks list now scrolls when new task added
  • Added button to scroll to the top

UI/UX:

  • Updated .desktop file for better mobile support

Translations:

  • Added Catalan translation (cubells)

UI/UX:

  • Set minimum window size to 250px for better phone screen support
  • Added new setting for disabling sub-tasks if you don't need them

UI/UX:

  • Added animation for task and sub-task edit mode switching
  • Remember if window is maximized
  • Small color tweaks for better contrast
  • Updated symbolic icon

UI/UX:

  • Added task add/remove animations
  • Added sub-task add/remove animations

Translations:

  • Updated Italian translation (Albano Battistella)
  • Updated Dutch translation (Heimen Stoffels)

UI/UX:

  • Added animations for progress bars
  • Bug fixes and improvements

Translations:

  • Added Turkish translation (Sabri Ünal)
  • Fixed bug with app not opening
  • Added animations for accent color switching

UI/UX:

  • Added undo button for restoring deleted tasks and sub-tasks
  • Added new setting for clearing history on startup (OFF by default)
  • Added new setting for history size (20 items by default)
  • Added new setting for hiding accent color button if you don't use it
  • UI improvements
  • Accessibility improvements

Translations:

  • Updated Russian translation
  • Add progress bar for completed tasks and sub-tasks
  • Add button for deleting completed tasks
  • UI improvements
  • Code improvements and refactoring
  • Updated application icon
  • Bug fixes
  • Added Italian translation. Thanks to Albano Battistella.
  • Bug fixes.
  • Bug fixes.

UI/UX:

  • Added buttons for moving tasks and sub-tasks up and down in list. To show them just click edit button.

Translations:

  • Added Dutch translation. Thanks to Heimen Stoffels.
  • Added French translation. Thanks to Jeremy Castel.

UI/UX:

  • New custom widgets for tasks
  • Task widgets are wider
  • URL's are now clickable
  • Better and more intuitive editing of tasks
  • Info of how many sub-task are completed
  • Button for deleting completed sub-tasks
  • Tasks can now be marked as completed too
  • Fixed icon size

Settings:

  • New setting for tasks expansion on startup

Translations:

  • You can now help translate this application! For more info visit GitHub project page.
  • Added Russian translation.

Backend:

  • Rewritten most of the app. Reorganized project structure.
  • Use Meson build system instead of Make.
  • Fixed bug with apostrophe character being displayed incorrectly (Thanks to CastelJeremy)
  • Fixed another one bug with URL's
  • Fixed bug with URL's not being visible (Thanks to fastrizwaan)
  • Checkbox to mark sub-task as completed
  • UI improvements
  • Color tags
  • Tasks and sub-task editing
  • UI improvements.
  • You can now add sub-tasks!
  • Redesigned interface for better visibility and contrast

Fixed add task button not being clickable.

Added menu with theme switcher.

Bug fixes.

Bug fixes.

First release.

mrvladus-Errands-7b25a62/data/meson.build000066400000000000000000000032101456072341300203510ustar00rootroot00000000000000subdir('resources') subdir('icons') desktop_file = i18n.merge_file( input: configure_file( input: 'io.github.mrvladus.List.desktop.in.in', output: app_id + '.desktop.in', configuration: conf ), output: app_id + '.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file]) endif appstream_file = i18n.merge_file( input: configure_file( input: 'io.github.mrvladus.List.metainfo.xml.in.in', output: app_id + '.metainfo.xml.in', configuration: conf ), output: app_id + '.metainfo.xml', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') ) # Validate Appdata appstreamcli = find_program('appstreamcli', required: false) if (appstreamcli.found()) test('validate-appdata', appstreamcli, args: ['validate', '--no-net', '--explain', appstream_file], workdir: meson.current_build_dir() ) endif install_data( configure_file( input: 'io.github.mrvladus.List.gschema.xml.in', output: app_id + '.gschema.xml', configuration: conf ), install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') ) compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()]) endif mrvladus-Errands-7b25a62/data/resources/000077500000000000000000000000001456072341300202255ustar00rootroot00000000000000mrvladus-Errands-7b25a62/data/resources/errands.gresource.xml000066400000000000000000000067051456072341300244120ustar00rootroot00000000000000 style.css style-dark.css gtk/help-overlay.ui icons/errands-up-symbolic.svg icons/errands-calendar-symbolic.svg icons/errands-copy-symbolic.svg icons/errands-share-symbolic.svg icons/errands-theme-system-symbolic.svg icons/errands-theme-light-symbolic.svg icons/errands-theme-dark-symbolic.svg icons/errands-sync-symbolic.svg icons/errands-info-symbolic.svg icons/errands-trash-symbolic.svg icons/errands-lists-symbolic.svg icons/errands-daytime-morning-symbolic.svg icons/errands-daytime-sunset-symbolic.svg icons/errands-add-symbolic.svg icons/errands-click-symbolic.svg icons/errands-sidebar-left-symbolic.svg icons/errands-sidebar-right-symbolic.svg icons/errands-appearance-symbolic.svg icons/errands-check-toggle-symbolic.svg icons/errands-select-symbolic.svg icons/errands-notes-symbolic.svg icons/errands-priority-symbolic.svg icons/errands-color-symbolic.svg icons/errands-toolbar-symbolic.svg icons/errands-progressbar-symbolic.svg icons/errands-private-symbolic.svg mrvladus-Errands-7b25a62/data/resources/gtk/000077500000000000000000000000001456072341300210125ustar00rootroot00000000000000mrvladus-Errands-7b25a62/data/resources/gtk/help-overlay.ui000066400000000000000000000050721456072341300237640ustar00rootroot00000000000000 General Show keyboard shortcuts <Control>question Preferences <Control>comma Quit <Control>q <Control>w Sync Sync / Fetch Tasks <Control>F Lists Add List <Control>A Details Toggle Details F9 mrvladus-Errands-7b25a62/data/resources/icons/000077500000000000000000000000001456072341300213405ustar00rootroot00000000000000mrvladus-Errands-7b25a62/data/resources/icons/errands-add-symbolic.svg000066400000000000000000000003441456072341300260650ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-appearance-symbolic.svg000066400000000000000000000047231456072341300274410ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-calendar-symbolic.svg000066400000000000000000000012331456072341300271040ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-check-toggle-symbolic.svg000066400000000000000000000046501456072341300276750ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-click-symbolic.svg000066400000000000000000000050711456072341300264240ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-color-symbolic.svg000066400000000000000000000022141456072341300264510ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-copy-symbolic.svg000066400000000000000000000013751456072341300263140ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-daytime-morning-symbolic.svg000066400000000000000000000055041456072341300304430ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-daytime-sunset-symbolic.svg000066400000000000000000000032041456072341300303060ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-info-symbolic.svg000066400000000000000000000014631456072341300262730ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-lists-symbolic.svg000066400000000000000000000022311456072341300264700ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-notes-symbolic.svg000066400000000000000000000041701456072341300264660ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-priority-symbolic.svg000066400000000000000000000033361456072341300272220ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-private-symbolic.svg000066400000000000000000000066051456072341300270150ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-progressbar-symbolic.svg000066400000000000000000000007131456072341300276660ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-select-symbolic.svg000066400000000000000000000013471456072341300266200ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-share-symbolic.svg000066400000000000000000000017041456072341300264400ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-sidebar-left-symbolic.svg000066400000000000000000000011421456072341300276730ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-sidebar-right-symbolic.svg000066400000000000000000000011441456072341300300600ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-sync-symbolic.svg000066400000000000000000000025551456072341300263170ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-theme-dark-symbolic.svg000066400000000000000000000021521456072341300273550ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-theme-light-symbolic.svg000066400000000000000000000041551456072341300275500ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-theme-system-symbolic.svg000066400000000000000000000036751456072341300277730ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-toolbar-symbolic.svg000066400000000000000000000045421456072341300270030ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-trash-symbolic.svg000066400000000000000000000020501456072341300264520ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/icons/errands-up-symbolic.svg000066400000000000000000000041401456072341300257570ustar00rootroot00000000000000 mrvladus-Errands-7b25a62/data/resources/meson.build000066400000000000000000000002051456072341300223640ustar00rootroot00000000000000gnome.compile_resources('errands', 'errands.gresource.xml', gresource_bundle: true, install: true, install_dir: pkgdatadir, )mrvladus-Errands-7b25a62/data/resources/style-dark.css000066400000000000000000000006301456072341300230150ustar00rootroot00000000000000/* Task lists item */ .task-lists-item:drop(active) { background-color: @blue_2; } .task-blue { background: #264770; } .task-green { background: #345039; } .task-yellow { background: #5e5900; } .task-orange { background: #65461f; } .task-red { background: #5e0800; } .task-purple { background: #5c395c; } .task-brown { background: #512e12; } link { color: white; }mrvladus-Errands-7b25a62/data/resources/style.css000066400000000000000000000047611456072341300221070ustar00rootroot00000000000000/* Task lists item */ .task-lists-item { transition: background-color 0.2s; } .task-lists-item:drop(active) { background-color: @blue_1; } /* Task */ .task-title:drop(active) { border-radius: 10px; } .tasks-list:last-child { margin-bottom: 36px; } .task { margin: 6px 12px 6px 12px; background-color: alpha(@card_bg_color, 0.5); } .task-expand-icon { transition: transform 0.25s; } .task-drop-area { padding: 6px; margin: 0px 0px 12px 0px; border-radius: 10px; border-width: 3px; border-style: dotted; border-color: @light_4; } .task-drop-target:drop(active) { border-radius: 10px; } .task-completed box.title { opacity: 0.5; } .task-completed label.title { text-decoration: line-through; } .task-toolbar-btn { all: unset; opacity: 0.7; font-size: 12px; padding: 4px; border-radius: 6px; transition: 0.2s; } .task-toolbar-btn:hover { background-color: @shade_color; } /* Task accent colors */ .task-blue { background: #dde9f7; } .task-green { background: #daf7e0; } .task-yellow { background: #faf7cf; } .task-orange { background: #fce8d0; } .task-red { background: #f9ccc7; } .task-purple { background: #f1d8f1; } .task-brown { background: #ece2da; } /* Accent colors buttons */ .accent-color-btn { transition: 0.25s; } .accent-color-btn:hover { filter: brightness(1.2); } .btn-blue { background: @blue_1; } .btn-green { background: @green_1; } .btn-yellow { background: @yellow_1; } .btn-orange { background: @orange_1; } .btn-red { background: @red_1; } .btn-purple { background: @purple_1; } .btn-brown { background: @brown_1; } /* Sub-task */ .sub-tasks:last-child { margin-bottom: 6px; } .sub-task { margin: 6px 11px 6px 11px; background-color: alpha(@card_bg_color, 0.5); } /* Calendar */ calendar { background: @background; } calendar, calendar header { border: none; } /* Utils */ .rounded-corners { border-radius: 12px; } .transparent { background-color: transparent; } .fade { transition: 0.2s; } .rotate { transform: rotate(180deg); } /* Expand indicator */ .expand-indicator { transition: 0.2s; } .expand-indicator-expanded { transform: rotate(180deg); } progressbar.osd { background-color: @shade_color; } .secret-notes-progressbar progressbar { background-color: @shade_color; } .secret-notes-progressbar progress { background-image: none; background-color: @red_1; } .secret-note { background-color: @card_bg_color; } textview text { background-color: @card_bg_color; }mrvladus-Errands-7b25a62/errands/000077500000000000000000000000001456072341300167405ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/__builtins__.pyi000066400000000000000000000001501456072341300221040ustar00rootroot00000000000000# This file needed to fix warnings of LSP about gettext _ function. # Used only for completion. _ = str mrvladus-Errands-7b25a62/errands/errands.py000066400000000000000000000030161456072341300207500ustar00rootroot00000000000000#!@PYTHON@ # Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT import os import sys import signal import locale import gettext import gi # type:ignore gi.require_version("Gtk", "4.0") gi.require_version("Adw", "1") gi.require_version("Secret", "1") gi.require_version("GtkSource", "5") from gi.repository import Adw, Gio # type:ignore APP_ID = "@APP_ID@" VERSION = "@VERSION@" PREFIX = "@PREFIX@" PROFILE = "@PROFILE@" pkgdatadir = "@pkgdatadir@" localedir = "@localedir@" sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) gettext.install("errands", localedir) locale.bindtextdomain("errands", localedir) locale.textdomain("errands") def main() -> None: resource = Gio.Resource.load(os.path.join(pkgdatadir, "errands.gresource")) resource._register() from errands.lib.logging import Log from errands.lib.data import UserData Log.init() UserData.init() sys.exit(Application().run(sys.argv)) class Application(Adw.Application): def __init__(self) -> None: super().__init__( application_id=APP_ID, flags=Gio.ApplicationFlags.DEFAULT_FLAGS, ) self.set_resource_base_path("/io/github/mrvladus/Errands/") def do_activate(self) -> None: from errands.widgets.window import Window Window(application=self) # Run tests if PROFILE == "development": from errands.tests.tests import run_tests run_tests() if __name__ == "__main__": main() mrvladus-Errands-7b25a62/errands/lib/000077500000000000000000000000001456072341300175065ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/lib/animation.py000066400000000000000000000022221456072341300220350ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, Gtk # type:ignore def property( obj: Gtk.Widget, prop: str, val_from, val_to, time_ms: int, ) -> None: """Animate widget property""" def callback(value, _) -> None: obj.set_property(prop, value) animation = Adw.TimedAnimation.new( obj, val_from, val_to, time_ms, Adw.CallbackAnimationTarget.new(callback, None), ) animation.play() def scroll(win: Gtk.ScrolledWindow, scroll_down: bool = True, widget=None) -> None: """Animate scrolling""" adj = win.get_vadjustment() def callback(value, _) -> None: adj.set_property("value", value) if not widget: # Scroll to the top or bottom scroll_to = adj.get_upper() if scroll_down else adj.get_lower() else: scroll_to = widget.get_allocation().height + adj.get_value() animation = Adw.TimedAnimation.new( win, adj.get_value(), scroll_to, 250, Adw.CallbackAnimationTarget.new(callback, None), ) animation.play() mrvladus-Errands-7b25a62/errands/lib/data.py000066400000000000000000000325401456072341300207750ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import json import os import shutil import sqlite3 from typing import Any, TypedDict from uuid import uuid4 from errands.lib.gsettings import GSettings from gi.repository import GLib # type:ignore from errands.lib.logging import Log class TaskListData(TypedDict): deleted: bool name: str synced: bool uid: str class TaskData(TypedDict): color: str completed: bool deleted: bool end_date: str expanded: bool list_uid: str notes: str parent: str percent_complete: int priority: int start_date: str synced: bool tags: str text: str trash: bool uid: str class UserData: data_dir: str = os.path.join(GLib.get_user_data_dir(), "errands") db_path: str = os.path.join(data_dir, "data.db") @classmethod def init(cls): if not os.path.exists(cls.data_dir): os.mkdir(cls.data_dir) cls.connection = sqlite3.connect( cls.db_path, check_same_thread=False, isolation_level=None ) cls.run_sql( """CREATE TABLE IF NOT EXISTS lists ( deleted INTEGER NOT NULL, name TEXT NOT NULL, synced INTEGER NOT NULL, uid TEXT NOT NULL )""", """CREATE TABLE IF NOT EXISTS tasks ( color TEXT NOT NULL, completed INTEGER NOT NULL, deleted INTEGER NOT NULL, end_date TEXT NOT NULL, expanded INTEGER NOT NULL, list_uid TEXT NOT NULL, notes TEXT NOT NULL, parent TEXT NOT NULL, percent_complete INTEGER NOT NULL, priority INTEGER NOT NULL, start_date TEXT NOT NULL, synced INTEGER NOT NULL, tags TEXT NOT NULL, text TEXT NOT NULL, trash INTEGER NOT NULL, uid TEXT NOT NULL )""", ) cls._convert(cls) @classmethod def add_list(cls, name: str, uuid: str = None, synced: bool = False) -> str: uid: str = str(uuid4()) if not uuid else uuid Log.debug(f"Data: Create '{uid}' list") with cls.connection: cur = cls.connection.cursor() cur.execute( "INSERT INTO lists (deleted, name, synced, uid) VALUES (?, ?, ?, ?)", (False, name, synced, uid), ) return uid @classmethod def get_tasks(cls) -> list[str]: # Log.debug(f"Data: Get tasks uids") with cls.connection: cur = cls.connection.cursor() cur.execute("SELECT uid FROM tasks") return [i[0] for i in cur.fetchall()] @classmethod def clean_deleted(cls): Log.debug("Data: Clean deleted") with cls.connection: cur = cls.connection.cursor() cur.execute("DELETE FROM lists WHERE deleted = 1") cur.execute("DELETE FROM tasks WHERE deleted = 1") @classmethod def get_lists_as_dicts(cls) -> list[TaskListData]: # Log.debug("Data: Get lists as dicts") with cls.connection: cur = cls.connection.cursor() cur.execute("SELECT * FROM lists") res: list[tuple] = cur.fetchall() lists: list[TaskListData] = [] for i in res: lists.append( TaskListData( deleted=bool(i[0]), name=i[1], synced=bool(i[2]), uid=i[3], ) ) return lists @classmethod def move_task_before(cls, list_uid: str, task_uid: str, before_uid: str) -> None: tasks: list[TaskData] = UserData.get_tasks_as_dicts() # Find tasks to move task_to_move_down: TaskData = None task_to_move_up: TaskData = None for task in tasks: if task["list_uid"] == list_uid and task["uid"] == before_uid: task_to_move_down = task elif task["list_uid"] == list_uid and task["uid"] == task_uid: task_to_move_up = task # Move task up task_to_move_up = tasks.pop(tasks.index(task_to_move_up)) tasks.insert(tasks.index(task_to_move_down), task_to_move_up) # Run SQL values: list[tuple[str, str]] = ((t["list_uid"], t["uid"]) for t in tasks) with cls.connection: cur = cls.connection.cursor() cur.execute("CREATE TABLE IF NOT EXISTS tmp AS SELECT * FROM tasks WHERE 0") cur.executemany( f"""INSERT INTO tmp SELECT * FROM tasks WHERE list_uid = ? AND uid = ?""", values, ) cur.execute("DROP TABLE tasks") cur.execute("ALTER TABLE tmp RENAME TO tasks") @classmethod def execute( cls, cmd: str, values: tuple = (), fetch: bool = False ) -> list[tuple] | None: try: with cls.connection: cur = cls.connection.cursor() cur.execute(cmd, values) if fetch: return cur.fetchall() except Exception as e: Log.error(f"Data: {e}") @classmethod def move_task_to_list( cls, task_uid: str, old_list_uid: str, new_list_uid: str, parent: str, synced: bool, ) -> None: sub_tasks_uids: list[str] = cls.get_tasks_uids_tree(old_list_uid, task_uid) tasks: list[TaskData] = cls.get_tasks_as_dicts(old_list_uid) task_dict: TaskData = [i for i in tasks if i["uid"] == task_uid][0] sub_tasks_dicts: list[TaskData] = [ i for i in tasks if i["uid"] in sub_tasks_uids ] # Move task if old_list_uid == new_list_uid: cls.run_sql( f"DELETE FROM tasks WHERE list_uid = '{old_list_uid}' AND uid = '{task_uid}'" ) else: cls.update_props(old_list_uid, task_uid, ["deleted"], [True]) task_dict["list_uid"] = new_list_uid task_dict["parent"] = parent task_dict["synced"] = synced cls.add_task(**task_dict) # Move sub-tasks for sub_dict in sub_tasks_dicts: if old_list_uid == new_list_uid: cls.run_sql( f"""DELETE FROM tasks WHERE list_uid = '{old_list_uid}' AND uid = '{sub_dict['uid']}'""" ) else: cls.update_props(old_list_uid, sub_dict["uid"], ["deleted"], [True]) sub_dict["list_uid"] = new_list_uid sub_dict["synced"] = synced cls.add_task(**sub_dict) @classmethod def get_prop(cls, list_uid: str, uid: str, prop: str) -> Any: # Log.debug(f"Data: Get '{prop}' for '{uid}'") with cls.connection: cur = cls.connection.cursor() cur.execute( f"SELECT {prop} FROM tasks WHERE uid = ? AND list_uid = ?", (uid, list_uid), ) return cur.fetchone()[0] @classmethod def update_props( cls, list_uid: str, uid: str, props: list[str], values: list[Any] ) -> None: # Log.debug(f"Data: Update props for '{uid}'") with cls.connection: cur = cls.connection.cursor() for i, prop in enumerate(props): cur.execute( f"""UPDATE tasks SET {prop} = ? WHERE uid = '{uid}' AND list_uid = '{list_uid}'""", (values[i],), ) @classmethod def run_sql(cls, *cmds: list, fetch: bool = False) -> list[tuple] | None: try: with cls.connection: cur = cls.connection.cursor() for cmd in cmds: if isinstance(cmd, tuple): cur.execute(cmd[0], cmd[1]) else: cur.execute(cmd) return cur.fetchall() if fetch else None except Exception as e: Log.error(f"Data: {e}") @classmethod def get_tasks_uids(cls, list_uid: str, parent: str = None) -> list[str]: # Log.debug(f"Data: Get tasks uids {f'for {parent}' if parent else ''}") with cls.connection: cur = cls.connection.cursor() cur.execute( f"""SELECT uid FROM tasks WHERE list_uid = ? AND deleted = 0 {f"AND parent = '{parent}'" if parent != None else ''}""", (list_uid,), ) return [i[0] for i in cur.fetchall()] @classmethod def get_tasks_uids_tree(cls, list_uid: str, parent: str) -> list[str]: """ Get all sub-task uids recursively """ # Log.debug(f"Data: Get tasks uids tree for '{parent}'") uids: list[str] = [] def _add(sub_uids: list[str]) -> None: for uid in sub_uids: uids.append(uid) if len(cls.get_tasks_uids(list_uid, uid)) > 0: _add(cls.get_tasks_uids(list_uid, uid)) _add(cls.get_tasks_uids(list_uid, parent)) return uids @classmethod def get_tasks_as_dicts( cls, list_uid: str = None, parent: str = None ) -> list[TaskData]: # Log.debug(f"Data: Get tasks as dicts") with cls.connection: cur = cls.connection.cursor() if not list_uid and not parent: cur.execute("SELECT * FROM tasks") else: cur.execute( f"""SELECT * FROM tasks WHERE list_uid = ? {f"AND parent = '{parent}'" if parent else ""}""", (list_uid,), ) tasks: list[TaskData] = [] for task in cur.fetchall(): tasks.append( TaskData( color=task[0], completed=bool(task[1]), deleted=bool(task[2]), end_date=task[3], expanded=bool(task[4]), list_uid=task[5], notes=task[6], parent=task[7], percent_complete=int(task[8]), priority=int(task[9]), start_date=task[10], synced=bool(task[11]), tags=task[12], text=task[13], trash=bool(task[14]), uid=task[15], ) ) return tasks @classmethod def add_task( cls, color: str = "", completed: bool = False, deleted: bool = False, end_date: str = "", expanded: bool = False, list_uid: str = "", notes: str = "", parent: str = "", percent_complete: int = 0, priority: int = 0, start_date: str = "", synced: bool = False, tags: str = "", text: str = "", trash: bool = False, uid: str = "", ) -> str: if not uid: uid: str = str(uuid4()) Log.debug(f"Data: Add task {uid}") with cls.connection: cur = cls.connection.cursor() cur.execute( """INSERT INTO tasks (uid, list_uid, text, parent, completed, deleted, color, notes, percent_complete, priority, start_date, end_date, tags, synced, expanded, trash) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", ( uid, list_uid, text, parent, completed, deleted, color, notes, percent_complete, priority, start_date, end_date, tags, synced, expanded, trash, ), ) return uid def _convert(cls): old_path = os.path.join(GLib.get_user_data_dir(), "list") old_data_file = os.path.join(old_path, "data.json") if not os.path.exists(old_data_file): return Log.debug("Data: convert data file") # Get tasks try: with open(old_data_file, "r") as f: data: dict = json.loads(f.read()) except: Log.error("Data: can't read data file") return # Remove old data folder shutil.rmtree(old_path, True) # If sync is enabled if GSettings.get("sync-provider") != 0: uid = cls.add_list(GSettings.get("sync-cal-name"), synced=True) GSettings.set("sync-cal-name", "s", "") # If sync is disabled else: uid = cls.add_list("Errands") # Add tasks for task in data["tasks"]: cls.add_task( color=task["color"], completed=task["completed"], deleted=task["id"] in data["deleted"], list_uid=uid, parent=task["parent"], synced=task["synced_caldav"], text=task["text"], trash=task["deleted"], uid=task["id"], ) mrvladus-Errands-7b25a62/errands/lib/encryption.py000066400000000000000000000047501456072341300222600ustar00rootroot00000000000000# Copyright 2020 gdavid7 https://github.com/gdavid7/cryptocode # Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from base64 import b64encode, b64decode import hashlib from Cryptodome.Cipher import AES from Cryptodome.Random import get_random_bytes def encrypt(message: str, password: str) -> str: """Encrypt string with password""" # generate a random salt salt: bytes = get_random_bytes(AES.block_size) # use the Scrypt KDF to get a private key from the password private_key: bytes = hashlib.scrypt( password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32, ) # create cipher config cipher_config = AES.new(private_key, AES.MODE_GCM) # return a dictionary with the encrypted text (cipher_text, tag) = cipher_config.encrypt_and_digest(bytes(message, "utf-8")) encryptedDict: dict[str, str] = { "cipher_text": b64encode(cipher_text).decode("utf-8"), "salt": b64encode(salt).decode("utf-8"), "nonce": b64encode(cipher_config.nonce).decode("utf-8"), "tag": b64encode(tag).decode("utf-8"), } encryptedString: str = ( encryptedDict["cipher_text"] + "*" + encryptedDict["salt"] + "*" + encryptedDict["nonce"] + "*" + encryptedDict["tag"] ) return encryptedString def decrypt(enc_message: str, password: str) -> str | None: """Decrypt string with password""" enc_dict: list[str] = enc_message.split("*") try: enc_dict: dict[str, str] = { "cipher_text": enc_dict[0], "salt": enc_dict[1], "nonce": enc_dict[2], "tag": enc_dict[3], } # decode the dictionary entries from base64 salt: bytes = b64decode(enc_dict["salt"]) cipher_text: bytes = b64decode(enc_dict["cipher_text"]) nonce: bytes = b64decode(enc_dict["nonce"]) tag: bytes = b64decode(enc_dict["tag"]) # generate the private key from the password and salt private_key: bytes = hashlib.scrypt( password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32, ) # create the cipher config cipher = AES.new(private_key, AES.MODE_GCM, nonce=nonce) # decrypt the cipher text decrypted: bytes = cipher.decrypt_and_verify(cipher_text, tag) except: return None return decrypted.decode("UTF-8") mrvladus-Errands-7b25a62/errands/lib/functions.py000066400000000000000000000015741456072341300220770ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from threading import Thread from gi.repository import Gtk # type:ignore def get_children(obj: Gtk.Widget) -> list[Gtk.Widget]: """ Get list of widget's children """ children: list[Gtk.Widget] = [] child: Gtk.Widget = obj.get_first_child() while child: children.append(child) child = child.get_next_sibling() return children def threaded(function: Callable): """ Decorator to run function in thread. Use GLib.idle_add(func) as callback at the end of threaded function if you need to change UI from thread. It's needed to be called to make changes in UI thread safe. """ def wrapper(*args, **kwargs): Thread(target=function, args=args, kwargs=kwargs, daemon=True).start() return wrapper mrvladus-Errands-7b25a62/errands/lib/goa.py000066400000000000000000000045111456072341300206270ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import TypedDict from errands.lib.logging import Log class GoaCredentials(TypedDict): url: str username: str password: str def get_goa_credentials(acc_name: str) -> GoaCredentials | None: """ If Gnome Online Accounts is installed, try to get account info. Only for password based account yet. """ try: import gi # type:ignore gi.require_version("Goa", "1.0") from gi.repository import Goa # type:ignore except (ValueError, ModuleNotFoundError): Log.debug("Gnome Online Accounts is not installed. Skipping...") return None try: client: Goa.Client = Goa.Client.new_sync(None) accounts: list[Goa.ObjectProxy] = client.get_accounts() for account in accounts: acc: Goa.AccountProxy = account.get_account() name: str = acc.get_cached_property("ProviderName").get_string() if name == acc_name: Log.debug(f"GOA: Getting data for {acc_name}") username: str = ( acc.get_cached_property("PresentationIdentity") .get_string() .split("@")[:-1] ) username = "".join(username) password = account.get_password_based().call_get_password_sync( arg_id=acc.get_cached_property("Id").get_string() ) # Get url try: url: str = ( account.get_calendar() .get_cached_property("Uri") .get_string() .replace(username + "@", "") ) except: url: str = ( "https://" + ( acc.get_cached_property("PresentationIdentity") .get_string() .split("@")[-1] ) + "/remote.php/dav/" ) return GoaCredentials(url=url, username=username, password=password) except Exception as e: Log.error(f"GOA: Can't get credentials. {e}") return None return None mrvladus-Errands-7b25a62/errands/lib/gsettings.py000066400000000000000000000051561456072341300220760ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import GLib, Gio, Gtk, Secret # type:ignore from __main__ import APP_ID from errands.lib.logging import Log SECRETS_SCHEMA: Secret.Schema = Secret.Schema.new( APP_ID, Secret.SchemaFlags.NONE, { "account": Secret.SchemaAttributeType.STRING, }, ) class GSettings: """Class for accessing gsettings""" gsettings: Gio.Settings = None initialized: bool = False def _check_init(self): if not self.initialized: self.init() @classmethod def bind( self, setting: str, obj: Gtk.Widget, prop: str, invert: bool = False ) -> None: self._check_init(self) self.gsettings.bind( setting, obj, prop, ( Gio.SettingsBindFlags.INVERT_BOOLEAN if invert else Gio.SettingsBindFlags.DEFAULT ), ) @classmethod def get(self, setting: str): self._check_init(self) return self.gsettings.get_value(setting).unpack() @classmethod def set(self, setting: str, gvariant: str, value) -> None: self._check_init(self) self.gsettings.set_value(setting, GLib.Variant(gvariant, value)) @classmethod def get_secret(self, account: str): self._check_init(self) return Secret.password_lookup_sync(SECRETS_SCHEMA, {"account": account}, None) @classmethod def set_secret(self, account: str, secret: str) -> None: self._check_init(self) return Secret.password_store_sync( SECRETS_SCHEMA, { "account": account, }, Secret.COLLECTION_DEFAULT, f"Errands account credentials for {account}", secret, None, ) @classmethod def delete_secret(self, account: str) -> bool: return Secret.password_clear_sync(SECRETS_SCHEMA, {"account": account}, None) @classmethod def init(self) -> None: Log.debug("Initialize GSettings") self.initialized = True self.gsettings = Gio.Settings.new(APP_ID) # Migrate old password try: account: int = self.gsettings.get_int("sync-provider") password: str = self.gsettings.get_string("sync-password") if 0 < account < 3 and password: account = "Nextcloud" if account == 1 else "CalDAV" self.set_secret(account, password) self.gsettings.set_string("sync-password", "") # Clean pass except: pass mrvladus-Errands-7b25a62/errands/lib/logging.py000066400000000000000000000025571456072341300215170ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT import os from gi.repository import GLib # type:ignore from __main__ import VERSION class Log: """Logging class""" data_dir: str = os.path.join(GLib.get_user_data_dir(), "errands") log_file: str = os.path.join(data_dir, "log.txt") log_old_file: str = os.path.join(data_dir, "log.old.txt") @classmethod def init(self): # Create data dir if not os.path.exists(self.data_dir): os.mkdir(self.data_dir) # Copy old log if os.path.exists(self.log_file): os.rename(self.log_file, self.log_old_file) # Start new log self.debug("Starting Errands " + VERSION) @classmethod def debug(self, msg: str) -> None: print(f"\033[33;1m[DEBUG]\033[0m {msg}") self._log(self, f"[DEBUG] {msg}") @classmethod def error(self, msg: str) -> None: print(f"\033[31;1m[ERROR]\033[0m {msg}") self._log(self, f"[ERROR] {msg}") @classmethod def info(self, msg: str) -> None: print(f"\033[32;1m[INFO]\033[0m {msg}") self._log(self, f"[INFO] {msg}") def _log(self, msg: str) -> None: try: with open(self.log_file, "a") as f: f.write(msg + "\n") except OSError: self.error("Can't write to the log file") mrvladus-Errands-7b25a62/errands/lib/markup.py000066400000000000000000000011411456072341300213540ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT import re from gi.repository import GLib # type:ignore class Markup: @classmethod def escape(self, text: str) -> str: return GLib.markup_escape_text(text) @classmethod def find_url(self, text: str) -> str: """Convert urls to markup. Make sure to escape text before calling.""" string: str = text urls: list[str] = re.findall(r"(https?://\S+)", string) for url in urls: string = string.replace(url, f'{url}') return string mrvladus-Errands-7b25a62/errands/lib/sync/000077500000000000000000000000001456072341300204625ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/lib/sync/providers/000077500000000000000000000000001456072341300224775ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/lib/sync/providers/caldav.py000066400000000000000000000420651456072341300243120ustar00rootroot00000000000000import datetime import urllib3 from caldav import Calendar, DAVClient, Principal, Todo from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.data import UserData from gi.repository import Adw, GLib # type:ignore from caldav.elements import dav class SyncProviderCalDAV: can_sync: bool = False calendars: list[Calendar] = None window = None def __init__( self, window: Adw.ApplicationWindow, testing: bool, name: str = "CalDAV" ) -> bool: Log.info(f"Sync: Initialize '{name}' sync provider") self.name: str = name self.window: Adw.ApplicationWindow = window self.testing: bool = testing # Only for connection test if not self._check_credentials(): return self._check_url() return self._connect() def _check_credentials(self) -> bool: Log.debug("Sync: Checking credentials") self.url: str = GSettings.get("sync-url") self.username: str = GSettings.get("sync-username") self.password: str = GSettings.get_secret(self.name) if self.url == "" or self.username == "" or self.password == "": Log.error(f"Sync: Not all {self.name} credentials provided") if not self.testing: self.window.add_toast( _("Not all sync credentials provided. Please check settings.") ) return False return True def _check_url(self) -> None: Log.debug("Sync: Checking URL") self.url = GSettings.get("sync-url") Log.debug(f"Sync: URL is set to {self.url}") def _connect(self) -> bool: Log.debug(f"Sync: Attempting connection") urllib3.disable_warnings() with DAVClient( url=self.url, username=self.username, password=self.password, ssl_verify_cert=False, ) as client: try: self.principal: Principal = client.principal() Log.info(f"Sync: Connected to {self.name} server at '{self.url}'") self.can_sync = True self.calendars = [ cal for cal in self.principal.calendars() if "VTODO" in cal.get_supported_components() ] except Exception as e: Log.error( f"Sync: Can't connect to {self.name} server at '{self.url}'. {e}" ) if not self.testing: self.window.add_toast( _("Can't connect to CalDAV server at:") # pyright:ignore + " " + self.url ) def _get_tasks(self, calendar: Calendar) -> list[dict]: """ Get todos from calendar and convert them to dict """ try: Log.debug(f"Sync: Getting tasks for {calendar.id}") todos: list[Todo] = calendar.todos(include_completed=True) tasks: list[dict] = [] for todo in todos: data: dict = { "color": str(todo.icalendar_component.get("x-errands-color", "")), "completed": str(todo.icalendar_component.get("status", "")) == "COMPLETED", "notes": str(todo.icalendar_component.get("description", "")), "parent": str(todo.icalendar_component.get("related-to", "")), "percent_complete": int( todo.icalendar_component.get("percent-complete", 0) ), "priority": int(todo.icalendar_component.get("priority", 0)), "text": str(todo.icalendar_component.get("summary", "")), "uid": str(todo.icalendar_component.get("uid", "")), } # Set tags # It is super readable, I know. It works, okay?! if (tags := todo.icalendar_component.get("categories", "")) != "": data["tags"] = ",".join( [ i.to_ical().decode("utf-8") for i in (tags if isinstance(tags, list) else tags.cats) ] ) else: data["tags"] = "" # Set date if todo.icalendar_component.get("due", "") != "": data["end_date"] = ( todo.icalendar_component.get("due", "") .to_ical() .decode("utf-8") .strip("Z") ) else: data["end_date"] = "" if todo.icalendar_component.get("dtstart", "") != "": data["start_date"] = ( todo.icalendar_component.get("dtstart", "") .to_ical() .decode("utf-8") .strip("Z") ) else: data["start_date"] = "" tasks.append(data) # Clear parent of the orphaned tasks ids: list[str] = [task["uid"] for task in tasks] par_ids: list[str] = [ task["parent"] for task in tasks if task["parent"] != "" ] orph_ids: list[str] = [t for t in par_ids if t not in ids] for o in orph_ids: Log.debug(f"Sync: Delete orphaned task: {o}") todo = calendar.todo_by_uid(o) todo.icalendar_component["RELATED-TO"] = "" todo.save() for task in tasks: if task["parent"] in orph_ids: task["parent"] = "" return [task for task in tasks if task["uid"] not in orph_ids] except Exception as e: Log.error(f"Sync: Can't get tasks from remote. {e}") return [] def _update_calendars(self) -> bool: try: self.calendars = [ cal for cal in self.principal.calendars() if "VTODO" in cal.get_supported_components() ] return True except: Log.error(f"Sync: Can't get caldendars from remote") return False def sync(self) -> None: Log.info(f"Sync: Sync tasks with remote") if not self._update_calendars(): return remote_lists_uids = [c.id for c in self.calendars] for list in UserData.get_lists_as_dicts(): for cal in self.calendars: # Rename list on remote if ( cal.id == list["uid"] and cal.name != list["name"] and not list["synced"] ): Log.debug(f"Sync: Rename remote list '{list['uid']}'") cal.set_properties([dav.DisplayName(list["name"])]) GLib.idle_add( UserData.run_sql, f"UPDATE lists SET synced = 1 WHERE uid = '{cal.id}'", ) # Rename local list elif ( cal.id == list["uid"] and cal.name != list["name"] and list["synced"] ): Log.debug(f"Sync: Rename local list '{list['uid']}'") GLib.idle_add( UserData.run_sql, f"UPDATE lists SET name = '{cal.name}', synced = 1 WHERE uid = '{cal.id}'", ) # Delete local list deleted on remote if ( list["uid"] not in remote_lists_uids and list["synced"] and not list["deleted"] ): Log.debug(f"Sync: Delete local list deleted on remote '{list['uid']}'") GLib.idle_add( UserData.run_sql, f"""DELETE FROM lists WHERE uid = '{list["uid"]}'""", ) # Delete remote list deleted locally elif ( list["uid"] in remote_lists_uids and list["deleted"] and list["synced"] ): for cal in self.calendars: if cal.id == list["uid"]: Log.debug(f"Sync: Delete list on remote {cal.id}") cal.delete() GLib.idle_add( UserData.run_sql, f"DELETE FROM lists WHERE uid = '{cal.id}'", ) break # Create new remote list elif ( list["uid"] not in remote_lists_uids and not list["synced"] and not list["deleted"] ): Log.debug(f"Sync: Create list on remote {list['uid']}") self.principal.make_calendar( cal_id=list["uid"], supported_calendar_component_set=["VTODO"], name=list["name"], ) GLib.idle_add( UserData.run_sql, f"""UPDATE lists SET synced = 1 WHERE uid = '{list['uid']}'""", ) if not self._update_calendars(): return user_lists_uids = [i["uid"] for i in UserData.get_lists_as_dicts()] remote_lists_uids = [c.id for c in self.calendars] for calendar in self.calendars: # Get tasks local_tasks = UserData.get_tasks_as_dicts(calendar.id) local_ids = [t["uid"] for t in local_tasks] remote_tasks = self._get_tasks(calendar) remote_ids = [task["uid"] for task in remote_tasks] deleted_uids = [ i[0] for i in UserData.run_sql( "SELECT uid FROM tasks WHERE deleted = 1", fetch=True ) ] # Add new local lists if calendar.id not in user_lists_uids: Log.debug(f"Sync: Copy list from remote {calendar.id}") UserData.add_list(name=calendar.name, uuid=calendar.id, synced=True) for task in local_tasks: # Update local task that was changed on remote if task["uid"] in remote_ids and task["synced"]: for remote_task in remote_tasks: if remote_task["uid"] == task["uid"]: updated: bool = False for key in task.keys(): if ( key not in "deleted list_uid synced expanded trash" and task[key] != remote_task[key] ): UserData.update_props( calendar.id, task["uid"], [key], [remote_task[key]], ) updated = True if updated: Log.debug( f"Sync: Update local task from remote: {task['uid']}" ) break # Create new task on remote that was created offline if task["uid"] not in remote_ids and not task["synced"]: try: Log.debug(f"Sync: Create new task on remote: {task['uid']}") new_todo = calendar.save_todo( categories=task["tags"] if task["tags"] != "" else None, description=task["notes"], dtstart=( datetime.datetime.fromisoformat(task["start_date"]) if task["start_date"] else None ), due=( datetime.datetime.fromisoformat(task["end_date"]) if task["end_date"] else None ), priority=task["priority"], percent_complete=task["percent_complete"], related_to=task["parent"], summary=task["text"], uid=task["uid"], x_errands_color=task["color"], ) if task["completed"]: new_todo.complete() UserData.update_props( calendar.id, task["uid"], ["synced"], [True] ) except Exception as e: Log.error( f"Sync: Can't create new task on remote: {task['uid']}\n{e}" ) # Update task on remote that was changed locally elif task["uid"] in remote_ids and not task["synced"]: try: Log.debug(f"Sync: Update task on remote: {task['uid']}") todo = calendar.todo_by_uid(task["uid"]) todo.uncomplete() todo.icalendar_component["summary"] = task["text"] if task["end_date"]: todo.icalendar_component["due"] = task["end_date"] else: todo.icalendar_component.pop("DUE", None) if task["start_date"]: todo.icalendar_component["dtstart"] = task["start_date"] else: todo.icalendar_component.pop("DTSTART", None) todo.icalendar_component["percent-complete"] = task[ "percent_complete" ] todo.icalendar_component["description"] = task["notes"] todo.icalendar_component["priority"] = task["priority"] if task["tags"] != "": todo.icalendar_component["categories"] = task["tags"].split( "," ) else: todo.icalendar_component["categories"] = [] todo.icalendar_component["related-to"] = task["parent"] todo.icalendar_component["x-errands-color"] = task["color"] todo.save() if task["completed"]: todo.complete() UserData.update_props( calendar.id, task["uid"], ["synced"], [True] ) except Exception as e: Log.error( f"Sync: Can't update task on remote: {task['uid']}. {e}" ) # Delete local task that was deleted on remote elif task["uid"] not in remote_ids and task["synced"]: Log.debug( f"Sync: Delete local task deleted on remote: {task['uid']}" ) UserData.run_sql( f"""DELETE FROM tasks WHERE uid = '{task["uid"]}'""" ) # Delete tasks on remote if they were deleted locally elif task["uid"] in remote_ids and task["deleted"]: try: Log.debug(f"Sync: Delete task from remote: '{task['uid']}'") if todo := calendar.todo_by_uid(task["uid"]): todo.delete() except Exception as e: Log.error( f"Sync: Can't delete task from remote: '{task['uid']}'. {e}" ) # Create new local task that was created on CalDAV for task in remote_tasks: if task["uid"] not in local_ids and task["uid"] not in deleted_uids: Log.debug( f"Sync: Copy new task from remote to list '{calendar.id}': {task['uid']}" ) UserData.add_task( color=task["color"], completed=task["completed"], end_date=task["end_date"], list_uid=calendar.id, notes=task["notes"], parent=task["parent"], percent_complete=task["percent_complete"], priority=task["priority"], start_date=task["start_date"], synced=True, tags=task["tags"], text=task["text"], uid=task["uid"], ) mrvladus-Errands-7b25a62/errands/lib/sync/providers/nextcloud.py000066400000000000000000000015551456072341300250640ustar00rootroot00000000000000from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.providers.caldav import SyncProviderCalDAV class SyncProviderNextcloud(SyncProviderCalDAV): def __init__(self, *args, **kwargs) -> None: return super().__init__(name="Nextcloud", *args, **kwargs) def _check_url(self) -> None: Log.debug("Sync: Checking URL") # Add prefix if needed if not self.url.startswith("http"): self.url = "https://" + self.url GSettings.set("sync-url", "s", self.url) # Add suffix if needed if not "remote.php/dav" in GSettings.get("sync-url"): self.url = f"{self.url}/remote.php/dav/" GSettings.set("sync-url", "s", self.url) else: self.url = GSettings.get("sync-url") Log.debug(f"Sync: URL is set to {self.url}") mrvladus-Errands-7b25a62/errands/lib/sync/providers/todoist.py000066400000000000000000000034301456072341300245360ustar00rootroot00000000000000import urllib.request import json import uuid class SyncProviderTodoist: def __init__(self, api_token): self.api_token = api_token self.base_url = "https://api.todoist.com/sync/v9/sync" def sync(self, commands): url = self.base_url headers = { "Authorization": f"Bearer {self.api_token}", "Content-Type": "application/json", } data = {"token": self.api_token, "commands": json.dumps(commands)} req = urllib.request.Request( url, headers=headers, data=json.dumps(data).encode("utf-8") ) with urllib.request.urlopen(req) as response: response_json = json.loads(response.read().decode("utf-8")) return response_json def get_projects(self): commands = [{"type": "projects/get_data"}] response = self.sync(commands) projects = response["Projects"] return projects def create_task(self, project_id, content): commands = [ { "type": "item_add", "temp_id": self._generate_temp_id(), "uuid": self._generate_uuid(), "args": {"content": content, "project_id": project_id}, } ] response = self.sync(commands) task = response["TempIdMapping"][0] return task def complete_task(self, task_id): commands = [ { "type": "item_complete", "uuid": self._generate_uuid(), "args": {"id": task_id}, } ] response = self.sync(commands) return response["Items"][0]["id"] == task_id def _generate_temp_id(self): return f"temp_id_{uuid.uuid4().hex}" def _generate_uuid(self): return str(uuid.uuid4()) mrvladus-Errands-7b25a62/errands/lib/sync/sync.py000066400000000000000000000053471456072341300220210ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from errands.widgets.window import Window from errands.lib.sync.providers.caldav import SyncProviderCalDAV from errands.lib.sync.providers.nextcloud import SyncProviderNextcloud from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.data import UserData from errands.lib.functions import threaded from gi.repository import GLib # type:ignore class Sync: provider = None window: Window = None syncing: bool = False sync_again: bool = False @classmethod def init(self, window: Window, testing: bool = False) -> None: self.window: Window = window Log.info("Sync: Initialize sync provider") match GSettings.get("sync-provider"): case 0: Log.info("Sync: Sync disabled") UserData.clean_deleted() case 1: self.provider = SyncProviderNextcloud( window=self.window, testing=testing ) case 2: self.provider = SyncProviderCalDAV(window=self.window, testing=testing) @classmethod @threaded def sync(self, update_ui: bool = True) -> None: """ Sync tasks without blocking the UI """ if GSettings.get("sync-provider") == 0: UserData.clean_deleted() if update_ui: GLib.idle_add(self.window.sidebar.task_lists.update_ui) return if not self.provider: GLib.idle_add( self.window.sidebar.header_bar.sync_indicator.set_visible, True ) self.init(self.window) GLib.idle_add( self.window.sidebar.header_bar.sync_indicator.set_visible, False ) if self.provider and self.provider.can_sync: if self.syncing: self.sync_again = True return self.syncing = True GLib.idle_add( self.window.sidebar.header_bar.sync_indicator.set_visible, True ) self.provider.sync() UserData.clean_deleted() if update_ui: GLib.idle_add(self.window.sidebar.task_lists.update_ui) if self.sync_again: self.sync() self.sync_again = False GLib.idle_add( self.window.sidebar.header_bar.sync_indicator.set_visible, False ) self.syncing = False @classmethod def test_connection(self) -> bool: self.init(testing=True, window=self.window) return self.provider.can_sync mrvladus-Errands-7b25a62/errands/meson.build000066400000000000000000000006151456072341300211040ustar00rootroot00000000000000configure_file( input: 'errands.py', output: 'errands', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr--r--' ) install_subdir('utils', install_dir: moduledir) install_subdir('lib', install_dir: moduledir) install_subdir('widgets', install_dir: moduledir) if profile == 'development' install_subdir('tests', install_dir: moduledir) endif mrvladus-Errands-7b25a62/errands/tests/000077500000000000000000000000001456072341300201025ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/tests/tests.py000066400000000000000000000005501456072341300216160ustar00rootroot00000000000000import unittest # Import test modules import errands.tests.widgets.test_window def load_tests(): tests: list[unittest.TestSuite] = [] loader = unittest.TestLoader() tests.append(loader.loadTestsFromModule(errands.tests.widgets.test_window)) return tests def run_tests(): unittest.TextTestRunner().run(unittest.TestSuite(load_tests())) mrvladus-Errands-7b25a62/errands/tests/widgets/000077500000000000000000000000001456072341300215505ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/tests/widgets/test_details.py000066400000000000000000000003641456072341300246110ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from unittest import TestCase from errands.widgets.window import WINDOW class TestDetails(TestCase): def setUp(self): self.window = WINDOW mrvladus-Errands-7b25a62/errands/tests/widgets/test_sidebar.py000066400000000000000000000003641456072341300245750ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from unittest import TestCase from errands.widgets.window import WINDOW class TestSidebar(TestCase): def setUp(self): self.window = WINDOW mrvladus-Errands-7b25a62/errands/tests/widgets/test_task.py000066400000000000000000000003611456072341300241230ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from unittest import TestCase from errands.widgets.window import WINDOW class TestTask(TestCase): def setUp(self): self.window = WINDOW mrvladus-Errands-7b25a62/errands/tests/widgets/test_task_list.py000066400000000000000000000003651456072341300251620ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from unittest import TestCase from errands.widgets.window import WINDOW class TestTaskList(TestCase): def setUp(self): self.window = WINDOW mrvladus-Errands-7b25a62/errands/tests/widgets/test_window.py000066400000000000000000000031341456072341300244710ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from unittest import TestCase from gi.repository import Adw, Gio from errands.widgets.window import WINDOW class TestWindow(TestCase): def setUp(self): self.window = WINDOW def test_empty_state(self): return name: str = self.window.stack.get_visible_child_name() self.assertEqual(name, "status") def test_min_stack_pages(self): pages_list: Gio.ListModel = self.window.stack.get_pages() pages: list[Adw.ViewStackPage] = [ pages_list.get_item(i).get_name() for i in range(pages_list.get_n_items()) ] expected_pages = ["trash", "status"] for page in expected_pages: self.assertTrue(page in pages) def test_add_toast(self): return self.window.add_toast("Test toast") def test_existing_actions(self): actions: list[str] = ( self.window.list_actions() + self.window.get_application().list_actions() ) expected_actions: list[str] = [ "show-help-overlay", "preferences", "sync", "import", "about", "quit", "secret_notes", ] self.assertEqual(actions, expected_actions) def test_about_window(self): app: Adw.Application = self.window.get_application() app.activate_action("about") self.assertTrue(self.window.about_window.get_visible()) self.window.about_window.close() self.assertFalse(self.window.about_window.get_visible()) mrvladus-Errands-7b25a62/errands/widgets/000077500000000000000000000000001456072341300204065ustar00rootroot00000000000000mrvladus-Errands-7b25a62/errands/widgets/components.py000066400000000000000000000204331456072341300231470ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import datetime from typing import Callable from errands.lib.functions import get_children from gi.repository import Gtk, Adw, GObject, GLib # type:ignore class Box(Gtk.Box): """ Gtk.Box with multiple children provided in list. """ def __init__(self, children: list[Gtk.Widget] = [], **kwargs): super().__init__(**kwargs) for child in children: self.append(child) def for_each(self, callback: Callable): """Call function for each child as argument""" for child in get_children(self): callback(child) class Button(Gtk.Button): """ Gtk.Button which takes arguments: - label - icon - callback for "clicked" signal - shortcut. """ def __init__( self, label: str = None, icon_name: str = None, on_click: Callable = None, shortcut: str = None, **kwargs, ): super().__init__(**kwargs) self.label: str = label content = Adw.ButtonContent() if icon_name: content.set_icon_name(icon_name) if label: content.set_label(label) if on_click: self.connect("clicked", on_click) if icon_name: self.set_child(content) else: self.set_label(label) if shortcut: ctrl = Gtk.ShortcutController(scope=1) ctrl.add_shortcut( Gtk.Shortcut( trigger=Gtk.ShortcutTrigger.parse_string(shortcut), action=Gtk.ShortcutAction.parse_string("activate"), ) ) self.add_controller(ctrl) class DateTime(Gtk.Box): """ Date and time picker widget. Datetime returned in yyyymmddThhmmss format. """ datetime: str = "" changed = GObject.Signal() lock_signals: bool = True def __init__(self): super().__init__() self._build_ui() def _build_ui(self): self.set_orientation(Gtk.Orientation.VERTICAL) # Hour button self.hour = Gtk.SpinButton( adjustment=Gtk.Adjustment(lower=0, upper=23, step_increment=1) ) self.hour.connect("value-changed", self._on_date_time_changed) # Minute button self.minutes = Gtk.SpinButton( adjustment=Gtk.Adjustment(lower=0, upper=59, step_increment=1) ) self.minutes.connect("value-changed", self._on_date_time_changed) # Time box self.append( Box( children=[ Box( children=[ self.hour, Gtk.Label(label=":"), self.minutes, ], css_classes=["toolbar"], halign="center", ), Box( children=[ Button( "09:00", "errands-daytime-morning-symbolic", on_click=self._on_time_preset_clicked, ), Button( "13:00", "errands-theme-light-symbolic", on_click=self._on_time_preset_clicked, ), ], css_classes=["toolbar"], homogeneous=True, ), Box( children=[ Button( "17:00", "errands-daytime-sunset-symbolic", on_click=self._on_time_preset_clicked, ), Button( "20:00", "errands-theme-dark-symbolic", on_click=self._on_time_preset_clicked, ), ], css_classes=["toolbar"], homogeneous=True, ), ], orientation="vertical", ) ) # Calendar self.calendar = Gtk.Calendar() self.calendar.connect("day-selected", self._on_date_time_changed) self.append(self.calendar) # Buttons box self.append( Box( children=[ Box( children=[ Button( label=_("Today"), on_click=self._on_today_btn_clicked, ), Button( label=_("Tomorrow"), on_click=self._on_tomorrow_btn_clicked, ), ], css_classes=["toolbar"], homogeneous=True, ), Box( children=[ Button( label=_("Now"), on_click=self._on_now_btn_clicked, hexpand=True, ), Button( label=_("Clear"), on_click=self._on_clear_btn_clicked, hexpand=True, ), ], css_classes=["toolbar"], homogeneous=True, ), ], orientation="vertical", ) ) def _on_date_time_changed(self, *_args): # Get hour hour: str = str(self.hour.get_value_as_int()) hour: str = f"0{hour}" if len(hour) == 1 else hour # Get min min: str = str(self.minutes.get_value_as_int()) min: str = f"0{min}" if len(min) == 1 else min # Get date date: str = self.calendar.get_date().format("%Y%m%d") # Set date self.datetime = f"{date}T{hour}{min}00" if not self.lock_signals: self.emit("changed") def _on_time_preset_clicked(self, btn: Button): hour, min = btn.label.split(":") self.hour.set_value(int(hour)) self.minutes.set_value(int(min)) def _on_now_btn_clicked(self, _btn): self.set_datetime(datetime.datetime.now().strftime("%Y%m%dT%H%M00")) self.emit("changed") def _on_today_btn_clicked(self, _btn): self.set_datetime(datetime.datetime.now().strftime("%Y%m%dT000000")) self.emit("changed") def _on_tomorrow_btn_clicked(self, _btn): self.set_datetime( (datetime.datetime.now() + datetime.timedelta(1)).strftime("%Y%m%dT000000") ) self.emit("changed") def _on_clear_btn_clicked(self, _btn): self.datetime = "" self.emit("changed") def get_datetime(self) -> str: return self.datetime def get_human_datetime(self) -> str: if self.datetime: out: str = ( f"{self.datetime[9:11]}:{self.datetime[11:13]}, {self.calendar.get_date().format('%d %B, %Y')}" ) else: out: str = _("Not Set") return out def get_datetime_as_int(self) -> int: return int(f"{self.datetime[:8]}{self.datetime[9:]}") if self.datetime else 0 def set_datetime(self, dt: str): self.lock_signals = True if dt: dt = datetime.datetime.fromisoformat(dt).strftime("%Y%m%dT%H%M00") self.hour.set_value(int(dt[9:11])) self.minutes.set_value(int(dt[11:13])) self.calendar.select_day( GLib.DateTime.new_local( int(dt[:4]), int(dt[4:6]), int(dt[6:8]), 0, 0, 0 ) ) else: self.hour.set_value(0) self.minutes.set_value(0) self.calendar.select_day(GLib.DateTime.new_now_local()) # Set datetime self.datetime = dt self.lock_signals = False mrvladus-Errands-7b25a62/errands/widgets/details.py000066400000000000000000000460351456072341300224150ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from errands.lib.gsettings import GSettings if TYPE_CHECKING: from errands.widgets.task_list import TaskList from errands.widgets.task import Task from datetime import datetime from errands.lib.data import UserData from icalendar import Calendar, Event from errands.lib.functions import get_children from errands.widgets.components import Box, Button, DateTime from gi.repository import Adw, Gtk, Gdk, GObject, GtkSource, Gio # type:ignore from errands.lib.markup import Markup from errands.lib.sync.sync import Sync from errands.lib.logging import Log class Details(Adw.Bin): parent: Task = None can_sync: bool = False def __init__(self, task_list: TaskList) -> None: super().__init__() self.task_list: TaskList = task_list self.split_view: Adw.OverlaySplitView = task_list.split_view self._build_ui() def _build_ui(self): # Header Bar hb = Adw.HeaderBar(show_title=False, show_back_button=False) # Back button back_btn = Button( icon_name="go-previous-symbolic", on_click=lambda *_: self.split_view.set_show_sidebar(False), visible=False, ) back_btn.bind_property( "visible", self.split_view, "collapsed", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) hb.pack_start(back_btn) # Delete button delete_btn = Button( icon_name="errands-trash-symbolic", on_click=self._on_delete_btn_clicked, tooltip_text=_("Delete"), ) hb.pack_start(delete_btn) # Status self.status = Adw.StatusPage( icon_name="errands-info-symbolic", visible=True, vexpand=True, title=_("No Details"), description=_("Click on task to show more info"), ) self.status.add_css_class("compact") self.status.bind_property( "visible", delete_btn, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) # Colors colors_box = Gtk.Box(halign="center", css_classes=["toolbar"]) colors = ["", "blue", "green", "yellow", "orange", "red", "purple", "brown"] for color in colors: btn = Gtk.Button() if color == "": btn.set_icon_name("window-close-symbolic") btn.set_tooltip_text(_("Clear Style")) else: btn.add_css_class("accent-color-btn") btn.add_css_class(f"btn-{color}") btn.add_css_class("circular") btn.connect("clicked", self._on_style_selected, color) colors_box.append(btn) # Edit group edit_group = Adw.PreferencesGroup(title=_("Text")) # Edit entry self.edit_entry = GtkSource.Buffer() Adw.StyleManager.get_default().bind_property( "dark", self.edit_entry, "style-scheme", GObject.BindingFlags.SYNC_CREATE, lambda _, is_dark: self.edit_entry.set_style_scheme( GtkSource.StyleSchemeManager.get_default().get_scheme( "Adwaita-dark" if is_dark else "Adwaita" ) ), ) self.edit_entry.connect("changed", self._on_text_changed) edit_entry_text_ovrl = Gtk.Overlay( child=GtkSource.View( height_request=100, top_margin=12, bottom_margin=12, left_margin=12, right_margin=12, buffer=self.edit_entry, css_classes=["card"], wrap_mode=3, ) ) # Save button self.edit_entry_save_btn: Gtk.Button = Gtk.Button( icon_name="errands-select-symbolic", css_classes=["circular", "suggested-action"], halign=Gtk.Align.END, valign=Gtk.Align.END, margin_bottom=6, margin_end=6, tooltip_text=_("Save"), visible=False, ) self.edit_entry_save_btn.connect("clicked", lambda *_: self.save()) edit_entry_text_ovrl.add_overlay(self.edit_entry_save_btn) edit_group.add(edit_entry_text_ovrl) # Copy button text_copy_btn = Gtk.Button( icon_name="errands-copy-symbolic", valign="center", tooltip_text=_("Copy Text"), css_classes=["flat"], ) text_copy_btn.connect("clicked", self._on_copy_clicked, self.edit_entry) edit_group.set_header_suffix(text_copy_btn) # Notes group notes_group = Adw.PreferencesGroup(title=_("Notes")) # Notes entry notes_source_view = GtkSource.View( height_request=200, top_margin=12, bottom_margin=12, left_margin=12, right_margin=12, wrap_mode=3, css_classes=["card"], ) self.notes = notes_source_view.get_buffer() Adw.StyleManager.get_default().bind_property( "dark", self.notes, "style-scheme", GObject.BindingFlags.SYNC_CREATE, lambda _, is_dark: self.notes.set_style_scheme( GtkSource.StyleSchemeManager.get_default().get_scheme( "Adwaita-dark" if is_dark else "Adwaita" ) ), ) lm: GtkSource.LanguageManager = GtkSource.LanguageManager.get_default() self.notes.set_language(lm.get_language("markdown")) self.notes.connect("changed", self._on_notes_changed) notes_ovrl = Gtk.Overlay(child=notes_source_view) # Save button self.notes_save_btn: Gtk.Button = Gtk.Button( icon_name="errands-select-symbolic", css_classes=["circular", "suggested-action"], halign=Gtk.Align.END, valign=Gtk.Align.END, margin_bottom=6, margin_end=6, tooltip_text=_("Save"), visible=False, ) self.notes_save_btn.connect("clicked", lambda *_: self.save()) notes_ovrl.add_overlay(self.notes_save_btn) # Copy button notes_copy_btn = Gtk.Button( icon_name="errands-copy-symbolic", valign="center", tooltip_text=_("Copy Text"), css_classes=["flat"], ) notes_copy_btn.connect("clicked", self._on_copy_clicked, self.notes) notes_group.set_header_suffix(notes_copy_btn) notes_group.add(notes_ovrl) # Properties group props_group = Adw.PreferencesGroup(title=_("Properties")) # Start date row self.start_datetime_row = Adw.ActionRow(title=_("Not Set"), subtitle=_("Start")) self.start_datetime = DateTime() self.start_datetime.connect("changed", self._on_start_time_changed) self.start_datetime_row.add_suffix( Gtk.MenuButton( valign="center", icon_name="errands-calendar-symbolic", tooltip_text=_("Set Date"), popover=Gtk.Popover( child=Gtk.ScrolledWindow( propagate_natural_height=True, propagate_natural_width=True, child=self.start_datetime, ) ), css_classes=["flat"], ) ) props_group.add(self.start_datetime_row) # End date row self.end_datetime_row = Adw.ActionRow(title=_("Not Set"), subtitle=_("Due")) self.end_datetime = DateTime() self.end_datetime.connect("changed", self._on_end_time_changed) self.end_datetime_row.add_suffix( Gtk.MenuButton( valign="center", icon_name="errands-calendar-symbolic", tooltip_text=_("Set Date"), popover=Gtk.Popover(child=self.end_datetime), css_classes=["flat"], ) ) props_group.add(self.end_datetime_row) # Complete % row percent_complete_row = Adw.ActionRow(title=_("Complete %")) self.percent_complete = Gtk.SpinButton( valign="center", adjustment=Gtk.Adjustment(lower=0, upper=100, step_increment=1), ) self.percent_complete.connect("changed", self._on_percent_complete_changed) percent_complete_row.add_suffix(self.percent_complete) props_group.add(percent_complete_row) # Priority row priority_row = Adw.ActionRow(title=_("Priority")) self.priority = Gtk.SpinButton( valign="center", adjustment=Gtk.Adjustment(lower=0, upper=9, step_increment=1), ) self.priority.connect("changed", self._on_priority_changed) priority_row.add_suffix(self.priority) props_group.add(priority_row) # Tags group self.tags = Adw.PreferencesGroup(title=_("Tags")) # Tags entry self.tag_entry = Adw.EntryRow(title=_("Add Tag")) self.tag_entry.connect("entry-activated", self._on_tag_added) self.tags.add(self.tag_entry) # Export group misc_group = Adw.PreferencesGroup(title=_("Export")) open_cal_btn = Button( icon_name="errands-share-symbolic", on_click=self._on_export, valign="center", css_classes=["flat"], ) open_cal_row = Adw.ActionRow( title=_("Export"), subtitle=_("Save Task as .ics file"), activatable_widget=open_cal_btn, ) open_cal_row.add_suffix(open_cal_btn) misc_group.add(open_cal_row) # Groups box p_box = Box( children=[ colors_box, edit_group, notes_group, props_group, self.tags, misc_group, ], orientation="vertical", spacing=12, visible=False, ) p_box.bind_property( "visible", self.status, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.BIDIRECTIONAL, ) # Toolbar View toolbar_view = Adw.ToolbarView( content=Gtk.ScrolledWindow( child=Adw.Clamp( child=Box(children=[self.status, p_box], orientation="vertical"), margin_start=12, margin_end=12, margin_top=6, margin_bottom=24, ) ) ) toolbar_view.add_top_bar(hb) self.set_child(toolbar_view) def add_tag(self, text: str) -> None: if text == "": return tag = Adw.ActionRow(title=text) delete_btn = Gtk.Button( icon_name="window-close-symbolic", valign="center", css_classes=["flat", "circular"], ) delete_btn.connect("clicked", self._on_tag_deleted, tag) tag.add_suffix(delete_btn) self.tags.add(tag) def save(self): Log.debug("Details: Save") self.edit_entry_save_btn.set_visible(False) self.notes_save_btn.set_visible(False) # Text old_text: str = self.parent.get_prop("text") text: str = self.edit_entry.props.text if text.strip(" \n\t") and text != old_text: self.parent.task_row.task_row.set_title( Markup.find_url(Markup.escape(text)) ) # Save props self.parent.update_props( [ "text", "notes", "completed", "start_date", "end_date", "percent_complete", "priority", "synced", ], [ text if text.strip(" \n\t") and text != old_text else old_text, self.notes.props.text, self.parent.task_row.complete_btn.get_active(), self.start_datetime.get_datetime(), self.end_datetime.get_datetime(), self.percent_complete.get_value_as_int(), self.priority.get_value_as_int(), False, ], ) self.parent.update_ui() Sync.sync(False) def update_info(self, parent: Task): # Show status on empty task if parent == None: self.status.set_visible(True) return self.can_sync = False self.parent = parent Log.debug("Details: Update info") # Edit text self.edit_entry.set_text(self.parent.get_prop("text")) # Notes self.notes.set_text(self.parent.get_prop("notes")) # Datetime self.start_datetime.set_datetime(self.parent.get_prop("start_date")) self.start_datetime_row.set_title(self.start_datetime.get_human_datetime()) self.end_datetime.set_datetime(self.parent.get_prop("end_date")) self.end_datetime_row.set_title(self.end_datetime.get_human_datetime()) # Percent complete self.percent_complete.set_value(self.parent.get_prop("percent_complete")) # Priority self.priority.set_value(self.parent.get_prop("priority")) self.status.set_visible(False) # Tags # Remove old for i, tag in enumerate(get_children(self.tag_entry.get_parent())): # Skip entry if i == 0: continue self.tags.remove(tag) # Add new for tag in self.parent.get_prop("tags").split(","): self.add_tag(tag) self.can_sync = True def _on_text_changed(self, buffer: Gtk.TextBuffer): if not self.can_sync: return if buffer.props.text != self.parent.get_prop("text"): if GSettings.get("sync-provider") != 0: self.edit_entry_save_btn.set_visible(True) else: self.save() def _on_notes_changed(self, buffer: GtkSource.Buffer): if not self.can_sync: return if buffer.props.text != self.parent.get_prop("notes"): if GSettings.get("sync-provider") != 0: self.notes_save_btn.set_visible(True) else: self.save() def _on_percent_complete_changed(self, _): if not self.can_sync: return self.save() def _on_priority_changed(self, row: Adw.SpinRow): if not self.can_sync: return self.save() def _on_start_time_changed(self, *args): if not self.can_sync: return Log.debug("Details: change start time") sdt: int = self.start_datetime.get_datetime_as_int() edt: int = self.end_datetime.get_datetime_as_int() if sdt > edt and edt != 0: self.end_datetime.set_datetime(self.start_datetime.get_datetime()) self.end_datetime_row.set_title(self.end_datetime.get_human_datetime()) self.start_datetime_row.set_title(self.start_datetime.get_human_datetime()) self.save() def _on_end_time_changed(self, *args): if not self.can_sync: return Log.debug("Details: change end time") sdt: int = self.start_datetime.get_datetime_as_int() edt: int = self.end_datetime.get_datetime_as_int() if edt < sdt and sdt != 0 and edt != 0: self.start_datetime.set_datetime(self.end_datetime.get_datetime()) self.start_datetime_row.set_title(self.start_datetime.get_human_datetime()) self.end_datetime_row.set_title(self.end_datetime.get_human_datetime()) self.save() def _on_copy_clicked(self, _btn, buffer: Gtk.TextBuffer): Log.info("Details: Copy to clipboard") Gdk.Display.get_default().get_clipboard().set(buffer.props.text) self.task_list.window.add_toast(_("Copied to Clipboard")) def _on_delete_btn_clicked(self, _btn): self.parent.delete() self.status.set_visible(True) def _on_export(self, _btn): def _confirm(dialog, res): try: file = dialog.save_finish(res) except: Log.debug("List: Export cancelled") return Log.info(f"Task: Export '{self.parent.uid}'") task = [ i for i in UserData.get_tasks_as_dicts(self.parent.list_uid) if i["uid"] == self.parent.uid ][0] calendar = Calendar() event = Event() event.add("uid", task["uid"]) event.add("summary", task["text"]) if task["notes"]: event.add("description", task["notes"]) event.add("priority", task["priority"]) if task["tags"]: event.add("categories", task["tags"]) event.add("percent-complete", task["percent_complete"]) if task["color"]: event.add("x-errands-color", task["color"]) event.add( "dtstart", ( datetime.fromisoformat(task["start_date"]) if task["start_date"] else datetime.now() ), ) if task["end_date"]: event.add("dtend", datetime.fromisoformat(task["end_date"])) calendar.add_component(event) with open(file.get_path(), "wb") as f: f.write(calendar.to_ical()) self.window.add_toast(_("Exported")) dialog = Gtk.FileDialog(initial_name=f"{self.parent.uid}.ics") dialog.save(self.task_list.window, None, _confirm) def _on_style_selected(self, btn: Gtk.Button, color: str) -> None: """ Apply accent color """ for c in self.parent.main_box.get_css_classes(): if "task-" in c: self.parent.main_box.remove_css_class(c) break if color != "": self.parent.main_box.add_css_class(f"task-{color}") self.parent.update_props(["color", "synced"], [color, False]) Sync.sync() # --- Tags --- # def _on_tag_added(self, entry: Adw.EntryRow) -> None: text = entry.get_text().strip(" \n\t") if text == "": return Log.debug("Details: Add tag") self.add_tag(entry.get_text()) entry.set_text("") self._save_tags() def _on_tag_deleted(self, btn, tag): Log.debug("Details: Remove tag") self.tags.remove(tag) self._save_tags() def _save_tags(self): self.parent.update_props( ["tags", "synced"], [ ",".join( [ r.get_title() for r in get_children(self.tag_entry.get_parent())[1:] ] ), False, ], ) Sync.sync() mrvladus-Errands-7b25a62/errands/widgets/preferences.py000066400000000000000000000226071456072341300232700ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from errands.widgets.window import Window from errands.lib.goa import get_goa_credentials from gi.repository import Adw, Gtk # type:ignore from errands.lib.sync.sync import Sync from errands.lib.gsettings import GSettings class PreferencesWindow(Adw.PreferencesWindow): selected_provider: int = 0 def __init__(self, win: Window) -> None: super().__init__() self.window: Window = win self._build_ui() self._setup_sync() def _build_ui(self) -> None: self.set_transient_for(self.window) self.set_search_enabled(False) # Theme group theme_group: Adw.PreferencesGroup = Adw.PreferencesGroup( title=_("Application Theme"), ) # System theme self.theme_system_btn: Gtk.CheckButton = Gtk.CheckButton( active=GSettings.get("theme") == 0 ) self.theme_system_btn.connect("toggled", self.on_theme_change, 0) theme_system_row: Adw.ActionRow = Adw.ActionRow( title=_("System"), icon_name="errands-theme-system-symbolic", ) theme_system_row.add_suffix(self.theme_system_btn) theme_system_row.set_activatable_widget(self.theme_system_btn) theme_group.add(theme_system_row) # Light theme self.theme_light_btn: Gtk.CheckButton = Gtk.CheckButton( group=self.theme_system_btn, active=GSettings.get("theme") == 1 ) self.theme_light_btn.connect("toggled", self.on_theme_change, 1) theme_light_row: Adw.ActionRow = Adw.ActionRow( title=_("Light"), icon_name="errands-theme-light-symbolic", ) theme_light_row.add_suffix(self.theme_light_btn) theme_light_row.set_activatable_widget(self.theme_light_btn) theme_group.add(theme_light_row) # Dark theme self.theme_dark_btn = Gtk.CheckButton( group=self.theme_system_btn, active=GSettings.get("theme") == 4 ) self.theme_dark_btn.connect("toggled", self.on_theme_change, 4) theme_dark_row: Adw.ActionRow = Adw.ActionRow( title=_("Dark"), icon_name="errands-theme-dark-symbolic", ) theme_dark_row.add_suffix(self.theme_dark_btn) theme_dark_row.set_activatable_widget(self.theme_dark_btn) theme_group.add(theme_dark_row) # Task lists group # task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) # add_tasks_position = Adw.ComboRow( # title=_("Add new Tasks"), # model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), # icon_name="errands-add-symbolic", # ) # task_list_group.add(add_tasks_position) # Tasks group tasks_group = Adw.PreferencesGroup(title=_("Tasks")) # Primary action task_primary_action = Adw.ComboRow( title=_("Click Action"), model=Gtk.StringList.new([_("Open Details Panel"), _("Show Sub-Tasks")]), icon_name="errands-click-symbolic", ) task_primary_action.set_selected( int(GSettings.get("primary-action-show-sub-tasks")) ) task_primary_action.connect( "notify::selected", lambda row, *_: GSettings.set( "primary-action-show-sub-tasks", "b", bool(row.get_selected()) ), ) tasks_group.add(task_primary_action) # Toggle size task_big_toggle = Adw.ComboRow( title=_("Complete Button Size"), model=Gtk.StringList.new([_("Small"), _("Big")]), icon_name="errands-check-toggle-symbolic", ) task_big_toggle.set_selected(int(GSettings.get("task-big-toggle"))) task_big_toggle.connect( "notify::selected", lambda row, *_: GSettings.set( "task-big-toggle", "b", bool(row.get_selected()) ), ) tasks_group.add(task_big_toggle) # Progress bar task_progress_bar = Adw.SwitchRow( title=_("Progress Bar"), icon_name="errands-progressbar-symbolic" ) GSettings.bind("task-show-progressbar", task_progress_bar, "active") tasks_group.add(task_progress_bar) # Toolbar task_toolbar = Adw.SwitchRow( title=_("Tool Bar"), icon_name="errands-toolbar-symbolic" ) GSettings.bind("task-show-toolbar", task_toolbar, "active") # tasks_group.add(task_toolbar) # Sync group sync_group = Adw.PreferencesGroup( title=_("Sync"), ) # Provider model = Gtk.StringList.new([_("Disabled"), "Nextcloud", "CalDAV"]) self.sync_providers = Adw.ComboRow( title=_("Sync Provider"), model=model, icon_name="errands-sync-symbolic", ) GSettings.bind("sync-provider", self.sync_providers, "selected") self.sync_providers.connect("notify::selected", lambda *_: self._setup_sync()) sync_group.add(self.sync_providers) # URL self.sync_url = Adw.EntryRow( title=_("Server URL"), ) GSettings.bind("sync-url", self.sync_url, "text") sync_group.add(self.sync_url) # Username self.sync_username = Adw.EntryRow( title=_("Username"), ) GSettings.bind("sync-username", self.sync_username, "text") sync_group.add(self.sync_username) # Password self.sync_password = Adw.PasswordEntryRow( title=_("Password"), ) self.sync_password.connect("changed", self.on_sync_pass_changed) sync_group.add(self.sync_password) # Test connection test_btn = Gtk.Button( label=_("Test"), valign="center", ) test_btn.connect("clicked", self.on_test_connection_btn_clicked) self.test_connection_row = Adw.ActionRow( title=_("Test Connection"), ) self.test_connection_row.add_suffix(test_btn) self.test_connection_row.set_activatable_widget(test_btn) sync_group.add(self.test_connection_row) # Details group details_group = Adw.PreferencesGroup( title=_("Details Panel"), ) details_position = Adw.ComboRow( title=_("Position"), model=Gtk.StringList.new([_("Left"), _("Right")]), icon_name="errands-sidebar-left-symbolic", ) details_position.set_selected(int(GSettings.get("right-sidebar"))) details_position.connect("notify::selected", self._on_details_position_changed) details_group.add(details_position) # Appearance Page appearance_page = Adw.PreferencesPage( title=_("Appearance"), icon_name="errands-appearance-symbolic" ) appearance_page.add(theme_group) appearance_page.add(tasks_group) appearance_page.add(details_group) # page.add(task_list_group) self.add(appearance_page) # Sync Page sync_page = Adw.PreferencesPage( title=_("Sync"), icon_name="errands-sync-symbolic" ) sync_page.add(sync_group) self.add(sync_page) def _setup_sync(self) -> None: selected: int = self.sync_providers.props.selected self.sync_url.set_visible(0 < selected < 3) self.sync_username.set_visible(0 < selected < 3) self.sync_password.set_visible(0 < selected < 3) self.test_connection_row.set_visible(selected > 0) if self.sync_password.props.visible: account: str = self.sync_providers.props.selected_item.props.string password: str = GSettings.get_secret(account) with self.sync_password.freeze_notify(): self.sync_password.props.text = password if password else "" # Fill out forms from Gnome Online Accounts if needed acc_name: str = self.sync_providers.props.selected_item.props.string data: dict[str, str] | None = get_goa_credentials(acc_name) if data: if not GSettings.get("sync-url"): self.sync_url.set_text(data["url"]) if not GSettings.get("sync-username"): self.sync_username.set_text(data["username"]) if not GSettings.get_secret(acc_name): self.sync_password.set_text(data["password"]) def on_sync_pass_changed(self, _entry) -> None: if 0 < self.sync_providers.props.selected < 3: account = self.sync_providers.props.selected_item.props.string GSettings.set_secret(account, self.sync_password.props.text) def on_test_connection_btn_clicked(self, _btn) -> None: res: bool = Sync.test_connection() msg: str = _("Connected") if res else _("Can't connect") toast: Adw.Toast = Adw.Toast(title=msg, timeout=2) self.add_toast(toast) def on_theme_change(self, btn: Gtk.Button, theme: int) -> None: Adw.StyleManager.get_default().set_color_scheme(theme) GSettings.set("theme", "i", theme) def _on_details_position_changed(self, row: Adw.ComboRow, *_) -> None: for list in self.window.sidebar.task_lists._get_task_lists(): list.split_view.set_sidebar_position(row.get_selected()) GSettings.set("right-sidebar", "b", bool(row.get_selected())), mrvladus-Errands-7b25a62/errands/widgets/secret_notes.py000066400000000000000000000236401456072341300234620ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING, TypedDict from errands.lib.functions import get_children if TYPE_CHECKING: from errands.widgets.window import Window from uuid import uuid4 from errands.lib.gsettings import GSettings from errands.lib.data import UserData from errands.widgets.components import Box from errands.lib.encryption import encrypt, decrypt from gi.repository import Adw, Gtk, GtkSource, GObject # type:ignore class NoteDict(TypedDict): text: str uid: str class SecretNote(Gtk.ListBoxRow): def __init__(self, notes_page: SecretNotesPage, note: NoteDict): super().__init__() self.notes_page: SecretNotesPage = notes_page self.notes_list: Gtk.ListBox = notes_page.notes_list self.password: str = notes_page.password self.uid: str = note["uid"] self.text: str = note["text"] self._build_ui() def _build_ui(self): self.set_activatable(False) self.set_margin_top(6) self.set_margin_bottom(6) self.set_margin_start(12) self.set_margin_end(12) # Text view self.text_view = GtkSource.View( css_classes=["card", "secret-note"], height_request=100, top_margin=12, bottom_margin=12, right_margin=12, left_margin=12, wrap_mode=Gtk.WrapMode.WORD_CHAR, ) self.buffer = self.text_view.get_buffer() self.buffer.props.text = self.text lm: GtkSource.LanguageManager = GtkSource.LanguageManager.get_default() self.buffer.set_language(lm.get_language("markdown")) self.buffer.connect("changed", self._on_text_changed) # Delete button delete_btn = Gtk.Button( icon_name="errands-trash-symbolic", css_classes=["flat", "circular", "error"], halign=Gtk.Align.END, valign=Gtk.Align.END, margin_end=6, margin_bottom=6, ) delete_btn.connect("clicked", self._on_delete_clicked) # Overlay overlay = Gtk.Overlay(child=self.text_view) overlay.add_overlay(delete_btn) self.set_child(overlay) def _on_text_changed(self, buffer: GtkSource.Buffer): text: str = encrypt(buffer.props.text, self.password) UserData.execute( "UPDATE secret_notes SET text = ? WHERE uid = ?", (text, self.uid) ) def _on_delete_clicked(self, _btn): UserData.execute("DELETE FROM secret_notes WHERE uid = ?", (self.uid,)) self.notes_list.remove(self) self.notes_page.update_ui() class SecretNotesPage(Adw.Bin): password: str = None def __init__(self, password: str): super().__init__() self.password: str = password self._build_ui() self._load_notes() self.update_ui() def _add_note(self, note: NoteDict): self.notes_list.append(SecretNote(self, note)) def _build_ui(self): # Headerbar hb: Adw.HeaderBar = Adw.HeaderBar( title_widget=Adw.WindowTitle(title=_("Secret Notes")) ) # Add note button self.add_btn: Gtk.Button = Gtk.Button( child=Adw.ButtonContent(icon_name="errands-add-symbolic", label=_("Add")) ) self.add_btn.connect("clicked", self._on_add_note_clicked) hb.pack_start(self.add_btn) self.notes_list: Gtk.ListBox = Gtk.ListBox( selection_mode=0, css_classes=["background"] ) # Status self.status_page = Adw.StatusPage( title="Add Note", icon_name="errands-notes-symbolic", vexpand=True, ) # Scrolled window self.scrl = Gtk.ScrolledWindow( child=Adw.Clamp( child=self.notes_list, margin_bottom=36, maximum_size=1000, tightening_threshold=300, ), propagate_natural_height=True, ) self.scrl.bind_property( "visible", self.status_page, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.INVERT_BOOLEAN, ) # Toolbar view toolbar_view: Adw.ToolbarView = Adw.ToolbarView( content=Box( children=[ self.status_page, self.scrl, ], orientation=Gtk.Orientation.VERTICAL, ) ) toolbar_view.add_top_bar(hb) self.set_child(toolbar_view) def _load_notes(self): notes: list[NoteDict] = [ NoteDict(text=decrypt(i[1], self.password), uid=i[0]) for i in UserData.execute("SELECT uid, text FROM secret_notes", fetch=True) ] for note in notes: self._add_note(note) def _on_add_note_clicked(self, _btn): uid: str = str(uuid4()) UserData.execute( "INSERT INTO secret_notes (text, uid) VALUES (?, ?)", ("", uid) ) self._add_note(NoteDict(text="", uid=uid)) self.update_ui() def update_ui(self): self.status_page.set_visible(not get_children(self.notes_list)) class SecretNotesPasswordPage(Adw.Bin): attempts: int = 0 def __init__(self, notes_win: SecretNotesWindow): super().__init__() self.notes_win: SecretNotesWindow = notes_win self._build_ui() def _build_ui(self): password: str | None = GSettings.get_secret("errands_secret_notes") # Status page self.status_page = Adw.StatusPage( title=_("Secret Notes"), description=( _("Enter password") if password != None else _("Create password") ), icon_name="errands-private-symbolic", height_request=300, ) # Entry password_entry = Adw.PasswordEntryRow( title=_("Password"), css_classes=["card"], height_request=60, margin_end=12, margin_start=12, ) password_entry.connect("entry-activated", self._on_password_entered) # Attempts bar self.attempts_bar = Gtk.ProgressBar( text=_("Attempts"), show_text=True, margin_top=12, margin_end=12, margin_start=12, ) self.attempts_bar.add_css_class("secret-notes-progressbar") self.attempts_bar.set_fraction(0.5) self.attempts_rev = Gtk.Revealer(child=self.attempts_bar) # Delete notes button self.delete_btn = Gtk.Button( label=_("Delete Notes"), css_classes=["pill", "destructive-action"], halign=Gtk.Align.CENTER, margin_top=24, visible=password != None, ) self.delete_btn.connect("clicked", self._on_delete_clicked) # Toolbar view toolbar_view: Adw.ToolbarView = Adw.ToolbarView( content=Adw.Clamp( child=Box( children=[ self.status_page, password_entry, self.attempts_rev, self.delete_btn, ], orientation=Gtk.Orientation.VERTICAL, ), margin_bottom=36, valign=Gtk.Align.CENTER, ) ) toolbar_view.add_top_bar(Adw.HeaderBar(show_title=False)) self.set_child(toolbar_view) def _on_password_entered(self, entry: Adw.PasswordEntryRow): password: str = entry.get_text() # Ignore empty password if not password: return # Get user password notes_password: str | None = GSettings.get_secret("errands_secret_notes") # Create password if not exists and open notes if not notes_password: # Save password GSettings.set_secret("errands_secret_notes", password) # Create notes table UserData.execute( """ CREATE TABLE IF NOT EXISTS secret_notes ( text TEXT, uid TEXT NOT NULL ) """ ) # Open notes self.notes_win.set_content(SecretNotesPage(password)) return # Verify password within 3 attempts and open notes if notes_password != password: # Delete data after 3 failed attempts if self.attempts > 2: UserData.execute("DROP TABLE secret_notes") GSettings.delete_secret("errands_secret_notes") self.delete_btn.set_visible(False) self.status_page.set_description(_("Create password")) # Update progressbar after failed attempt else: self.attempts += 1 self.attempts_bar.set_fraction(self.attempts / 3) self.attempts_rev.set_reveal_child(True) else: # Open notes self.notes_win.set_content(SecretNotesPage(password)) def _on_delete_clicked(self, btn: Gtk.Button): btn.set_visible(False) UserData.execute("DROP TABLE secret_notes") GSettings.delete_secret("errands_secret_notes") self.status_page.set_description(_("Create password")) class SecretNotesWindow(Adw.Window): def __init__(self, window: Window): super().__init__() self.window: Window = window self._build_ui() def _build_ui(self): self.props.width_request = 360 self.props.height_request = 360 self.set_hide_on_close(True) self.set_title(_("Secret Notes")) GSettings.bind("secret-notes-width", self, "default_width") GSettings.bind("secret-notes-height", self, "default_height") self.set_content(SecretNotesPasswordPage(self)) mrvladus-Errands-7b25a62/errands/widgets/sidebar.py000066400000000000000000000525051456072341300224000ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations import time from typing import TYPE_CHECKING if TYPE_CHECKING: from errands.widgets.window import Window from datetime import datetime from icalendar import Calendar, Todo from errands.lib.data import UserData from errands.lib.functions import get_children from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.widgets.components import Box from errands.widgets.task import Task from errands.widgets.task_list import TaskList from gi.repository import Adw, Gtk, Gio, GObject, Gdk, GLib # type:ignore class Sidebar(Adw.Bin): def __init__(self, window: Window): super().__init__() self.window: Window = window self._build_ui() def _build_ui(self): # Components self.status_page: SidebarStatusPage = SidebarStatusPage(self) self.task_lists: SidebarTaskLists = SidebarTaskLists(self) self.header_bar: SidebarHeaderBar = SidebarHeaderBar( self.task_lists, self.window ) self.trash_button: SidebarTrashButton = SidebarTrashButton( self.task_lists, self.window ) # Toolbar view toolbar_view: Adw.ToolbarView = Adw.ToolbarView( content=Box( children=[ self.status_page, self.task_lists, self.trash_button, ], orientation=Gtk.Orientation.VERTICAL, ) ) toolbar_view.add_top_bar(self.header_bar) self.set_child(toolbar_view) class SidebarHeaderBar(Adw.Bin): def __init__(self, task_lists: SidebarTaskLists, window: Window): super().__init__() self.task_lists: SidebarTaskLists = task_lists self.window: Window = window self._build_ui() def _build_ui(self): # HeaderBar hb: Adw.HeaderBar = Adw.HeaderBar( title_widget=Gtk.Label( label=_("Errands"), css_classes=["heading"], ) ) self.set_child(hb) # Import menu import_menu: Gio.Menu = Gio.Menu.new() import_menu.append(_("Import List"), "app.import") # Add list button self.add_list_btn: Adw.SplitButton = Adw.SplitButton( icon_name="list-add-symbolic", tooltip_text=_("Add List (Ctrl+A)"), menu_model=import_menu, dropdown_tooltip=_("More Options"), ) ctrl = Gtk.ShortcutController(scope=1) ctrl.add_shortcut( Gtk.Shortcut( trigger=Gtk.ShortcutTrigger.parse_string("A"), action=Gtk.ShortcutAction.parse_string("activate"), ) ) self.add_list_btn.add_controller(ctrl) self.add_list_btn.connect("clicked", self._on_add_btn_clicked) hb.pack_start(self.add_list_btn) # Main menu menu: Gio.Menu = Gio.Menu.new() top_section: Gio.Menu = Gio.Menu.new() # top_section.append(_("Secret Notes"), "app.secret_notes") top_section.append(_("Sync / Fetch Tasks"), "app.sync") menu.append_section(None, top_section) bottom_section: Gio.Menu = Gio.Menu.new() bottom_section.append(_("Preferences"), "app.preferences") bottom_section.append(_("Keyboard Shortcuts"), "win.show-help-overlay") bottom_section.append(_("About Errands"), "app.about") menu.append_section(None, bottom_section) menu_btn: Gtk.MenuButton = Gtk.MenuButton( menu_model=menu, primary=True, icon_name="open-menu-symbolic", tooltip_text=_("Main Menu"), ) hb.pack_end(menu_btn) # Sync indicator self.sync_indicator: Gtk.Spinner = Gtk.Spinner( tooltip_text=_("Syncing..."), visible=False, spinning=True ) hb.pack_end(self.sync_indicator) def _on_add_btn_clicked(self, btn) -> None: def _entry_activated(_, dialog): if dialog.get_response_enabled("add"): dialog.response("add") dialog.close() def _entry_changed(entry, _, dialog): text = entry.props.text.strip(" \n\t") names = [i["name"] for i in UserData.get_lists_as_dicts()] dialog.set_response_enabled("add", text and text not in names) def _confirm(_, res, entry): if res == "cancel": return name = entry.props.text.rstrip().lstrip() uid = UserData.add_list(name) row = self.task_lists.add_list(name, uid) self.task_lists.lists.select_row(row) Sync.sync() entry = Gtk.Entry(placeholder_text=_("New List Name")) dialog = Adw.MessageDialog( transient_for=self.window, hide_on_close=True, heading=_("Add List"), default_response="add", close_response="cancel", extra_child=entry, ) dialog.add_response("cancel", _("Cancel")) dialog.add_response("add", _("Add")) dialog.set_response_enabled("add", False) dialog.set_response_appearance("add", Adw.ResponseAppearance.SUGGESTED) dialog.connect("response", _confirm, entry) entry.connect("activate", _entry_activated, dialog) entry.connect("notify::text", _entry_changed, dialog) dialog.present() class SidebarStatusPage(Adw.Bin): def __init__(self, sidebar: Sidebar): super().__init__() self.sidebar: Sidebar = sidebar self._build_ui() def _build_ui(self) -> None: status_page: Adw.StatusPage = Adw.StatusPage( title=_("Add new List"), description=_('Click "+" button'), icon_name="errands-lists-symbolic", css_classes=["compact"], vexpand=True, ) self.set_child(status_page) class SidebarTaskLists(Gtk.ScrolledWindow): def __init__(self, sidebar: Sidebar): super().__init__() self.sidebar: Sidebar = sidebar self.window: Window = sidebar.window self._build_ui() self._load_lists() self.update_ui() def _build_ui(self) -> None: self.set_propagate_natural_height(True) self.set_vexpand(True) # Lists self.lists: Gtk.ListBox = Gtk.ListBox(css_classes=["navigation-sidebar"]) self.lists.connect("row-selected", self._on_row_selected) self.bind_property( "visible", self.sidebar.status_page, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.BIDIRECTIONAL, ) self.set_child(self.lists) def add_list(self, name, uid) -> SidebarTaskListsItem: task_list: TaskList = TaskList(self.window, uid, self) page: Adw.ViewStackPage = self.window.stack.add_titled( child=task_list, name=name, title=name ) task_list.title.bind_property( "title", page, "title", GObject.BindingFlags.SYNC_CREATE ) task_list.title.bind_property( "title", page, "name", GObject.BindingFlags.SYNC_CREATE ) row: SidebarTaskListsItem = SidebarTaskListsItem(task_list, self) self.lists.append(row) return row def _on_row_selected(self, _, row: Gtk.ListBoxRow) -> None: Log.debug("Lists: Switch list") if row: name = row.label.get_label() self.window.stack.set_visible_child_name(name) self.window.split_view.set_show_content(True) GSettings.set("last-open-list", "s", name) self.sidebar.status_page.set_visible(False) def _get_task_lists(self) -> list[TaskList]: lists: list[TaskList] = [] pages: Adw.ViewStackPages = self.window.stack.get_pages() for i in range(pages.get_n_items()): child: TaskList = pages.get_item(i).get_child() if isinstance(child, TaskList): lists.append(child) return lists def _get_task_lists_items(self) -> list[SidebarTaskListsItem]: return get_children(self.lists) def _load_lists(self) -> None: lists: list[dict] = [ i for i in UserData.get_lists_as_dicts() if not i["deleted"] ] for l in lists: row: SidebarTaskListsItem = self.add_list(l["name"], l["uid"]) if GSettings.get("last-open-list") == l["name"]: self.lists.select_row(row) self.sidebar.status_page.set_visible(len(lists) == 0) def update_ui(self) -> None: Log.debug("Lists: Update UI...") # Delete lists uids: list[str] = [i["uid"] for i in UserData.get_lists_as_dicts()] for row in self._get_task_lists_items(): if row.uid not in uids: prev_child: SidebarTaskListsItem | None = row.get_prev_sibling() next_child: SidebarTaskListsItem | None = row.get_next_sibling() list: TaskList = row.task_list self.window.stack.remove(list) if prev_child or next_child: self.lists.select_row(prev_child or next_child) self.lists.remove(row) # Update old lists for l in self._get_task_lists(): l.update_ui() # Create new lists old_uids: list[str] = [row.uid for row in self._get_task_lists_items()] new_lists: list[dict] = UserData.get_lists_as_dicts() for l in new_lists: if l["uid"] not in old_uids: Log.debug(f"Lists: Add list '{l['uid']}'") row: SidebarTaskListsItem = self.add_list(l["name"], l["uid"]) self.lists.select_row(row) self.window.stack.set_visible_child_name(l["name"]) self.sidebar.status_page.set_visible(False) # Show status length: int = len(self._get_task_lists_items()) self.sidebar.status_page.set_visible(length == 0) if length == 0: self.window.stack.set_visible_child_name("status") class SidebarTaskListsItem(Gtk.ListBoxRow): def __init__(self, task_list: TaskList, task_lists: SidebarTaskLists) -> None: super().__init__() self.task_lists: SidebarTaskLists = task_lists self.list_box: Gtk.ListBox = task_lists.lists self.task_list: TaskList = task_list self.uid: str = task_list.list_uid self.window: Window = task_lists.window self._build_ui() self._add_actions() def _add_actions(self) -> None: group: Gio.SimpleActionGroup = Gio.SimpleActionGroup() self.insert_action_group(name="list_item", group=group) def _create_action(name: str, callback: callable) -> None: action: Gio.SimpleAction = Gio.SimpleAction.new(name, None) action.connect("activate", callback) group.add_action(action) def _delete(*args): def _confirm(_, res): if res == "cancel": Log.debug("ListItem: Deleting list is cancelled") return Log.info(f"Lists: Delete list '{self.uid}'") UserData.run_sql( f"UPDATE lists SET deleted = 1 WHERE uid = '{self.uid}'", f"DELETE FROM tasks WHERE list_uid = '{self.uid}'", ) self.window.stack.remove(self.task_list) # Switch row next_row: SidebarTaskListsItem = self.get_next_sibling() prev_row: SidebarTaskListsItem = self.get_prev_sibling() self.list_box.remove(self) if next_row or prev_row: self.list_box.select_row(next_row or prev_row) else: self.window.stack.set_visible_child_name("status") self.task_lists.sidebar.status_page.set_visible(True) # Remove items from trash for item in get_children(self.window.trash.trash_list): if item.task_widget.list_uid == self.uid: self.window.trash.trash_list.remove(item) Sync.sync() dialog: Adw.MessageDialog = Adw.MessageDialog( transient_for=self.window, hide_on_close=True, heading=_("Are you sure?"), body=_("List will be permanently deleted"), default_response="delete", close_response="cancel", ) dialog.add_response("cancel", _("Cancel")) dialog.add_response("delete", _("Delete")) dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE) dialog.connect("response", _confirm) dialog.present() def _rename(*args): def _entry_activated(_, dialog: Adw.MessageDialog): if dialog.get_response_enabled("save"): dialog.response("save") dialog.close() def _entry_changed(entry: Gtk.Entry, _, dialog: Adw.MessageDialog): text = entry.props.text.strip(" \n\t") names = [i["name"] for i in UserData.get_lists_as_dicts()] dialog.set_response_enabled("save", text and text not in names) def _confirm(_, res, entry: Gtk.Entry): if res == "cancel": Log.debug("ListItem: Editing list name is cancelled") return Log.info(f"ListItem: Rename list {self.uid}") text: str = entry.props.text.rstrip().lstrip() UserData.run_sql( ( "UPDATE lists SET name = ?, synced = 0 WHERE uid = ?", (text, self.uid), ) ) self.task_list.title.set_title(text) Sync.sync() entry: Gtk.Entry = Gtk.Entry(placeholder_text=_("New Name")) entry.get_buffer().props.text = self.label.get_label() dialog: Adw.MessageDialog = Adw.MessageDialog( transient_for=self.window, hide_on_close=True, heading=_("Rename List"), default_response="save", close_response="cancel", extra_child=entry, ) dialog.add_response("cancel", _("Cancel")) dialog.add_response("save", _("Save")) dialog.set_response_enabled("save", False) dialog.set_response_appearance("save", Adw.ResponseAppearance.SUGGESTED) dialog.connect("response", _confirm, entry) entry.connect("activate", _entry_activated, dialog) entry.connect("notify::text", _entry_changed, dialog) dialog.present() def _export(*args): def _confirm(dialog, res): try: file = dialog.save_finish(res) except: Log.debug("List: Export cancelled") return Log.info(f"List: Export '{self.uid}'") tasks: list[dict] = UserData.get_tasks_as_dicts(self.uid) calendar: Calendar = Calendar() calendar.add("x-wr-calname", self.label.get_label()) for task in tasks: event = Todo() event.add("uid", task["uid"]) event.add("related-to", task["parent"]) event.add("summary", task["text"]) if task["notes"]: event.add("description", task["notes"]) event.add("priority", task["priority"]) if task["tags"]: event.add("categories", task["tags"]) event.add("percent-complete", task["percent_complete"]) if task["color"]: event.add("x-errands-color", task["color"]) event.add( "dtstart", ( datetime.fromisoformat(task["start_date"]) if task["start_date"] else datetime.now() ), ) if task["end_date"]: event.add( "due", ( datetime.fromisoformat(task["end_date"]) if task["end_date"] else datetime.now() ), ) calendar.add_component(event) try: with open(file.get_path(), "wb") as f: f.write(calendar.to_ical()) except Exception as e: Log.error(f"List: Export failed. {e}") self.window.add_toast(_("Export failed")) self.window.add_toast(_("Exported")) filter: Gtk.FileFilter = Gtk.FileFilter() filter.add_pattern("*.ics") dialog: Gtk.FileDialog = Gtk.FileDialog( initial_name=f"{self.uid}.ics", default_filter=filter ) dialog.save(self.window, None, _confirm) _create_action("delete", _delete) _create_action("rename", _rename) _create_action("export", _export) def _build_ui(self) -> None: self.add_css_class("task-lists-item") # Label self.label: Gtk.Label = Gtk.Label( halign="start", hexpand=True, ellipsize=3, ) self.task_list.title.bind_property( "title", self.label, "label", GObject.BindingFlags.SYNC_CREATE, ) # Menu menu: Gio.Menu = Gio.Menu.new() menu.append(_("Rename"), "list_item.rename") menu.append(_("Delete"), "list_item.delete") menu.append(_("Export"), "list_item.export") # Click controller ctrl: Gtk.GestureClick = Gtk.GestureClick() ctrl.connect("released", self._on_click) self.add_controller(ctrl) # Drop controller drop_ctrl: Gtk.DropTarget = Gtk.DropTarget.new( actions=Gdk.DragAction.MOVE, type=Task ) drop_ctrl.connect("drop", self._on_task_drop) self.add_controller(drop_ctrl) # Drop hover controller drop_hover_ctrl: Gtk.DropControllerMotion = Gtk.DropControllerMotion() drop_hover_ctrl.connect("enter", self._on_drop_hover) self.add_controller(drop_hover_ctrl) self.set_child( Box( children=[ self.label, Gtk.MenuButton( menu_model=menu, icon_name="view-more-symbolic", tooltip_text=_("Menu"), ), ], css_classes=["toolbar"], ) ) def _on_click(self, *args) -> None: self.window.stack.set_visible_child_name(self.label.get_label()) self.window.split_view.set_show_content(True) def _on_drop_hover(self, ctrl: Gtk.DropControllerMotion, _x, _y): """ Switch list on dnd hover after DELAY_SECONDS """ DELAY_SECONDS: float = 0.7 entered_at: float = time.time() def _switch_delay(): if ctrl.contains_pointer(): if time.time() - entered_at >= DELAY_SECONDS: self.activate() return False else: return True else: return False GLib.timeout_add(100, _switch_delay) def _on_task_drop(self, _drop, task: Task, _x, _y): """ Move task and sub-tasks to new list """ if task.list_uid == self.uid: return Log.info(f"Lists: Move '{task.uid}' to '{self.uid}' list") UserData.move_task_to_list(task.uid, task.list_uid, self.uid, "", False) uid: str = task.uid task.purge() self.task_list.add_task(uid) Sync.sync() class SidebarTrashButton(Gtk.Button): def __init__(self, task_lists: SidebarTaskLists, window: Window): super().__init__() self.task_lists: SidebarTaskLists = task_lists self.window: Window = window self._build_ui() def _build_ui(self): self.set_child( Adw.ButtonContent( icon_name="errands-trash-symbolic", label=_("Trash"), halign="center", ) ) self.add_css_class("flat") self.set_margin_top(6) self.set_margin_bottom(6) self.set_margin_start(6) self.set_margin_end(6) self.task_lists.bind_property( "visible", self, "visible", GObject.BindingFlags.SYNC_CREATE, ) # Drop controller trash_drop_ctrl = Gtk.DropTarget.new(actions=Gdk.DragAction.MOVE, type=Task) trash_drop_ctrl.connect("drop", lambda _d, t, _x, _y: t.delete()) self.add_controller(trash_drop_ctrl) def do_clicked(self) -> None: self.task_lists.lists.unselect_all() self.window.stack.set_visible_child_name("trash") self.window.split_view.set_show_content(True) mrvladus-Errands-7b25a62/errands/widgets/task.py000066400000000000000000000643051456072341300217320ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import Any, TYPE_CHECKING if TYPE_CHECKING: from errands.widgets.task_list import TaskList from errands.widgets.window import Window from errands.widgets.components import Box, Button from gi.repository import Gtk, Adw, Gdk, GObject # type:ignore from errands.lib.sync.sync import Sync from errands.lib.logging import Log from errands.lib.data import UserData from errands.lib.markup import Markup from errands.lib.functions import get_children from errands.lib.gsettings import GSettings class TaskTopDropArea(Gtk.Revealer): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def _build_ui(self): self.set_transition_type(5) # Drop Image top_drop_img: Gtk.Image = Gtk.Image( icon_name="list-add-symbolic", hexpand=True, css_classes=["dim-label", "task-drop-area"], ) top_drop_img_target: Gtk.DropTarget = Gtk.DropTarget.new( actions=Gdk.DragAction.MOVE, type=Task ) top_drop_img_target.connect("drop", self._on_drop) top_drop_img.add_controller(top_drop_img_target) self.set_child(top_drop_img) # Drop controller drop_ctrl: Gtk.DropControllerMotion = Gtk.DropControllerMotion.new() drop_ctrl.bind_property( "contains-pointer", self, "reveal-child", GObject.BindingFlags.SYNC_CREATE ) self.task.add_controller(drop_ctrl) def _on_drop(self, _drop, task: Task, _x, _y) -> bool: """ When task is dropped on "+" area on top of task """ UserData.move_task_to_list( task.uid, task.list_uid, self.task.list_uid, self.task.parent.uid if isinstance(self.task.parent, Task) else "", False, ) UserData.move_task_before(self.task.list_uid, task.uid, self.task.uid) # If task has the same parent if task.parent == self.task.parent: # Move widget self.task.parent.tasks_list.reorder_child_after(task, self.task) self.task.parent.tasks_list.reorder_child_after(self.task, task) return True # Change parent if different parents UserData.update_props( self.task.list_uid, task.uid, ["parent", "synced"], [self.task.parent.uid if isinstance(self.task.parent, Task) else "", False], ) # Add new task widget new_task: Task = Task( task.uid, self.task.list_uid, self.task.window, self.task.task_list, self.task.parent, self.task.get_prop("parent") != None, ) self.task.parent.tasks_list.append(new_task) self.task.parent.tasks_list.reorder_child_after(new_task, self.task) self.task.parent.tasks_list.reorder_child_after(self.task, new_task) new_task.toggle_visibility(True) # Toggle completion if not task.task_row.complete_btn.get_active(): self.task.update_props(["completed", "synced"], [False, False]) self.task.just_added = True self.task.task_row.complete_btn.set_active(False) self.task.just_added = False for parent in self.task.get_parents_tree(): if parent.task_row.complete_btn.get_active(): parent.update_props(["completed", "synced"], [False, False]) parent.just_added = True parent.task_row.complete_btn.set_active(False) parent.just_added = False # Update status task.purge() self.task.task_list.update_ui() # Sync Sync.sync() return True class TaskTitleRow(Gtk.Overlay): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def add_rm_crossline(self, add: bool) -> None: if add: self.task_row.add_css_class("task-completed") else: self.task_row.remove_css_class("task-completed") def _build_ui(self): # Task Title Row self.task_row = Adw.ActionRow( title=Markup.find_url(Markup.escape(self.task.get_prop("text"))), css_classes=["rounded-corners", "transparent"], height_request=60, accessible_role=Gtk.AccessibleRole.ROW, cursor=Gdk.Cursor.new_from_name("pointer"), use_markup=True, ) self.add_rm_crossline(self.task.get_prop("completed")) # Drag controller task_row_drag_source: Gtk.DragSource = Gtk.DragSource.new() task_row_drag_source.set_actions(Gdk.DragAction.MOVE) task_row_drag_source.connect("prepare", self._on_drag_prepare) task_row_drag_source.connect("drag-begin", self._on_drag_begin) task_row_drag_source.connect("drag-cancel", self._on_drag_end) task_row_drag_source.connect("drag-end", self._on_drag_end) self.task_row.add_controller(task_row_drag_source) # Drop controller task_row_drop_target = Gtk.DropTarget.new( actions=Gdk.DragAction.MOVE, type=Task ) task_row_drop_target.connect("drop", self._on_drop) self.task_row.add_controller(task_row_drop_target) # Click controller task_row_click_ctrl = Gtk.GestureClick.new() task_row_click_ctrl.connect("released", self._on_row_clicked) self.task_row.add_controller(task_row_click_ctrl) # Prefix self.complete_btn = TaskCompleteButton(self.task, self.task_row) self.task_row.add_prefix(self.complete_btn) # Suffix self.details_btn = TaskDetailsButton(self.task) self.expand_btn = TaskExpandButton(self.task) self.task_row.add_suffix(Box(children=[self.expand_btn, self.details_btn])) self.expand_indicator = Gtk.Image( icon_name="errands-up-symbolic", css_classes=["expand-indicator"], halign=Gtk.Align.END, margin_end=50, ) expand_indicator_rev = Gtk.Revealer( child=self.expand_indicator, transition_type=1, reveal_child=False, can_target=False, ) GSettings.bind("primary-action-show-sub-tasks", expand_indicator_rev, "visible") self.add_overlay(expand_indicator_rev) # Expand indicator hover controller hover_ctrl = Gtk.EventControllerMotion() hover_ctrl.bind_property( "contains-pointer", expand_indicator_rev, "reveal-child", GObject.BindingFlags.SYNC_CREATE, ) self.task_row.add_controller(hover_ctrl) box = Gtk.ListBox( selection_mode=Gtk.SelectionMode.NONE, css_classes=["rounded-corners", "transparent"], accessible_role=Gtk.AccessibleRole.PRESENTATION, ) box.append(self.task_row) self.set_child(box) def _on_row_clicked(self, *args) -> None: # Show sub-tasks if this is primary action if GSettings.get("primary-action-show-sub-tasks"): self.task.expand(not self.task.sub_tasks_revealer.get_child_revealed()) else: self.task.task_row.details_btn.do_clicked() def update_ui(self): # Update widget title crossline and completed toggle completed: bool = self.task.get_prop("completed") self.add_rm_crossline(completed) if self.complete_btn.get_active() != completed: self.task.just_added = True self.complete_btn.set_active(completed) self.task.just_added = False # Update subtitle total, completed = self.task.get_status() self.task_row.set_subtitle( _("Completed:") + f" {completed} / {total}" if total > 0 else "" ) # --- DND --- # def _on_drag_prepare(self, *_) -> Gdk.ContentProvider: # Bug workaround when task is not sensitive after short dnd for task in self.task.task_list.get_all_tasks(): task.set_sensitive(True) self.task.set_sensitive(False) value: GObject.Value = GObject.Value(Task) value.set_object(self.task) return Gdk.ContentProvider.new_for_value(value) def _on_drag_begin(self, _, drag) -> bool: text: str = self.task.get_prop("text") icon: Gtk.DragIcon = Gtk.DragIcon.get_for_drag(drag) icon.set_child(Gtk.Button(label=text if len(text) < 20 else f"{text[0:20]}...")) def _on_drag_end(self, *_) -> bool: self.task.set_sensitive(True) # KDE dnd bug workaround for issue #111 for task in self.task.task_list.get_all_tasks(): task.top_drop_area.set_reveal_child(False) task.set_sensitive(True) def _on_drop(self, _drop, task: Task, _x, _y) -> None: """ When task is dropped on task and becomes sub-task """ if task == self.task or task.parent == self.task: return # Change parent UserData.move_task_to_list( task.uid, task.list_uid, self.task.list_uid, self.task.get_prop("uid"), False, ) # Add new sub-task self.task.tasks_list.add_sub_task(task.uid) # Toggle completion if not task.task_row.complete_btn.get_active(): self.task.update_props(["completed", "synced"], [False, False]) self.task.just_added = True self.task.task_row.complete_btn.set_active(False) self.task.just_added = False for parent in self.task.get_parents_tree(): if parent.task_row.complete_btn.get_active(): parent.update_props(["completed", "synced"], [False, False]) parent.just_added = True parent.task_row.complete_btn.set_active(False) parent.just_added = False if not self.task.get_prop("expanded"): self.task.expand(True) # Remove old task task.purge() self.task.task_list.update_ui() # Sync Sync.sync() return True class TaskCompleteButton(Gtk.Box): def __init__(self, task: Task, parent: Adw.ActionRow) -> None: super().__init__() self.task: Task = task self.parent: Adw.ActionRow = parent self._build_ui() def get_active(self) -> bool: return self.big_btn.get_active() def set_active(self, active: bool) -> None: self.big_btn.set_active(active) def _build_ui(self) -> None: # Big button self.big_btn = Gtk.CheckButton( valign=Gtk.Align.CENTER, tooltip_text=_("Mark as Completed"), active=self.task.get_prop("completed"), css_classes=["selection-mode"], ) GSettings.bind("task-big-toggle", self.big_btn, "visible") self.big_btn.connect("toggled", self._on_toggle) self.append(self.big_btn) # Small button small_btn = Gtk.CheckButton( valign=Gtk.Align.CENTER, tooltip_text=_("Mark as Completed"), active=self.task.get_prop("completed"), ) small_btn.bind_property( "active", self.big_btn, "active", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) GSettings.bind("task-big-toggle", small_btn, "visible", True) self.append(small_btn) def _on_toggle(self, btn: Gtk.CheckButton) -> None: Log.debug(f"Task '{self.task.uid}': Set completed to '{self.get_active()}'") # If task is just added set crossline and return to avoid sync loop self.task.task_row.add_rm_crossline(self.get_active()) if self.task.just_added: return self.task.update_props(["completed", "synced"], [self.get_active(), False]) sub_tasks: list[Task] = self.task.tasks_list.get_all_sub_tasks() parents: list[Task] = self.task.get_parents_tree() if self.get_active(): # Complete all sub-tasks for sub in sub_tasks: if not sub.task_row.complete_btn.get_active(): sub.just_added = True sub.task_row.complete_btn.set_active(True) sub.just_added = False sub.update_props(["completed", "synced"], [True, False]) else: # Uncomplete parent if sub-task is uncompleted for parent in parents: if parent.task_row.complete_btn.get_active(): parent.just_added = True parent.task_row.complete_btn.set_active(False) parent.just_added = False parent.update_props(["completed", "synced"], [False, False]) # Calculate completion percent for parents # for parent in parents: # total, completed = parent.get_status() # pc: int = ( # completed / total * 100 # if total > 0 # else parent.get_prop("percent_complete") # ) # if parent.get_prop("percent_complete") != pc: # parent.update_props(["percent_complete", "synced"], [pc, False]) # parent.update_ui() # Calculate completion percent for self # total, completed = self.task.get_status() # pc: int = ( # completed / total * 100 # if total > 0 # else (100 if self.task.get_prop("completed") else 0) # ) # if self.task.get_prop("percent_complete") != pc: # self.task.update_props(["percent_complete", "synced"], [pc, False]) # # Calculate completion percent for sub-tasks # for sub in sub_tasks: # total, completed = sub.get_status() # pc: int = ( # completed / total * 100 # if total > 0 # else (100 if self.task.get_prop("completed") else 0) # ) # if sub.get_prop("percent_complete") != pc: # sub.update_props(["percent_complete", "synced"], [pc, False]) self.task.task_list.update_ui() Sync.sync() class TaskExpandButton(Gtk.Button): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def _build_ui(self): self.set_icon_name("errands-up-symbolic") self.set_valign(Gtk.Align.CENTER) self.set_tooltip_text(_("Expand / Fold")) self.add_css_class("flat") self.add_css_class("circular") self.add_css_class("fade") self.add_css_class("rotate") GSettings.bind("primary-action-show-sub-tasks", self, "visible", True) def do_clicked(self): self.task.expand(not self.task.sub_tasks_revealer.get_child_revealed()) class TaskDetailsButton(Gtk.Button): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def _build_ui(self): self.set_icon_name("errands-info-symbolic") self.set_valign(Gtk.Align.CENTER) self.set_tooltip_text(_("Details")) self.add_css_class("flat") self.add_css_class("circular") GSettings.bind("primary-action-show-sub-tasks", self, "visible") def do_clicked(self): # Close details on second click if ( self.task.details.parent == self.task and not self.task.details.status.get_visible() and self.task.task_list.split_view.get_show_sidebar() ): self.task.task_list.split_view.set_show_sidebar(False) return # Update details and show sidebar self.task.details.update_info(self.task) self.task.task_list.split_view.set_show_sidebar(True) class TaskInfoBar(Gtk.Box): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def _build_ui(self): self.set_orientation(Gtk.Orientation.VERTICAL) # Progress bar self.progress_bar = Gtk.ProgressBar( margin_end=12, margin_start=12, margin_bottom=6, ) self.progress_bar.add_css_class("osd") self.progress_bar.add_css_class("dim-label") GSettings.bind("task-show-progressbar", self.progress_bar, "visible") self.progress_bar_rev = Gtk.Revealer( child=self.progress_bar, transition_duration=100 ) self.append(self.progress_bar_rev) # Info # self.due_date = Button( # icon_name="errands-calendar-symbolic", # label=_("Due"), # css_classes=["task-toolbar-btn"], # cursor=Gdk.Cursor(name="pointer"), # ) # self.priority = Button( # icon_name="errands-priority-symbolic", # label=_("Priority"), # css_classes=["task-toolbar-btn"], # cursor=Gdk.Cursor(name="pointer"), # ) # self.notes = Button( # icon_name="errands-notes-symbolic", # label=_("Notes"), # css_classes=["task-toolbar-btn"], # cursor=Gdk.Cursor(name="pointer"), # ) # self.color = Button( # icon_name="errands-color-symbolic", # label=_("Color"), # css_classes=["task-toolbar-btn"], # cursor=Gdk.Cursor(name="pointer"), # ) # self.tags = Gtk.Box(hexpand=True) # self.status_box = Box( # children=[ # self.due_date, # self.priority, # self.tags, # self.notes, # self.color, # ], # margin_end=12, # margin_start=12, # margin_bottom=3, # ) # GSettings.bind("task-show-toolbar", self.status_box, "visible") # self.append(self.status_box) def update_ui(self): # end_date = self.task.get_prop("end_date") # start_date = self.task.get_prop("start_date") # notes = self.task.get_prop("notes") # Update percrent complete if GSettings.get("task-show-progressbar"): total, completed = self.task.get_status() pc: int = ( completed / total * 100 if total > 0 else self.task.get_prop("percent_complete") ) if self.task.get_prop("percent_complete") != pc: self.task.update_props(["percent_complete", "synced"], [pc, False]) self.progress_bar.set_fraction(pc / 100) self.progress_bar_rev.set_reveal_child(self.task.get_status()[0] > 0) class TaskSubTasksEntry(Gtk.Entry): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() def _build_ui(self): self.set_hexpand(True) self.set_placeholder_text(_("Add new Sub-Task")) self.set_margin_start(12) self.set_margin_end(12) self.set_margin_bottom(2) def do_activate(self) -> None: """ Add new Sub-Task """ text: str = self.get_text() # Return if entry is empty if text.strip(" \n\t") == "": return # Add sub-task self.task.tasks_list.add_sub_task( UserData.add_task( list_uid=self.task.list_uid, text=text, parent=self.task.uid ) ) # Clear entry self.set_text("") # Update status self.task.update_props(["completed"], [False]) self.task.just_added = True self.task.task_row.complete_btn.set_active(False) self.task.just_added = False self.task.update_ui() # Sync Sync.sync() class TaskSubTasks(Gtk.Box): def __init__(self, task: Task): super().__init__() self.task: Task = task self._build_ui() self._add_sub_tasks() def _build_ui(self): self.set_orientation(Gtk.Orientation.VERTICAL) self.add_css_class("sub-tasks") def _add_sub_tasks(self) -> None: subs: list[str] = UserData.get_tasks_uids(self.task.list_uid, self.task.uid) if len(subs) == 0: self.task.just_added = False return for uid in subs: self.add_sub_task(uid) # self.task.parent.update_ui() self.task.task_list.update_status() self.task.just_added = False def add_sub_task(self, uid: str) -> Task: new_task: Task = Task( uid, self.task.list_uid, self.task.window, self.task.task_list, self.task, True, ) self.append(new_task) new_task.toggle_visibility(not new_task.get_prop("trash")) return new_task def get_sub_tasks(self) -> list[Task]: return get_children(self) def get_all_sub_tasks(self) -> list[Task]: """ Get list of all tasks widgets including sub-tasks """ tasks: list[Task] = [] def _append_tasks(sub_tasks: list[Task]) -> None: for task in sub_tasks: tasks.append(task) children: list[Task] = task.tasks_list.get_sub_tasks() if len(children) > 0: _append_tasks(children) _append_tasks(self.get_sub_tasks()) return tasks class Task(Gtk.Revealer): just_added: bool = True can_sync: bool = True def __init__( self, uid: str, list_uid: str, window: Window, task_list: TaskList, parent: TaskList | Task, is_sub_task: bool, ) -> None: super().__init__() Log.info(f"Add task: {uid}") self.uid = uid self.list_uid = list_uid self.window = window self.task_list = task_list self.parent = parent self.is_sub_task = is_sub_task self.trash = window.trash self.details = task_list.details self._build_ui() # Add to trash if needed if self.get_prop("trash"): self.trash.trash_add(self) # Expand self.expand(self.get_prop("expanded")) self.update_ui() def _build_ui(self) -> None: # Top drop area self.top_drop_area = TaskTopDropArea(self) # Task row self.task_row = TaskTitleRow(self) # Info bar self.info_bar = TaskInfoBar(self) # Sub-tasks self.tasks_list = TaskSubTasks(self) # Sub-tasks revealer self.sub_tasks_revealer = Gtk.Revealer( child=Box( children=[TaskSubTasksEntry(self), self.tasks_list], orientation="vertical", ) ) # Task card self.main_box = Box( children=[self.task_row, self.info_bar, self.sub_tasks_revealer], orientation="vertical", hexpand=True, css_classes=["fade", "card", f'task-{self.get_prop("color")}'], ) self.set_child( Box( children=[self.top_drop_area, self.main_box], orientation="vertical", margin_start=12, margin_end=12, margin_bottom=6, margin_top=6, ) ) def get_parents_tree(self) -> list[Task]: """Get parent tasks chain""" parents: list[Task] = [] def _add(task: Task): if isinstance(task.parent, Task): parents.append(task.parent) _add(task.parent) _add(self) return parents def get_prop(self, prop: str) -> Any: res: Any = UserData.get_prop(self.list_uid, self.uid, prop) if prop in "deleted completed expanded trash": res = bool(res) return res def get_status(self) -> tuple[int, int]: """Get total tasks and completed tasks tuple""" total: int = 0 completed: int = 0 sub_tasks: list[Task] = self.tasks_list.get_sub_tasks() for task in sub_tasks: if task.get_reveal_child(): total += 1 if task.task_row.complete_btn.get_active(): completed += 1 return total, completed def delete(self, *_) -> None: """Move task to trash""" Log.info(f"Task: Move to trash: '{self.uid}'") self.toggle_visibility(False) self.update_props(["trash"], [True]) self.task_row.complete_btn.set_active(True) self.trash.trash_add(self) for task in self.tasks_list.get_sub_tasks(): if not task.get_prop("trash"): task.delete() self.parent.update_ui() def expand(self, expanded: bool) -> None: self.sub_tasks_revealer.set_reveal_child(expanded) self.update_props(["expanded"], [expanded]) if expanded: self.task_row.expand_btn.remove_css_class("rotate") self.task_row.expand_indicator.remove_css_class("expand-indicator-expanded") else: self.task_row.expand_btn.add_css_class("rotate") self.task_row.expand_indicator.add_css_class("expand-indicator-expanded") def purge(self) -> None: """Completely remove widget""" self.parent.tasks_list.remove(self) self.run_dispose() def toggle_visibility(self, on: bool) -> None: self.set_reveal_child(on) def update_props(self, props: list[str], values: list[Any]) -> None: UserData.update_props(self.list_uid, self.uid, props, values) def update_ui(self) -> None: # Change parent parent: str = self.get_prop("parent") uid: str = self.uid if isinstance(self.parent, Task) and self.parent.uid != parent: self.purge() if not parent: self.task_list.add_task(uid) return else: for task in self.task_list.get_all_tasks(): if task.uid == parent: task.add_task(uid) return # Change visibility self.toggle_visibility(not self.get_prop("trash")) self.task_row.update_ui() self.info_bar.update_ui() for task in self.tasks_list.get_sub_tasks(): task.update_ui() mrvladus-Errands-7b25a62/errands/widgets/task_list.py000066400000000000000000000354531456072341300227670ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from errands.lib.sync.sync import Sync from errands.widgets.components import Box from errands.widgets.details import Details from gi.repository import Adw, Gtk, GLib, GObject # type:ignore from errands.lib.animation import scroll from errands.lib.data import UserData from errands.lib.functions import get_children from errands.lib.logging import Log from errands.widgets.task import Task from errands.lib.gsettings import GSettings class TaskList(Adw.Bin): # State scrolling: bool = False # Is window scrolling def __init__(self, window, list_uid: str, parent): super().__init__() self.window = window self.list_uid = list_uid self.parent = parent self._build_ui() self.update_ui() def _build_ui(self) -> None: # Title self.title = Adw.WindowTitle( title=UserData.run_sql( f"SELECT name FROM lists WHERE uid = '{self.list_uid}'", fetch=True, )[0][0] ) # Toggle sidebar button self.left_toggle_sidebar_btn = Gtk.ToggleButton( icon_name="errands-sidebar-left-symbolic", tooltip_text=_("Toggle Sidebar"), ) toggle_ctrl = Gtk.ShortcutController(scope=1) toggle_ctrl.add_shortcut( Gtk.Shortcut( trigger=Gtk.ShortcutTrigger.parse_string("F9"), action=Gtk.ShortcutAction.parse_string("activate"), ) ) self.left_toggle_sidebar_btn.add_controller(toggle_ctrl) self.left_toggle_sidebar_bin = Adw.Bin(child=self.left_toggle_sidebar_btn) GSettings.bind("right-sidebar", self.left_toggle_sidebar_btn, "visible", True) self.right_toggle_sidebar_btn = Gtk.ToggleButton( icon_name="errands-sidebar-right-symbolic", tooltip_text=_("Toggle Sidebar"), ) self.right_toggle_sidebar_btn.bind_property( "active", self.left_toggle_sidebar_btn, "active", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) self.right_toggle_sidebar_bin = Adw.Bin(child=self.right_toggle_sidebar_btn) GSettings.bind("right-sidebar", self.right_toggle_sidebar_btn, "visible") # Delete completed button self.delete_completed_btn = Gtk.Button( valign="center", icon_name="edit-clear-all-symbolic", tooltip_text=_("Delete Completed Tasks"), sensitive=False, ) self.delete_completed_btn.connect( "clicked", self._on_delete_completed_btn_clicked ) # Scroll up btn self.scroll_up_btn = Gtk.Button( valign="center", icon_name="go-up-symbolic", tooltip_text=_("Scroll Up"), sensitive=False, ) self.scroll_up_btn.connect("clicked", lambda *_: scroll(self.scrl, False)) # Header Bar hb = Adw.HeaderBar(title_widget=self.title) hb.pack_start(self.left_toggle_sidebar_bin) hb.pack_start(self.delete_completed_btn) hb.pack_end(self.right_toggle_sidebar_bin) hb.pack_end(self.scroll_up_btn) # ---------- BOTTOMBAR ---------- # left_toggle_sidebar_btn = Gtk.ToggleButton( icon_name="errands-sidebar-left-symbolic", tooltip_text=_("Toggle Sidebar"), ) left_toggle_sidebar_btn.bind_property( "active", self.left_toggle_sidebar_btn, "active", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) GSettings.bind("right-sidebar", left_toggle_sidebar_btn, "visible", True) right_toggle_sidebar_btn = Gtk.ToggleButton( icon_name="errands-sidebar-right-symbolic", tooltip_text=_("Toggle Sidebar"), ) right_toggle_sidebar_btn.bind_property( "active", self.left_toggle_sidebar_btn, "active", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) GSettings.bind("right-sidebar", right_toggle_sidebar_btn, "visible") delete_completed_btn = Gtk.Button( valign="center", icon_name="edit-clear-all-symbolic", tooltip_text=_("Delete Completed Tasks"), sensitive=False, ) delete_completed_btn.bind_property( "sensitive", self.delete_completed_btn, "sensitive", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) delete_completed_btn.connect("clicked", self._on_delete_completed_btn_clicked) scroll_up_btn = Gtk.Button( valign="center", icon_name="go-up-symbolic", tooltip_text=_("Scroll Up"), sensitive=False, ) scroll_up_btn.bind_property( "sensitive", self.scroll_up_btn, "sensitive", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) scroll_up_btn.connect("clicked", lambda *_: scroll(self.scrl, False)) # ---------- TASKS LIST ---------- # # Srolled window adj = Gtk.Adjustment() adj.connect( "value-changed", lambda *_: self.scroll_up_btn.set_sensitive(adj.get_value() > 0), ) self.scrl = Gtk.ScrolledWindow( propagate_natural_height=True, propagate_natural_width=True, vadjustment=adj, ) self.dnd_ctrl = Gtk.DropControllerMotion() self.dnd_ctrl.connect("motion", self._on_dnd_scroll) self.scrl.add_controller(self.dnd_ctrl) # Tasks list self.tasks_list = Gtk.Box(orientation="vertical", hexpand=True, vexpand=True) self.tasks_list.add_css_class("tasks-list") self.scrl.set_child( Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=self.tasks_list, ) ) # Content box content_box = Box( children=[TaskListEntry(self), self.scrl], orientation="vertical", vexpand=True, ) content_box_click_ctrl = Gtk.GestureClick() content_box_click_ctrl.connect("released", self._on_empty_area_clicked) content_box.add_controller(content_box_click_ctrl) # Split View self.split_view = Adw.OverlaySplitView( min_sidebar_width=360, max_sidebar_width=400, sidebar_width_fraction=0.40, sidebar_position=int(GSettings.get("right-sidebar")), ) self.split_view.bind_property( "show-sidebar", self.left_toggle_sidebar_btn, "active", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) GSettings.bind("sidebar-open", self.split_view, "show-sidebar") # Details self.details = Details(self) self.split_view.set_sidebar(self.details) # Tasks list toolbar view self.tasks_toolbar_view = Adw.ToolbarView( content=content_box, reveal_bottom_bars=False, ) self.tasks_toolbar_view.add_top_bar(hb) self.tasks_toolbar_view.add_bottom_bar( Box( children=[ left_toggle_sidebar_btn, delete_completed_btn, Gtk.Separator(hexpand=True, css_classes=["spacer"]), scroll_up_btn, right_toggle_sidebar_btn, ], css_classes=["toolbar"], ) ) self.split_view.set_content(self.tasks_toolbar_view) # Breakpoints tasks_brb = Adw.BreakpointBin( width_request=360, height_request=360, child=self.split_view ) bp = Adw.Breakpoint.new(Adw.breakpoint_condition_parse("max-width: 720px")) bp.add_setter(self.split_view, "collapsed", True) tasks_brb.add_breakpoint(bp) bp1 = Adw.Breakpoint.new(Adw.breakpoint_condition_parse("max-width: 370px")) bp1.add_setter(self.split_view, "collapsed", True) bp1.add_setter(self.left_toggle_sidebar_bin, "visible", False) bp1.add_setter(self.right_toggle_sidebar_bin, "visible", False) bp1.add_setter(self.delete_completed_btn, "visible", False) bp1.add_setter(self.scroll_up_btn, "visible", False) bp1.add_setter(self.tasks_toolbar_view, "reveal-bottom-bars", True) tasks_brb.add_breakpoint(bp1) self.set_child(tasks_brb) def add_task(self, uid: str) -> None: new_task = Task(uid, self.list_uid, self.window, self, self, False) self.tasks_list.append(new_task) new_task.toggle_visibility(not new_task.get_prop("trash")) def get_all_tasks(self) -> list[Task]: """ Get list of all tasks widgets including sub-tasks """ tasks: list[Task] = [] for task in self.get_toplevel_tasks(): tasks.append(task) tasks.extend(task.tasks_list.get_all_sub_tasks()) return tasks def get_toplevel_tasks(self) -> list[Task]: return get_children(self.tasks_list) def update_status(self) -> None: """ Update status bar on the top """ tasks: list[Task] = self.get_toplevel_tasks() n_total: int = len([t for t in tasks if t.get_reveal_child()]) n_completed: int = len( [ t for t in tasks if t.task_row.complete_btn.get_active() and t.get_reveal_child() ] ) self.title.set_subtitle( _("Completed:") + f" {n_completed} / {n_total}" if n_total > 0 else "" ) self.delete_completed_btn.set_sensitive( len( [ t for t in self.get_all_tasks() if t.task_row.complete_btn.get_active() and t.get_reveal_child() ] ) > 0 ) def update_ui(self) -> None: Log.debug(f"Task list {self.list_uid}: Update UI") # Rename list self.title.set_title( UserData.run_sql( f"""SELECT name FROM lists WHERE uid = '{self.list_uid}'""", fetch=True, )[0][0] ) # Remove deleted tasks all_tasks: list[Task] = self.get_all_tasks() ids: list[str] = UserData.get_tasks_uids(self.list_uid) for task in all_tasks: if task.uid not in ids: task.purge() all_tasks.remove(task) # Create new tasks for task_dict in UserData.get_tasks_as_dicts(self.list_uid): if task_dict["uid"] not in [task.uid for task in self.get_all_tasks()]: # Add toplevel task and its sub-tasks if task_dict["parent"] == "": self.add_task(task_dict["uid"]) # Add sub-task and its sub-tasks else: for t in self.get_all_tasks(): if t.uid == task_dict["parent"]: t.tasks_list.add_sub_task(task_dict["uid"]) # Update details if ( self.details.parent and self.details.parent.uid in UserData.get_tasks_uids(self.list_uid) and not self.details.parent.get_prop("trash") ): self.details.update_info(self.details.parent) else: self.details.update_info(None) for task in self.get_toplevel_tasks(): task.update_ui() self.update_status() def _on_delete_completed_btn_clicked(self, _) -> None: """ Hide completed tasks and move them to trash """ Log.info("Delete completed tasks") for task in self.get_all_tasks(): if not task.get_prop("trash") and task.get_prop("completed"): task.delete() self.update_ui() def _on_dnd_scroll(self, _motion, _x, y: float) -> bool: """ Autoscroll while dragging task """ def _auto_scroll(scroll_up: bool) -> bool: """Scroll while drag is near the edge""" if not self.scrolling or not self.dnd_ctrl.contains_pointer(): return False adj: Gtk.Adjustment = self.scrl.get_vadjustment() adj.set_value(adj.get_value() - (2 if scroll_up else -2)) return True MARGIN: int = 50 if y < MARGIN: self.scrolling = True GLib.timeout_add(100, _auto_scroll, True) elif y > self.scrl.get_allocation().height - MARGIN: self.scrolling = True GLib.timeout_add(100, _auto_scroll, False) else: self.scrolling = False def _on_empty_area_clicked(self, _gesture, _n, x: float, y: float) -> None: """Close Details panel on click on empty space""" height = 0 for task in self.get_toplevel_tasks(): if task.get_child_revealed(): height = ( task.compute_bounds(self.tasks_toolbar_view.get_content()) .out_bounds.get_bottom_right() .y ) left_area_end: int = self.tasks_list.get_allocation().x right_area_start: int = left_area_end + self.tasks_list.get_width() on_sides: bool = x < left_area_end or x > right_area_start on_bottom: bool = y > height if on_sides or on_bottom: self.split_view.set_show_sidebar(False) class TaskListEntry(Adw.Bin): def __init__(self, task_list: TaskList) -> None: super().__init__() self.task_list = task_list self._build_ui() def _build_ui(self): # Entry entry = Adw.EntryRow( activatable=False, height_request=60, title=_("Add new Task"), ) entry.connect("entry-activated", self._on_task_added) # Box box = Gtk.ListBox( css_classes=["boxed-list"], selection_mode=Gtk.SelectionMode.NONE, margin_top=12, margin_bottom=12, margin_start=12, margin_end=12, ) box.append(entry) # Clamp self.set_child( Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=box, ) ) def _on_task_added(self, entry: Adw.EntryRow): text: str = entry.props.text if text.strip(" \n\t") == "": return self.task_list.add_task( UserData.add_task(list_uid=self.task_list.list_uid, text=text) ) entry.props.text = "" scroll(self.task_list.scrl, True) Sync.sync() mrvladus-Errands-7b25a62/errands/widgets/trash.py000066400000000000000000000162411456072341300221050ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from errands.widgets.task_list import TaskList if TYPE_CHECKING: from errands.widgets.window import Window from errands.lib.data import UserData from errands.lib.functions import get_children from errands.widgets.components import Box, Button from gi.repository import Adw, Gtk, GObject # type:ignore from errands.widgets.task import Task from errands.lib.sync.sync import Sync from errands.lib.logging import Log class Trash(Adw.Bin): def __init__(self, window: Window): super().__init__() self.window: Window = window self.stack: Adw.ViewStack = window.stack self._build_ui() self.update_status() def _build_ui(self) -> None: # Headerbar hb: Adw.HeaderBar = Adw.HeaderBar( title_widget=Adw.WindowTitle(title=_("Trash")) ) # Clear button clear_btn = Button( icon_name="errands-trash-symbolic", on_click=self.on_trash_clear, valign="center", tooltip_text=_("Clear"), ) hb.pack_start(clear_btn) # Restore button restore_btn = Button( icon_name="edit-redo-symbolic", on_click=self.on_trash_restore, valign="center", tooltip_text=_("Restore All"), ) hb.pack_end(restore_btn) # Status self.status = Adw.StatusPage( icon_name="errands-trash-symbolic", title=_("Empty Trash"), description=_("No deleted items"), vexpand=True, ) self.status.add_css_class("compact") # Trash list self.trash_list = Gtk.Box( orientation="vertical", margin_top=12, margin_bottom=12, margin_start=12, margin_end=12, spacing=12, css_classes=["boxed-list"], vexpand=False, ) scrl = Gtk.ScrolledWindow( child=Adw.Clamp( child=self.trash_list, maximum_size=850, tightening_threshold=300, ), visible=False, propagate_natural_height=True, ) scrl.bind_property( "visible", self.status, "visible", GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.BIDIRECTIONAL, ) scrl.bind_property( "visible", clear_btn, "visible", GObject.BindingFlags.SYNC_CREATE ) scrl.bind_property( "visible", restore_btn, "visible", GObject.BindingFlags.SYNC_CREATE ) # Toolbar View toolbar_view = Adw.ToolbarView( content=Box(children=[self.status, scrl], orientation="vertical") ) toolbar_view.add_top_bar(hb) self.set_child(toolbar_view) def trash_add(self, task_widget) -> None: self.trash_list.append(TrashItem(task_widget, self)) self.status.set_visible(False) def update_status(self) -> None: self.status.set_visible(len([t for t in get_children(self.trash_list)]) == 0) def on_trash_clear(self, btn) -> None: def _confirm(_, res) -> None: if res == "cancel": Log.debug("Clear Trash cancelled") return Log.info("Trash: Clear") UserData.run_sql( f"""UPDATE tasks SET deleted = 1 WHERE trash = 1""", ) # Remove tasks for row in get_children(self.trash_list): row.task_widget.purge() self.trash_list.remove(row) self.status.set_visible(True) self.update_status() # Sync Sync.sync() Log.debug("Trash: Show confirm dialog") dialog = Adw.MessageDialog( transient_for=self.window, hide_on_close=True, heading=_("Are you sure?"), body=_("Tasks will be permanently deleted"), default_response="delete", close_response="cancel", ) dialog.add_response("cancel", _("Cancel")) dialog.add_response("delete", _("Delete")) dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE) dialog.connect("response", _confirm) dialog.show() def on_trash_restore(self, _) -> None: """ Remove trash items and restore all tasks """ Log.info("Trash: Restore") # Get all tasks tasks: list[Task] = [] task_lists: list[TaskList] = [] pages = self.stack.get_pages() for i in range(pages.get_n_items()): child = pages.get_item(i).get_child() if hasattr(child, "get_all_tasks"): task_lists.append(child) tasks.extend(child.get_all_tasks()) for task in tasks: task.update_props(["trash"], [False]) self.window.sidebar.task_lists.update_ui() for row in get_children(self.trash_list): self.trash_list.remove(row) self.update_status() class TrashItem(Adw.Bin): def __init__(self, task_widget: Task, trash: Trash) -> None: super().__init__() self.task_widget: Task = task_widget self.uid: str = task_widget.uid self.trash: Trash = trash self.trash_list: Gtk.Box = trash.trash_list self._build_ui() def _build_ui(self) -> None: self.add_css_class("card") row: Adw.ActionRow = Adw.ActionRow( title=self.task_widget.get_prop("text"), css_classes=["rounded-corners"], height_request=60, title_selectable=True, ) self.task_widget.task_row.connect( "notify::title", lambda *_: row.set_title(self.task_widget.get_prop("text")) ) self.task_widget.task_list.title.bind_property( "title", row, "subtitle", GObject.BindingFlags.SYNC_CREATE, ) row.add_suffix( Button( icon_name="emblem-ok-symbolic", on_click=self.on_restore, tooltip_text=_("Restore"), valign="center", css_classes=["flat", "circular"], ) ) box: Gtk.ListBox = Gtk.ListBox( selection_mode=0, css_classes=["rounded-corners"], accessible_role=Gtk.AccessibleRole.PRESENTATION, ) box.append(row) self.set_child(box) def on_restore(self, _) -> None: """Restore task and its parents""" Log.info(f"Restore task: {self.uid}") tasks: list[Task] = [] tasks.append(self.task_widget) tasks.extend(self.task_widget.get_parents_tree()) for task in tasks: task.update_props(["trash"], [False]) tasks_uids: list[str] = [t.uid for t in tasks] for item in get_children(self.trash_list): if item.uid in tasks_uids: self.trash_list.remove(item) self.task_widget.task_list.update_ui() self.trash.update_status() mrvladus-Errands-7b25a62/errands/widgets/window.py000066400000000000000000000220671456072341300222760ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from __main__ import VERSION, APP_ID from uuid import uuid4 from icalendar import Calendar from errands.lib.data import UserData from errands.widgets.components import Box, Button from errands.widgets.secret_notes import SecretNotesWindow from errands.widgets.trash import Trash from gi.repository import Gio, Adw, Gtk # type:ignore from errands.widgets.sidebar import Sidebar from errands.widgets.preferences import PreferencesWindow from errands.lib.sync.sync import Sync from errands.lib.gsettings import GSettings from errands.lib.logging import Log WINDOW: Window = None class Window(Adw.ApplicationWindow): about_window: Adw.AboutWindow = None secret_notes: SecretNotesWindow = None def __init__(self, **kwargs) -> None: super().__init__(**kwargs) global WINDOW WINDOW = self self._create_actions() self._build_ui() self.present() # Setup sync Sync.window = self Sync.sync() def _build_ui(self): self.set_title(_("Errands")) self.props.width_request = 360 self.props.height_request = 200 # Remember window state GSettings.bind("width", self, "default_width") GSettings.bind("height", self, "default_height") GSettings.bind("maximized", self, "maximized") # Setup theme Adw.StyleManager.get_default().set_color_scheme(GSettings.get("theme")) # Split View self.split_view = Adw.NavigationSplitView( max_sidebar_width=300, min_sidebar_width=240, show_content=True, sidebar_width_fraction=0.25, ) # Stack self.stack = Adw.ViewStack() # Trash self.trash = Trash(self) self.stack.add_titled(self.trash, name="trash", title=_("Trash")) # Status page Toolbar View status_toolbar_view = Adw.ToolbarView( content=Box( children=[ Adw.StatusPage(title=_("No Task Lists"), icon_name=APP_ID), Button( label=_("Create List"), on_click=lambda *_: self.sidebar.header_bar.add_list_btn.activate(), halign="center", css_classes=["pill", "suggested-action"], ), ], orientation="vertical", vexpand=True, valign="center", ) ) status_toolbar_view.add_top_bar(Adw.HeaderBar(show_title=False)) self.stack.add_titled( child=status_toolbar_view, name="status", title=_("No Task Lists"), ) self.stack.set_visible_child_name("status") # Lists self.sidebar = Sidebar(self) self.split_view.set_sidebar(Adw.NavigationPage.new(self.sidebar, _("Lists"))) self.split_view.set_content(Adw.NavigationPage.new(self.stack, _("Tasks"))) # Toast overlay self.toast_overlay = Adw.ToastOverlay(child=self.split_view) # Breakpoints bp = Adw.Breakpoint.new(Adw.breakpoint_condition_parse("max-width: 980px")) bp.add_setter(self.split_view, "collapsed", True) bp.add_setter(self.split_view, "show-content", True) self.add_breakpoint(bp) self.set_content(self.toast_overlay) def add_toast(self, text: str) -> None: self.toast_overlay.add_toast(Adw.Toast.new(title=text)) def _create_actions(self) -> None: """ Create actions for main menu """ Log.debug("Creating actions") def _create_action(name: str, callback: callable, shortcuts=None) -> None: action: Gio.SimpleAction = Gio.SimpleAction.new(name, None) action.connect("activate", callback) if shortcuts: self.props.application.set_accels_for_action(f"app.{name}", shortcuts) self.props.application.add_action(action) def _about(*args) -> None: """ Show about window """ if not self.about_window: self.about_window = Adw.AboutWindow( transient_for=self, version=VERSION, application_icon=APP_ID, application_name=_("Errands"), copyright="© 2023 Vlad Krupinskii", website="https://github.com/mrvladus/Errands", issue_url="https://github.com/mrvladus/Errands/issues", license_type=Gtk.License.MIT_X11, translator_credits=_("translator-credits"), modal=True, hide_on_close=True, ) self.about_window.present() def _sync(*args): Sync.sync() if GSettings.get("sync-provider") == 0: self.add_toast(_("Sync is disabled")) def _import(*args) -> None: def _confirm(dialog: Gtk.FileDialog, res) -> None: try: file: Gio.File = dialog.open_finish(res) except: Log.debug("Lists: Import cancelled") return with open(file.get_path(), "r") as f: calendar: Calendar = Calendar.from_ical(f.read()) # List name name = calendar.get( "X-WR-CALNAME", file.get_basename().rstrip(".ics") ) if name in [ i[0] for i in UserData.run_sql("SELECT name FROM lists", fetch=True) ]: name = f"{name}_{uuid4()}" # Create list uid: str = UserData.add_list(name) # Add tasks for todo in calendar.walk("VTODO"): # Tags if (tags := todo.get("CATEGORIES", "")) != "": tags = ",".join( [ i.to_ical().decode("utf-8") for i in ( tags if isinstance(tags, list) else tags.cats ) ] ) # Start if (start := todo.get("DTSTART", "")) != "": start = ( todo.get("DTSTART", "") .to_ical() .decode("utf-8") .strip("Z") ) else: start = "" # End if (end := todo.get("DUE", todo.get("DTEND", ""))) != "": end = ( todo.get("DUE", todo.get("DTEND", "")) .to_ical() .decode("utf-8") .strip("Z") ) else: end = "" UserData.add_task( color=todo.get("X-ERRANDS-COLOR", ""), completed=str(todo.get("STATUS", "")) == "COMPLETED", end_date=end, list_uid=uid, notes=str(todo.get("DESCRIPTION", "")), parent=str(todo.get("RELATED-TO", "")), percent_complete=int(todo.get("PERCENT-COMPLETE", 0)), priority=int(todo.get("PRIORITY", 0)), start_date=start, tags=tags, text=str(todo.get("SUMMARY", "")), uid=todo.get("UID", None), ) self.sidebar.task_lists.update_ui() self.add_toast(_("Imported")) Sync.sync() filter = Gtk.FileFilter() filter.add_pattern("*.ics") dialog = Gtk.FileDialog(default_filter=filter) dialog.open(self, None, _confirm) def _secret_notes(*args): if not self.secret_notes: self.secret_notes: SecretNotesWindow = SecretNotesWindow(self) self.secret_notes.present() else: self.secret_notes.present() _create_action( "preferences", lambda *_: PreferencesWindow(self).show(), ["comma"], ) _create_action("about", _about) _create_action("import", _import) _create_action("secret_notes", _secret_notes) _create_action("sync", _sync, ["f"]) _create_action( "quit", lambda *_: self.props.application.quit(), ["q", "w"], ) mrvladus-Errands-7b25a62/io.github.mrvladus.List.Devel.json000066400000000000000000000033041456072341300236710ustar00rootroot00000000000000{ "id": "io.github.mrvladus.List.Devel", "runtime": "org.gnome.Platform", "runtime-version": "45", "sdk": "org.gnome.Sdk", "command": "errands", "finish-args": [ "--device=dri", "--socket=wayland", "--socket=fallback-x11", "--share=ipc", "--share=network", "--talk-name=org.freedesktop.secrets", "--talk-name=org.gnome.OnlineAccounts" ], "cleanup": [ "/lib/debug", "/include", "/lib/pkgconfig", "/man", "/share/aclocal", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "/share/vala", "*.la", "*.a" ], "modules": [ { "name": "gnome-online-accounts", "buildsystem": "meson", "config-opts": [ "-Dgoabackend=false", "-Dexchange=false", "-Dgoogle=false", "-Dimap_smtp=false", "-Dwebdav=false", "-Dkerberos=false", "-Dwindows_live=false", "-Dvapi=false" ], "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/gnome-online-accounts.git", "branch": "master" } ] }, "build-aux/python3-modules.json", { "name": "errands", "buildsystem": "meson", "config-opts": [ "-Dprofile=development" ], "sources": [ { "type": "dir", "path": "." } ] } ] }mrvladus-Errands-7b25a62/meson.build000066400000000000000000000024231456072341300174450ustar00rootroot00000000000000project( 'errands', version: '45.1.8', meson_version: '>= 0.62.0', ) dependency('libadwaita-1', version: '>= 1.4') dependency('libsecret-1') dependency('gtksourceview-5') dependency('pygobject-3.0') dependency('goa-1.0', required: false) i18n = import('i18n') gnome = import('gnome') python = import('python') pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) moduledir = join_paths(pkgdatadir, 'errands') profile = get_option('profile') if profile == 'development' app_id = 'io.github.mrvladus.List.Devel' prefix = '/io/github/mrvladus/List/Devel' elif profile == 'release' app_id = 'io.github.mrvladus.List' prefix = '/io/github/mrvladus/List' endif conf = configuration_data() conf.set('PYTHON', python.find_installation('python3').full_path()) conf.set('PYTHON_VERSION', python.find_installation('python3').language_version()) conf.set('APP_ID', app_id) conf.set('PREFIX', prefix) conf.set('VERSION', meson.project_version()) conf.set('PROFILE', profile) conf.set('localedir', join_paths(get_option('prefix'), get_option('localedir'))) conf.set('pkgdatadir', pkgdatadir) subdir('data') subdir('errands') subdir('po') gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) mrvladus-Errands-7b25a62/meson_options.txt000066400000000000000000000001561456072341300207410ustar00rootroot00000000000000option( 'profile', type: 'combo', choices: [ 'release', 'development', ], value: 'release' )mrvladus-Errands-7b25a62/po/000077500000000000000000000000001456072341300157205ustar00rootroot00000000000000mrvladus-Errands-7b25a62/po/LINGUAS000066400000000000000000000001161456072341300167430ustar00rootroot00000000000000ca cs da_DK de es eu fa fr hr hu it ja nl oc pl pt_BR ru tr uk zh_CN zh_TW el mrvladus-Errands-7b25a62/po/POTFILES000066400000000000000000000007721456072341300170760ustar00rootroot00000000000000# .py errands/widgets/components.py errands/widgets/preferences.py errands/widgets/sidebar.py errands/widgets/task_list.py errands/widgets/details.py errands/widgets/task.py errands/widgets/trash.py errands/widgets/window.py errands/lib/sync/sync.py errands/lib/sync/providers/caldav.py errands/lib/sync/providers/nextcloud.py errands/lib/sync/providers/todoist.py # .ui data/resources/gtk/help-overlay.ui # Data data/io.github.mrvladus.List.desktop.in.in data/io.github.mrvladus.List.metainfo.xml.in.in mrvladus-Errands-7b25a62/po/ca.po000066400000000000000000000327261456072341300166550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the list package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-11-13 12:44+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Buida la paperera" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tema de l'aplicació" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Clar" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Fosc" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Tasques" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Afegeix una subtasca" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Completat:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronització" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Inhabilitat" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Proveïdor de sincornització" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Enllaç del servidor" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Usuari" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Contrasenya" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Prova" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Comprovar la connexió" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Clar" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Tasques" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "Importar tasques" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Sincronitzar/Recuperar les Tasques" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferències" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Quan a Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Cancel·la" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "Afegir una tasca nova" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "N'estàs segur?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "Les tasques s'esborraran definitivament" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Suprimeix" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "Tasques exportades" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "Tasques exportades" #: errands/widgets/sidebar.py:477 #, fuzzy msgid "Rename" msgstr "Usuari" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "Exportar tasques" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menú" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "Tanca la paperera" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "Commuta la barra lateral" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "Suprimeix les tasques completades" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Llisca cap amunt" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Completat:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Afegir una tasca nova" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "Neteja l'estil" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "Còpia" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "Completat:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "Afegir una tasca nova" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copiat al portaretalls" # Trobo que "Marca com a feta" es més breu que no pas "Marca com a completada" i és fa més agradable de llegir. #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Marca com a feta" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Afegeix una subtasca" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Restableix tot" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Paperera buida" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Cap tasca eliminada" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Les tasques s'esborraran definitivament" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Restableix" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Importar tasques" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" "cubells \n" "arnau ferreres " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "Tasques importades" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "No s'han proporcionat totes les credencials de sincronització. Si us plau, " "comprovi la configuració." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "No es pot establir la connexió amb el servidor CalDAV a:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostra les dreceres de teclat" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Surt" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Commuta la barra lateral" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Gestiona les teves tasques" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "" "Aplicació de gestió de tasques per a aquells que prefereixen la simplicitat." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Característiques:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Afegeix, esborra, edita tasques i subtasques" # Potser "Marca com a feta" no es una mala opció. -arnau #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Marca com a completades tasques i subtasques" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Afegeix un accent de color per a cada tasca" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sincronitza les tasques amb Nexcloud o altres proveïdors CalDAV" # Tot i que la traducció literal és "Suport per arrosegar i deixar anar"; "Suport Drag and Drop" és una versió més curta i trobo que és igual d'entenedora. #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Suport Drag and Drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "Importar tasques" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Commuta la barra lateral" #, fuzzy #~ msgid "End" #~ msgstr "Tasques" #~ msgid "Export Cancelled" #~ msgstr "Exportació cancel·lada" #~ msgid "Error" #~ msgstr "Error" #~ msgid "Import Cancelled" #~ msgstr "Importació cancel·lada" #~ msgid "Invalid File" #~ msgstr "Fitxer no vàlid" #~ msgid "Deleted Tasks" #~ msgstr "Tasques esborrades" #~ msgid "Move to Trash" #~ msgstr "Moure a la paperera" #~ msgid "Show Deleted Tasks" #~ msgstr "Mostra les tasques esborrades" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Suprimeix les tasques completades (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Sincronitzar/Recuperar Tasques (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Exportar tasques..." #~ msgid "Import Tasks..." #~ msgstr "Importar tasques..." #~ msgid "Import and Export" #~ msgstr "Importar i exportar" #~ msgid "Exit edit mode" #~ msgstr "Surt del mode d'edició" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Expandir subtasques en iniciar" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Nom del calendari (\"Tasques\" per defecte)." #~ msgid "Token" #~ msgstr "Token" #~ msgid "Edit" #~ msgstr "Edita" #~ msgid "Cancel (Escape)" #~ msgstr "Cancel·la" mrvladus-Errands-7b25a62/po/cs.po000066400000000000000000000322031456072341300166650ustar00rootroot00000000000000# Czech translation for List. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the list package. # Amerey.eu , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-10-25 09:09+0200\n" "Last-Translator: Amerey.eu \n" "Language-Team: \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Zrušit zvýraznění" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Motiv aplikace" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Systém" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Světlý" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Tmavý" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Úkoly" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Přidat nový podúkol" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Dokončeno:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronizace" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Zakázáno" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Poskytovatel synchronizace" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Adresa URL serveru" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Uživatelské jméno" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Heslo" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Test připojení" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Světlý" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Pochůzky" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "Importovat úkoly" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Úlohy synchronizace/načítání" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Předvolby" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "O aplikaci Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Hlavní menu" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Zrušit" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "Přidat nový úkol" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Doopravdy?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "Úkoly budou trvale smazány" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Smazat" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "Úkoly byly exportovány" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "Úkoly byly exportovány" #: errands/widgets/sidebar.py:477 #, fuzzy msgid "Rename" msgstr "Uživatelské jméno" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "Exportovat úkoly" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "Zavřít Koš" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "Přepnout postranní panel" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "Smazat hotové úkoly" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Posunout nahoru" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Dokončeno:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Přidat nový úkol" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "Zrušit zvýraznění" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "Kopírovat" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "Dokončeno:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "Přidat nový úkol" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Zkopírováno do schránky" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Označit jako dokončené" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Přidat nový podúkol" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Obnovit vše" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Vyprázdnit koš" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Žádné smazané položky" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Úkoly budou trvale smazány" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Obnovit" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Importovat úkoly" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Amerey.eu" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "Úkoly byly importovány" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Nebyly poskytnuty všechny přihlašovací údaje pro synchronizaci. Zkontrolujte " "prosím nastavení." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Nelze se připojit k serveru CalDAV na adrese:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Obecné" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Zobrazit klávesové zkratky" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Ukončit" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Přepnout postranní panel" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Spravujte své úkoly" #: data/io.github.mrvladus.List.desktop.in.in:10 #, fuzzy msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;tasks;list;todo;todos;úkoly;seznam;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Aplikace pro ty, kteří preferují jednoduchost." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Funkce:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Přidávat, odebírat, upravovat úkoly a podúkoly" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Označit úkol a podúkoly jako dokončené" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Přidání zvýrazňující barvy pro každý úkol" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Synchronizace úloh s Nextcloud nebo jinými poskytovateli CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Podpora drag and drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "Importovat úkoly" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Přepnout postranní panel" #, fuzzy #~ msgid "End" #~ msgstr "Pochůzky" #~ msgid "Export Cancelled" #~ msgstr "Export byl zrušen" #~ msgid "Error" #~ msgstr "Chyba" #~ msgid "Import Cancelled" #~ msgstr "Import byl zrušen" #~ msgid "Invalid File" #~ msgstr "Neplatný soubor" #~ msgid "Deleted Tasks" #~ msgstr "Smazané úkoly" #~ msgid "Move to Trash" #~ msgstr "Přesunout do koše" #~ msgid "Show Deleted Tasks" #~ msgstr "Zobrazit smazané úkoly" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Smazat hotové úkoly (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Úlohy synchronizace/načítání (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Exportovat úkoly..." #~ msgid "Import Tasks..." #~ msgstr "Importovat úkoly..." #~ msgid "Import and Export" #~ msgstr "Importovat a exportovat" #~ msgid "Exit edit mode" #~ msgstr "Opustit režim úprav" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Rozbalit podúkoly při spuštění" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Název kalendáře (ve výchozím nastavení „Pochůzky“)" #~ msgid "Token" #~ msgstr "Token" #~ msgid "Edit" #~ msgstr "Editovat" #~ msgid "Cancel (Escape)" #~ msgstr "Zrušit (ESC)" mrvladus-Errands-7b25a62/po/da_DK.po000066400000000000000000000302461456072341300172270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-06 14:35+0100\n" "Last-Translator: Peter Normann \n" "Language-Team: \n" "Language: da_DK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "I dag" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "I morgen" #: errands/widgets/components.py:167 msgid "Now" msgstr "Nu" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Ryd" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Ikke angivet" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Farvetema" #: errands/widgets/preferences.py:39 msgid "System" msgstr "System" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Lyst" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Mørkt" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "" #: errands/widgets/preferences.py:83 #, fuzzy msgid "Click Action" msgstr "Tryk på \"+\" knappen" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Tilføj ny under-opgave" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Afsluttet %" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synkronisér" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Deaktiveret" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Synkroniseringsvært" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Server URL" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Brugernavn" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Kodeord" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Test forbindelse" #: errands/widgets/preferences.py:171 #, fuzzy msgid "Details Panel" msgstr "Ingen oplysninger" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Lyst" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Forbundet" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Kan ikke tilslutte" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importér liste" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Tilføj liste" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Flere valg" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Hent og synkronisér opgaver" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Indstillinger" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Tastaturgenveje" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Om Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Hovedmenu" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nyt listenavn" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Tilføj liste" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Fortryd" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Tilføj" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Tilføj ny liste" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Tryk på \"+\" knappen" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Er du sikker?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Listen vil blive slettet permanent" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Slet" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nyt navn" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Omdøb liste" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Gem" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Eksporting mislykkedes" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Eksporteret" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Omdøb" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Eksportér" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Papirkurv" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Skift sidebar" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Slet afsluttede opgaver" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Rul op" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Afsluttet:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Tilføj ny opgave" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Ingen oplysninger" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Klik på opgave for at se flere detaljer" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Ryd formattering" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Tekst" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Kopier tekst" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Noter" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Egenskaber" #: errands/widgets/details.py:176 msgid "Start" msgstr "Start" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Angiv dato" #: errands/widgets/details.py:197 msgid "Due" msgstr "Slutdato" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Afsluttet %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioritet" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Mærkat" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Tilføj Mærkat" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Gem opgave som .ics fil" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Kopieret til udklipsholder" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Markér som afsluttet" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Fold ud / Fold ind" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 #, fuzzy msgid "Details" msgstr "Ingen oplysninger" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Tilføj ny under-opgave" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Genskab alle" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Tøm papirkurv" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Ingen slettede elementer" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Opgaver vil blive slettet permanent" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Genskab" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Ingen opgavelister" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Opret liste" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Tilføj liste" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "oversættelses-akkrediteringer" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Synkronisering er slået fra" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importeret" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Ikke alle synkroniseringsoplysninger er angivet. Tjek dine indstillinger." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Kan ikke få en forbindelse til følgende CalDAV vært:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Generel" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Vis tastaturgenveje" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Afslut" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Ingen oplysninger" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Hav styr på dine opgaver" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Huskeliste til dem, der foretrækker det enkelt og nemt." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Features:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Understøtter flere opgavelister" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Tilføj, fjern og redigér opgaver og under-opgaver" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Markér opgave og under-opgave som afsluttet" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Tilføj accentfarve til hver opgave" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Synkronisér opgaver med Nextcloud eller andre CalDAV kilder" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Understøtter Træk og Slip" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importér .ics filer" #~ msgid "Create" #~ msgstr "Opret" #~ msgid "Load" #~ msgstr "Hent" #~ msgid "Click for Details" #~ msgstr "Klik for detaljer" #~ msgid "Toggle sidebar" #~ msgstr "Skift sidebar" mrvladus-Errands-7b25a62/po/de.po000066400000000000000000000317721456072341300166620ustar00rootroot00000000000000# German translation for Errands. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # Christoph Bähr # Philipp Kiemle , 2023. # Milo Ivir , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-18 15:44+0100\n" "Last-Translator: Philipp Kiemle \n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Heute" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Morgen" #: errands/widgets/components.py:167 msgid "Now" msgstr "Jetzt" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Leeren" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Nicht gesetzt" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Anwendungsthema" #: errands/widgets/preferences.py:39 msgid "System" msgstr "System" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Hell" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Dunkel" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Aufgaben" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Klick-Aktion" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Details-Panel öffnen" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Unteraufgaben anzeigen" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Abgeschlossen %" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronisierung" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Deaktiviert" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Synchronisierungsanbieter" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Serveradresse" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Benutzername" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Passwort" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Überprüfen" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Verbindung überprüfen" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Details-Panel" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Position" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Links" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Rechts" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Erscheinungsbild" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Verbunden" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Herstellen einer Verbindung fehlgeschlagen" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Liste importieren" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Liste hinzufügen" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Mehr Optionen" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Aufgaben synchronisieren/holen" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Einstellungen" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Tastenkürzel" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Info zu Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Hauptmenü" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Synchronisierung läuft …" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Name der neuen Liste" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Liste hinzufügen" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Abbrechen" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Hinzufügen" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Neue Liste hinzufügen" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Den »+«-Knopf drücken" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Sind Sie sicher?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Die Liste wird un­wi­der­ruf­lich gelöscht" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Löschen" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Neuer Name" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Liste umbenennen" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Speichern" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Export fehlgeschlagen" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Exportiert" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Umbenennen" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exportieren" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menü" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Papierkorb" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Seitenleiste ein-/ausblenden" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Abgeschlossene Aufgaben löschen" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Nach oben scrollen" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Abgeschlossen:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Neue Aufgabe hinzufügen" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Keine Details" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Klicken Sie auf die Aufgabe, um weitere Informationen anzuzeigen" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Stil entfernen" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Text" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Text kopieren" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Anmerkungen" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Eigenschaften" #: errands/widgets/details.py:176 msgid "Start" msgstr "Start" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Datum wählen" #: errands/widgets/details.py:197 msgid "Due" msgstr "Fällig" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Abgeschlossen %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Priorität" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Schlagworte" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Schlagwort hinzufügen" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Aufgabe als .ics-Datei speichern" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "In Zwischenablage kopiert" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Als abgeschlossen markieren" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Aufklappen / Zuklappen" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Details" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Neue Unteraufgabe hinzufügen" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Alles wiederherstellen" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Papierkorb leeren" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Keine gelöschten Aufgaben" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Aufgaben werden un­wi­der­ruf­lich gelöscht" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Wiederherstellen" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Keine Aufgabenlisten" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Liste erstellen" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Liste hinzufügen" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" "Christoph Bähr\n" "Philipp Kiemle \n" "Milo Ivir " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Synchronisation ist deaktiviert" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importiert" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Einige Synchonisations-Zugangsdaten fehlen. Bitte überprüfen Sie die " "Einstellungen." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Verbindung folgendem CalDAV-Server kann nicht hergestellt werden:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Allgemein" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Tastenkürzel anzeigen" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Beenden" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Details umschalten" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Verwalten Sie Ihre Aufgaben" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;tasks;list;todo;todos;Erledigungen;Aufgaben;Listen;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Aufgaben-Anwendung für Menschen die Einfachheit schätzen." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Funktionen:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Unterstützung für mehrerer Aufgabenlisten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Aufgaben und Unteraufgaben hinzufügen, entfernen und bearbeiten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Aufgaben und Unteraufgaben als abgeschlossen markieren" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Akzentfarbe für jede Aufgabe hinzufügen" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Aufgaben mit Nextcloud oder anderen CalDAV-Anbietern synchronisieren" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Drag-and-Drop-Unterstützung" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr ".ics Dateien importieren" #~ msgid "Save changed details" #~ msgstr "Geänderte Details speichern" #~ msgid "Save (Ctrl+S)" #~ msgstr "Speichern (Strg+S)" #~ msgid "Create" #~ msgstr "Erstellen" #~ msgid "Load" #~ msgstr "Laden" #~ msgid "Click for Details" #~ msgstr "Für Details klicken" #~ msgid "Toggle sidebar" #~ msgstr "Seitenleiste ein-/ausblenden" #~ msgid "End" #~ msgstr "Ende" mrvladus-Errands-7b25a62/po/el.po000066400000000000000000000342051456072341300166640ustar00rootroot00000000000000# For the people that want it in greek for some reason like why would you do that are you some kind of du- # Copyright (C) 2024 itsnotAZ # This file is distributed under the same license as the errands package. # itsnotAZ, 2024. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-28 13:51+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Σήμερα" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Αύριο" #: errands/widgets/components.py:167 msgid "Now" msgstr "Τώρα" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Εκκαθάριση" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Μη Ρυθμισμένο" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Θέμα Εφαρμογής" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Σύστημα" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Φωτεινό" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Σκοτεινό" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Δουλείες" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Δράση Κλικ" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Άνοιγμα Πίνακα Λεπομερειών" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Εμφάνιση Υπο-Δουλειών" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Ολοκληρωμένο Μέγεθος Κουμπιού" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Μικρό" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Μεγάλο" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Συγχρονισμός" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Απενεργοποιημένο" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Παροχέας Συγχρονισμού" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL Σέρβερ" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Όνομα Χρήστη" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Συνθηματικό" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Δοκιμή" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Δοκιμή Σύνδεσης" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Πίνακας Λεπτομερειών" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Θέση" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Αριστερά" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Δεξιά" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Εμφάνιση" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Συνδεδεμένο" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Αδυναμία Σύνδεσης" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Εrrands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Εισαγωγή Λίστας" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Προσθήκη Λίστας (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Περισσότερες Επιλογές" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Συγχρονισμός/ Εύρεση Δουλειών" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Προτιμήσεις" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Συντομεύσεις Πληκτρολογίου" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Περί Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Κεντρικό Μενού" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Συγχρονισμός..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Όνομα Νέας Λίστας" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Προσθήκη Λίστας" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Ακύρωση" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Προσθήκη" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Προσθήκη νέας Λίστας" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Πατήστε το κουμπί \"+\"" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Είστε σίγουροι;" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Η Λίστα θα διαγραφεί διαπαντός" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Διαγραφή" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Νέο Όνομα" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Μετονομασία Λίστας" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Αποθήκευση" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Εξαγωγή απέτυχε" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Εξαγωγή ολοκληρώθηκε" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Μετονομασία" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Εξαγωγή" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Μενού" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Απορρίμματα" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Εναλλαγή Πλευρικής Εργαλειοθήκης" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Διαγραφή Ολοκληρωμένων Δουλειών" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Κύλιση προς τ' απάνω" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Ολοκληρωμένα:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Προσθήκη νέας Δουλειάς" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Χωρίς Λεπτομέρειες" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Κάντε κλικ πάνω στην Δουλεία για περισσότερες πληροφορίες" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Καθαρό Στυλ" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Κείμενο" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Αντιγραφή Κειμένου" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Σημειώσεις" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Ιδιότητες" #: errands/widgets/details.py:176 msgid "Start" msgstr "Αρχή" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Ρύθμιση Ημερομηνίας" #: errands/widgets/details.py:197 msgid "Due" msgstr "Τέλος" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Ολοκλήρωση %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Προτεραιότητα" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Ετικέτες" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Προσθήκη Ετικέτας" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Αποθήκευση ως αρχείο .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Αντιγράφηκε στο Πρόχειρο" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Σημείωση ως Ολοκληρωμένο" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Ανάπτυξη / Δίπλωμα" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Λεπτομέρειες" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Προσθήκη νέας υπο-δουλειάς" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Επαναφορά όλων" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Άδειασμα Απορριμάτων" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Δεν υπάρχουν διαγραμμένα αντικείμενα" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Οι δουλειές θα διαγραφούν διαπαντός" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Επαναφορά" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Δεν υπάρχουν λίστες" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Δημιουργία Λίστας" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Λίστες" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "itsnotAZ" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Ο Συγχρονισμός είναι απενεργοποιημένος" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Εισαγωγές" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Λείπουν στοιχεία για τον συγχρονισμό. Παρακαλώ ελέγξτε τις ρυθμίσεις." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Αδυναμία σύνδεσης σε σέρβερ CalDAV στο:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Γενικά" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Προβολή συντομεύσεων πληκτρολογίου" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Έξοδος" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Εναλλαγή Λεπτομερειών" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Διαχειριστείτε τις δουλειές σας" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Εφαρμογή to-do για εκείνους που προτιμούν την απλότητα." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Χαρακτηριστικά:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Υποστήριξη για πολλαπλές λίστες από δουλείες" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Προσθήκη, Αφαίρεση και επεξεργασία δουλειών και υπο-δουλειών" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Σημείωση δουλειών και υπο-δουλειών σαν ολοκληρωμένα" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Προσθήκη χρώματος έμφασης για κάθε δουλειά" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Συγχρονισμός δουλειών με Nextcloud ή άλλους παροχείς CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Υποστήριξη για Τράβηγμα και Απόθεση" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Εισαγωγή αρχείων .ics" #~ msgid "Save changed details" #~ msgstr "Αποθήκευση αλλαγών" mrvladus-Errands-7b25a62/po/errands.pot000066400000000000000000000243641456072341300201130ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "" #: errands/widgets/preferences.py:39 msgid "System" msgstr "" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 msgid "Create List" msgstr "" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 msgid "Imported" msgstr "" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "" mrvladus-Errands-7b25a62/po/es.po000066400000000000000000000340241456072341300166720ustar00rootroot00000000000000# Spanish translation for Errands. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # # Ian Jose Ferrero , 2023 # Sergio Varela , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-29 16:42+0000\n" "Last-Translator: Vicente015 \n" "Language-Team: Spanish - Spain \n" "Language: es_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" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Hoy" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Mañana" #: errands/widgets/components.py:167 msgid "Now" msgstr "Ahora" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Limpiar" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Sin establecer" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tema de la aplicación" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Claro" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Oscuro" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Tareas" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Acción al pulsar" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Abrir panel de detalles" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Mostrar subtareas" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Tamaño del botón de completar" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Pequeño" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Grande" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronización" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Deshabilitado" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Proveedor de sincronización" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL del servidor" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Nombre de usuario" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Contraseña" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Prueba" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Prueba de conexión" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Panel de detalles" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Posición" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Izquierda" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Derecha" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Apariencia" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Conectado" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "No se pudo conectar" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Recados" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importar lista" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Añadir lista (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Más opciones" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizar/recuperar tareas" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferencias" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Acerca de Recados" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Sincronizando..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nombre de nueva lista" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Añadir lista" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Cancelar" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Añadir" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Añadir nueva lista" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Presiona el botón \"+\"" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "¿Estás seguro?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "La lista será eliminada de forma permanente" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Eliminar" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nuevo nombre" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Renombrar lista" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Guardar" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "El exportado ha fallado" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Listas exportadas" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Renombrar" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exportar" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menú" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Papelera" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Alternar barra lateral" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Eliminar tareas completadas" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Desplazarse hacia arriba" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Completado:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Añadir nueva tarea" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Sin detalles" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Haz clic en una tarea para ver sus detalles" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Limpiar estilo" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Texto" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Copiar texto" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Notas" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Propiedades" #: errands/widgets/details.py:176 msgid "Start" msgstr "Comienzo" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Establecer fecha" #: errands/widgets/details.py:197 msgid "Due" msgstr "Pendiente" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Completado %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioridad" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Etiquetas" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Añadir etiqueta" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Guardar tarea como archivo .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copiado al portapapeles" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Marcar como completada" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Expandir / Recoger" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Detalles" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Añadir subtarea" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Restaurar todas" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Papelera vacía" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "No hay elementos eliminados" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Las tareas serán eliminadas de forma permanente" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Restaurar" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "No hay listas de tareas" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Crear lista" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listas" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" "Sergio Varela\n" "Clay Gomera" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "La sincronización está desactivada" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Listas importadas" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "No se han proporcionado todas las credenciales de sincronización. Comprueba " "la configuración." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "No se puede conectar al servidor CalDAV en:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar atajos del teclado" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Salir" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Mostrar detalles" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Administrar tareas" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "recados;tareas;lista;todo;todos;caldav;nextcloud;sync;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "" "Una aplicación de listas de tareas, para los que prefieren la sencillez." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Características:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Soporte de múltiples listas de tareas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Añadir, eliminar, editar tareas y subtareas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Marcar la tarea y las subtareas como completadas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Añadir un color de acento para cada tarea" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sincronización de tareas con Nextcloud u otros proveedores de CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Compatibilidad con la opción de arrastrar y soltar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importar tareas desde archivo .ics" #~ msgid "Save changed details" #~ msgstr "Guardar detalles cambiados" #~ msgid "Save (Ctrl+S)" #~ msgstr "Guardar (Ctrl+S)" #~ msgid "Create" #~ msgstr "Crear" #~ msgid "Load" #~ msgstr "Cargar" #~ msgid "Click for Details" #~ msgstr "Haz clic para ver detalles" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Alternar barra lateral" #, fuzzy #~ msgid "End" #~ msgstr "Recados" #~ msgid "Export Cancelled" #~ msgstr "Exportación cancelada" #~ msgid "Error" #~ msgstr "Error" #~ msgid "Import Cancelled" #~ msgstr "Importación cancelada" #~ msgid "Invalid File" #~ msgstr "Archivo no válido" #~ msgid "Deleted Tasks" #~ msgstr "Tareas eliminadas" #~ msgid "Move to Trash" #~ msgstr "Mover a la papelera" #~ msgid "Show Deleted Tasks" #~ msgstr "Mostrar tareas eliminadas" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Eliminar tareas completadas (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Sincronizar/recuperar tareas (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Exportar tareas..." #~ msgid "Import Tasks..." #~ msgstr "Importar tareas..." #~ msgid "Import and Export" #~ msgstr "Importar y exportar" #~ msgid "Exit edit mode" #~ msgstr "Salir del modo de edición" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Expandir subtareas al inicio" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Nombre del calendario (\"Recados\" por defecto)" #~ msgid "Token" #~ msgstr "Token" #~ msgid "Edit" #~ msgstr "Editar" #~ msgid "Cancel (Escape)" #~ msgstr "Cancelar (Esc)" mrvladus-Errands-7b25a62/po/eu.po000066400000000000000000000325241456072341300166770ustar00rootroot00000000000000# Basque (eu.po) translation of Errands. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # Sergio Varela , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-12-02 00:14+0100\n" "Last-Translator: Sergio Varela \n" "Language-Team: Spanish - Spain \n" "Language: es_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" "X-Generator: Gtranslator 45.3\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Ezabatu" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Aplikazioaren gaia" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistemarena" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Argia" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Iluna" # ES_EU: Use "Atazak" instead of "Zereginak". # https://hiztegiak.elhuyar.eus/es/tarea# #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Atazak" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Erantsi azpiataza berri bat" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Eginda:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sinkronizatu" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Desgaitua" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Sinkronizazio-hornitzailea" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Zerbitzariaren URLa" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Erabiltzailearen izena" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Pasahitza" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Proba" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Konexio-proba" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Argia" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "Inportatu atazak" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Atazak sinkronizatu/lortu" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Hobespenak" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Teklatuko lasterbideak" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Errands-i buruz" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menu nagusia" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Ezeztatu" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "Gehitu ataza berria" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Ziur zaude?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "Atazak etengabe ezabatuko dira" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Ezabatu" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "Atazak esportatu egin dira" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "Atazak esportatu egin dira" #: errands/widgets/sidebar.py:477 #, fuzzy msgid "Rename" msgstr "Erabiltzailearen izena" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "Esportatu atazak" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menua" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "Zakarrontzia itxi" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "Txandakatu alboko barra" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "Ezabatu betetako atazak" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Gorantz egin" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Eginda:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Gehitu ataza berria" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "Estiloa garbitu" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "Kopiatu" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "Eginda:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "Gehitu ataza berria" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Arbelean kopiatuta" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Markatu eginda bezala" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Erantsi azpiataza berri bat" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Dena leheneratu" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Zakarrontzia hustu" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Ez dago elementurik ezabatuta" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Atazak etengabe ezabatuko dira" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Leheneratu" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Inportatu atazak" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" "Sergio Varela\n" "https://ingrownmink4.codeberg.page" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "Atazak inportatu egin dira" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Ez dira eman sinkronizazio-kredentzial guztiak. Egiaztatu hobespenak." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Ezin da CalDAV zerbitzariarekin konektatu:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Orokorra" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Erakutsi teklatuko lasterbideak" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Irten" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Txandakatu alboko barra" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Kudeatu zure zereginak" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Sinpletasuna nahiago dutenentzat, atazak kudeatzeko aplikazioa." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Ezaugarriak:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Atazak eta azpiatazak gehitu, ezabatu, edo editatu" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Ataza eta azpiatazak eginda bezala markatu" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Erantsi azentu-kolore bat ataza bakoitzerako" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" "Atazen sinkronizazioa Nextcloud-ekin edo CalDAV-en beste hornitzaile " "batzuekin" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Arrastatzeko eta askatzeko euskarria" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "Inportatu atazak" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Txandakatu alboko barra" #, fuzzy #~ msgid "End" #~ msgstr "Errands" #~ msgid "Export Cancelled" #~ msgstr "Esportazioa ezeztatu da" #~ msgid "Error" #~ msgstr "Errorea" #~ msgid "Import Cancelled" #~ msgstr "Inportazioa ezeztatu da" #~ msgid "Invalid File" #~ msgstr "Fitxategia ez da baliozkoa" #~ msgid "Deleted Tasks" #~ msgstr "Ezabatutako atazak" #~ msgid "Move to Trash" #~ msgstr "Zakarrontzira mugitu" #~ msgid "Show Deleted Tasks" #~ msgstr "Erakutsi ezabatutako atazak" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Ezabatu betetako atazak (Ctrl+Supr)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Atazak sinkronizatu/lortu (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Esportatu atazak..." #~ msgid "Import Tasks..." #~ msgstr "Inportatu atazak..." #~ msgid "Import and Export" #~ msgstr "Inportazioa eta esportazioa" #~ msgid "Exit edit mode" #~ msgstr "Edizio modutik atera" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Azpiatazak hasieran zabaldu" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Egutegiaren izena (\"Errands\" aukera lehenetsita da)" #~ msgid "Token" #~ msgstr "Autentifikatzailea" #~ msgid "Edit" #~ msgstr "Editatu" #~ msgid "Cancel (Escape)" #~ msgstr "Ezeztatu (Esc)" mrvladus-Errands-7b25a62/po/fa.po000066400000000000000000000332551456072341300166560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # Danial Behzadi , 2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-02-04 13:34+0330\n" "Last-Translator: Danial Behzadi \n" "Language-Team: \n" "Language: fa_IR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n" "X-Generator: Poedit 3.2.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "امروز" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "فردا" #: errands/widgets/components.py:167 msgid "Now" msgstr "اکنون" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "پاک‌سازی" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "تنظیم نشده" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "زمینهٔ برنامه" #: errands/widgets/preferences.py:39 msgid "System" msgstr "سامانه" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "روشن" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "تیره" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "تکلیف‌ها" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "کنش کلیک" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "گشودن تابلوی جزییات" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "نمایش زیرتکلیف‌ها" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "اندازهٔ‌ دکمهٔ کامل" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "کوچک" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "بزرگ" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "همگام‌سازی" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "از کار افتاده" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "فراهم‌کنندهٔ همگام‌سازی" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "نشانی کارساز" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "نام‌کاربری" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "گذرواژه" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "آزمایش" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "آزمون اتّصال" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "تابلوی جزییات" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "جایگاه" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "چپ" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "راست" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "ظاهر" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "وصل شده" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "نمی‌توان وصل شد" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "مأموریت‌ها" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "درون‌ریزی سیاهه‌ها" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "افزودن سیاهه (مهار+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "گزینه‌های بیش‌تر" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "همگام‌سازی و واکشی تکلیف‌ها" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "ترجیحات" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "میان‌برهای صفحه‌کلید" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "دربارهٔ مأموریت‌ها" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "فهرست اصلی" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "هم‌گام ساختن…" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "نام سیاههٔ جدید" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "افزودن سیاهه" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "انصراف" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "افزودن" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "افزودن سیاههٔ جدید" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "زدن دکمهٔ «+»" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "مطمئنید؟" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "سیاهه برای همیشه از دست خواهد رفت" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "حذف" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "نام جدید" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "تغییر نام سیاهه" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "ذخیره" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "برون‌ریزی شکست خورد" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "برون ریخته" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "تغییر نام" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "برون‌ریزی" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "فهرست" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "زباله‌دان" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "تغییر وضعیت نوار کناری" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "حذف تکلیف‌های انجام شده" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "لغزش به بالا" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "کامل شده:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "افزودن تکلیف جدید" #: errands/widgets/details.py:63 msgid "No Details" msgstr "بدون جزییات" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "کیکل رو ی تکلیف برای نمایش اطّلاعات بیش‌تر" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "پاک سازی سبک" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "متن" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "رونوشت از متن" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "یادداشت‌ها" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "ترجیحات" #: errands/widgets/details.py:176 msgid "Start" msgstr "آغاز" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "تنظیم تاریخ" #: errands/widgets/details.py:197 msgid "Due" msgstr "سررسید" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "٪ انجام شده" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "اولویت" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "برچسب‌ها" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "افزودن برچسب" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "ذخیرهٔ تکلیف به شکل پروندهٔ ‪.ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "رونوشت شده در تخته‌گیره" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "علامت به کامل شده" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "گسترش یا جمع کردن" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "جزییات" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "افزودن زیرتکلیف جدید" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "بازگردانی همه" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "خالی کردن زباله‌دان" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "بدون مورد حذف شده" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "تکلیف برای همیشه حذف خواهد شد" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "بازآوری" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "بدون سیاههٔ تکلیف" #: errands/widgets/window.py:69 msgid "Create List" msgstr "ایجاد سیاهه" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "سیاهه‌ها" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "دانیال بهزادی " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "همگام سازی از کار افتاده" #: errands/widgets/window.py:212 msgid "Imported" msgstr "درون ریخته" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "همهٔ گواهی‌ّای همگام سازی فراهم نشده. لطفاً تنظیمات را بررسی کنید." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "نتواسنت به این کارساز CalDAV وصل شود:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "عمومی" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "نمایش میان‌برهای صفحه‌کلید" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "ترک" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "تغغیر وضعیت جزییات" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "مدیریت تکلیف‌هایتان" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tasks;list;todo;todos;caldav;nextcloud;sync;مأموریت;وظیفه;تکلیف;" "نکست‌کلود;همگام;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "برنامهٔ تکلیف‌ها برای آنان که سادگی را ترجیح می دهند." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "ویژگی‌ها:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "پشتیبانی از چندین سیاههٔ تکلیف" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "افزودن، برداشتن و ویرایش تکلیف‌ها و زیرتکلیف‌ها" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "علامت زدن تکلیف‌ها و زیرتکلیف‌ها به کامل شده" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "افزودن لهجهٔ رنگی برای هر تکلیف" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "همگام سازی تکلیف‌ها با نکست‌کلود یا دیگر فراهم‌کنندگان CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "پشتیبانی از کشیدن و رها کردن" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "درون‌ریزی پرونده‌های ‪.ics" #~ msgid "Save changed details" #~ msgstr "ذخیرهٔ جزییات تغییر یافته" mrvladus-Errands-7b25a62/po/fr.po000066400000000000000000000316671456072341300167040ustar00rootroot00000000000000# LIST. # Copyright (C) 2023 # This file is distributed under the same license as the list package. # Jeremy Castel , 2023. # Irénée THIRION , 2023-2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-16 17:50+0100\n" "Last-Translator: Irénée THIRION \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Gtranslator 45.3\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Aujourd’hui" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Demain" #: errands/widgets/components.py:167 msgid "Now" msgstr "Maintenant" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Effacer" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Non défini" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Thème de l'application" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Système" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Clair" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Sombre" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Tâches" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Action du clic" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Ouvre le panneau des détails" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Affiche les sous-tâches" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Terminé %" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronisation" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Désactivé" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Fournisseur de synchronisation" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL du serveur" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Nom d’utilisateur" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Mot de passe" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Tester" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Tester la connexion" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Panneau des détails" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Position" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Gauche" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Droite" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Apparence" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Connecté" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Impossible de se connecter" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importer une liste" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Ajouter une liste" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Plus d’options" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Synchroniser / Récupérer les tâches" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Préférences" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "À propos de Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menu principal" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Synchronisation…" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nouveau nom de liste" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Ajouter une liste" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Annuler" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Ajouter" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Ajouter une nouvelle liste" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Cliquez sur le bouton +" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Supprimer les éléments de la corbeille ?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "La liste sera définitivement supprimée" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Supprimer" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nouveau nom" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Renommer la liste" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Enregistrer" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Exportation échouée" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Tâches exportée" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Renommer" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exporter" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Corbeille" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Afficher ou masquer le panneau latéral" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Supprimer les tâches terminées" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Défiler vers le haut" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Terminé :" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Ajouter une tâche" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Aucun détail" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Cliquez sur une tâche pour afficher plus d’informations" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Effacer le style" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Texte" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Copier le texte" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Notes" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Propriétés" #: errands/widgets/details.py:176 msgid "Start" msgstr "Début" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Définir une date" #: errands/widgets/details.py:197 msgid "Due" msgstr "Échéance" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Terminé %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Priorité" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Étiquettes" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Ajouter une étiquette" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Enregistrer la tâche en fichier .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copié dans le presse-papier" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Marquer comme terminée" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Dérouler / Replier" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Détails" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Ajouter une sous-tâche" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Tout restaurer" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Corbeille vide" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Aucun élément supprimé" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Tous les éléments seront définitivement supprimés" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Restaurer" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Aucune liste de tâches" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Créer une liste" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Ajouter une liste" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Jeremy Castel " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Synchronisation désactivée" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importée" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Identifiants de synchronisation manquants. Veuillez vérifier les paramètres." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Impossible de se connecter au serveur CalDAV à l’adresse suivante :" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Général" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Afficher les raccourcis clavier" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Quitter" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Basculer les détails" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Gérer vos tâches" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tâches;task;liste;todos;à faire;caldav;nextcloud;synchronisation;" "post it;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Application de tâches pour ceux appréciant la simplicité." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Fonctionnalités :" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Prise en charger des listes de tâches multiples" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Ajouter, supprimer, éditer des tâches et sous-tâches" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Marquer les tâches et sous-tâches comme terminées" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Thème de couleurs pour chaque tâche" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" "Synchronisation des tâches avec Nextcloud ou d’autres fournisseur CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Prise en charge du glisser-déposer" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Import de fichiers .ics" #~ msgid "Save changed details" #~ msgstr "Enregistrer les modifications des détails" #~ msgid "Save (Ctrl+S)" #~ msgstr "Enregistrer (Ctrl+S)" #~ msgid "Create" #~ msgstr "Créer" #~ msgid "Load" #~ msgstr "Charger" #~ msgid "Click for Details" #~ msgstr "Cliquez pour afficher les détails" mrvladus-Errands-7b25a62/po/hr.po000066400000000000000000000305751456072341300167030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the list package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-12-25 22:29+0100\n" "Last-Translator: Milo Ivir \n" "Language-Team: \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Izbriši" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Nije postavljeno" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tema aplikacije" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sustav" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Svijetla" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Tamna" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "" #: errands/widgets/preferences.py:83 #, fuzzy msgid "Click Action" msgstr "Pritisni gumb „+”" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Dodaj novi podzadatak" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Dovršeno (u postocima)" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sinkronizacija" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Isključeno" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Pružatelj usluge sinkronizacije" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL servera" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Korisničko ime" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Lozinka" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Provjeri" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Testiraj vezu" #: errands/widgets/preferences.py:171 #, fuzzy msgid "Details Panel" msgstr "Nema detalja" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Svijetla" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Povezano" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Povezivanje nije moguće" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Uvezi popis" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Dodaj popis" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sinkroniziraj/Preuzmi zadatke" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Postavke" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Tipkovnički prečaci" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "O aplikaciji Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Glavni izbornik" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Ime novog popisa" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Dodaj popis" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Odustani" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Dodaj" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Dodaj novi popis" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Pritisni gumb „+”" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Jesi li siguran/na?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Popis će se zauvijek izbrisati" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Izbriši" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Novo ime" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Preimenuj popis" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Spremi" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "Izvezeno" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Izvezeno" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Preimenuj" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Izvezi" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Izbornik" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Smeće" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Uključi/Isključi bočnu traku" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Izbriši dovršene zadatke" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Klizni gore" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Dovršeno:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Dodaj novi zadatak" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Nema detalja" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Pritisni zadatak za prikaz više informacija" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Izbriši stil" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Tekst" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Kopiraj tekst" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Bilješke" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Svojstva" #: errands/widgets/details.py:176 msgid "Start" msgstr "Početak" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Dovršeno (u postocima)" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioritet" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Oznake" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Dodaj oznaku" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Spremi zadatak kao .ics datoteku" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Kopirano u međuspremnik" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Označi kao dovršeno" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Rasklopi/Sklopi" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 #, fuzzy msgid "Details" msgstr "Nema detalja" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Dodaj novi podzadatak" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Obnovi sve" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Isprazni smeće" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Nema izbrisanih stavki" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Zadaci će se zauvijek izbrisati" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Obnovi" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Nema popisa zadataka" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Preimenuj popis" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Dodaj popis" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Milo Ivir " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Sinkronizacija je deaktivirana" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Uvezeno" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Nisu navedeni svi podaci za pristup sinkronizacije. Provjeri postavke." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Neuspjelo povezivanje s CalDAV serverom pri:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "" #: data/resources/gtk/help-overlay.ui:13 #, fuzzy msgid "Show keyboard shortcuts" msgstr "Tipkovnički prečaci" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Nema detalja" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Upravljaj svojim zadacima" #: data/io.github.mrvladus.List.desktop.in.in:10 #, fuzzy msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;zadaci;popis;popis zadataka;popisi zadataka;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Aplikacija za zadatke za one koji vole jednostavnost." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Značajke:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Podrška za višestruke popise zadataka" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Dodaj, ukloni, uredi zadatke i podzadatke" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Označi zadatak i podzadatke kao dovršene" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Dodaj boju za svaki zadatak" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" "Sinkroniziraj zadatke s Nextcloudom ili s drugim pružateljima usluge za " "CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Podrška za povuci i ispusti" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Uvezi .ics datoteke" #~ msgid "Click for Details" #~ msgstr "Pritisni za prikaz detalja" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Uključi/Isključi bočnu traku" #~ msgid "End" #~ msgstr "Kraj" mrvladus-Errands-7b25a62/po/hu.po000066400000000000000000000310231456072341300166730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-29 22:39+0100\n" "Last-Translator: acszoltan111@gmail.com\n" "Language-Team: \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Ma" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Holnap" #: errands/widgets/components.py:167 msgid "Now" msgstr "Most" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Ürítés" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Nincs beállítva" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Alkalmazástéma" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Rendszer" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Világos" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Sötét" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Feladatok" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Kattintás művelete" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Részletek panel megnyitása" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Alfeladatok megjelenítése" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Befejezés gomb mérete" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Kicsi" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Nagy" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Szinkronizáció" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Letiltva" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Szinkronizáció szolgáltató" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Szerver URL" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Felhasználónév" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Jelszó" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Teszt" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Kapcsolat tesztelése" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Részletek panel" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Pozíció" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Bal" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Jobb" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Megjelenés" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Csatlakozva" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Nem lehet csatlakozni" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Tennivalók" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Lista importálása" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Lista hozzáadása (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "További lehetőségek" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Feladatok lekérése / szinkronizálása" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Beállítások" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "A Tennivalók névjegye" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Főmenü" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Szinkronizálás..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Új listanév" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Lista hozzáadása" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Mégse" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Hozzáadás" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Új lista hozzáadása" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Kattintson a \"+\" gombra" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Biztos benne?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "A lista véglegesen törölve lesz" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Törlés" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Új név" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Lista átnevezése" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Mentés" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Az exportálás sikertelen" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Exportálva" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Átnevezés" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exportálás" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menü" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Kuka" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Oldalsáv megjelenítése / elrejtése" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Befejezett feladatok törlése" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "A tetejére" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Befejezett:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Új feladat hozzáadása" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Nincsenek részletek" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Kattintson a feladatra a további információ megjelenítéséhez" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Stílus törlése" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Szöveg" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Szöveg másolása" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Jegyzetek" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Tulajdonságok" #: errands/widgets/details.py:176 msgid "Start" msgstr "Kezdet" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Dátum beállítása" #: errands/widgets/details.py:197 msgid "Due" msgstr "Lejárat" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Befejezett %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioritás" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Címkék" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Címke hozzáadása" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Feladat mentése .ics fájlként" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Vágólapra másolva" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Befejezettként jelölés" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Kinyitás / becsukás" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Részletek" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Új alfeladat hozzáadása" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Összes visszaállítása" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Kuka ürítése" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Nincsenek törölt elemek" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "A feladatok véglegesen törölve lesznek" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Visszaállítás" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Nincsenek feladatlisták" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Lista létrehozása" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listák" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "zoli111" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "A szinkronizáció letiltva" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importálva" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Nincs minden szinkronizálási adat megadva. Kérjük, ellenőrizze a " "beállításokat." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Nem lehet csatlakozni a CalDAV szerverhez itt:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Általános" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Gyorsbillentyűk mejelenítése" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Kilépés" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Részletek megjelenítése / elrejtése" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Kezelje a feladatait" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tasks;list;todo;caldav;nextcloud;feladatok;tennivalók;szinkronizáció;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Egy teendők alkalmazás az egyszerűséget kedvelőknek." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Funkciók:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Több feladatlista támogatása" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Feladatok és alfeladatok hozzáadása, eltávolítása, szerkesztése" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Feladatok és alfeladatok befejezettként jelölése" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Kiemelőszín hozzáadása minden egyes feladathoz" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Feladatok szinkronizálása Nextcloud vagy CalDAV szolgáltatókkal" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Húzd és ejtsd támogatás" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr ".ics fájlok importálása" #~ msgid "Save changed details" #~ msgstr "Megváltoztatott részletek mentése" mrvladus-Errands-7b25a62/po/it.po000066400000000000000000000337441456072341300167070ustar00rootroot00000000000000# LIST. # Copyright (C) 2023 # This file is distributed under the same license as the list package. # ALBANO BATTISTELLA , 2023,2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-28 14:31+0100\n" "Last-Translator: Albano Battistella \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.12.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Oggi" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Domani" #: errands/widgets/components.py:167 msgid "Now" msgstr "Ora" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Chiaro" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Non impostato" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tema applicazione" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Chiaro" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Scuro" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Attività" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Premere il tasto »+«" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Apri il pannello dei dettagli" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Mostra attività secondarie" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Dimensione pulsante completa" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Piccolo" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Grande" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizzazione" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Disabilitato" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Provider di sincronizzazione" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL Server" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Nome utente" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Password" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Test di connessione" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Pannello dei dettagli" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Posizione" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Sinistra" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Destra" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Aspetto" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Connesso" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Impossibile connettere" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importa lista" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Aggiungi lista (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Altre opzioni" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizza / Recupera attività" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferenze" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Informazioni su Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menù principale" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Sincronizzazione..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nuovo nome della lista" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Aggiungi lista" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Annulla" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Aggiungi" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Aggiungi nuova lista" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Fare clic sul pulsante \"+\"." #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Sei sicuro?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "La lista verrà eliminata definitivamente" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Cancella" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nuovo nome" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Rinomina lista" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Salva" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Esportazione non riuscita" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Esportato" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Rinomina" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Esporta" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menù" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Cestino" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Attiva barra laterale" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Elimina attività completate" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Scorri verso l'alto" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Completato:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Aggiungi nuova attività" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Nessun dettaglio" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Fare clic sull'attività per visualizzare ulteriori informazioni" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Stile chiaro" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Testo" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Copia testo" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Note" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Proprietà" #: errands/widgets/details.py:176 msgid "Start" msgstr "Inizio" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Imposta data" #: errands/widgets/details.py:197 msgid "Due" msgstr "Scadenza" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Completo %:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Priorità" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Tag" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Aggiungi tag" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Salva attività come file .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copiato negli appunti" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Contrassegna come completato" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Espandi / Piega" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Dettaglio" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Aggiungi una nuova attività secondaria" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Ripristina tutto" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Cestino vuoto" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Nessun elemento eliminato" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Le attività verranno eliminate definitivamente" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Ripristina" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Nessun elenco di attività" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Crea lista" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Liste" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Albano Battistella " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "La sincronizzazione è disabilitata" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importato" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Non tutte le credenziali di sincronizzazione fornite. Si prega di verificare " "le impostazioni." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Impossibile connettersi al server CalDAV su:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Generale" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostra scorciatoie da tastiera" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Esci" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Attiva/disattiva i dettagli" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Gestisci le tue attività" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "commissioni;attività;elenco;cosa da fare;cose da fare;caldav;nextcloud;" "sincronizzazione;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Applicazione Todo per chi preferisce la semplicità." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Caratteristiche:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Supporto per più elenchi di attività" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Aggiungere, rimuovere, modificare attività e attività secondarie" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Contrassegna l'attività e le attività secondarie come completate" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Aggiungi un colore in risalto per ogni attività" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sincronizza le attività con Nextcloud o altri provider CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Supporto trascina e rilascia" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importa file .ics" #~ msgid "Save changed details" #~ msgstr "Salva i dettagli modificati" #~ msgid "Save (Ctrl+S)" #~ msgstr "Salva(Ctrl+S)" #~ msgid "Create" #~ msgstr "Crea" #~ msgid "Load" #~ msgstr "Carica" #~ msgid "Click for Details" #~ msgstr "Clicca per vedere i dettagli" #~ msgid "Toggle sidebar" #~ msgstr "Attiva barra laterale" #~ msgid "Export Cancelled" #~ msgstr "Esportazione cancellata" #~ msgid "Error" #~ msgstr "Errore" #~ msgid "Import Cancelled" #~ msgstr "Importazione cancellata" #~ msgid "Invalid File" #~ msgstr "File non valido" #~ msgid "Deleted Tasks" #~ msgstr "Attività completate" #~ msgid "Move to Trash" #~ msgstr "Sposta nel cestino" #~ msgid "Show Deleted Tasks" #~ msgstr "Mostra attività eliminate" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Elimina le attività completate (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Attività di sincronizzazione/recupero (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Esporta attività..." #~ msgid "Import Tasks..." #~ msgstr "Importa attività..." #~ msgid "Import and Export" #~ msgstr "Importazione ed esportazione" #~ msgid "Exit edit mode" #~ msgstr "Uscire dalla modalità di modifica" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Espandi le attività secondarie all'avvio" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Nome del calendario (\"Errands\" per impostazione predefinita)" #~ msgid "Token" #~ msgstr "Token" #~ msgid "Edit" #~ msgstr "Modifica" #~ msgid "Cancel (Escape)" #~ msgstr "Annulla (Esc)" mrvladus-Errands-7b25a62/po/ja.po000066400000000000000000000321451456072341300166570ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-27 21:12+0900\n" "Last-Translator: Gnuey56 \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "今日" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "明日" #: errands/widgets/components.py:167 msgid "Now" msgstr "現在" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "クリア" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "未設定" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "アプリケーションのテーマ" #: errands/widgets/preferences.py:39 msgid "System" msgstr "システム" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "ライト" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "ダーク" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "タスク" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "クリック時のアクション" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "詳細パネルを開く" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "サブタスクを表示" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "完了度 (パーセント)" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同期" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "無効" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "同期プロバイダー" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "サーバーURL" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "ユーザー名" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "パスワード" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "テスト" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "接続をテスト" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "詳細パネル" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "位置" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "左" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "右" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "外観" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "接続されています" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "接続できません" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "リストをインポート" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "リストを追加" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "その他のオプション" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "タスクを同期" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "設定" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "キーボード・ショートカット" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Errands について" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "メインメニュー" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "同期中..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "新しいリストの名前" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "リストを追加" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "キャンセル" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "追加" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "新しいリストを追加" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "\"+\" ボタンをクリック" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "本当に削除しますか?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "削除されたリストは元に戻せません" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "削除" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "新しい名前" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "リストの名前を変更" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "保存" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "エクスポートに失敗しました" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "エクスポートされました" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "名前を変更" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "エクスポート" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "メニュー" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "ゴミ箱" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "サイドバーを切り替え" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "完了したタスクを削除" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "上へスクロール" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "完了:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "新しいタスクを追加" #: errands/widgets/details.py:63 msgid "No Details" msgstr "詳細なし" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "タスクをクリックして詳細を表示" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "色をクリア" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "タイトル" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "タイトルをコピー" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "メモ" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "プロパティ" #: errands/widgets/details.py:176 msgid "Start" msgstr "開始日" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "日付を設定" #: errands/widgets/details.py:197 msgid "Due" msgstr "終了日" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "完了度 (パーセント)" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "優先度" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "タグ" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "タグを追加" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "タスクを .ics ファイルとして保存" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "クリップボードにコピーされました" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "完了にする" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "展開/折りたたみ" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "詳細" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "新しいサブタスクを追加" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "すべて復元" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "空のゴミ箱" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "削除されたアイテムはありません" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "削除されたタスクは元に戻せません" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "復元" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "タスクのリストはありません" #: errands/widgets/window.py:69 msgid "Create List" msgstr "リストを作成" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "リストを追加" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Gnuey56" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "同期は無効です" #: errands/widgets/window.py:212 msgid "Imported" msgstr "インポートしました" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "同期に必要な情報が入力されていません。設定を確認してください。" #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV サーバーに接続できません:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "全般" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "キーボード・ショートカットを表示" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "終了" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "詳細を切り替え" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "タスクを管理" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tasks;list;todo;todos;caldav;nextcloud;sync;用事;タスク;リスト;やるこ" "とリスト;同期;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "シンプルを好む人のための To Do アプリケーション。" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "機能:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "複数のタスクリストをサポート" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "タスク/サブタスクを、追加、削除、編集" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "タスク/サブタスクを完了済みにチェック" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "タスクごとにアクセントカラーを追加" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Nextcloud 又は他の CalDAV プロバイダーとタスクを同期" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "ドラッグアンドドロップをサポート" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr ".ics ファイルをインポート" #~ msgid "Save changed details" #~ msgstr "変更された詳細を保存" #~ msgid "Save (Ctrl+S)" #~ msgstr "保存 (Ctrl+S)" #~ msgid "Create" #~ msgstr "作成" #~ msgid "Load" #~ msgstr "読み込み" #~ msgid "Click for Details" #~ msgstr "クリックしてタスクの詳細を表示" #~ msgid "Toggle sidebar" #~ msgstr "サイドバーの切り替え" mrvladus-Errands-7b25a62/po/meson.build000066400000000000000000000000501456072341300200550ustar00rootroot00000000000000i18n.gettext('errands', preset: 'glib') mrvladus-Errands-7b25a62/po/nl.po000066400000000000000000000320461456072341300166760ustar00rootroot00000000000000# LIST. # Copyright (C) 2023 # This file is distributed under the same license as the list package. # Heimen Stoffels , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-31 22:21+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Vandaag" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Morgen" #: errands/widgets/components.py:167 msgid "Now" msgstr "Zojuist" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Standaard" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Niet ingesteld" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Thema" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Systeemthema" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Licht thema" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Donker thema" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Taken" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Klikactie" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Details tonen" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Bijkomende taken tonen" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Grootte van afrondknop" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Klein" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Groot" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchroniseren" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Uitgeschakeld" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Synchronisatiedienst" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Server-url" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Gebruikersnaam" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Wachtwoord" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Testen" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Verbinding testen" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Detailpaneel" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Locatie" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Links" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Rechts" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Vormgeving" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Verbonden" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Verbinding mislukt" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Boodschappen" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Lijst importeren" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Lijst toevoegen (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Meer opties" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Taken ophalen/synchroniseren" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Voorkeuren" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Over Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Hoofdmenu" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Bezig met synchroniseren…" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nieuwe lijstnaam" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Lijst toevoegen" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Annuleren" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Toevoegen" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Lijst toevoegen" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Klik op de ‘+’-knop" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Weet u het zeker?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "De lijst wordt permanent verwijderd" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Verwijderen" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nieuwe naam" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Lijstnaam wijzigen" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Opslaan" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Exporteren mislukt" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Exporteren voltooid" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Naam wijzigen" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exporteren" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Prullenbak" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Zijbalk tonen/verbergen" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Afgeronde taken wissen" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Omhoog schuiven" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Afgerond:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Taak toevoegen" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Geen omschrijving" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Klik op een taak om meer informatie te tonen" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Stijl wissen" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Tekst" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Tekst kopiëren" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Aantekeningen" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Eigenschappen" #: errands/widgets/details.py:176 msgid "Start" msgstr "Starten" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Datum instellen" #: errands/widgets/details.py:197 msgid "Due" msgstr "Einddatum" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "% afgerond" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioriteit" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Labels" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Label toekennen" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Taak opslaan als .ics-bestand" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Gekopieerd naar het klembord" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Markeren als afgerond" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Uit-/Inklappen" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Details" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Bijkomende taak toevoegen" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Alles herstellen" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Prullenbak legen" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Er zijn geen verwijderde items" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "De taken worden permanent verwijderd" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Herstellen" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Er zijn geen lijsten" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Lijst maken" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Lijsten" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Heimen Stoffels " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Synchronisatie is uitgeschakeld" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importeren voltooid" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Er zijn geen inloggegevens bekend. Controleer de voorkeuren." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Er kan geen verbinding worden gemaakt met de server:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Algemeen" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Sneltoetsen tonen" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Afsluiten" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Details tonen/verbergen" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Beheer uw taken" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;taken;lijst;taak;todo;caldav;nextcloud;synchronisatie;synchroniseren;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Een takentoepassing voor zij die eenvoud boven alles verkiezen." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Kenmerken:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Ondersteuning voor meerdere lijsten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Voeg taken en bijkomende taken toe, bewerk ze of verwijder ze" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Markeer taken en bijkomende taken als afgerond" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Voorzie elke taak van een andere kleur" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Synchroniseer taken met Nextcloud of andere CalDAV-diensten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Sleep taken naar het venster" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importeer .ics-bestanden" #~ msgid "Save changed details" #~ msgstr "Wijzigingen opslaan" #~ msgid "Save (Ctrl+S)" #~ msgstr "Opslaan (Ctrl+S)" #~ msgid "Create" #~ msgstr "Maken" #~ msgid "Load" #~ msgstr "Laden" #~ msgid "Click for Details" #~ msgstr "Klik voor meer informatie" #~ msgid "Toggle sidebar" #~ msgstr "Zijbalk tonen/verbergen" #, fuzzy #~ msgid "End" #~ msgstr "Boodschappen" #~ msgid "Deleted Tasks" #~ msgstr "Taken wissen" #~ msgid "Move to Trash" #~ msgstr "Verplaatsen naar prullenbak" #~ msgid "Show Deleted Tasks" #~ msgstr "Verwijderde taken tonen" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Afgeronde taken wissen (Ctrl+Delete)" #~ msgid "Export Tasks..." #~ msgstr "Taken exporteren…" #~ msgid "Import Tasks..." #~ msgstr "Taken importeren…" #~ msgid "Import and Export" #~ msgstr "Im- en exporteren" #~ msgid "Edit" #~ msgstr "Bewerken" mrvladus-Errands-7b25a62/po/oc.po000066400000000000000000000335571456072341300166760ustar00rootroot00000000000000# Occitan translation. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # Quentin PAGÈS, 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-09-21 20:23+0200\n" "Last-Translator: Quentin PAGÈS\n" "Language-Team: \n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.3.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Uèi" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Deman" #: errands/widgets/components.py:167 msgid "Now" msgstr "Ara" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Escafar" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Non definida" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tèma de l’aplicacion" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistèma" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Clar" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Fosc" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Prètzfaches" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Accion del clic" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Dobrir lo panèl de detalhs" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Mostrar jos prètzfaches" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Talha del boton Acabat" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Pichona" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Granda" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizacion" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Desactivada" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Provesidor de sincro." #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL servidor" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Nom d'utilizaire" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Senhal" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Ensag" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Ensajar connexion" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Panèl de detalh" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Posicion" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Esquèrra" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Drecha" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Aparéncia" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Connectat" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Connexion impossibla" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importar lista" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Apondre una lista (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Mai d'opcions" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincro / Recuperacion prètzfaches" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferéncias" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Acorchis de clavièr" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "A prepaus d’Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Sincronizacion..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Nom de la lista novèla" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Apondre una lista" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Anullar" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Apondre" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Apondre una lista novèla" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Clicar lo boton « + »" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "O confirmatz ?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "La lista serà definitivament suprimida" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Suprimir" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Nom novèl" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Renonemar la lista" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Enregistrar" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Expòrt non reüssit" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Exportat" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Renomenar" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exportar" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menú" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Bordilhièr" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Afichar o amagar lo panèl lateral" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Suprimir los prètzfaches acabats" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Desfilar cap amont" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Acabat :" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Apondre un prètzfach novèl" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Cap de detalh" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Clicar un prètzfach per afichar mai d'informacions" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Estil clar" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Tèxte" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Copiar lo tèxte" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Nòtas" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Proprietats" #: errands/widgets/details.py:176 msgid "Start" msgstr "Debuta" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Definir la data" #: errands/widgets/details.py:197 msgid "Due" msgstr "Tèrme" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Acabar %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioritat" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Etiquetas" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Apondre una etiqueta" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Enregistrar lo prètzfach coma fichièr .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copiat al quichapapièrs" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Marcar coma acabat" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Desplegar / Plegar" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Detalhs" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Apondre un jos prètzfach" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Tot restaurar" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Voidar lo bordilhièr" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Cap d’element pas suprimit" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Los prètzfaches seràn definitivament suprimits" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Restablir" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Cap de lista de prètzfaches" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Crear una lista" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listas" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Quentin PAGÈS" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "La sincronizacion es desactivada" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importat" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Totes los identificants son pas provesits. Verificatz los paramètres se vos " "plai." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Connexion impossibla al servidor CalDAV de :" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar los acorchis clavièr" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Quitar" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Afichar o amagar los detalhs" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Gerir vòstres prètzfaches" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tasks;list;todo;todos;prètzfaches;prètzfait;lista;tièra;caldav;" "nextcloud;sincro;sync;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Alicacion de lista de prètzfaches pel monde qu'estima la simplicitat" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Foncionalitats :" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Presa en carga de mantuna lista de prètzfaches" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Apondre, suprimir, modificar los prètzfaches e los jos prètzfaches" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Marcar lo prètzfach e jos prètzfaches coma acabats" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Apondre una color dominanta per cada prètzfach" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sincronizar los prètzfaches amb Nextcloud o d'autres provesidor CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Presa en carga del lisar e depausar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importar fichièrs .ics" #~ msgid "Save changed details" #~ msgstr "Enregistrar los details modificats" #~ msgid "Save (Ctrl+S)" #~ msgstr "Enregistrar (Ctrl+S)" #~ msgid "Create" #~ msgstr "Crear" #~ msgid "Load" #~ msgstr "Cargar" #~ msgid "Click for Details" #~ msgstr "Clicar pels detalhs" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Afichar o amagar lo panèl lateral" #, fuzzy #~ msgid "End" #~ msgstr "Errands" #~ msgid "Export Cancelled" #~ msgstr "Exportacion anullada" #~ msgid "Error" #~ msgstr "Error" #~ msgid "Import Cancelled" #~ msgstr "Importacion anullada" #~ msgid "Invalid File" #~ msgstr "Fichièr invalid" #~ msgid "Deleted Tasks" #~ msgstr "Prètzfaches suprimits" #~ msgid "Move to Trash" #~ msgstr "Desplaçar al bordilhièr" #~ msgid "Show Deleted Tasks" #~ msgstr "Mostrar los prètzfaches suprimits" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Suprimir los prètzfaches acabats (Ctrl+Sup.)" #~ msgid "Export Tasks..." #~ msgstr "Exportar los prètzfaches" #~ msgid "Import Tasks..." #~ msgstr "Importar los prètzfaches..." #~ msgid "Import and Export" #~ msgstr "Impòrt e Expòrt" #~ msgid "Exit edit mode" #~ msgstr "Sortir del mòde edicion" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Espandir la lista dels prètzfaches a l’aviada" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Nom del calendièr" #~ msgid "Token" #~ msgstr "Geton" #~ msgid "Edit" #~ msgstr "Modificar" #~ msgid "Cancel (Escape)" #~ msgstr "Anullar (Escape)" mrvladus-Errands-7b25a62/po/pl.po000066400000000000000000000276601456072341300167060ustar00rootroot00000000000000# Errands - Polish translate # Copyright (C) 2023 # This file is distributed under the same license as the errands package. # Szymon Zielonka , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-09-21 22:01+0200\n" "Last-Translator: Szymon Zielonka \n" "Language-Team: \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 " "|| n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.3.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Wyczyść" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Motyw aplikacji" #: errands/widgets/preferences.py:39 msgid "System" msgstr "System" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Jasny" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Ciemny" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Zadania" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Dodaj nowe podzadanie" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Ukończone:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Jasny" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "Import zadań" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Ustawienia" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Skróty klawiaturowe" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "O Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menu główne" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Anuluj" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "Dodaj nowe zadanie" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Jesteś pewien?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "Zadania zostaną usunięte" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Usuń" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "Zadania wyeksportowane" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "Zadania wyeksportowane" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "Eksport zadań" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "Zamknij kosz" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "Przełącz pasek boczny" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "Usuń zakończone zadania" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Przenieś do góry" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Ukończone:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Dodaj nowe zadanie" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "Wyczyść styl" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "Kopiuj" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "Ukończone:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "Dodaj nowe zadanie" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Skopiowano do schowka" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Oznacz jako ukończone" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Dodaj nowe podzadanie" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Odzyskaj wszystkie" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Opróżnij kosz" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Nie ma usuniętych zadań" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Zadania zostaną usunięte" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Przywróć" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Import zadań" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Szymon Zielonka " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "Zadania zaimportowane" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Ogólne" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Pokarz skróty klawiaturowe" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Zamknij" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Przełącz pasek boczny" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Zarządzaj swoimi zadaniami" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 #, fuzzy msgid "Mark task and sub-tasks as completed" msgstr "Oznacz jako ukończone" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "Import zadań" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Przełącz pasek boczny" #~ msgid "Deleted Tasks" #~ msgstr "Usunięte zadania" #~ msgid "Move to Trash" #~ msgstr "Przenieś do kosza" #~ msgid "Show Deleted Tasks" #~ msgstr "Pokaż usunięte zadania" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Usuń zakończone zadania (Ctrl+Delete)" #~ msgid "Export Tasks..." #~ msgstr "Eksport zadań…" #~ msgid "Import Tasks..." #~ msgstr "Import zadań…" #~ msgid "Import and Export" #~ msgstr "Import i eksport" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Rozwiń podzadania przy uruchamianiu" #~ msgid "Edit" #~ msgstr "Edytuj" mrvladus-Errands-7b25a62/po/pt_BR.po000066400000000000000000000334151456072341300172740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the list package. # FIRST AUTHOR , YEAR. # Vitor Gabriel Gomes , 2023 msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-01-09 09:36-0300\n" "Last-Translator: Guilherme Berbet \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Hoje" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Amanhã" #: errands/widgets/components.py:167 msgid "Now" msgstr "Agora" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Limpar" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Não configurado" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Tema da aplicação" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Claro" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Escuro" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Tarefas" #: errands/widgets/preferences.py:83 #, fuzzy msgid "Click Action" msgstr "Clique no botão \"+\"" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Adicionar nova sub-tarefa" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Completado %" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizar" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Desabilitado" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Provedor de sincronização" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL do servidor" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Nome de usuário" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Senha" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Teste" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Teste de conexão" #: errands/widgets/preferences.py:171 #, fuzzy msgid "Details Panel" msgstr "Nenhum Detalhe" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Claro" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Conectado" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Não é possível conectar" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Importar Listas" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Adicionar listas" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Mais opções" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizar / Buscar tarefas" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferências" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Atalhos do teclado" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Sobre o Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Menu principal" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Novo nome da lista" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Adicionar listas" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Cancelar" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Adicionar" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Adicionar nova lista" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Clique no botão \"+\"" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Tem certeza?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "A lista será excluída permanentemente" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Deletar" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Novo nome" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Renomear lista" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Salvar" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Falha na exportação" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Exportado" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Renomear" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Exportar" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menu" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Lixeira" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Alternar barra lateral" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Deletar tarefas concluídas" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Rolar para cima" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Completado:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Adicionar nova tarefa" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Nenhum Detalhe" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Clique na tarefa para mostrar mais informações" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Estilo claro" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Texto" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Copiar Texto" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Notas" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Propriedades" #: errands/widgets/details.py:176 msgid "Start" msgstr "Iniciar" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Definir Data" #: errands/widgets/details.py:197 msgid "Due" msgstr "Devido" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Completado %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioridade" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Etiquetas" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Adicionar Etiquetas" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Salvar tarefa como arquivo .ics" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Copiado para a área de transferência" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Marcar como concluído" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Expandir / Dobrar" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 #, fuzzy msgid "Details" msgstr "Nenhum Detalhe" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Adicionar nova sub-tarefa" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Restaurar tudo" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Lixeira vazia" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Não há itens deletados" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "As tarefas serão excluídas permanentemente" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Restaurar" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Sem listas de tarefas" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Criar lista" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Adicionar listas" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "" "Leandro Cunha \n" "Guilherme Berbet " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "A sincronização está desativada" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importado" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Nem todas as credenciais de sincronização são fornecidas. Por favor, " "verifique as configurações." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Não é possível conectar-se ao servidor CalDAV em:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Geral" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar atalhos do teclado" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Sair" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Nenhum Detalhe" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Gerencie suas tarefas" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "recados;tarefas;lista;fazer;todos;caldav;nextcloud;sincronizar;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Aplicativo Todo para quem prefere simplicidade." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Características:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Suporte para múltiplas listas de tarefas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Adicione, remova, edite tarefas e subtarefas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Marcar tarefas e subtarefas como concluídas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Adicione cores de destaque para cada tarefa" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sincronize tarefas com Nextcloud ou outros provedores CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Suporte para arrastar e soltar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importar arquivo .ics" #~ msgid "Create" #~ msgstr "Criar" #~ msgid "Load" #~ msgstr "Carregar" #~ msgid "Click for Details" #~ msgstr "Clique para detalhes" #~ msgid "Toggle sidebar" #~ msgstr "Alternar barra lateral" #, fuzzy #~ msgid "End" #~ msgstr "Errands" #~ msgid "Export Cancelled" #~ msgstr "Exportação cancelada" #~ msgid "Error" #~ msgstr "Erro" #~ msgid "Import Cancelled" #~ msgstr "Importação cancelada" #~ msgid "Invalid File" #~ msgstr "Arquivo inválido" #~ msgid "Deleted Tasks" #~ msgstr "Tarefas apagadas" #~ msgid "Move to Trash" #~ msgstr "Mover para lixeira" #~ msgid "Show Deleted Tasks" #~ msgstr "Mostrar itens deletados" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Deletar tarefas concluídas (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Sincronização/busca de tarefas (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Exportar Tarefas..." #~ msgid "Import Tasks..." #~ msgstr "Importar Tarefas..." #~ msgid "Import and Export" #~ msgstr "Importar e exportar" #~ msgid "Exit edit mode" #~ msgstr "Sair do modo de edição" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Expandir subtarefas na inicialização" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Nome do calendário (\"Errands\" por padrão)" #~ msgid "Token" #~ msgstr "Token" #~ msgid "Edit" #~ msgstr "Editar" #~ msgid "Cancel (Escape)" #~ msgstr "Cancelar (Escapar)" mrvladus-Errands-7b25a62/po/ru.po000066400000000000000000000334761456072341300167230ustar00rootroot00000000000000# Errands. # Copyright (C) 2023 # This file is distributed under the same license as the list package. # Vlad Krupinski , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-07-07 16:56+0300\n" "Last-Translator: Vlad Krupinskii \n" "Language-Team: \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=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Poedit 3.3.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Сегодня" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Завтра" #: errands/widgets/components.py:167 msgid "Now" msgstr "Сейчас" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Очистить" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Не задано" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Тема" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Системная" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Светлая" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Темная" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Задачи" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Действие при клике" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Показать подробности" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Показать подзадачи" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Размер кнопки выполнения" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Маленький" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Большой" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "Панель прогресса" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "Панель инструментов" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Синхронизация" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Отключено" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Способ синхронизации" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL сервера" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Имя пользователя" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Пароль" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Тест" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Тест соединения" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Панель подробностей" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Позиция" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Слева" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Справа" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Внешний вид" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Соединено" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Соединение не удалось" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Дела" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Импортировать список" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Добавить список (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Больше опций" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Синхронизировать задачи" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Параметры" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "О приложении" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Главное меню" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Синхронизация..." #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Новое имя списка" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Добавить список" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Отмена" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Довавить" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Добавить новый список" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Нажмите на кнопку \"+\"" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Вы уверены?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Список будет безвозвратно удален" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Удалить" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Новое имя" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Переименовать список" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Сохранить" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Экспорт не удался" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Экспортировано" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Переименовать" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Экспорт" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Меню" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Корзина" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Переключить боковую панель" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Удалить выполненные задачи" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Прокрутить вверх" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Выполнено:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Добавьте задачу" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Нет подробностей" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Кликните на задачу, чтобы показать больше информации" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Отчистить цвет" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Текст" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Копировать" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Заметки" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Свойства" #: errands/widgets/details.py:176 msgid "Start" msgstr "Начало" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Задать дату" #: errands/widgets/details.py:197 msgid "Due" msgstr "Конец" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Процент выполнения" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Приоритет" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Метки" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Добавить метку" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Сохранить задачу как .ics файл" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Скопировано в буфер обмена" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Пометить как выполненное" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Раскрыть / Свернуть" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Подробности" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Добавьте подзадачу" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Восстановить всё" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Корзина пуста" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Нет удаленных задач" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Задачи будут безвозвратно удалены" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Восстановить" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Нет списков задач" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Создать список" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Списки" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Vlad Krupinski " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Синхронизация отключена" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Импортировано" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Не все данные для синхронизации предоставлены. Проверьте настройки." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Невозможно подключиться к CalDAV серверу по адресу:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Основные" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Комбинации клавиш" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Выйти" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Показать/Скрыть подробности" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Управляйте своими задачами" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;дела;задачи;лист;caldav;nextcloud;sync" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Список задач для тех, кто предпочитает простоту." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Главные функции:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Поддержка нескольких списков" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Добавляйте, удаляйте, редактируйте задачи и подзадачи" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Помечайте задачи как выполненные" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Добавляйте цвета к задачам" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Синхронизируйте задачи с Nextcloud или другими CalDAV провайдерами" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Поддержка Drag and Drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Импорт .ics файлов"mrvladus-Errands-7b25a62/po/tr.po000066400000000000000000000335041456072341300167120ustar00rootroot00000000000000# Turkish translation for io.github.mrvladus.errands. # Copyright (C) 2023 io.github.mrvladus.errands's copyright holder # This file is distributed under the same license as the io.github.mrvladus.errands package. # # Sabri Ünal , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-12-29 18:59+0300\n" "Last-Translator: Sabri Ünal \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Bugün" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Yarın" #: errands/widgets/components.py:167 msgid "Now" msgstr "Şimdi" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Temizle" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Ayarlanmadı" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Uygulama Teması" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Sistem" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Açık" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Koyu" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Görevler" #: errands/widgets/preferences.py:83 #, fuzzy msgid "Click Action" msgstr "\"+\" düğmesine tıklayın" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "Yeni Alt Görev Ekle" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "Tamamlanma Yüzdesi" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Eşzamanla" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Devre dışı" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Eşzamanlama Sağlayıcı" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Sunucu URL" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Kullanıcı adı" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Parola" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Sına" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Bağlantıyı Sına" #: errands/widgets/preferences.py:171 #, fuzzy msgid "Details Panel" msgstr "Ayrıntı Yok" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "Açık" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Bağlandı" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Bağlanamadı" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Listeyi İçe Aktar" #: errands/widgets/sidebar.py:80 #, fuzzy msgid "Add List (Ctrl+A)" msgstr "Liste Ekle" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Daha Çok Seçenek" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Görevleri Eşzamanla/Getir" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Tercihler" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Errands Hakkında" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Ana Menü" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Yeni Liste Adı" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Liste Ekle" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "İptal" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Ekle" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Yeni Liste Ekle" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "\"+\" düğmesine tıklayın" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Emin misiniz?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Liste kalıcı olarak silinecek" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Sil" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Yeni Ad" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Listeyi Yeniden Adlandır" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Kaydet" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Dışa aktarılamadı" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Dışa Aktarıldı" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Yeniden Adlandır" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Dışa Aktar" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Menü" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Çöpe Taşı" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Kenar Çubuğunu Aç/Kapat" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Tamamlanan Görevleri Sil" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Yukarı Kaydır" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Tamamlandı:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Yeni Görev Ekle" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Ayrıntı Yok" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Daha fazla bilgi için göreve tıklayın" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Biçemi Temizle" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Metin" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Metni Kopyala" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Notlar" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Özellikler" #: errands/widgets/details.py:176 msgid "Start" msgstr "Başlangıç" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Tarih Ayarla" #: errands/widgets/details.py:197 msgid "Due" msgstr "Tamamlanma" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Tamamlanma Yüzdesi" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Öncelik" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Etiketler" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Etiket Ekle" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Görevi .ics dosyası olarak kaydet" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Panoya Kopyalandı" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Tamamlanmadı Olarak İmle" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Genişlet / Katla" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 #, fuzzy msgid "Details" msgstr "Ayrıntı Yok" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Yeni Alt Görev Ekle" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Tümünü Geri Yükle" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Çöpü Boşalt" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Silinmiş öge yok" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Görevler kalıcı olarak silinecek" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Geri Yükle" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Görev Listesi Yok" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "Listeyi Yeniden Adlandır" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Liste Ekle" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Sabri Ünal " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Eşzamanlama devre dışı" #: errands/widgets/window.py:212 msgid "Imported" msgstr "İçe Aktarıldı" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Tüm eşzamanlama kimlik bilgileri sağlanmadı. Lütfen ayarları denetleyin." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV sunucusuna bağlanılamıyor:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Genel" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Klavye kısayollarını göster" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Çık" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "Ayrıntı Yok" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Görevlerinizi yönetin" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;görevler;görev;yapılacak;işler;caldav;nexcloud;sync;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Sadeliği tercih edenler için yapılacaklar uygulaması." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Özellikler:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Çoklu görev listesi desteği" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Görev ve alt görev ekleme, kaldırma, düzenleme" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Görev ve alt görevleri tamamlandı olarak imleme" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Her görev için vurgu rengi ekleme" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Nextcloud ya da diğer CalDAV sağlayıcıları ile görevleri eşzamanlama" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Sürükle ve Bırak desteği" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr ".ics dosyalarını içe aktarma" #~ msgid "Create" #~ msgstr "Oluştur" #~ msgid "Load" #~ msgstr "Yükle" #~ msgid "Click for Details" #~ msgstr "Ayrıntılar İçin Tıklayın" #~ msgid "Toggle sidebar" #~ msgstr "Kenar çubuğu aç/kapat" #~ msgid "End" #~ msgstr "Bitiş" #, fuzzy #~| msgid "Errands" #~ msgid "errands" #~ msgstr "Errands" #~ msgid "Export Cancelled" #~ msgstr "Dışa Aktarma İptal Edildi" #~ msgid "Error" #~ msgstr "Hata" #~ msgid "Import Cancelled" #~ msgstr "İçe Aktarma İptal Edildi" #~ msgid "Invalid File" #~ msgstr "Geçersiz Dosya" #~ msgid "Deleted Tasks" #~ msgstr "Silinmiş Görevler" #~ msgid "Move to Trash" #~ msgstr "Çöpe Taşı" #~ msgid "Show Deleted Tasks" #~ msgstr "Silinmiş Görevleri Göster" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Tamamlanmış Görevleri Sil (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Görevleri Eşzamanla/Getir (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Görevleri Dışa Aktar..." #~ msgid "Import Tasks..." #~ msgstr "Görevleri İçe Aktar..." #~ msgid "Import and Export" #~ msgstr "Aktarma" #~ msgid "Exit edit mode" #~ msgstr "Düzenleme kipinden çık" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Başlangıçta Alt Görevleri Genişlet" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Takvim Adı (\"Errands\" Öntanımlı)" #~ msgid "Token" #~ msgstr "Jeton" #~ msgid "Edit" #~ msgstr "Düzenle" #~ msgid "Cancel (Escape)" #~ msgstr "İptal (Esc)" mrvladus-Errands-7b25a62/po/uk.po000066400000000000000000000401671456072341300167070ustar00rootroot00000000000000# Ukrainian translation for Errands. # Copyright (C) 2023-2024 THE Errands'S COPYRIGHT HOLDER # This file is distributed under the same license as the Errands package. # volkov , 2023-2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: https://github.com/mrvladus/Errands/issues\n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2024-02-06 17:56+0200\n" "Last-Translator: volkov \n" "Language-Team: volkov \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "Сьогодні" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "Завтра" #: errands/widgets/components.py:167 msgid "Now" msgstr "Зараз" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Очистити" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "Не встановлено" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Стиль додатку" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Використовувати системний стиль" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Світлий стиль" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Темний стиль" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "Задачі" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Дія при натисканні" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Відкрити панель подробиць" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Показати підзадачі" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Розмір кнопки завершеності задачі" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Маленький" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Великий" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "Індикатор виконання" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "Панель інструменту" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Сінхронізація" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Немає / Вимкнено" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Постачальник синхронізації" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "URL-адреса сервера" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Ім'я користувача" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Пароль" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Протестувати" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Протестувати з'єднання" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Панель подробиць" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Розташування" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Зліва" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Справа" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Зовнішній вигляд" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "З'єднаний" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Не вдалося з'єднатися" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 msgid "Import List" msgstr "Імпортувати список" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Додати список (Ctrl+A)" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Більше опцій" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Синхронізувати / отримати задачі" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Налаштування" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Клавіатурні скорочення" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Про Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Головне меню" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Синхронізація…" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Назва нового списку" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Додати список" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Скасувати" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Додати" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Додати новий список" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Натисніть на \"+\" кнопку" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Ви впевнені?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Список буде видалено назавжди" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Видалити" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Нова назва" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Перейменувати список" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Зберегти" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Не вдалося експортувати" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Експортовано" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Перейменувати" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Експортувати" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Меню" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 msgid "Trash" msgstr "Видалити" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 msgid "Toggle Sidebar" msgstr "Показати / сховати бічну панель" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Видалити завершені задачі" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Прокрутити вгору" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Завершено:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Додати нову задачу" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Немає подробиць" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Клацніть на задачу щоб побачити більше інформації" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Очистити стиль" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Текст" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Скопіювати текст" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Примітки" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Властивості" #: errands/widgets/details.py:176 msgid "Start" msgstr "Розпочати" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Встановити дату" #: errands/widgets/details.py:197 msgid "Due" msgstr "До" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Відсоток завершення %" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Пріоритет" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Теги" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Додати тег" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Зберегти задачу як .ics файл" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Скопійовано в буфер обміну" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Позначити як завершене" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Розкрити / сховати" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Подробиці" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Додати нову підзадачу" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Відновити усі" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Смітник порожній" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "Немає видалених задач" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "Задачі будуть видалені назавжди" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Відновити" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Немає списків із задачами" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Створити список" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Списки" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "volkov " #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Синхронізація вимкнена" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Імпортовано" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Надано не всі облікові дані синхронізації. Будь ласка, перевірте " "налаштування." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "Не вдалося з'єднатися з CalDAV сервером за адресою:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Загальні" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Показати клавіатурні скорочення" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Вийти" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Перемкнути подробиці" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Керуйте вашими задачами" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;tasks;list;todo;todos;caldav;nextcloud;sync;справи;туду;список;" "записати;задачі;синхронізація;некстклауд;нєкстклауд;кальдав;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "" "Додаток для керуваннями списками справ для тих хто віддає перевагу простоті." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Можливості:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Підтримка кількох списків задач" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Додавання, видалення і редагування для задач і підзадач" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Позначити задачу і підзадачу як завершену" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Додавання акцентованих кольорів для кожної задачі" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Синхронізація з Nextcloud та іншими постачальниками CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Підтримка перетягування до вікна" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Імпортуват .ics файлів" #~ msgid "Create" #~ msgstr "Створити" #~ msgid "Load" #~ msgstr "Завантажити" #~ msgid "Click for Details" #~ msgstr "Клацніть для подробиць" #~ msgid "Toggle sidebar" #~ msgstr "Показати / сховати бічну панель" #~ msgid "Export Cancelled" #~ msgstr "Експорт скасовано" #~ msgid "Error" #~ msgstr "Помилка" #~ msgid "Import Cancelled" #~ msgstr "Імпорт скасовано" #~ msgid "Invalid File" #~ msgstr "Не правильний файл" #~ msgid "Deleted Tasks" #~ msgstr "Видалені задачі" #~ msgid "Move to Trash" #~ msgstr "Пересунути у смітник" #~ msgid "Show Deleted Tasks" #~ msgstr "Показати видалені задачі" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "Видалити завершені задачі (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "Синхронізувати/Отримати задачі (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "Експортувати задачі..." #~ msgid "Import Tasks..." #~ msgstr "Імпортувати задачі..." #~ msgid "Import and Export" #~ msgstr "Імпорт і експорт" #~ msgid "Exit edit mode" #~ msgstr "Вийти із режиму редагування" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "Розгортати підзавдання при запуску додатку" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "Назва календарю ('Errands' за замовчуванням)" #~ msgid "Token" #~ msgstr "Токен" #~ msgid "Edit" #~ msgstr "Редагувати" #~ msgid "Cancel (Escape)" #~ msgstr "Скасувати (Escape)" mrvladus-Errands-7b25a62/po/zh_CN.po000066400000000000000000000311151456072341300172620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: 2023-12-20 16:05+0800\n" "Last-Translator: Petalzu \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.1\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "清除" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "主题" #: errands/widgets/preferences.py:39 msgid "System" msgstr "系统配色" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "亮配色" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "暗配色" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "任务" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "添加新子项目" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "已完成:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同步" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "关闭" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "同步服务" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "服务器链接" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "用户名" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "密码" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "测试" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "测试连接" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "亮配色" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "导入任务" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "同步/抓取任务" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "偏好设置" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "关于 Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "主菜单" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "取消" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "添加新任务" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "您确定吗?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "待办任务将会被永久删除" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "删除" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "导出取消" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "任务导出" #: errands/widgets/sidebar.py:477 #, fuzzy msgid "Rename" msgstr "用户名" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "导出任务" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "菜单" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "关闭垃圾桶" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "侧边栏" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "删除已完成任务" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "向上滚动" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "已完成:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "添加新任务" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "清空格式" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "复制" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "已完成:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "添加新任务" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "复制到剪贴板" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "标注为已完成" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "添加新子项目" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "全部恢复" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "清空垃圾桶" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "没有删除的任务" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "待办任务将会被永久删除" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "还原" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "导入任务" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "翻译者名单" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "任务导入" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "未提供所有同步凭据。请检查设置。" #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "无法连接以下 CalDAV 服务器:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "一般选项" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "显示键盘快捷键" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "退出" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "侧边栏" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "管理任务" #: data/io.github.mrvladus.List.desktop.in.in:10 #, fuzzy msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;任务;列表;待办;todos;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "代办软件适用于喜欢简单的人。" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "特性:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "添加,移除,编辑任务和子任务" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "标注任务和子任务为已完成" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "为每个任务添加强调色" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "通过 Nextcloud 或其他 CalDAV 服务同步任务" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "支持拖放" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "导入任务" #~ msgid "Toggle sidebar" #~ msgstr "侧边栏" #~ msgid "Error" #~ msgstr "错误" #~ msgid "Import Cancelled" #~ msgstr "导入取消" #~ msgid "Invalid File" #~ msgstr "无效文件" #~ msgid "Deleted Tasks" #~ msgstr "删除的任务" #~ msgid "Move to Trash" #~ msgstr "移至垃圾桶" #~ msgid "Show Deleted Tasks" #~ msgstr "显示删除的任务" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "删除已完成任务(Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "同步/抓取任务(Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "导出任务…" #~ msgid "Import Tasks..." #~ msgstr "导入任务…" #~ msgid "Import and Export" #~ msgstr "导入和导出" #~ msgid "Exit edit mode" #~ msgstr "退出编辑模式" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "启动时展开子任务" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "日历名(默认为”Errands“)" #~ msgid "Token" #~ msgstr "标志" #~ msgid "Edit" #~ msgstr "编译" #~ msgid "Cancel (Escape)" #~ msgstr "取消(ESC)" mrvladus-Errands-7b25a62/po/zh_TW.po000066400000000000000000000314641456072341300173230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-02-06 17:58+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Chung-Wei Chung \n" "Language-Team: LANGUAGE \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: errands/widgets/components.py:153 msgid "Today" msgstr "" #: errands/widgets/components.py:157 msgid "Tomorrow" msgstr "" #: errands/widgets/components.py:167 msgid "Now" msgstr "" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "清除" #. Start date row #. End date row #: errands/widgets/components.py:231 errands/widgets/details.py:176 #: errands/widgets/details.py:197 msgid "Not Set" msgstr "" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "主題風格" #: errands/widgets/preferences.py:39 msgid "System" msgstr "跟隨系統配色" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "亮色" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "暗色" #. Task lists group #. task_list_group = Adw.PreferencesGroup(title=_("Task Lists")) #. add_tasks_position = Adw.ComboRow( #. title=_("Add new Tasks"), #. model=Gtk.StringList.new([_("At the Top"), _("At the Bottom")]), #. icon_name="errands-add-symbolic", #. ) #. task_list_group.add(add_tasks_position) #. Tasks group #: errands/widgets/preferences.py:80 errands/widgets/window.py:91 msgid "Tasks" msgstr "待辦事項" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "" #: errands/widgets/preferences.py:84 #, fuzzy msgid "Show Sub-Tasks" msgstr "新增子項目" #: errands/widgets/preferences.py:99 #, fuzzy msgid "Complete Button Size" msgstr "已完成:" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同步" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "關閉" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "同步服務" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "伺服器 URL" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "帳號" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "密碼" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "測試" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "測試連線" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "" #: errands/widgets/preferences.py:175 #, fuzzy msgid "Right" msgstr "亮色" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "" #: errands/widgets/sidebar.py:67 errands/widgets/window.py:38 #: errands/widgets/window.py:129 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:27 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:75 #, fuzzy msgid "Import List" msgstr "匯入待辦事項" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "" #. top_section.append(_("Secret Notes"), "app.secret_notes") #: errands/widgets/sidebar.py:99 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "同步待辦事項" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "偏好設定" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "關於 Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "主選單" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "取消" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "" #: errands/widgets/sidebar.py:168 #, fuzzy msgid "Add new List" msgstr "新增待辦事項" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "您確定嗎?" #: errands/widgets/sidebar.py:338 #, fuzzy msgid "List will be permanently deleted" msgstr "待辦事項將會永久刪除" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "刪除" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "" #: errands/widgets/sidebar.py:444 #, fuzzy msgid "Export failed" msgstr "待辦事項已匯入" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 #, fuzzy msgid "Exported" msgstr "待辦事項已匯入" #: errands/widgets/sidebar.py:477 #, fuzzy msgid "Rename" msgstr "帳號" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 #, fuzzy msgid "Export" msgstr "匯出待辦事項" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "選單" #: errands/widgets/sidebar.py:563 errands/widgets/trash.py:30 #: errands/widgets/window.py:61 #, fuzzy msgid "Trash" msgstr "關閉垃圾桶" #: errands/widgets/task_list.py:40 errands/widgets/task_list.py:55 #: errands/widgets/task_list.py:96 errands/widgets/task_list.py:107 #, fuzzy msgid "Toggle Sidebar" msgstr "側選單開關" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 #, fuzzy msgid "Delete Completed Tasks" msgstr "刪除已完成事項" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "往上捲動" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "已完成:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "新增待辦事項" #: errands/widgets/details.py:63 msgid "No Details" msgstr "" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "" #: errands/widgets/details.py:81 #, fuzzy msgid "Clear Style" msgstr "移除顏色" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "" #: errands/widgets/details.py:124 errands/widgets/details.py:166 #, fuzzy msgid "Copy Text" msgstr "複製" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "" #: errands/widgets/details.py:176 msgid "Start" msgstr "" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "" #: errands/widgets/details.py:197 msgid "Due" msgstr "" #. Complete % row #: errands/widgets/details.py:212 #, fuzzy msgid "Complete %" msgstr "已完成:" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "" #. Tags entry #: errands/widgets/details.py:234 #, fuzzy msgid "Add Tag" msgstr "新增待辦事項" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "已複製到剪貼簿" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "標註爲完成" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "新增子項目" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "全部復原" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "清空垃圾桶" #: errands/widgets/trash.py:52 msgid "No deleted items" msgstr "沒有已刪除的項目" #: errands/widgets/trash.py:132 msgid "Tasks will be permanently deleted" msgstr "待辦事項將會永久刪除" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "還原" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:69 #, fuzzy msgid "Create List" msgstr "匯入待辦事項" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "翻譯者名單" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:212 #, fuzzy msgid "Imported" msgstr "待辦事項已匯入" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "沒有提供全部的驗證資訊。請檢查設定值。" #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "無法連線到以下的 CalDAV 伺服器:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "一般功能" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "顯示鍵盤快捷鍵" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "離開" #: data/resources/gtk/help-overlay.ui:72 #, fuzzy msgid "Toggle Details" msgstr "側選單開關" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "管理待辦事項" #: data/io.github.mrvladus.List.desktop.in.in:10 #, fuzzy msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;待辦事項;清單;工作項目;todos;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "為簡潔而生的待辦事項軟體" #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "功能:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "新增、移除、編輯待辦事項和子項目" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "把待辦事項和子項目標記爲已完成" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "為每個待辦事項新增強調色" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "透過 Nextcloud 或其他 CalDAV 服務同步待辦事項" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "支援拖拉" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 #, fuzzy msgid "Import .ics files" msgstr "匯入待辦事項" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "側選單開關" #~ msgid "Export Cancelled" #~ msgstr "匯出已取消" #~ msgid "Error" #~ msgstr "發生錯誤" #~ msgid "Import Cancelled" #~ msgstr "匯入已取消" #~ msgid "Invalid File" #~ msgstr "不支援的檔案" #~ msgid "Deleted Tasks" #~ msgstr "已刪除的待辦事項" #~ msgid "Move to Trash" #~ msgstr "移到垃圾桶" #~ msgid "Show Deleted Tasks" #~ msgstr "顯示刪除項目" #~ msgid "Delete Completed Tasks (Ctrl+Delete)" #~ msgstr "刪除已完成項目 (Ctrl+Delete)" #~ msgid "Sync/Fetch Tasks (Ctrl+S)" #~ msgstr "同步/擷取待辦事項 (Ctrl+S)" #~ msgid "Export Tasks..." #~ msgstr "匯出待辦事項..." #~ msgid "Import Tasks..." #~ msgstr "匯入待辦事項..." #~ msgid "Import and Export" #~ msgstr "匯入和匯出" #~ msgid "Exit edit mode" #~ msgstr "離開編輯模式" #~ msgid "Expand Sub-Tasks on Startup" #~ msgstr "開啟應用程式後展開子項目" #~ msgid "Calendar Name (\"Errands\" by Default)" #~ msgstr "日曆名稱 (預設為 \"Errands\")" #~ msgid "Token" #~ msgstr "權杖" #~ msgid "Edit" #~ msgstr "編輯" #~ msgid "Cancel (Escape)" #~ msgstr "取消 (ESC)" mrvladus-Errands-7b25a62/screenshots/000077500000000000000000000000001456072341300176425ustar00rootroot00000000000000mrvladus-Errands-7b25a62/screenshots/main.png000066400000000000000000001400601456072341300212750ustar00rootroot00000000000000PNG  IHDRb6%sBIT|dtEXtSoftwaregnome-screenshot>.iTXtCreation TimeВт 06 фев 2024 18:50:07{ IDATxy;$ ð VR*U{?xjjU =U(ՊEKEeG93̞L'?LflY\ɳ.ɝ"ڝ)$!>S@2ǺdBh<|N4Ц  uyhNCgB f:[/3! dԡL2HvI$[Xl$Q(,EL^c {xmMm-ٯMttƞXžMLl'֙1 H&фF'#ɫL'Js֡MCR)ALxm x1 0V alR-ZtqnZ~5 `ԷoXtJ&yu ,XzVm(aLW@P# ]B0'ntdh%E~4 u32_-],!R-Z;׆a$?DDyyy.wΝ;{VKӿZDiiCEZא -Ԫ%PH E%:ƢaLu:WK0@2 O~~C}WaLhx>ox0FI 1> M!Lq69rEy' 4уTn:FkC3o,+Pؾq|cD t70.sY,`h999l߾IN2$;{zsr{&Z45@oSa"2c{罹^E@2dogϞ=@ug,)inHeLGa"(t!ZUw^1@a UUUJΞ:ho`90VདƊ {H/-b j"2$Y.\x! t:z'NRmc@H4FGb:"i7TSH͑>6 qȑ#:rH4`$UR!LSݒa/%u0-v}k:҂ d:tH8pnFuY t:ĺT\.]wu>HN3egg%i0+M\kR$W&Һ?u/0 Cw͛9Rڴi^o˫ph8pRRRb] v>uq!ZD;q4[Ø$~<PqgΝڰa4UYfƍ28v오fIR.?Gs.׫kFӦM n7 CG}GꤓNҴit9 uתDVRZZn]uUQcG/b9N-[L555k4}1.Ksʕ+K/Tn:편0 !#˥E HMi(D1+lIhnӮaM}ih{HS[GZf:tvء'zgϞziٲeӧ5o2H*..n0vXխ|Cٛ= .k hB[4ֿ ѣz) 2DV">JJJ[o^7,IڼyY}] 0@k̙7x5_u=cz$I_[OwyG=nIҦM$I˕W^yEO=.f}>\.***Z||EE\.WkJ9ST'wX1MZJ:R kժU8qƍHWu=k3g.RYV3<ܧ{1cN?tId$i2 CcǎZC?$i޽uշo`K>tdpH='|R^s2Lwĉ;-^…nL&G |IhlP.x<IRjjj%L l6ķb>osg𤭧J۔qŋ)H+VЬY4eM2%$@@X/^),,e24cƌvѣG% (??_vZp]`ݻ7'|ږ}wqvV^-߯*//WFF֭['I0`@DիW;f֭[[|>gm&9322Z{h74iP'QZĴ!L8"0csՇ~(I>}\c۶m>}>vbBZJOzOjJOOוW^ŋdv@y<}WjǧjMi*4l07QVV}QmݺU}Qn. ) bY{vqJou8q?|?TϞ=5gΜg͚kÆ *,,T.]4~xtM]pr8Zr<Jxk\./t:#Dk֬믿+55Uyyyzۢ)ltSQ}>:guVt}5yLwk>/=^}ݻwٳ .ŋգG&kH<o߮JI֭[5|XԘ<}W9s|IL&ݻsG5Y@sš:"&˜D ay:駟*'H5nРA ZfﯡCj˖-zwduM7?\G[l믿SO=Ucǎ$=Zz z39rD?p2ۭBBݔ|>_&˗/:\G۶m q\ھ}1Gc޽{5sLL&ٳG={ԣ>ڪs#1'ޮ|T!$\βbHҳ>/ׇ֔)Snݺ:A$ꫲl_W_}U[lرcwis='ժ^ . {y^ >\SN7%MTtS{{iĈo~z7NCuiL%駟.l˖1a4=;;[g1RzOQCI1)))CHwڥꫯTVV&߯:deeUii$i߾}38#1N3x`eddhŊ1c}@rrr]B}ڶmfΜ)03иqtȑ.Jffn.\ݻA$HNNrm۶-ݔbZebQg[fq[>{?i$I 14GCX/((=ܣs=u]Gill,͛7O+WjҥZ|?SNi[4h~= n߳gF^>Ori>-q /ls a@#alnJqqfΜDŽ9p~͞=[]vmhP4iR0I&۷oWuuƎѣGGz>GkCzu]rϟI&0 }m.Ɲs9ZhQNݻW UPPᄏ+輾+UVV*55U#F˜TUUUiǎZcSK?fٚ={hչALL`t}E=xU`F$ZRTc 0 P~ҥKw^=c=zRSS|Q VnJa$) 6fӛfiꫯ:fktvݻwkzG_fϞx@wnh\1-$z%{/ȑ#5yd}Zd=\Gv<=̙-[f顇s=xԵkW}gTNN?Scƌ:A"֛B߿_o1[n4R79shHyyyzg*<{9qm~^ϧy[om۷O۷oW\Ѧ޺]oֹXKw1a{%ɼMGo71ޗ]j֬Yu֝׃ٳ/ -Iƍk؎1MiȐ!u]wIYlȐ!Zq1YFEEEQntK..C|>-_\jչ瞫N::>}YWZZիWرcV^t(==X,JIIiV)))KX1*@'N>]RmfӣG]q:uj{֨@7>Ж0MM7sٷoV\ &W^***aʕ6lXCfYSLQQQ.\op6N&Lj3TNN<6nܨ˗/ozy؄'q*&N WN"~Pf߮o=֥D%M)RmswpUaZl u=>'''UEVPPAy^vڥnI&I:Scǎ- ^JJJ|^4I e˖F]tQMM$Ro&NX'h*--UzzzMzo&QPP^zd|u}嗌 !8x1͑*FUŕv |E Z&555zuW{ڳg>x㍲X,z3ft۷?M7ݤL}Zb~H4|p]x*(({ァn΀.K|򉮽ZeeeiZj.ٳGwrsso„ tW+;;[޽{%~1bDFt:|wƇ [oرcJKKӀ ^l6eLzzz0 JKKSiii>.][̜|Z~ ճgOC ѪUAaÆfspV\eeeѣׯ_UVVjҥjg(|늴ÇյkWeggK Y,:zr8v7P:tᮿzy<ٳGK,Q>}] 9l6\fX ΛbLS3nݺvk߿>NLuˆaY6ͲZކv[W]uUu7߷~]tQYY=z4bw-0T\\hW.v!ChӦM*++#0,222fYE6-#%s @dzZ:'oaY^zꥂ9rDRm0ԭ[]oΝ"UTT[Șfy^檴T~V<B~zҡC;v,ƍk5h ^Z~_ڹs V#GgϞLJ),, nۧ&CGERnݔluMYYYiN;4id2ԭ[7]tEԥ^%K)==]'Nܲۧup+9r׿jĉ8q/_ufiȑ4h8 -[L۷oUW]~\rl6gϞȐ$UWWkׯ_Y&L>L~Dl0555ZvaW\QERny#m7<#,c9.xXN<[Ol6dALZ `''[/@fYVY,Y,L@&@ a Ðdl6t:.q0 y<UUUvnjd2[~A $@hcn$)++KV++l p8zU^^.׫>11!+˥uڕ XVuU)))r\}H.1 DŽ1 CJOOWjjj +@k*==]u0&)$0vt:p8b]ڀ)ƌAO@ԁy%)---e^oDdB &+IFFFK@;Ȑu)h1[|>Y,lW`dXhb !I.55U' yh7[n-ܢ͛7Ǻ'Ўv{EL@Ν"iܹ.')O[hl63ura6R\\~[[lQII4tP|JOO̙3u%袋.I}?5~x]s51> 'd2Ÿ"'bpDbڀ#<W222tqر#n3f 2dn62Lb]NA?a΁Dvޭ=SX,.]U1yX$tg襗^uP:' AL|ѱcǔ~v*''GӦMi&/… 矫TzMI̙3uhڳgiӦiРA5j̙3fKٳG={S[o+Vkܸqڰa|F#h=!C(//O>.\zjɒ%siȐ!zz%Io {/ͦ~8]^~e]SN9EfReee*++ӂ 4e=y7yf5kTPPЖ&@tbڀfc=+B|n6=ڻwop,M>]C QVVxx3fNSntM7)++KVjP1c\}G1cN:$2"b$ALq:5w\s=***_'l999r8֑#G4p 2D}]p]&Ir:B0:c0U.Ƿ6fX4n8͚5K=z_|1GaYo7fRRRZ!>Oa0B7tm{Φ4AL;X,֭[AJ@` 3 CwV^^$X|Iկ_fmFϞ=%I;vXt.YΝQFź{1m믿+-[ѣ:|׿*??_sN;N]tE;wURRW^yEYYY9r$n+??_۶mSyyyUUUiܸq ө .@s7|b͟?? K^ynkРA5kzݬsL:UfϞ-׫#G㒖s=W/5d=#ZSW_?twy+umܸ18H34zW.rHM!ˡC ,Y~"M;/fΜK.D]tQVIIM7|Yݭ9r-7=zЋ/5t޽޺`D*0Uyy:)77'Ȑjb 0(vI|!ƉF,+dY!—!CEZѼͲg蔖.]K/T'NԤIXE$DwСC6lJJJo誫uY3v^|EL&fMJ@.K[nUϞ=u'7ڵk5z舳5}嗪npQp8Z|۷+''G999->H||Lw̙3`jA*++M>wK/T?b]L`$$;wjݺu֭[AaZfN;AKS;ZMMn$ȑ#*++ hfٶmN@'|7*((P^bTALx'[=ZC is/_9\RڵkKj3cƌ ްaݫǰ"BCkٲem+1 رc1brss_oJرC۷oWyyyo߮j8p@6mݻSQQJ[lQiiipΝ;gϞ:n޼Ynݺul}Ν;aڵK^v߯={hƍڹs?๾kܹ3}z5aIbo~DЮ]'ݮoz7{no~i0;5yd-X@K.l? . e"A5 :]v{$iZjʔ)Itg)(([o\.RSShdeeI`hٲe:xz-ժwաC[RRUVoVZZ`&"Fmӯ_?iƍzwu뭷jOWVV/^ɓ'3X lҥ 3b跿.X$A$D T^^ɓ'kܸq5\T+##C]tƍDždh8ӧNp}UEEoN#ժ뤓NY-s~$E&33Sgq<OO_,RgaxfϞ-ϧ & ":lI 8P5j&LŋH:|pp?h]pz;_~y'6,7|Sgvj3fLUjj~m?X 9z/^ph޽Szzzl6]yz7aÆ =zTRm˘{G˖-#Ai1`)d}czCCoj< htjF:f2 C555ٍUVVGʓ)ϧ>}k׮:Sd6ս{w}ҥz)ժ.]4=dRNNN P`]>}dەaÆt*;;[Cu*33SݻwWs::S5$##N'ŢN;M6MCgy ,)--M{:x`}넾'ө^zTuƺᥗ^ ޷o_pL.,U޻l6l6׹Io$-/{v9nן^[1ˡU?| <,''^ W3X#+IIIbPQ [e|>^˙ jٳ^M0!vpAeddjbI n#TO78y2e,+d]r0G f{tF^7֥hjڰaCK@'B0/VXHX,eee1@Zbt:]:A @! 1 tBAb ALkJBBb f2Ў ÐWdğ*$ &IEn;=nY,:H1@ALEEEK@; y@0L2LZxC֮]I&׺ub]N )?0ͲZr8***e @+++SQQVkKRhkB@Ş}Yرc3gN4fsժT@555.QQAA˕*3ʞ. Yg}&04f̘:_^߯nݺi:uj~&Ƅ>Z—kė &ZR&Ĵ!ǣ:l6[I>KӦMS߾}\oZէO͚5K)))ZtfϞSN9ET;+?ի?Gт dZ?I6m#<"áW^^zH3fЄ TTT$Οڵkd2鮻}1~@ndb/<` A}|bТEhѢ:xM0!P'Nwl?яz}ڵkW0ɓuiI&Mŋݻ}]͙3GT;ǒ%K$IEEEz;v222N`$I3g,X:H-cB×6iЅ&yĴӌ3gС^_ZZ%KhСC굸 ˙+á*:tHah)k5j(M:Uƍ_ѣG7}L2$· &NUWW;矯)S(''GwuW3z^!6lٳe}z衇4j(=#~5)>4 qpyĩZ>}zpݻuرf߻woIҶmۂ-]"uQ9rF뮻NӦMSaa3`֤7]KDӆ" k6eۣ>W׮]UYY_Ǐ͛%I={l񩩩K4gTNNN;˵zjyЖ-[p8u Ewȑz駣>W~4}tkzWtYg΋wy^x=%\\IREE/__~Y.KC=Ԣ&@t'Ӧi)d}a9tsqrzu9p5֛4iRp֤VWTRRX vI|!ƉF,+dY!—!C5yx`nz-v]wGѣ&@30F c$A $!t9@ğ@zF(y@ <0@l-f9>pF b A0 fV,,L&SA b 0aF>I.$0ql쩑njd 1I L 1 Cn[_^S DCdI5Ja箒UJJ$iC|b 0a󩺺Z^S\- Z>T<\r8X,2̈́1I>&aG\><&]x!@ qʮ*A*r|Lb NKec\ڒ˰׎[AKI&1`aXv5;b|b ΅|2d?3ːY>V1IxH aoIu)hG~K<$!H~?|zO`Ɂ X^ê޼)5 A $qb Hj_b Os/9@WΉBAvCZ$Ū=t膛nnoksT]vem3 C?h(#wwrUSS#PJ5% N䮮VZ[^W$YVRRHq(1M7N]Sc2 _rH>hm٤~ L&edd|]:_jVUxBBx= |5>kܪ(/jSZF۵.*)é+Vޮlʡ5hȩڭ{L@b yjjTZR,w[dp*ő"&"I2|>yݪr*+եlU(1?i@p;k'k'hmigWjTvk9~&)ףG֬c&ߤ _ _ >{K>Vs<ߦk^ց}{ԭ[2u_΂W%IW|K/JyO;~h1IR˥6̒355fE)RRR˥Rk:v@]e7xlklZF#G%ϧ/V.՚Uf^Mvz+IzgUVZ8O>Wzm {dԫO_'dOqhOSOu45``Oo$T?ů5vr=>뗺֟ .crk_w\.&$1\.?^(IJKKWݢ:ޙ*gjJBǏ>9x`~/fY/~W7\6Q]yMp'XyY|_7xM~84E~XQ7K/=\.ٍƞ g@B"NSS!LFF2Z|.]@zU IDATlT ei7߃VUG5h؈{S^CIu>WU>e%Z'[UQQÇsO?ZM~}lFl|}НoƞK~8Q#FU A tr%%LkB̬,O*-)VvNә\+>ALyedUg'hҔSk è߈wǭ fy}&-z|/5|լ'ZQ c] v*++qfE1]vjƭʊ6;o$Y]p\9iZʈީ8v;YNg|=R<ůF|'ҹ˴qoߒ qFn Yx6GXr\`9xxx*,,\x;IIIb]F[e|>^UcnKKK?{wU}}Ι-}v,"KumUѫjOZj[mB[KV h!@v$c2C I Ʉx3g9p}G=AklT Ш5JcCd)k-%˲d? gFI1I6vkiHlͶڼwu[]04 [f,X/\k׮Mu9H($I}vDۉk+I6`!pnԨZsOAE['uHeYp I0n?15KkKjرꪫ4v.8a9#ߨwtε^k}Q&vLdZV]#vZ]cCwoTEv=N㨢|/c5=bz\~Zӟ~W`;Oo|Gr裏W_տۿ@7nT^^ ۷OtDK.բE/Y?я8nvorɯ~+566W4/~ -[L7tSx@wJKK^?.SKK*++um%(++.׫_]?ukĈs>|g͚5en͚5+%^BB^_\# %0_\ܼ|uX+jllT$?oYcƌQii啕YVR,?oYǏWQQ͛'{ ?xK.$?4|p}$IZbn竸X\s|Cڜ0a`%\x=zJKKukСڲeK?># Um%gH룠8uꤓNRUUѨƏ4aرCwVKKK=eFQ$I---O"IڹslַyhT͝9tP|dill+>@׮] 3t9i]|r܊D#jinV߫47+r@>=ZpXm+k%&vp6K.Ճ>|P˗/׳>vnFꫯ֏~#7Nmw># }U}ْ^o;f'b1=J[;*ʋ핶Ǟ|Ij~r]۶ewy*--MnO4鐶|>***4mڴ{= f6d~^Zg}F?c566Km6UWWwz & &23ԤP8:J uI=^efފqu5zT_WH$r\ZǺ} Ze8߇wWtxnjT+ dHy{t=bzQ$Q0TSS>#zꩧt-0 ~s9{ekɒ%ӕSN9Ewvءf^:L4I=٣*}݊D"G\e]e˖iݺub6kϞ= WSS}Y۷Oox9sлreHjjگ}G3f_chmTSW+Y'ګAOox]j y0]4tXY,K'.kͪz=bz3pžm[oZygE%~o޻G~;n8IvGX4v$QnF=NZ_]~gǘmKl'V볫u9f `HJJJdǺļIhT@@aOQ_Yu5r$]nev{ߖf5*P<_cjjͪI^O'r֨1Tg$i̓T6TeY:U\??FU$9lD~~]s ];+)?@sO?C>H﬍6rXqygj*Y7!rG577'/^¢C~hMڽR>X%qTSG6g#?HOFr\,Ky0}AxHjml<6Ķl{o;_qW@H2~\CPP8r˴,I)( )_Ir{'LBA;pXu_PWW˲,E8mrrMz˿mz֮W%I`0YsN֋+%W|M7yf|%wՆ;kV/jIdHǝ4t }TPPY|`9e$ǻg|T35rGr-{$U ǣ!jjگ@@hD@.sg3=UK1j6jTTO^OW8R ?t8M̶ e!uжMӔjϥQɐa: [wgUҮMom[ s0˭kӆGX5 )ϧ< ae6| TT2Dy}HUf|V*>.۶8jFU2d٭{$Ivv#tx?>$ժieYE*.FU")>Jb;/C$J ՞ݻTSZpHd1]C\SGE%%QmMuk*wT%ehG1U߯ ᆪ7W&4_SVv>?lUٱYy zrGֿ^u,W ><}YR׭քS4z8M2UoR[6oY^q}L|e!ʊ ڴqPz;jWDa_V r[ywr{w.tU :vecɎOUPP̬?VMb$0@9:%#Ʊ8, ~BOb A @?!'1 ~BO\.|9%nj`Ou OiʓOb A @?!'1U [ZFS] rxHu)`b Mb15h4h4p8̬lY0@04 ! @FjHu@b [ZaR$*Ғ20@@C. q?HH-ǐ@Ob5kh˵vTA #vwFպ{R] x1;ҥK;7|m޼+:~psϟvWVVꬳR pˮ-ZH= &M͜9S7n8O /Yn]ׯ_+;;jw-Xr`sƌ3tj֭g>#IP$E[:Sǿ{1cF5{l=#.}`wU^{9=VsOwcXL>;]pѥThii] 4P񐡚>dy.Oոk>c|rrr^oGhzРI&oСC%I^z]SN$}Ǻ曵b IowPAAN?t}ߐ_믿p8sj…hWCiiʴaÆdok֬Y;w.9#08֯_/ݪѢEK /hӦMZxOMMM馛^W]uU}T'UXT];w(ɲTkXL tҤ{vuxERk/ď6=Ut]nw]CzQ$Q0HT^^p8 &t3gnM!$Iu5zgu?sʝڼiZZUXT*(ٶU 47˟I1cKSUSׯScc229jLyH[pX/>FSqM}1/ֿ˿󓯫F5~{>O&LЎ;ȑ#u'N:${!L;wmַf5R‰'p8[VǏWVV$iܹzꩧt5ha[ĉ;??P=tOkx:|(Jٶ-ӌw\;SU%mw~W ;: ׯxE_xLԺ t_z7~ۚ1{w֮Jww$idwneg$CI*,*Q^~^~/?aF=N~f>@Qu՚ k{ /Ti5MSٹ: gʲ\tּ p88IƌUKss=)WBI,˶ƶxi37%O*ۭŋ?$)33ҥKvؖɓa]VgN;餓}vٳG6lH1ݭ3ӦMSvv?wy,>VM|Ѩ*wkxS:llJI^'hf| Y'y>:SliV`_"c"$hȐR%)Č5FeU3;jWu04vkK/Pss^crr󔛛6-KC[w& jM՗Vh`b^rr4dhZ5iھu~Y~LheIs=ܣ*))C=B&Ms=O>YmNj*M>]ڰa|>rrrrteiٲe***҉':׷J֌3l2j|Zl.ߕ3fk_~iɒ%*++;O@_(tB?oIse۶IvwOL IDAT Fg,)]6bvUlО9ZoPc~FU\2+#Gk3O/$9gbmYLKv,87Fzq31rN2M,_AawڻJ۷}J/lcHikԖ6iTQ &n-[L/V4,G7My睺kUZZy橲2>,`Zr-[f1B/N +xtk޽e]i3n8I63g-[3OUqW裏>߮?0YFw} -ܢYf$p8ʝ:/(~(S={vX꽻5dh\۸"+;{"33K.[;5 」ʝ6|$iXYRnҲ6c22.K4@Pܶcb(ؒP[WeGȴ,-=qUW[P0Z57ow\R -Uzx 47)u,=u^y$bzm龗_~ݶ 7ܠnuw{oCe.]r%-Fᾮ_dII& .;?Q. ՎO4tƌzS'y33Ǻ 45qݵgfjȐR(lI֘l}=6x whvTU'T6bs؎?٦<)>Mqm*1Jh˶̍Ԥ-?𑣕͛6q 9~VI2-5rXzh8 ir+Ur\x}:L'8]>de(A @TՒ6|(}FM5G3fuE7^}Q^Wc}&HrOLTY.֭]24avaQوQڴvCFݻvtCLKi\*(,ּUN'N5VjO(+;[ƌdE*,*{EK茳Viuڸ. Qֿstx}n'/s.<╜tѶ~gǘmKl'V볫u9fUg5k{$zfކ58d$~W%V+F  {8ښ(=ppx5Ύ/f`YVK#oxe۶f(+ F9~rFfjeH2ec  v`8R'LE*.(KnTUm@ IFk)~FT001B!e|2 d1٭"8,Pb`J Irl[(m GgeEYrǑ cHcA b$ǎ) $'E"a9vL/ A0j1n[cN귿=Z~}rҖ-[:z -k> 6z w鋓r[FkZI訯#Iuuu*//p{w{FRQQQ\+ х.bMez{1ޣ5jԨv766J3gCM0Ai/t_A ?-.-!nI7G|4i٣Iƍu=O7T$駟ku_RG۵h"׫V]wmۦq{MuH3}unG6'c9/xXϮ׉ܚUt=C9V%~WٶX,h4@ eo1E"Q554{tԑ^xM۫#jTd4;.*2$I~Ԣ?Y'VvTu],K~_͊bR]]eꔝ-;544u-IhT27ͣDm۶iر2 #׿ 5ʕ-%Ӵk-%c#QRLRͳnp<j6yVWw0Y/[f=UW{Mhj䟊]wZN2y">]߭&6N\M>]---Z|F%˥N;M3Pii1'N#i&M8}8kɒ%}vIҸqt~ a&edAٽ#鿞k$IZ~}uz$iވ:Bp::uVM2g 6t46X FG&A#-<ڸՌlG6(.^-{tˣ ?2O5fvϧ}5}tkW,B-[L 薓<Ƒ1-5ڳ/)כ]'pnݪ_|}SNUii^z%E[0H9&00YoL+IzkLCyZ~>MGFCDz#m ffu8ۉiӓk"@]<=S$|nGN F1cm` ȄR'M(uz@B3'fjsE:sbF TT8691CKt׋ ڸJ9an=+0H1#6ԭZXפoR|3i p.gj'!aUElKF4̣4{7A5x Y`^~BOb A @?!Aː!ɔgj/A Bqٰ ñ hwD| KPJHw,R4'LC2LC˥@Hk Y. ӐIb`i0dLR0VcS8euƦLӒan~b`Pi͈6 Ci|wmJ+HWkvyd P>-$&,Ӑv)boc H+{ d]h0 )Cjc2-y=UU7hwTvWUu,ӒaZTr@2 Ci6-S\y}*U8ȒT 0hUmPF|>Y.L<H ''IG10L#}jhl֨aEDA)]5 F2r{'%4 (Ř\c|DJex*)QvO>%-f; c 4nZB!^y&&a@Tkʘ2M[2e\KQ;sbrbl'uKLC2,Sare2MVLYdBb`26q$Y2L#mY1S1-9Grdjc!3,Ða4eL3\,/ĒC%4dےe2 [t9$(L)T #4 s acso  Vrf+v`)j&ڍC"Di!#QrY북H$@FkO]o> ҆:okҒdH!&/jzhss@9fPK}z$8*"4tD"C9m'Ab ʹ `qd `Hcv l^_0= Fi@oI/l;X4&ێʶmvj8dL%e4-_5a"4ЮmvŢQE"ayܖsu[Ln+f; EbQ]YPHnG%0dfrc w qdێlV$ehtirp,LC~K~K%Ѯ} r{2%qKccA bC[m+lQQnʊRZ`w+gd*kI>_$Si0A b#%z[ZTZ| ʊLUȐdi1Lu  S(RQ^&! @?)(/SPHݺ*i Đ$Ƕ8ܦp$~VV%i(q904&] Hr"JrR]@Z*+Q$cDd 㶔2alŢfVX4, b`Pr$9GhLYH,GhLOqL"AuX8b-Jq]k:$ȤDH-qdF,h cާ !@ÿ$snA ZN<+ޟ1)~Ju# EPHhTXLdY\.^222R\)1D: o>negg+;;+R p $In[~_>On[eI1HD`P͊D"SSS xRc pDU]]-)*33c-˒eY|SSS TUUb,H &X&;;[Æ 4Hff T]]>Hb=!Lnn J1pWj*@I;=cmA BnQ9XAAnB@ 41nK$D)fo1os駟+RO>d^j=)In D"r=233ؘ\u~֭[ oV$G}^9@HR.3بb^x;Z|yhG[&pP($IS3:ouN$ѽޫ?_gyvh_}zuM7Oך5k=Zl.\[믗aO5vX-]T.i -e))Yu^ &;;[h9kii5\yСCuu/pdd]ھ}$iܸq0H&gHϮh;qqW*++;_ZZL=j6oެtM;v~>cٳ?o~ѣG bz%O$N\h\qg?+R=mۦ =Zr\.jw}Zfb٣?vu^AA߯\z%IÆ KJVh%) 薌 ۷Ok$8\..]G}T/,Y"45vX}+_$}_՝wީݻw@_:ΔpFnIod͙3G_ڝW??}vyG9D@5jFfm1ۜNhz%$J@ŪI*..Vuurss=oSSD$Cߗ%A ~NPH555jlleYX,H$`0dzUPP@O x<:t"\Uv+;;yvbG-A( )*I,˒UFF|>_+R k|>! pOb  IDAT A @?!'10h2$2Tb#LEz"A0<`8ڂ\0aӐb`P2ϖa)Ji5.eXj{DiHirTHu9i! a2`A " ÔiZ jl .tV0iZ2 MCA *ӿ׆a0M]Mie|w. Ӕaߧ%ĤZCÐe.1UmLuaiboB,Ky&} eH=b,Y%ǣݟn{du}ϺVu{f`u@ Ǎѭ>φM~ʹ,ӒaZ糴;Tiw^a(1keʒ|.ͪzޞ Y?C.*˲myƈ "0Ci?FH,iaqEf2eTcOϨd۵dӴd&0 ,JV(TbLIژv7,+8{޴YbI$Si0A dHq%LyuU{Ggb]#r,Sf I2*csa̠23bZ%LJ]Ä0]g]êT* @ڪ T4ȠxHRH1 #tIF䘆|WEa i̠" $Ea ϫ=ciw` gLWU"~A d10A ױ4VpS`+rK~PȪZ5L4=>vw߫, U1IHa)P F4 ,ȔaIQ5"ac/w,kCk ̠! Y=Pa2:YV = A dPt4;@z#"̊j9 =!Z{>c8`#. ;VWWUT $Y%۶444|>rOtvX,X, PT*ZZZ8h{ mjUsssT*$qT(8,˒T b J%-..RСCڽ{ B7z[ aFGGo߾ Cfo߾Ф#Ghee#}z A `Kj=ԶۚZSVGWdnnNRfbbbMLL+c"X,RqU48T**mk5L hYÉi||\333*;^.O .@nڞ[oE]zk_/| h__Ʀ K/K_REQB0b-}_8N߫駟uw멧^s\}нޫ .@7p{챎 gǺꪫօ1ꪫ//:eFĠ!$IeYGv|N)Jg?뮻NSSSڳg*k~7SzN:$Mo޽{Cu_nV|zu5h~~^mЩ}Ciw9bS+}_R~‚>?TXԓO>rV6LOO//tUW?JG}Tr>hjj*nbZbY PFՍt)U]~z_+R'xtR]yz%Iz*! R$@Kl{ױ{mꔽ{jxxX_כ)Bgzg:/Ӻ;u' uTZTTT.;rR<'umۺKuNK_RhvvVgqO~:}u_saJQ U1 iiiI+++=壇:~қfr9}Ç555.LgqN>dНwީ;C{^WuO&''NѵYd?y\w{m;~6ٵݍ[ *6> yR=ߏ~Zi׮]nKR9C Ȥ>G8LӒiɻnuFm[us%-J $pm;L+Wb_cQb;ipsZOr6{YDhr<\ڝyr14ēE-,,츽umYEu{nID;Iڽ{\mK^ŪI-+ ڽ{9br'-JZ\\yj!LPd@ؖB{jnnNJE333Z\\TPP>8,K?3KZX\}4>ELY,U3*{!v:4-I5 b U1"ղS6f)/GP.=Sc+ZXOeA\ T,ܒV+NN\~-UĿ1QkZ(c4CIVm2Lٖ-?9Q(FdX,ÒeLVS{$ 6ߚZL #%ØH%4j0 ,GBE)ԗ9Zb CeӔa2xjcݧ6,Rz&[bϘ)ۈT6\TߖLPJe4Bf$3E֒RT VbqH\} P6s!SbĖeI$6ncS3C`HQhmIKQk/R"֍CJe)Oe{D6@[W;E/k dH2(-18VEު," Q۶*rNJhm |ǁH Ek:cGo*g˶sg@dA aEoR-JĶl8/qZTunoxz3@Hh5rѪ,#m<"bsX%uy%j@䌪"$u|0C=.9S~2MSm++,/RrѪlۮIJVds@9QmBryE2rcni_5E%I BƲu}{I@ <1 V5*b Q<b #/2q1dA x; @:Öxf+b"bO50+A d>4e۶,˒eY2 ">C& CEQ$UVenEy"ӨJ( #WASS9r]Wm0zLE1E}&a 0 UTEJ2b=|/^cKa4|?\.'Icc H2 PA\.+[UΙMw*(jPTśJ|>/˲d&aLFiwК9a0T\PDrά% /d 1gJJ"מOKhמWT0xdR*(Υ3Sޝ|߯WAKTd A 0TJ+PIJEAtA j d,s9,sY+b2 HЏb`@#C\f:n{ DZhϹGv|NO^CUt~WxGumܧ_.?U׽:tHL\{oiY C ,,,MW\{%(!+b`@y/Ircێ;ѵ׼A:E=<֯ ׼\c>?5W^c> OO~ׅ1 Kzoҏ^SdFD#$ɲ: n;WZ&&F-zыN.}kvvAO zߧ~R׾f-,,ivvAW^/Щ>Wiw}Nta ݭVWz#ZY)ɪg@LOOΏOo{M/5(0cOS{599v7稈eUV6;XuSűqEqqyEjdkbbLv+cJ?zBA (ǮEz^&ҍێ)CC9=SEakI( C'wkMOO_SK% ڊ  )WGv|TZ\\^ Hs_詧՟G[Lw||Dr{VVVWz ) ݘ#P>RI+eMv<*C\[g|+}kvnzۣל|}{ު[o;A߯N{m7O*@;ujf6;o$f5fs~}|ff۬d‚ߟv7"oU @X,]3miС#<_ӻ&4\jKʪfg8ֶ334::*۶eYLO,-%{&^Q+ı(Y8I0FG%IKmo;n3h##r$i׮In{VKU*ڵkR33Z^^QRHVV\_2z׮I 84"H1'KKTYВB^+qdYB yʕVW&s599F% @::i-/X,|yZsckttyM12RHArE努O+ BIirl[nP>|>r@Ph+VM.!.!>aFb@;3i* #G?ٳUoA ÐeY<7<ϕeY 1G $,+dA 0dlۖ򃑴)۶πaa4M)uXdx@-][k|&D#>&$YEJiw mTZW9a#1eu]-1YPku3L@KΔL6f8kaѦ2ϕVǵX{m>$)Y C( ,}4fQP(RV`(KWHR>y:2ku\ rLÓsg+U=Wgu],˪_?LIDATWĨ3Ф0 eYֺc}-. CKaKhd۶ ^WdA d5LDQT- pu(K'_VI"#aL=×x%ѹ a LcE15#H_cF {b5I/9lЅ&bO%}f0 ?an~ ځ }T2&Ȉf @i/y G}.<pkư%^ي.SL @Ac4Mٶ-˲dY èd P2 PQ}UUQU!ȌRSc #WSsU1+۶eFJ&"˜">0qLT*RPѨQ,Cl(e\ȕ#*U9r9IZWC=1G!L @rYCƪ\ʽVYƴ1@|^e4M˜25s„arQR'gyNr\zcl"L\ STתrB]@JŬSAv7 } ,u<1)CT~ Z*&Kb0J]@ +T* b5VA KlVG$;X%_APA1G0y22=yWa1( j]@9+b zX㲅qidVCY:[b4OG計U  }D}߂ & KbNU.WZZy~}ir[h(S>K@ cbI|u0 UTUTU,d۶F52\rOBV=/.RJlVa(|Ε8ڈ yʕVV=_s*jr|Le=  IZY]삤Z3>:Pk-Ӕ)iblTU-UTu횞PagAFXŒ 4594\K+]Юi X5 \C-0IS$.ZG +b`/.IULqjb`-VTTe;*aMMvlU*U-V.#R$Ii{#[RԖe$4 wN;<_<~nt~}ڍPrEv WGډlǖ*+mi~棺}]1]vPr^xmnTZ‘Pc( -kRQ>q{ԫk&t֙N3[Kҳ4:Rozݎt 109cI?)o~$I_{>ů_~o>~fE?z-|_wͷ}Tu~W_t:zٯ]ˮ}]p`~qI_{y%(!+b`@y/Ircێ Ojz~a;z[.ѧMgo-JO>nQOԡgtf={z寜;oyz ::?{DWua⒮y=_p@aK;PaJ,s? {uʮI-,{腧irbL53':ʪ>{Wu՗jjr\{vM/׿u߸<=v> ?=}z'߿IK_Е~ȓ:stۍv7#ff^o6B10\QRURؼ&J~v|_劂 cO7nLgۖx>=ҳ܂u Ni@))! ڊ P.bղ&F;ryX|sO~8<$o;:lMoʹntYMMҋ/$`L:f6;o$f5fs~}|ff۬d‚ߟv7"oU @X,j3ۖ>|DkzjBÅ+jvnAmk߉6 8MkttTm˲{YZ>us%-J $pm;L+Wb_cQb;ipsMFX\n{q=@.(s{|W.jdжv~G.\ZRq-,\ZY6ph$iiiyG1sZZ I5=ѶՒ`$ CC5-.hrё'-j,%BP{'  Ɯ*fX\Va(|Ε8fP\je\`r9WcT ԹvOkbIk[&m[cL l pF *+ZTTz<_aJLӔr]GC\=A `CMe @[ָ˵;۶C02`֘ =" -ZՄ&\ONXJw BQ [B^ cYֺ>dA 0EQ]R*F<ӳ\ш5Ԭ2&`zO xCB"> `]? s%h.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Çu뭷y$qtYgݻS!GE Rq-?A=$_SCE RJ>httT477/Xr;oxtȑ㞿+v \xҽۑC=C袋9V.uyt.R}{_'xB/~ v|cS.uAG?^~Dօ0RmOz衇($IzQ}ooszOMM)I8 Ir"@ahF>_a]wuW]wu뮻֝G?Q]|Ś߯Z?OoYV |PrY/{kַU_zaiu{nIy|Ps<裺馛DBA7$IHשC"c4:K\rlWviz+_Y?y&''կ~Us 6s9]' 6N4Bdhl؎_ڻ|;Ȋ׽Ntg6;NMOO{r ڿ uϕ()'õ0^m%)qq?y}i M==ܣ׼5]`@Ros/\/YM矯.=Фf M275M2T$`@14 - M tpơIܗM,Hp]B%1]kAL_0eƳ\ҕz-i&ivqb0 dN w{N1f7ߛ̈́&$yj!`l~_{Hd{OI3io\,k_wm6˿oR+_Za:YJFw%7&$+#9QԓXXX JMNN$iY0&HǯdL藍csB0#A/ M <_6N*_?[>.և5,v)tU'J٬UŘM&ǫzG7::z!U1@Px>JZUk0ұLrJ*N۱*bgoXo&M8pSZ6yO=mg}}ڰ+=! f'ߤn6$)Oj}]W,?odxܣZ%LWvؤĴʼnZ؏I/~a|>}o~By=/ut}J7ұP횰74o4i~fv21 CҸ6ik8}k(RkG|]] ǒ׆(fHeq((I)4/%=m f#[ h8cqf$7  fH!E&m˵ļL. YuKrii܎aKj8 _ІIl<-LcULc%VJjxAL-;i_:68I'?5\Xh^fKØN+n*s$iW]2~㭸v_ bD[1Wl*R+0=ZR&I۫ht%~S2""&>X4ijl{;I Kz"ToyʘdK'`ۍ`P5a`qNfoΘNUlmVEL'IVĚM 'bM]Yiv`l8Mʻ$BNJMM<\3~!L5q7C8ȒǛ`BjР]Ó--lo61/ k4dwaF ?h$IV7nՓ7 FGM5Vlԗf `sn$lk4S߬*fLѶ!Zѐ0cUlV T5ԛ1ͮ,,iZ9^eLMnBDH5 aB c+c6lq>03Dj0=_ #vV'jPcl``ϷlgBޭ5iivn;AMͮ:^Lk6 ZZ [F ٵ czxc5 ^X+!KC^i c,c V䱭0]ʹͤ2oWMjԩ0cN»ݡTdvluNVCFJ?8Ixl+w-U0lO0ͮIѱ l#k~56> BwaLg{{@p6َak#zI;ѓ!!C)S:vBQ&{w Ai%"-W`ǖ6@]tYE : B3#L |{@OFVfIonHfi`PqG7]G7$-̒.@r4!VL)"2-RL DǗab~1Lr&.iTXtCreation TimeВт 06 фев 2024 18:49:59+ h IDATxy|T?9e&˄$d!$ll (Wmu)ZV{VR*Uj[V[d daKBe&#qf2{f~sΜM!>EDDDDDDLxL?'""""""DDDDDDDǀ挡< (l03Ԃ C& PER2R$FDDDDDD2I"پ"""""""JP&YD>&""""""`%b5$‚X~"""""""X$:B4k|~""""""d'#ɠ dc(IQ8 d[z9ⅈ("9bfЄ1)hm,MDDDDDD4v a 5{`EZGH$Bd=HP@DZ Q`z$lA@B@_q#8_*IԠa }\ Y<<"""""""N`šI0„D#|Iğ'@E:ʄ%ZpnS]#]m=uGDDDDDD4 dRLc&IP!zB a0;%Ϡ$ةHH1 b5t-tI`mL0#_B d](ACBe}2Lq $Q~DDDDDDDd?@#e<{.4aL"a<2Z1DDDDDDDCM0Wz|ϐ%)˜DBss a|0_%""""""+hx^ן!D:}l& eD lj #0&Cfi!L0~2CDDDDDDD[ n! t4L8!LW&DDDDDDD]KKK^ZYi aLW_mgmՔ}RBc@&0&1 $z/Fr幾Ȉ~ """"""H?j[/kALF„>Oso#` d$쨘Db a\ˆ^w}>""""""\)F.L0aL0-1X^ >o!}q_㺝s \\/]#xww샗r_8ED &Qy hlz6%"""""dJH!|9Z>M8s W\opv n|1S"iG|_F F@'\2mڴjY3dYhA.$I*YN?'" A{{;]yhkk3ѫC=t M_r໑3ަ4y7^ڕm$H ۨc_ӏst aرcOk0DɀA QbbCD4UWW?:nܸƸ0 }=be71 qM!< a_ʲ(J˟<~ܵG= qlBUoܳ'?צξ0T*t0DDDDDDDї`UUupo}8Zb$҈@ zȸ|Ǘ kNee/.Ş߽0&aFĪ`x;uqj7UHmii,#%!"JL1ͰX,QGVCAG:DDԟlh4>}'6u>v|7+W6zH(#b|5Cg$+3!"""J,zv===hoo;zgyfK8(yo6 ߛ &hFކ#y9k/›"PEPWWWLOv]]]1.Q(2"o @{0%"a:0_$SjS"""a68vfNSBL&-[իWɓ0 (++íފ .f͂^g}Ra2p>s=s8g Anej7ɭY,/"bĻbC$Uټy3M2ӧ|7%N@)?6 K,_~ ݎ뮻wq_$,]90j(q袋cf͚hooƍn \sMhZ|ٳgCcݺuZDyd’%Ka㪫;#n st$I$ 6 & :!k+D}$sD5IP[_={[v"""""ƍ߿?/qXn ֆ7x7nT?sxWV1uTݻw+j5=\,\qƍ3(^l}dȑ#$ SNZ+o[ֺ]kȑ3fB>Sff$9G\pnY&  Q9("%%%{/6uJJVVf; ֠OfϞ /\ E3<|d۱m6w~8UFD4vXz5Z[[zNvv6fϞoYy3->?jϓO>_~7nĦM0~xw}h 7_5FK1zoAZZΝO?āfþ}:0W_}5Ə_W0#=سgy(NSghNq4.]KulM7o.d-ZKbhnnFff&f̘n ZV9e]lذ6 sŭު\d2W^_ ^5$ڼy3y`0=X$Q9G8G_GDDC)%~lj{LMM?zo;c<||/;;/VX~)f͆*>aIj򧤤… B'9; k$ˈ V15yR>\sxժU>(//]b(..Ƹq{nj۔G~~> {n;3f N oMP^^\lڴɭF<'  a?O\qiJ/mC#ߧ)l6 ɤ1L„ 62Ƶɴ7O=~ab…555ÓO>9s bYO<5S415 6=VTnA DŽ =sgSp-`֭nA [h4z wԩSq lڴ x饗V/cŊs;ݎ &o* Y24uz'>?D 1&NGb۶m6m2e9d2Aφ x$U`J< t2+%ڻH*I5--V7x~GNx~A|طo:;;!2:;;ݎ1JPWWw~OϟJ3C`Zs{CC|ADII zhoذa֮]0z`!#GE#$I®]"]`tEO>Cmm-JKKQQQ<1ba߾}`ĉ,0`0l6c11ҏ>,^/FQQ;G}t@&Ԓ)l ?pͫ+I4z* OS`ڵn⩧¹ 4>;묳BiJ$5Z%GE\Z`„ طo_Gh49reeex'//ƣ>#G<7AL8?L2l >`'Mo}V^/8x`H%K`h4^zIo0l0Y===~3L2% ԬWDDhii1rȠo>}'c4%KLTRR^x!>\^z%{?o+筫CUU̙u'N XFs9'x`2|m6l^~awI0=Đ%ɼ+ `Aoĉ6 -rv%(+**xbuϞ=8q[伿gX""ٳgûoW_mRee%:_V~i]ؼy3ZZZ`Zٳg#333ޥńQ__Z/Fyɓ'QXX趭6mӧۋ\veHKKrK* :.t:]&%t)^A !"G몫²e˂d+""o@----A='''gƏ~hs҅^u$L`):lذ3gDAAdYFKKK6l6;ȹEQ-܂Xsu'N`̙nj5;Ѐn,vb$I `@JJJJ(Q |""""":::NZk٨g}[o* vSLAff&v222k.|W0͘0af͚|ǸL&Z ?`4m6lܸW^y%jjj0}tF#PTTv]@ߊK:ԩS6lȑ#ER .wmX,>'O-FnfCMM V^Be%h4Lt: x5$o7ȷ,X,ף~6e% 6ǒ$=Ej*V#Fk[=Doo2:t-IpGFJܹ bJBzz :΋JFՑ<(+((ɓ'zO>Rp8رcGQ ZشidYFGG8yyy^477+%IB]]fsІJ`hDVVrrr,FoCDDDDq`^ ^cǎEjj*mۆ5k@dee/GFF*^iii7oD1ϥuV`Μ9J7i$|7o͛c֭h44i1yd[UUUk|wW'DQD^^oPTToU3gb͚5x+(aV+8$֥ IDATlق6%3gNEDhn .۝ǮLj.s>v~ܪw7]銈hooWV6 "=naZVzK/{wR[[Ż"hڋtpJgK._˗1\ecW@ D<<$""""JqVDCQ&QBPT̄lbZ N^bCDDDD E35ا%QqjQ0!"""""""1DDDDDDDD1 (F"""""""aCDDDDDDD# bbA Q0!"""""""1DDDDDDDD1wl6jnǻ":CVCBǻ"""""0p8(vvXVARŻ$"""""0(vtwwh4ƻ""J,ǻ"'BKH b\f0Dnl4%"![@(k,Cajƻ" jeCD4ĸpޗ$1DDϰEEeuLxĸhfp8p8`2DD4p(BVCRARA勁Lx a&+pSn, X}* U d OFd0hc[_8&7QnA+:%`>h. (r؎A>QS6g@AF$ada4dĶ`퀺0T] ,}ɪȺLH|8GnqߥV@8z8q Bk3`6 gEKGC7̊iyn z lr@S+@:[ mbTibL1aj7WTkѧC</:%5Ek#IdYV^47DD$2$IflbVZ (Yh~eVy/ՙ[[css&oCV[ZZMD&;;߶vǡTç iP1(Ȉ&|+נNny%B> ga!f' Q04M[n?c`˝ "Ja{w] q2q ha^` 9HI)*6 !0J|/0!=BF!0$aUUG47A{|U'{XG^ I@K8u§x'L< #TY{[zB`ҷa??Z!r~y TҪF9ɵО"G+qV~ 񳿆h0N=;zн5G+qj= ͇Gr]٘RSoa"d|]4R}T# (U7G7qjQuuQ avɇp@(oj㤒@ 7}hnB{)S'"qNx{==a\{=m O vzxq8PTh4qh4PTp8$1DDIj5pprM2 Og W(> [?f l>Bf $fq$"g0`ٔcCDa۱cNyo]89%qCƩ=.7 xp 8.!ʇDu8Dy? j:xp@q8q·{Du8;!|'qz뀗k5q=Du8||wߍU1O~JF\wuhkkéS`'஻Bqq1& ۶mSq=`رmш7UFFTTTj?=܃QF!???+Ç_T˜#G //K,(3kgⷆޘG[9AdkGA?IMkꫯDKK y0F(sss^466pLٯPYY'N(\ѣGɓAzg=$5岑DVZZ()uT*L6 -_|f$Ip8?Bh4n'QԅIIkmmѣ(..Fqq1;ǠUEtA ߯k⿆dU[B¨AƿDuD(1J,AsZ·~l$ GAII Vr{^uu5<C~. -\5)x=jkkQ\\_|/"Q___VjWC7ja1$d]f + 9+'^*=I4V5%31p!ؽ{7p)|E]z_~9^}UTWWo&FVEuu5݋.0͘6mZPCqeW_ÇֆK|"ÇQ^^_|YYY‹/rTWWGZ﯆,dİkQJBA:5@A#ՠKϊa%[Q2o#I -- oZXhF9nv;Xx1v;&MG}T㒚/:PYY7PAߎz O?40}tCvء4{pƹĵ~~۲oFZӀ8>;<&ưkwyKEP jEKK j JMM yCDe#vQOTQ"ozMT}a$aE$ad}F3İ"w1Cf cWyd UݨEYQ:|NIEZnI +r[uJjܮODDvZ\uU7oϟxD.ĐW'Nm`2pIk]%*' gE\[B)\ۖ;5myT }q̵ccPI];L&6oތʲ͛7b?vڅ͛7t*455EZ"UVa…z,\1UOOwq~i\ve+]% 2iPgZrQ1%B>F15J*2*FA*0VeT=s ~%9c'eTxXl֮] Q.wS}IUCt)/(X@vɇ"Xw*&x% *yMr90ahOLA1SF89BHs-M bzv6 X*GNE_zdWJrUvrdvA~YVV75kSihh˕JVc(--G}K.z_|.r qFTiPSSb;v 6 (..J WTX`|moo/^u㬳B[[?;zаV¿"333Q|/%[l2 E-R^(qpD 0qiJS8/49 aQd?Z8;*Ӕ,P$LS/P6%5*Ӕ2f(qʩ8?*ӔO!LKK ڔ#++ Æ S'Ә0aÿ[-~O* EEE㢢"Ntvv& a2i@ÇGZZ?Ź瞋aÆgP]]:+A,hiiAkk+z=z `˖-hkk.X3fȑԙh0a3xqD Q#`x'7i000J'faM|K|/ 'L 06*y倛J88B mpC{|Հ3:ʐz"_4Y>`M| !aH=aяCA7Ս!mjjH=a1~XmpߴT=a\:eKKKq1sEyy9jjjPZZ'N`֬ЧLܹwFnn.a2}z]wlق~#F_աyy{"1 !2:çr 3(b8Z:Ät\!Lq 5!2%B> gDu8d!v!婧Du8$}.z+~Uah3;5%!BaÚydgDu8Yjd~k}( A-Qm0|zې&#lF|駸(֮]0<^JO<+[1DDCPA dpSn, Xz7BR@^4`DC~)bqLnB܂VtK6 [_} ]0 Q$"7D $TB*!|\  mzYQѐaI}c ;CU WJ˄χ#} 'BؿуcZOY9@aѐM2bRX mn z lr@V*]u :b3;5g$RsFۃ`nk6s$ ӡKς~XRAĉ]]]뮻hyP]]I&!33;v%\n+b֭3gcFnTUU)өrssVm65*:Wyȓ徿ddd`ؽ{7z{{={6- IDAT/_+Wb޼y!ADxb8̜9! h3h,@얺V*#Q,0BQ,Z#lkţ[Y)bA&B?N֊GNIhLүx4ՒM+*++Cuu59̜9~)ZZZSN) w.2|xQTTnzLHRv[夬 | L &??LSS>S#%%())q a@`ܹ_۷+͋(yn:0LCyon=]n]R~۽e IR҉(Qjwz~GDD!gY!2$IjUV7 Ugg'***NȀ@aa! ѣGCEdgg /Dff&Vw+ALrn+,,V`aۑqƹM@vv6ݶz3FYȗtO* cǎFAJJ ;syklnnl65.#f0nooG~~~*""">;?$ v]]]\ȅh<ǶPS\zXVxBDj! Q2۾}{KXBiiiQbQ՜zDDDDDD* FfcZVH"""""f"SbA Q0!"""""""1DDDDDDDD1 (F"""""""aCDDDDDDD# b(ܗe9Q Ӯ""""JX(BxADD~HQd,(8?M* %?*|cCDDDD twwǻ""򣻻-!Q @VffŻ$""VnA %_A(EZq|immVU^=_˩?1DDDDP$ .\tvvB$0""""JH1* Z0L.L&tvvB* ` ¶e̟?7pnr( Ej)))hii"8DKK RRRV)Ia 8}4,Yr( |ҪVa0ՅXxGD4XV444 jZyE RǻdSO/}ҤIxPQ6 tR1"y%dYVn(b %%6 jȀN$FeHłNXVhZ(k0aAwMRũ/~y\ %#$I߫\+vB$Hjs5$DH1 _ &Z-RSS]QL:_]ya?+WDKKKٸ꫱`h48Thg"˲ R$區V$IeYy k.뗷U &~ӟʕ+o>׿yuIchnngv;ӱ}vTWWw>l'Y$aʔ)nl۶ o?{&Uy};}t(H5(4QlP$!X^0 $ Ĉ1bAQpi loSϼ,3.ls]s͜gG9s枧$11qqw6{""""_dŊ5neL&&YU c*>ZɄ—kiXk )i@>]if=`ڴitԩV Ν?'Σs@HK.#==o5kִ N c)ЪȈK }n4UVjժJ~p'NȤIN9W_}uM7Ě5kػwo8owL2~ÇӱcGx ,X@Ϟ=1<֭[ >|8111Ĝ Nh$ זnĈg?΀Gg}?O[Kr9uy""T]Я_?.Vq\]˘KhWU?;ZgIK ]wuw}ݧO>u^_XXȺuصk%%%=z7OKKtRVVѣG1 s=7br٥K wɈ#+8p`NEG֬YwV""k…]:T],""MCLPBnf̘1c:u*)))̚5B~?aS=Vd6y'ٱck׮eΜ9 0{QiIn/|'пxxx馛8z(SN%..??;R"" 52""tt=; bZ}QXX]w^ߞv :vΝ;-]kۿύ7ȴi!))iIؼy3G&22u裏 /0sLl²e˸ygzWr1cЫWfKD=j T.I""OKQӀl6cϸJKKy뭷7n۶m 55NGFF2a,XkRRR*xaLLL ;vt{ui/6mĐ!C7o?GҩS'fΜ?έJII ^{-CK/eݺu?1",Uˁ& bPuߟgyܹ3wu˖-cҥ :ѣGQ3f`ѢE7!66 &@II ׯgɒ%\.:w̜9sIՖfML>3Ǝ[i[QQ&L7`׮]%"X:t@nn.v_~@𭸟4<1 d̞=,ZO<ɓ'QyoV`֬Y̚5+nʔ)ס_E-͚Tc ===p_W^D)]q,_ӧsyEDD21""uԭ[7f3#!!i߷n^^lӦM&[D1q;#""҂kEDzf"99v1kRrr2&M{w${_翼d"&>+bYGs""-i  a∎nƚLf Mb|~_F7롤FTL QQYaYq:#p:#8d8Wz6QYrNIHЬiĈHj xQ#"rAii)Γ-CBcƴ6>‚|<^6 gD$Նb}xe.|~y fgӥ[C?ku# '0|Xw&Έ~/->!/'Tnv.Etaŗoẵtڝغ˖p(Iyc9XW6|_y xAAAK|>L&#All,. χn0 fsjSrC&&6j5[,8,'qq\z>qĤ=_lDC lC6}gXi7L6Xp>E< ~}q{f=sCF.E|%%%EdeqW*w=;۫oaN[ӕשK7.0wᣘ0qrVHk FD504wUDDZ(ZXN[œMa(-- Գd5"""tlv}E8*8ggRbbO2~9n.s1SIrJ*uaTC8r8U[yfgvus'Vz$"R0 ?~xI;ӉtMmJKKx=ج6DlVҒ+:qDEAJJQlIۿ5EE6m:]v'""KIKG_ƲΤ~/~ß/7'7';-Oi3ĈHRKBhjU EDΔj w󬨥2ն9[2Ch@χ磤 Ȯ9X[X"@ @N 5P歕HMK?qi,x1|WR\ĺ&7'ͮ/tF߯vNce~DDZ}v)m DK@D2L-zq}جF("2[4n oƿ| 88G>Qi pm^X4ljOH79ΧS6~^y4t#FoʾwGy9e{m啔yŸ\dt#X:?oȌo߅[%"Ҫ4'emVTa}\r} -֓Cq999Z/5"r HKKv[Łz QZZJݛ""mƁfa61oߪ dk>Ckt S\\מt,,,=B %..Q!"R‚|0c7tG@Wx6N6*<e*,Sa]`4xxI"Ro7ofʔ)tMlٲsB7 fED꯵\K}g͐*;t.RXo9G~y]瓓Cvv6 ,hꈈr@XS1P~ >+"M(d~-e_LaL 1bȼyiѣ?Ox[3K0K3m4Əϔ)S"""Fs#N*;t.VXo~1ڭ'`Sϩd 1 hҤIqqqဦ-ZbO?Y3rH9眆4YfLrr2?ϛ:Mn 2!C0l0Z~_~'Oo[TRDDDDڤPKԹ+sXO?O=[uSj"v_~pBJttt3װ; RÇW^ij4믿g|>233Yz5SNeܹL0qq7sMED7B`*il~ᆬkZOGxRFv7re yWYv-ۗ3fTA_&??>}x׿f۷|իW0}tF֭[ٿ?:udݬ^Ǐ3`z!NYt)~!^QFq.s|g|73c w^~e֯_UW]Yd 6m"''dnVƏP13gdL4'>^"MnCք @ZZO=]t111L>k)""V7HA KD1Aלӫ7L.Hq #GEŋ/>'++ xbXdI2.]]wK/D޽yL<[o]3gbZ`ܹ \~<:tcStzIi&5[o`0:u*ofxԩSYt)w}7ƍofuxge]Ƽyp\w9s&ƍcMWlcy܍7Ql'"R&73ϿX80q > ݻw'==Gyņ X|^z%\ybccyGBB7pr tԉ/]vrXz5? $''s駟Rf޽gʔ)元\}t֍tn&ػwo߯ާKfMns!33,Z3grJ#(ƍcɒ%߿q`V(rjٳBe%""Rl1,~?z os:ݛCq1*m?S&)k׮^WVVÇ1 x |z2p:2SXXȺuصk%%%=z]翡iJT->>t~;:GݞooMbb"{/<n7|,\+W2k,L&L8 w^Yh 5SUmHKb 222>|xNTTTߖL@ii Eg]^Qa!%NP:GKnO| hL= aO(,or?ߺ]fxQ:fTZgZ`@vͷ!)>n:ԗZ4UVj*l6]vo߾,YR￟%K0g~?'Ch"f͚sΡGDDDpwO3m4ӹK8rYonpBN8ABB'O85ǏgL6s]wl2.]СC=ztTU$-͛?>&Yf1lذR|d͚5{n_V+SN#55!CCnn.}i󉈴56$r(..0nSGiiy$lB}& `ӆ\rD;'%4H )q8ѳC|gg~ +GQDFwltq>("R_rn>lf> DžCgס縜 gӥGDM2RRRXbE3ר\AAiiin C)))Gg|ٳgvZFGߟ{RSruq5T 0vX-ZD~j Y|9o&ǎ#11n5/"XOtt4V㪺0:??3T...kOjz\lV1qu7墸߇!ǜ)(GT>9'ؼc\8N.=okd?#<-9'X,x<)xuɱ 2|2:OPqGu'x5R5m)ѲK\:jı,6oCl|u0&22.Ƣ FDM&HkfIJIb|~Bk9j#*&kTdzwܵ;;}F~^IɩL9?%&|sL&s%JrJ1qdcFw,2W)?)NW 8E|B-:fBC>:°j8yO?z.K""IAԛfM **hYC)sj mDDZĈ0:Hv|D|B"^BtL,_r9# 2*_L9t_| WbEB~5_C_1ֳ-l6zO= >]=p570$']UvtLǩXLJyl| q\rٕl ;H}i$isj$i&I3#&~GbbQэ3N9͚Twj#"""""J.ݚ ""1bDDDDDDDDv5vKiĈ41""""""""MDAHQ#"""""""DĈ41""""""""MDAHQ#"""""""DĈ41""""""""MiH/or5w,\׿k "]6K-bDDDDDDDDZĈHr+""-ZĈ41""""""""MDAHQ#"""""""DĈ4͚$""""m ׃oXV݁3".(6'PZRFD~?~CTt Ԧk9 aDDΜ林)6]VFD~?F FDDDDUitm\ bDDDDMQkhR#"""""""DĈHm޼)SpM7e˖殎H FDm䐝͂ :""""""-2o</^\dzgϞ&w㷿),Xq\9r &P\\̦OΚ5k}Hk :t(_~%`P?۷ӫW/bbb͚5di]iC gos|> 6mĘ1co۶!C4Wu>|8JsWCDD:YCn=5k}_tDĞPVb/8v2Ngɩi zvMu>==|k?().qU?ظ:ui)4`0ȫڵk)((o߾̘14nF~_3p@ǃ>իغu+_9x 7;(flҥ|x^FŽKDDD:;A֭[6lFg! b2l߾GuӹYv-wfΜ9 nGU˖-c̙3ŋcy4W{qq1saĉ+^{5yw#<7̆ ;vi3|pbbb*rXz5+V !!os2sS2d x^vo[ bݛm۶1p@,K?qD&Mt9 ?<.?[ ͚=Xk$""rfp!)N]8:w o_ IԹmhߤSd=L~^.ѱ >T<ڱ3~@O4t8V @0 w c_9w? W?O#@ҒJ F;oq-? sA2:|1gѵ0 #RrE ҽ9}SXODD$]vzyw[tփ~ֻN""MEALNY?~묬,~?z s:ݛCz.]0`NFW^ta O)dx^rssի5+Wr}0u>}=;W_}?lj*""",~t-qSlt=a`67߾3ga%XEk^m1ʫau\sf3oـ+l#!GҩsW>۲!\։cY>bN;FLLl8萔B|B"6z[s:l_1H7W_{#kNfbb˰Xn??Iz0pvAUmaIHLT#"&51׋a2Qn^nٌBf3O>$?869sŋ//ꫯ[oU[_~ر-[0|#F~?Ύ;AL]_AoQi$i~?Ggҥ[yޱap,P_fEcOH$&&a}%U9N]4I)8wB|>w/Add߅z)C8MaA>P>pnj-r, 㯘ywnVU6 \N] GrJ*19p0@˨ι&.>\Пrs(s:c;OCR)e|e#~#Oߪ\D%Q:v,os:0ػwoߟ_fÆ 䐚Jdd$7ns} O bӧ˗/'..:tRSS={6SZЬIfVȡL,V1q~@RJ 2#$!CcԶzoj(.*`yUUO>Zfα@yӹkw3:qp}c#tkfw )w).W)kfØظxf4 t|M<7{擏VSR\DdظxRb8~h7{f\|64}"##8q" ,G%%%˗Yo߾Y.0?~C 60x`bbbرcNXV+'Ofɒ%$%%1`ϯԕ!Cd:t@n*m袋Xd W_}տ6C n'`ѢEddd9;.+m؈QA0 $YUm FZ5L)ѹ YGѩKyמX:wƾ_ѽǹ\%$x&L.ԩ ^/~DT,X@Ty.75ztwh2+9q,#%-?,\FjzEEz7!i=4￟%K0g~?'}qԴVn?QQXm6ʤ9߷etʎmqp&;ucFg6oXOwߒtLf3iV+EXwYSHn 2:ul0'wK^n6w(UZRitR)UUJ1n5>\IIdTdYD%S@fϞ]{Ҳnv͛Wiݔ)SHOO?e[E&nnU?~!;wv[m_hQM&fMj4kV2Y)q\S8t޳[7}E/&2*vkNLf_l!2*tpu&::];1 uINMgg^8)9'<-Ky[rr:|2:w%hٲ KKKٻgt#66=$ ҩKzNg>Cn=8~QTt@^Ç2Iı,V+vR9i3``6~G03HK FDDDDڝ}?[RUt]_2xH ?Gᅨ{saP3XV>߲Wi Nget/UӹKW=LzNju*b!K&\I  Y濈kHD$}bSR&q 4;>ퟑޱS`rwlb+~xFnS}`'0z$"Tۙl˭nг+Z=,''_rrr64+͛Y`=PȇfУGH~ZX,,x}xI5Sܜ3_DDNU`mbbbyP8}$Pgk#XZ2U]R}HfM""""""""MDAHQ#"""""""DĈ41""""""""MDA)V&96.1""""Ҧ殂HhR#""""m3"B抈ԓjhĈH0FD YVcm>DDDDͱX,.+J""-jnw%LQ#""""m3"B_,DDEQ$iL&Su0lƚN"""R31"L&5Y߯FDD )v)d2aX(++k>eeeX,JT9=#"djR\\LlllsWGDU)..j&zH{V~nmCA[f`0bۍlj nCTTfe7~,02"Ҿkj~c IDAT. bD]1L .i6dggӹsfH둝nl6rߒn+^_!Ĩ(kTT%]21".Ud2a(++#??fH˖O  """| =Z[%a00步HS29يъjl`6} nKOAkz <,ƋAQQyyyDFFb6+ RTjc ϋf!9.He]D1 _bn͎jl2a2ݖZڵ-Q#"ibB_&N'~""-K^^8N,K[R0}}0j5-=H[OD9Y&"V"VR"(r8Sp`*/KR#"^&M&|Esݜ8q"jbXaLKQ910 (2n""-Ql.8SBNa)Ng]aLcQ#"RV1_&L&>Cp8Їu`OYYx<G%L0@ i }wPKwYbHIlz|I,frqFD-c߆ FDڽ_ ,Kdj!`hTGi'B]6VkxPSZÔ xHR#"RG) Ee8  M{- EA[U"&l6c""mQYB!u:zx\s ]Qޚf6;H]~ |E!)vj ^0NP]%T6Wܷ%A#G\XjX)(vtaLHu dDus85L f!6ެib#m6EbN crW#"DuVoI7a ~1]VC\Z-i` bDDNT]n34 A`?@ZÈH;GO0A'9(@FDkyPkE iݜ6 ]>41""5C]Djy4Of2F0r,"X&`0 h!h*놡 FDZ.}S1 s0 \."""""-]/=1aja/IAH5^Zjkո=77/dee׽kl߾=rJ[㲈4 M_-"""|>^|E֮]Knn);tW\w܁ͦ锫|Cf`_u{lg}<233ڵ)۶mvʺ]t3 FDDD zYbEsssY|9&ᄏ k:l}et`/S4mMշ~AO b nWZ?tг>9uM9;`ر̝;m?0cǎ%/3gnJKK1 !)"R'k׮`Ŭ_ǢEXfMsVuƆIMIG `^ͭk\!~8thǎog/A*":t(?Ogԩ 2`uҺ(bݺu r?'ș uG۷o\@FFFSV8]pR(;g~T}59sUdZ *RZZw}G>}]n0y|T9gdYDpaQ[Jźr/Ԣ[]Ԫ]-Zj]*?؊z[*ZmU!Ț!l00dy?0˙9ѓ;߅W_}R=l*"?~O㔔cyDG}J֮]˜9s0 O?ѣGRRR2% ĈeΜ9,['xN;!C#{^`̘1| _痿%G}4rJ:җ~r'kM7c~2h կDQ#"Y |;(l#|C,Vsና3}\mp:ѡ(;󟧰I&3<ȑ#x 1G9#|CƏ}Ez@qq1 ,`Μ9cƌQ(ꪫO/}&ݱc/CG/s]wpB>hN>dOk%\رcXv-_9?>H7x-[e8G}4sgbE9oks|̝;?>9C}S433s8wnX!%ٽqGo|*((`,YV*--fΜ9X1""1cGu:+Vh# uJO~n6l`ŊtItIڵ?-[̙3[O"p%3fn 8vDžW6ClNBѾǤI5k~O `׮]<3i$^VH))Ĉ0 aY{o{m;\$l/O=T;"~_qyQTT믿_ի}"}+_`ܹ\}9@qaLC÷ְ}c_]C:먣bڵ+l?OEEK.m3QDOqqB~J}ED0zh9y6nܘ~>-wޡ_W$ [&ڳZƨQ0M5kP\\/eee̝;sCpB{=z|k_?z#F_sYgqguV^~e֯_5\_i,\><\%S\\̫… 1My楗s G[R>ٓ־NOv[nd<5[y3}ǩ/+yIOԼR"3t\!"̞=;w`ļqWSVVo۬○s3qmx5ǃeu|Nf|~fQ8@CDDDD|+<̝;͘1*Ux?Wv.Q#"2@) 2'mm겲2f̘_Õn̟]lSDD"1""""&r~J=,_m}Q0""NW/+yo;\:ed&ļ""(钳'9{RwG˺0l6N}Sb^Ȣ|CJ0A8j >.1,UGAqF2,BV#"ׅ#XEUǓDDU7w>gP4<C - $>>`f1Ч(iCk(RLu2 01M0 Q '"54F G1 Ÿ^cR#"d4k_ d M2a`&^ vr\("lضLJa뽑ߦ FD$i&e6mωg5<eaYVF4p0w4pHya36h  XR#"Bq\%Fz{ч.XP(DSS>ǃa^2A2@2-,󱵺e1tPzyXa&C\)/¤z8C$2t0 |>8C]]pߟޞ0&C'a0 LC`֝D8FnzhHx0-sOo52CqpfJKK 9NDw0MR0;w$//41:I13 .q V&F+""lRC8'㱰L Ӵ\O)k9aR!̐!C􋺈C r;L)W K"1OrRX<)/LA0@gai]V@l% 5QH׏H00 -ĈȀ D(--U#"Ҏpt03u"11M<&a<ĝ8b6hu@L 2,,@ eVLL/`OA HR&z$" @K,8ixRb)k c\0ė`&uQ""=L+e14SU-%٥ FD<۶F 6,ץ%%%lٲ˲xzǯ{/`ebb.LbňȀ`Bj9 #4 dTFCG)"҃ c6@Wt+L$`6e^119c=\\'7`I"2YH|ZCR}ĈȀ8x\""sN<e府ć%uf .^#"2@F2I.m&CA H릿&>x<{j$'M&-@\7aה+"҃y^ FDw?}3 #=3So d `Є"2 rk"""S`47 l&ĈȀ˭+"ʵȈ `>7y2=IA[L "Q#"%zub k0J2=CAC{zn*|qq;n8qqr[HO2M0M`y,L4r@FÖpav6^?J.u'OޯZ0㐟&N~5{)Okel}uVWjk qp\;'Z )gP2aCDqlv7Ũ 5Dz}Xa`fzؒzt$"{=멯[nOL?uY1.?39c1ᄂzGһ a9َC4fTE1GRJyq~Bp, 8#)eTE16pqpp>W_1"" }?//Caaa+=ϟG?a!n0A9MD7e!lMMC#@`b&I}3;GH7zw8S),,sovz[4cȑsW{Vq;#8bfΜɧ~>ydnvN>dϾ2}اƝw׾u]'?grWw&Oc=87x##GCkeر[_z%8iƚ5k:uN[;ɓyg1c,]]4.vq׿nnW^{-+Wץ^ƏOii>ǚђ%K)Sp9F7oׯg{TUUq 7֭ʢEXh+W3mڴt[555|u]]v}e:sM/^9u_=?9b<:uT~?/?6Ckײxb{1pAq)9mx:|o;<Ǝ~;>.b.>Nˮ-p]wO_|[bȐ!{={6^z)}/guVꕁ#uIK|D")/O""Uyq>eEA"c')J(&C `ʔ)m۶'k.}Q>: >`~ /N$?9=GuG'd׮]#pﳯۿwfl߾YfqښyxG8c;v,jK[UUUavIY-j#< &OdժUL0=|_R5}jjjxycݺu-z@흫=jX~=P;vqqꩧ2afΜ_v\ulb(>ix`6XG YwAEEE@b׳~z>3B> ضM<o't֜{K@Òemc~tNۓv:+u.2e [l[owsL+>u:տzjHwe{cY*/~:k9dڧ7mZ 2ip"nMĈȑ#)((H-jرc1 z+m۬X:j?c XjoVÒb~3ƌϱCB | IDAT>k/_΄ :}N[;HW݊+;d„ M6׾;W -z@烕ѣG8+Vzp)O?ŋynُM0vcB/RC:R[[yfx7 PҟqA #"r@6jR#"#7|37p\s EEEr)\`ƌ̞=>:,Ya)wXpaf=\^}v%]pp L8;kI?z*fbڴiיL4~75kziks]޴#;[n^04iOG-wuÇgĉ̞=s9K=cL8/}K1ܹsCy=XJKKyGYhQCdHKr\v޶vrg+EL6t׼;v#ԭטK=N}Y[O~궰o:thR;we݌='K֬YĉnGL.l۶aÆԤ"}@UU `YV:Dm-(k _CQ_Yw]v1vn Ga x?ĠAA<21h y}> @`['y좓zLc2q[]{: G /0}^g̘1 aD\7[| ""uIfgm1T)WV^ŋihh?ouY"?ӂH6몆#ehڵ|_u)3| WU.b\%""""-<.@DDzرcm;e0e/_2DDDDDzinn&eYx<~?yyyJDDZP#""""PP(D,kumضM$a׮]x^ (((JED7R#"""" hZ"^|^˲D455Ũ|>_.CDDrLh(ĖeX8a[-;ɓY|(&O'k,\ȋ_ ϟx"y/ p{2ٶͼy(++#?yd{ovN>d>9~NoF\wu9rJv'{uf>@'́0)EEE1EDd`Q#";w#0hpY޴m):B6P1u*7mb-7ZcS|fB<Ӧ孷X6o`l~MrqycǽRo19cFz[ʼn'rWS0jTm6n[{;\>O^9$cO稹sr~asx[Yh-bʕ~MF4M3dٲeL:ur7d/^믿Nccc/ok2e9>;>o<֯_ynhj s”dݒ1P(k튈HߠI""8$a c/W^aXU/_o5 2SZ'|$>-˖18nnf+{& F̌?GӢm ~+Ǎ>#g̠Xp!G_}5,kzxI8;2oƆ#ڹkM$?9oGuO>$#G__:]v/[o1#b}Q6nAc^"}R!Iaaa.,,P(e_{5^|E>1bguguVU^x!g}6gyfjMĈKKڟO ЩmFrCezZk@ 쪪`;p„64׿O #+VgiԊr""y#FD$7o;{aYԮZE2}>jw0O:?q1X ܂7wc˲em3m敗.Y.u.@zRtaر[o~ζmVX?m&#G_|!"'<=Uڒj;Ƥ]#0gΜv{b1>fΜ駟[,}+0odM^{_,{aL:>''jwGv_A׉64o~-X[n9^`ϳYo%}{{-Dۘ,6?Ϟʟ?_y_`¼ NPPP^UW]7oε^Kyy9gdLQ]t,_[rw[^믿nKٴi+V}Hēwފٔj;w`Ep7v:g?c˖-<d}\Y2bn{9fΜmƆ Ddzj**++[1uuuTVVG1nܸ{J FD$7(86/[FppN/1/I[&t̛az1jO<4y2aK/Q|/]ùR~q4;h5bJK4t җ8dԬY޼u?Oڵ]hXdI~a9S5kӦMczV7 75\CQQr +WHض tnj;g.^ill^{%%%SYY{wgrgs:s91c0|p.***D{QFQUUܹscΝ\q[1cp}Lɂ:jF[Ǚ13ޗzmaMM;%34ٓcoI'{nFݓ%UUU 4ǃeYZ @ڼ>CP(DW& #=:F<{?vi<䓌?|G\xTTT7˒CT[[ݨ3﫯>P˗sM7WjҪI"n:Fa=%%%=V˻n ,`_| :|Nf|~fQ8@Ų+&[n())/KALj짞zKqwf.bMƜ9s:t(_~Y`s̡*b1cx{4I"""""{$ŠbݶT۞V?'|͛7`0țo٥v;zߪUg޼y=|֬Yۻ| "PZZ?̨QS bDDDDDD%vj_??8#9yXn7ndɒ%,[ Å^ϻヒml߾>v;z_II wfѢE444ꫯ0lذtEEEl޼Y+tAii)>B~JCDDDDDǮ]hjj[Z://x<<<,] `&GNr饗ٶm%%%\tEmgJi}Fb޼y<,XN8SO=?o*>V od"h^_'زe X2`VLillۢHoz;44IDDDDjv>DDdP#""""Ҋ~?Xڬ[[[K,+Ĉ!5If(۫' h[DD1"""""m| 2H ':1!IC eF[jH;2dՄB!0badĈt ?? jkkD"@~~>@׋eYضM,#Ԕ`~?%%% #"2)СC BB!b z)((ļ""(Tinn&DZm˲x<~9XDDz1"""""!(d.ӪI""""""""=DAHQ#"""""""CĈ1"""".FDO3y]%d cϭavn Q2Z\_%{ĈHgo-"i5""}]1eXd^_%{ĈHg`Cu}(刈i!,40dZt7 4-‘( ќ%"җ54F Ga-. bDDDDJN#i$ax=>6lۙDD v0L0H\_S[d!a`C$jqGC S6h ,sϵULv)>πd ˴|lgݹ.MDOضs7[|XaZj <.@DDDDd뺉9bMC`֝D8T^kzh `y<7H&[ĈH`@ m5ohb2 \("ҫ44Fٰp,N ǓUhi7L7Q#""""}Zf\Dc䘥x7S^2`Һ"2؎K8jj v͑? aaRzt1""""%3d(cb`%yL,cy;q6mvm\qs[HO2 0,˰ ibZ0[3(>1""""$#e1.`aFqljd`&2 L0afjjŻ$ĈHi8`Y&.$FQ &0=^LHCJͱhHRP#""""aLbΘć=\\L O`RF d0bB FDDDDć%uf .^#"2@F2I.m&CACFrdҒ dp5pF_y^ FDDDD}?T,""f/lP`47 l&ĈH続(%$}n ez2}\E4FD=aKbֆa dzvqT86vq8Jd`&Xi咁-u?1""""ү88Ey-3(ߋka!"Db6bԆG"x>,00L3=lIc70.8H`TE19OD$, !8]M1"131n);FaLwP#""""Bqf /DDz^R44&i0(~`pTOps3.ox ֝!yy˜l2s]ȁJuI􄱉D"ˆtRyq>eEA"c$g3w\)>-5$u\%5 GeXuqaҘlR#"""" M,ex\#"' /L,ult1""""gƶy-r\H48߇km& bDDDDKq1J .GDO+- bc;C bDDDDsu6FD am7q}EqLV)>*9,Mtw]qx%"ҷvrg+EL6(>q],]Q""e0N' FDDDD4wOO ""FR#""""am^D$+uUÑOAHQ#"""""""C<.@DDDD/ 477Dض eYx<~?yyyW*"".BB!bXmƶm"vRPP@AAAW*""NFDzzX$X,F8X,Fmm-ry""c bDDDDD:Duu5` ֲ,,"PTTDcc# D"nʐ!CEDd""""" a 6lX!Lk Æ KM[jOAHh:),,d*))H1h4+5Hߢ FDDDD @'LQQWTTj[DD1"""""BD"^[II ^H$B(Z""7h^VBpl*,,P(tZϞ=M6gȑ1"""""{ b1^o&`0HCCCz@ m=8… Y|9{ozVh]Ĉ쥹#??(ɬcY F"" 4G^"$IWwbw}̜9O?秗Ўbs=̞=Srgk&O\Duuu\xwq$Ĉ%zmSN?زe O>$O?47oO1bn{9fΜmƆ .cZaL]]|G70rXdض eYݶT A IDAT۩}uF^xQRRByy9לs93Çs%PQQ~حuHKsFsRWWΝ;+Xncƌu#FDDDD۰apeillL?B!>3pJJKKyGdڵ̙30O=z4> %%%.S@A^,¶ml^1=H/SOwss3_|1ӦMcΜ9 :/{ȾY`s̡ 1c(g44IDDDDd/OXj;RQQA07luUg޼y=|֬Yۻ.i]ii)?0FROG^~?Hp8m+'ni?prsAqqQSSΝ;?~<%%%޽Eq aÆuk]"Ҷ0%uC bDDDDDǮ]hjj[Z>://[t饗ٶm%%%\tE?QF1o<~a,X '5Hs]tZv[nd<5[y3}ǩ/+yIOԼEz`6xݻw3z,QDߨbРAx<,4j]]]gh :|bqC?a[l!QVVF0J)zDDzw?@0X4ۿ5tA|' 3n}'J=&1͸p iEjۆj38ĈO,6k bDD 1"""""mHM ? B-EAH|>C ÉgLmmmzHҐ!C|YQDD$""""Ҏ| Buu5Pp8Laaa'mllX,$B,YDDz11"""""ϧZ"555444O bYm455OIIzˆ p bDDDDD:1tPBPX,FCCC*y^ 41 bDDDDD$aD"ql,<~<@+DA~ YDD˴jHQ#"""""""CĈ1""""""""=DA`b`;nlL^WI+٣ FDDDD4skX᨝ۂDDpưW1""""[˰5FrZH_j`W1""""P]u9""}Zu}0 Le0Y FDDDD] 01Mp$JCc4gue Q‘(iaf(e飒Ha`&^ v2jöx=> 0 V%1٠ FDDDDdcXlѐDD;Dm,smU] bDDDD3 #2->[ٶswKz>iaV⺚!O _anbc2ذu'Q;!E.UDڸ;Xe c*1""""/i&;|%c[.9 /%* Q6l!$zi MĈH+%Ř'9f)@,g  ೰. ڄEs$$CDoT0CAy &ʘXm0XNMj]vp-"ғL 2,,@ eVLL/`OA:}5 :$#e1.`aFqlt!:f"X1L,Dci6Z# {c bDDDD2Mu;>=D)}LqLL1]LuILH-1a$zc+3Hl1=stIĈHbdI`Y:7aLbΘć=\\L O`RF d0bRWzİ,[ڦ FDDDDzT5Վ\\֙ `za8&Eg[gf,ĈHc9 <H&X]iwqNՇINN27@QUT**[]Zq"*Xx[J]7rѯZTT,\Rk7\2,3̚d=1 d%19||Lgq=_+Rܡ/#|g9R}(z1)axn =Bۊ$MT(\'&[1ap<4ԟ0z^1.G\xCH70hA z${%4q3,$#x$ 4jHq^N Ðg d' +X#+0$%!icfƁw}>zÓpt)d%z¸\5ZG7y^W$y^E"wrif+p+wb:j4Nd8r#YLӔJ&=1[,˒JfѨZY%Y@'̆6 _F^%u1q:',+E4MYx<8qcuُKs$ȴ =R0&%c/s@Jb7cx´A zaL<k@Ȧd,AxKehI_}0iB>1݃sKc?nBj ] Ns tct%oþ!@E~nYVeibTLvhxM{bbF{2s:2 C.K.K#h!eYF r8"!y͐h }!+n*((w4M!Ñ% cځ ==`,R(R<R/ .-,*#*Q/!Y\zx$)w aLzb#%0e)) iǽ;íSNHczr\r:1t cYB0{-6Lo=bc=aB*IL^~}Y͖uroI@}jk ڱBvg PuuuNuu UTR29پ, JܚTQQ`跜NN\.bXF,S J\O{p8asTXu+/?GRcG:w|b@'ii*//P)//ir:^[{ZI=av1v @p8Rۭ`0L7 zzA=_P(,PO v  @ft:x}vBL7 zP(۷$n. Iۉ:]}{X-RW{\6-{}eNbzںuC@ [&B즽azj( Dv7]پ,݆"A}@˘@tIá]vX.+C-!i׮] ʒar\07hdu4Y>"5~5Cz=]v@;>956WazD"ڴiSvx<&@ې6mڤH$"כaa$)j1vgngb_RO4~[ŗܨ:^?ӯNB]of}̽]'Oc O.uKWWٷ7lD^0 E"m۶MXLeemĺ(W kD$eϕ)uz|'hb馛W~#sϿӯQQQɿ4`@$NRO>@Ú9@1z}u5EZ]}Ft@p8=bNnx}QYھNڋ]6̊5.Wuϕ)Kַu$igЖ;t%Zkz_ÆK7ıruf1|1Zti۵iV͝wYtb1Ksޮ.ȑot3 Z0^_-˒T<eY0 ;xI\R a#dj\A4'PzZ=_6kp8e1b?=dгZ clM諚,z^=ɜ.X^1==a]&C?S^dYq;}/'nL􌑤#'b@{1Rjb#_47oХ06 baE"\]3Q$I+eeyOs aCeYMGuUtz[4g2 !L/@{$0M{Ì Uzsc3=nBaC.Z: 'Bjj)rsuķGi+5i1YIE" N,F?1njQVVM kٷ)"bz0Q]m@ A sduRWWH+ܫ;3nСuδ+CꪟܦH$C9P|A ٳOӶmn#ilf=38{^\{=u^]2dH5@ՙKUUUgZkYbѨ4x`ErE"Q l_Vi 7hwEnC%%:n vV Tnn Ðjvp昦yI1IѤGks+i'-֕zWJ~Bs7&Pߠb 1 =1w|> ZBaVۯ,W^)-x,f)( >`<Sy A %tk" (*RWmǹ݆rsObЯS0RC0p(H4*+fI.܆!V#דz3@ 5 tnBMb85t!>lΝڹsgtʊ3 @+[N'By5k IIuG/3ܺAb1eee%>5c IҲe˔&@_S\."S!í$1rRh4q 'W0[oP8tZuwOצMۼ^Çduo &oГ S 馛@ +R7oڵkuI'eit:6}p8p8dB!.h"Q4c$hA ;;[O믿$z꩚2eJJJohȐ!zGdY{9ڵk<@͚5Kw\SO=Uwjjjn:egg?Ys꫔ &qI&I6o,I۟6lؠɓ'W[[VFRnnV^iӦi1cFt7N ÐUuM\9"L 4o(++0$%!iA 4qQGiРA6lL#Fz) SbĶP($IN]__/I2MS'I:cӟ4lIIIOW[n=3z饗zjOʕ+xbvatN(;|>A p2:_lԚY|>o'J^u1įDhZC t3rꩧP/BQUUsls˲vb?t ~.}3WGC4OT#)KGks+i'-֕z<:Å1豚{ t t\Ӏ^onL:hM)5|@knަ !LK`3KtAdnz| vζ3#c@ףb!@\B ]۰obk$[bi3{/U IDAT57ڇ =^^bb^ N ÐH,2 =ZrcYѨᰜ񈼎|f8 YqSѨG-4eGL<'iXvc,KPHgЇţrƢ2U/SRQ h##I)ccC)9,KXL`PYycn?_y+(T}}L^W.KN0nT1a,R07JV( &n1`zi@_60PH^5h{r)''Gi0 >Py@߯P(r {tٖe)H.; G"#%Oj p8TTT| !-ۭlB!UWW+&ɽc:;i+ wjVX7͏-cHcZrcQ__/ϧ$ǣ󩾾^X,eκe[D-˒"i Le6V ˲Р|ee3)??_ )AԹl7'Fh hi-1=˲#*'''M+''G BgWubKMmD"r84p(t/ b 25 1Ai&0 vx<2 CXqhЯYh4L7zl0 \L7ÂB!E"Dt:v2M<y}G_֋Fzn:^WUUU)TÑf?Pںggj=P( P^nr}R@_@_ieNo\ kkI& #U($nC,Sn[.g]1R$Q0V}CPHTU5 7 ?O2|/ٿ_ ziGʵ7]OTZRcl_Ve]N\*Pߠ:Bve5,M1X/t?\sщ'ٳg?ާ2Uo{ӝwީ?_&MҌ3rf5nܸ_ig̙zz˲tR]r%L'xbe㩧RVV~_X С7[￯\M2Ei&t1cK|O4bvi:trss5f}WڲeKva+n?LlSUUU2MSNSN3qkRs(s}F:IEebr}*b1KHDh|[~'ǓA_OI IK<6]wǠG t{ァSl;Sjժq]|)tFe˖4DpBM6MSNwܡ2WViiL9sh͉}3g;Cyiʔ)Z~}}Qg} &$sՄ TZZz+{7j)y]wuFsע"E"Z{NRc ?n Z+ p TaA P(,A t@(Ruuop~*p8M:ގ= jx<5euYz[;!e,KtL>ym۶M-JeZJz^x+P0L馛4e=:#[m$nK/iڴi_kZԩSvڔ[.VZSN9s6'hђ{۪vw# ں$)?^9einkt: _nN)w7^)tݻwK^]iN$5kVۑKz!7OS=z[w&M|' zWuuשPźꪫRb>}ƎCjr8ze>ljԨQzN~9RÆ e]L)Ӵ &!QR&O9mV͛u9HJoIz뭷vZg?kW{( )p7]پ,nChT`S,='~LJyd-zg$L>vAr>@`jsMM%Ibmz{p8,Iw;Nt'ӻᆱN:ٺOl8駟ʲ,͞=;qp4U /tFX7MScǎ՗_~vGښS]]?OTWW[i^ǣɓ'k͚5:õzjwqN뮻cHmձsNs=5kJJJ$RLh5#}6WC($L;1LA~

ucy睗ޞXx~{1?^Ǐ/KjzWn'3y=~-i]wWΞ4 Қ,It-Z/{x,/|H4<ΚqNJГjhѵ7߭Ν^+֍?u.{kWUSKޢc7jz ɓ'k)VX=2Uo{1iҤLꫯtud%%%nu0᪪*NqЈ#Z;+++׌ĸ4}5o<1B>O7nΝ;l m6}_mIXL/rt뭷?:ϟ 6hÆ Z~֯_RM>]ׯO m7NƍK{;H$*I]:]}`n<|m޺յuz^5O+KoHh4?vkɢK۶Ԣ^H9w,Ҕo uGgOn=%՜nק7imZG4c YF>vڥW^yE+VE]Ԯ27p}N+?mя~e˖_Ԯ]kٲe ^3gjѢEZ~bvܩO?4QfǎZt>cUVVj…,鸏:e\[˲4|mڴIwuxbbWt@DFvZb4 `N?t={Ͳ՟:]}2@5u~zu*K~x**keێ6u?‚|,U^UlH9٧WM;E8P^Ooo_stPmjj]y˭9|?=t/2L41b=P-ZH<~i5J>v˲m6wjT[[}nGOoc頃w߭>xޯYfӎ;TXXK.Dcƌ$=Zcƌу>m۶iرZx kVv.B 6Lzl"VyizGu '$:un]fM}JJJ|ө?ֶ\K,W_-Cw]nq3^[˲Jǫ!o>^ (*לn_nO]28h?=z-*f1 >h=S\t6;%tG땤]vzQ:8t 'Zvwphƌ1cFB-\0eۥ^x>sL͜9Je^%N2E6lk{S֑olWy.ofy bp:,K1^1==a]&/ JnK4D#w*? ޤ\6}U4r8!LOǭIЇ)hرnJrJ{)%ޢUTTt1}cWޮem+?jXI=۝^yu:Eؽ>,++K .ЌCylE`:̲oSR\0A a*((t3z-[hƍ2eJv[dJwÆ )ϑ*Q]]@ A s%+o ۆ.yLSJs=6Z>K_T)m-Qh4euJ@}vWV0 2S`{Hi}$3MI5bI֞VOZu%+i[xdm0F @/<]uKϱhk^]}Z­ILr/co9> UYU‚NFHTl_ #fc(p}յuS5 rokG̺u$I^4X4@U[gLeUM"X4fKm1g%Kh֬Yi3mڴ.lQ"bwza=oA5u~E#QI!/s]1W^)Iz7U^^jbM6M?񏻣i/+KC U* kwejeyrr#fYD" ªo&TA~=aB裏~nqݚ;wΝAEU[P4Umį63 Cy '1vҺutgP`P zj~*,,lw9lr} CjGDeY$t6dneyρzȘyI1IѤGks+i'-֕z1݃sKs] tnBMb A @7!&F} >ӈ#tW裏nw7ovtR5*e7߬˗UOwf[fΜR}i,K//_/REEE 0\k{utEi~1A7oUW]'ĉu5hƍ*]_V\g?Wc;:nK=}ᆱ 6kы/3fԊ+ezө#ك>ny}蠥Kjɚ>}.,=e('''eY|~Xi{zjO_0uT=7nRr)ZzuL[{:u>Ygm :ԩSSzZjUe.b=Zog=/BӦMK".\iӦiԩ;T__Rf*--Ք)S4gm޼9o̙zw4oJ4a„9x{0aJKK[ozoF-X 3<뮻tZTTH$Xo}OIт \nvg B~헲W}}}Ze5`Nmo_ԩSbHD )eY{Weeezgk۶mZhQ-[hժU[ /PW\q`M7ݤ)S'БGk$ۭ_w^z%M6MvrM:u֮]x<(j*r)mO>DGo{:lwy8n2 :`ݒH߯Yfuzi{@ ~[N&MJY>7 IDAT꫺TXXb]uUZreX,ӧkر:tϟ/á{/QViiF-O?4rH 6L]vJJJ3Lz'LDJ}i֭)lhZf?p^Zw>oyy.͛7O7WΝ;u=h֬Y*));qL$Lziz{duZgkӲe˴l2[@4MmhhХ^r]y啺4jԨD՚SN9Ek֬+ONpX_9wyy[cz4~x?^/.]W^I^1A'OSX"K{:eC>cm߾]vZZ6D٭$\UU߉x<1bDugee>Suu͛#Fiƍڹsgm0amۦ/R_Ҿ-)闿\.nֽVamذAׯUZZӧk) qiܸqio=A tЌ3f=ڵk^yXB]tQp zg;+B?>]j sdfΜEibڹs>D;vhҥUYY ʲ,x≭}G^۵m6q /&1СCli4i^})㺴ZkӦM뮻۷SH$7)4 `N?t={ʹ21b=P-ZH<~i5J>v˲m6wjT[[}n{UU}=3~f͚%ǣO;vPaa.3F4zh3F>mۦcj2?Zvm 5l0zڲeqg͛ŋG 'flԩʺu͚5.S*))i}O??xJXۚr-YDCW_}u #C6ߑ~t6\ƙtn/=ƞc~EE:~Qj 2}e))yKovI'??uf)͛uKvi] 8PovѦM#0rt6fʝ32MI5bI֞VOZu%+i[xdmpkaeeeD";vlk\R{lJLhoŭIЇeeei…u{wTZZO9_W͞=Zڃ d֖-[qFM2%e;+2icһaÆg"￿>L7hUrB@1Lt-===bzz#1 =b 4HfuIM1g%Kh֬Yi3mڴ.l1W^)Iz7U^^jbM6M?񏻣ib|IY%!өAi„ ***t!n[sܹs31 ~*//OhT׿K/ /Taaaa$Da1> @8CsNIR}}|ľr ͛7SO=W_}U@ {@QCCC|rM6MgСCvnh!L`~_ h\YY?IbXW7@@/t$-jСCu9tWd&@',K׿駟㎓$eee)LRc/ZIҐ!CTSSM6I"Hf#:K/$)04tP]xx<$áSN9Eo|> -Ir:쳵rJ}2MScǎɗ@]~m9Cu衇6X\pAg7 @ĭI݄ tnBMb A @7!&1݄ nn~ $f +UWWg *ܚMb A @7!& ֋رcx{8dI ))X@(8uQfZ1yFhemjvJU,(U8q-( R屭!`#r[-@珰vv~9~~G$CcƌѢETZZxT -^x}ᇁF:::~-_<= yAZ8p@aGt9͜9S}Q穪ٳgC7o^| bٳ֯_A R'PCCM]zUSL 5J+V<"I:tN>1cƨ_~C&$A Rp$؅ ymٲEsѣc< )hWlݺ5dHEj8q0`/^,˥IEEE4iΝ_:}M;SFZZZTWWA… r\ڷo_R2х jrjmmՅ x*bVK.ɓoZN˗<OER G2N9 9SӲ{y}ޯ>YQ:<jnn֊+4j(6ZpJJJnݺ… 8p>}+#ۭ˗/kذa"Э455 !+///}hnnVIIIZпkllTaaNrss7?>g@5I%y$ ^we\a FSrC Ԕ)Sn:-X l{7=tSiȴ9bp2ܹs%I[nUsses=3gN {P5AL,KF=z? m6mܸQVkk  UTT?ժ}QvyޛWjɒ%ڽ{F%KXxTYY2eJLGھ}ɓ5jx≘w|[<`z5uT3g(]Xmm~_|ٳgoH/R`߻ᆱ}݉*|+WjΜ9o|-X@׮]Kw2ʔ)S9v۲e߯7xC{lҗ^^]]oO>\Rg5Lmm,X`9y'kGф $I?O4k,رCSNMs zj=#]B3׫?ڴiΝ;1c?,sѤIg>|Xzz)}Gz뭷tI7NO?n1ӦM֭[u! :T5559re:::+׵k] .T^rT[[+s Ԅ<ŋ>'I*,,ԥK$I <#Gرc뮻ۜN&N:64)QBpxCH]zUGUyyyvWֶm_Zk׮U^^ϟI^j|ImذAzu1=sztq]sӟg=Z=ZZZ,>믿'Nhʕ:CyiԩڷojjjcVZZFI'|aϟ]vR>#ZgΜQ~n > ~L&)R-+b׭q8$e l|*+ZvV^#FHSfڴiڹsnn;l٢y&1c6lO?H.\ݻwSeeevz뭷iӦϟ@b17qF͘1C7oɓ;﨨H6mVXFhӦMɱۿ Ο?oYIַo_]x1 =޽{#jww$1oߺuk@:::I/Ȳպ5*V2-b'ɫΊCRyϗq?/6ǃ :qnn={\G l3Æ $]r%ʕ+]ms%''GG֧~zS>Sy^͛7/pVkkkkoUUUqiܹ5kz)޽[;v˵l2544$Bv۷o`Qkkkpd3gq}kx ^Xzt1>:GX3/{%?sϝ1(**Rqq4?t [򔗗gE2mnn#sb~EyӣGqF_wq^}UI!Cٳ٫jiiѥKԷo'O4= -.2W+adW_}N[եЕ/4PnusBݰpj8;$ٳrt C п6׫*ŢIofm >|Mm ޽{o[sxf=裒:CSNI|>3HÇT;vl|ĉ1t_SסI*_D؂p7+~cɒ,_6o޼, =n6͞=[ׯ_=zT7oΝ;իW/͘1C>cٳGC_cvdUUUi͚5ڳgΞ=_|Q] /k|ȑR0d )̡I )2 >?7yY>䓷3btjժUZn}+ѰaTQQ!Iя~^zI?v5a\2F{ճ>&=ZԣGIҥKبe˖{l2:uJŚ3gN`Hշ-رc|X?)iŁmCՓO>\={3<={|ӧOSmmΟ?1chr::W}}%KэaI9a \}wzi_]WwW>M^^cq 8rϺۭ˗/&$ժ}ݗ!QQה *))IkGQr: ̅e4?>g@pĉeeeoHjU$˭G]'54Jnt޴UФ{hR<fu I^Im^_@pIjSybeVb;T$IVmcX=Zʖl޼y_uŋg;]u1Vofnkvn`mI9燑{ٳwJr2e|}}>_U Cל.${Np v1[v=߷83wԩҥKsb<ȿjc#y-T?;8yyixϕC W7},1{-m nkkI ;TDt%sXU`>X=Vt,(1)ya1p1. h6vb6/qXǰ?W]#qFpcbb DO;21`sZMkd2&p ƎAUuXb5?yRaK27? #&ſneU1JPOJ 5O7H;KEieK5HV# vUKGXER-OcjAUH'6 6yo~D %BUG2!oOzJtKPcߪ Y*6႖HÖX5vvfV,E$;mB3`HE_l$x1n& &}eT?5,YaL"7֡TdXD;K!et#?8'1ofTH+aL bx>;2Mb-G?x&hkMP&vt7%V X>*$*1KDjAN n wIk#+