pax_global_header00006660000000000000000000000064146465133050014521gustar00rootroot0000000000000052 comment=cbe30b3ab7e848a6eed309494dc143facd9c68b2 mrvladus-Errands-cbe30b3/000077500000000000000000000000001464651330500154355ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/.github/000077500000000000000000000000001464651330500167755ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/.github/workflows/000077500000000000000000000000001464651330500210325ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/.github/workflows/CI.yml000066400000000000000000000010001464651330500220370ustar00rootroot00000000000000on: 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-cbe30b3/.gitignore000066400000000000000000000001201464651330500174160ustar00rootroot00000000000000.flatpak-builder/ .flatpak/ _build/ .vscode/ venv/ .venv/ .ruff_cache/ *.flatpakmrvladus-Errands-cbe30b3/DONATIONS.md000066400000000000000000000005231464651330500173150ustar00rootroot00000000000000# 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-cbe30b3/Errands.doap000066400000000000000000000020451464651330500177010ustar00rootroot00000000000000 Errands Manage your tasks Python GTK 4 Libadwaita Vlad Krupinskii mrvladus mrvladus-Errands-cbe30b3/LICENSE000066400000000000000000000021051464651330500164400ustar00rootroot00000000000000MIT 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-cbe30b3/README.md000066400000000000000000000047601464651330500167230ustar00rootroot00000000000000
# 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 log file at `$HOME/.var/app/io.github.mrvladus.List/data/errands/log.txt` - Create new issue. - Copy log if needed. - 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.5` - `libsecret` - `libportal` - `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-cbe30b3/TRANSLATIONS.md000066400000000000000000000010751464651330500177030ustar00rootroot00000000000000# 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-cbe30b3/build-aux/000077500000000000000000000000001464651330500173275ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/build-aux/python3-caldav.json000066400000000000000000000135031464651330500230600ustar00rootroot00000000000000{ "name": "python3-caldav", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} --no-build-isolation --ignore-installed caldav certifi charset-normalizer icalendar idna lxml python-dateutil pytz recurring-ical-events requests six tzlocal urllib3 vobject x-wr-timezone" ], "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/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", "sha256": "f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", "only-arches": [ "aarch64" ] }, { "type": "file", "url": "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "sha256": "753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", "only-arches": [ "x86_64" ] }, { "type": "file", "url": "https://files.pythonhosted.org/packages/fb/89/badc6427111cffabb6a462bf447cfff5e9e4c856527ddc030c11020b6cc5/icalendar-5.0.12-py3-none-any.whl", "sha256": "d873bb859df9c6d0e597b16d247436e0f83f7ac1b90a06429b8393fe8afeba40" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl", "sha256": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/6e/27/5775154626e0898a82dba7a7ee8bb503c78f64d33e56c3a031bd1bf4e336/lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", "sha256": "3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f", "only-arches": [ "aarch64" ] }, { "type": "file", "url": "https://files.pythonhosted.org/packages/be/c3/1765e019344d3f042dfe750eb9a424c0ea2fd43deb6b2ac176b5603a436e/lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", "sha256": "200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095", "only-arches": [ "x86_64" ] }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", "sha256": "a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" }, { "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/8a/3c/c1e8d2fb47dfb091d2552ca8bee98aefa7593db3bc713a2d40826547f6ef/recurring_ical_events-2.2.1-py3-none-any.whl", "sha256": "9e8e0390e7cfe2e7425690e6b858eed635bf7560b44cb52260cd3466fec9cec5" }, { "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/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" }, { "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/a2/73/a68704750a7679d0b6d3ad7aa8d4da8e14e151ae82e6fee774e6e0d05ec8/urllib3-2.2.1-py3-none-any.whl", "sha256": "450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/a2/f2/ea094c009f962bd2fda9851bd54cd32b20721c9228842df2eefc1122aa40/vobject-0.9.7-py2.py3-none-any.whl", "sha256": "67ebec81ee39fc60b7355ce077f850d5f13d99d08b110fa1abcfdbb516205e20" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/9d/c6/53227e391c641b891e173b0454f137a21cb969dd58b5171e487e4da7e87e/x_wr_timezone-0.0.7-py3-none-any.whl", "sha256": "0b5e16f677c8f51ce41087a0b3d4f786c5fdcf78af4f8a75d4d960107dcb6d3a" } ] }mrvladus-Errands-cbe30b3/build-aux/regenerate-translations.sh000077500000000000000000000004421464651330500245260ustar00rootroot00000000000000#!/usr/bin/bash flatpak run --filesystem=home org.gnome.Sdk//46 < Set[str]: """ Parses a wheel filename into a list of compatible platform tags. Implemented using functionality from ``packaging.utils.parse_wheel_filename``. """ _, _, _, tags = parse_wheel_filename(filename) return {str(tag) for tag in tags} except ModuleNotFoundError: # fall back to a local implementation # that is heavily inspired by / almost vendored from the `packaging` package: def tags_from_wheel_filename(filename: str) -> Set[str]: """ Parses a wheel filename into a list of compatible platform tags. Implemented as (semi-)vendored functionality in req2flatpak. """ Tag = Tuple[str, str, str] # the following code is based on packaging.tags.parse_tag, # it is needed for the parse_wheel_filename function: def parse_tag(tag: str) -> FrozenSet[Tag]: tags: Set[Tag] = set() interpreters, abis, platforms = tag.split("-") for interpreter in interpreters.split("."): for abi in abis.split("."): for platform_ in platforms.split("."): tags.add((interpreter, abi, platform_)) return frozenset(tags) # the following code is based on packaging.utils.parse_wheel_filename: # pylint: disable=redefined-outer-name def parse_wheel_filename( wheel_filename: str, ) -> Iterable[Tag]: if not wheel_filename.endswith(".whl"): raise InvalidWheelFilename( "Error parsing wheel filename: " "Invalid wheel filename (extension must be '.whl'): " f"{wheel_filename}" ) wheel_filename = wheel_filename[:-4] dashes = wheel_filename.count("-") if dashes not in (4, 5): raise InvalidWheelFilename( "Error parsing wheel filename: " "Invalid wheel filename (wrong number of parts): " f"{wheel_filename}" ) parts = wheel_filename.split("-", dashes - 2) return parse_tag(parts[-1]) return {"-".join(tag_tuple) for tag_tuple in parse_wheel_filename(filename)} # ============================================================================= # Data Structures # ============================================================================= @dataclass(frozen=True) class Platform: """Represents a target platform for python package installations.""" python_version: List[str] """A list of python version numbers, similar to ``platform.python_version_tuple()``.""" python_tags: List[str] """A list of platform tags, similar to ``packaging.tags.sys_tags()``.""" @dataclass(frozen=True) class Requirement: """Represents a python package requirement.""" package: str """A python package name.""" version: str """The exact version of the package.""" @dataclass(frozen=True) class Download(Requirement): """Represents a python package download.""" filename: str url: str sha256: str @cached_property def is_wheel(self): """True if this download is a wheel.""" return self.filename.endswith(".whl") @cached_property def is_sdist(self): """True if this download is a source distribution.""" return not self.is_wheel and not self.filename.endswith(".egg") @cached_property def tags(self) -> Optional[Set[str]]: """Returns a list of tags that this download is compatible for.""" # https://packaging.pypa.io/en/latest/utils.html#packaging.utils.parse_wheel_filename # https://packaging.pypa.io/en/latest/utils.html#packaging.utils.parse_sdist_filename if not self.is_sdist and self.filename.endswith(".whl"): return tags_from_wheel_filename(self.filename) return None @cached_property def arch(self) -> Optional[str]: """Returns a wheel's target architecture, and None for sdists.""" if not self.is_sdist and self.is_wheel and self.tags: if any(tag.endswith("x86_64") for tag in self.tags): return "x86_64" if any(tag.endswith("aarch64") for tag in self.tags): return "aarch64" return None def __lt__(self, other): """Makes this class sortable.""" # Note: Implementing __lt__ is sufficient to make a class sortable, # see, e.g., https://stackoverflow.com/a/7152796 def sort_keys(download: Download) -> Tuple[str, str, str]: """A tuple of package, version and architecture is used as key for sorting.""" return download.package, download.version, download.arch or "" return sort_keys(self) < sort_keys(other) @dataclass(frozen=True) class Release(Requirement): """Represents a package release as name, version, and downloads.""" package: str version: str downloads: List[Download] = field(default_factory=list) # ============================================================================= # Operations # ============================================================================= class PlatformFactory: """Provides methods for creating platform objects.""" @staticmethod def _get_current_python_version() -> List[str]: # pylint: disable=import-outside-toplevel import platform return list(platform.python_version_tuple()) @staticmethod def _get_current_python_tags() -> List[str]: try: # pylint: disable=import-outside-toplevel import packaging.tags tags = [str(tag) for tag in packaging.tags.sys_tags()] return tags except ModuleNotFoundError as e: logger.warning( 'Error trying to import the "packaging" package.', exc_info=e ) return [] @classmethod def from_current_interpreter(cls) -> Platform: """ Returns a platform object that describes the current interpreter and system. This method requires the ``packaging`` package to be installed because functionality from this package is used to generate the list of tags that are supported by the current platform. The platform object returned by this method obviously depends on the specific python interpreter and system architecture used to run the req2flatpak script. The reason why is that this method reads platform properties from the current interpreter and system. """ return Platform( python_version=cls._get_current_python_version(), python_tags=cls._get_current_python_tags(), ) @classmethod def from_string(cls, platform_string: str) -> Optional[Platform]: """ Returns a platform object by parsing a platform string. :param platform_string: A string specifying python version and system architecture. The string format is "{python_version}-{system_architecture}". For example: "cp39-x86_64" or "cp310-aarch64". Acceptable values are the same as in :py:meth:`~req2flatpak.PlatformFactory.from_python_version_and_arch`. """ try: _, minor, arch = re.match( # type: ignore[union-attr] r"^(?:py|cp)?(\d)(\d+)-(.*)$", platform_string ).groups() return cls.from_python_version_and_arch(minor_version=int(minor), arch=arch) except AttributeError: logger.warning("Could not parse platform string %s", platform_string) return None @classmethod def from_python_version_and_arch( cls, minor_version: Optional[int] = None, arch="x86_64" ) -> Platform: """ Returns a platform object that roughly describes a cpython installation on linux. The tags in the platform object are a rough approximation, trying to match what `packaging.tags.sys_tags` would return if invoked on a linux system with cpython. No guarantees are made about how closely this approximation matches a real system. :param minor_version: the python 3 minor version, specified as int. Defaults to the current python version. :param arch: either "x86_64" or "aarch64". """ if not minor_version: minor_version = int(cls._get_current_python_version()[1]) assert arch in ["x86_64", "aarch64"] return Platform( python_version=["3", str(minor_version)], python_tags=list( cls._cp3_linux_tags(minor_version=minor_version, arch=arch) ), ) @classmethod def _cp3_linux_tags( cls, minor_version: Optional[int] = None, arch="x86_64" ) -> Generator[str, None, None]: """Yields python platform tags for cpython3 on linux.""" # pylint: disable=too-many-branches assert minor_version is not None assert arch in ["x86_64", "aarch64"] def seq(start: int, end: int) -> Iterable[int]: """Returns a range of numbers, from start to end, in steps of +/- 1.""" step = 1 if start < end else -1 return range(start, end + step, step) cache = set() def dedup(obj: Hashable): if obj in cache: return None cache.add(obj) return obj platforms = [f"manylinux_2_{v}" for v in seq(35, 17)] + ["manylinux2014"] if arch == "x86_64": platforms += ( [f"manylinux_2_{v}" for v in seq(16, 12)] + ["manylinux2010"] + [f"manylinux_2_{v}" for v in seq(11, 5)] + ["manylinux1"] ) platforms += ["linux"] platform_tags = [f"{platform}_{arch}" for platform in platforms] # current cpython version, all abis, all platforms: for py in [f"cp3{minor_version}"]: for abi in [f"cp3{minor_version}", "abi3", "none"]: for platform in platform_tags: yield dedup(f"{py}-{abi}-{platform}") # older cpython versions, abi3, all platforms: for py in [f"cp3{v}" for v in seq(minor_version - 1, 2)]: for abi in ["abi3"]: for platform in platform_tags: yield dedup(f"{py}-{abi}-{platform}") # current python version, abi=none, all platforms: for py in [f"py3{minor_version}"]: for abi in ["none"]: for platform in platform_tags: yield dedup(f"{py}-{abi}-{platform}") # current major python version (py3), abi=none, all platforms: for py in ["py3"]: for abi in ["none"]: for platform in platform_tags: yield dedup(f"{py}-{abi}-{platform}") # older python versions, abi=none, all platforms: for py in [f"py3{v}" for v in seq(minor_version - 1, 0)]: for abi in ["none"]: for platform in platform_tags: yield dedup(f"{py}-{abi}-{platform}") # current python version, abi=none, platform=any yield f"py3{minor_version}-none-any" # current major python version, abi=none, platform=any yield "py3-none-any" # older python versions, abi=none, platform=any for py in [f"py3{v}" for v in seq(minor_version - 1, 0)]: yield f"{py}-none-any" class RequirementsParser: """ Parses requirements.txt files in a very simple way. This methods expects all versions to be pinned, and it does not resolve dependencies. """ # based on: https://stackoverflow.com/a/59971236 # using functionality from pkg_resources.parse_requirements @classmethod def parse_string(cls, requirements_txt: str) -> List[Requirement]: """Parses requirements.txt string content into a list of Requirement objects.""" def validate_requirement(req: pkg_resources.Requirement) -> None: assert ( len(req.specs) == 1 ), "Error parsing requirements: A single version number must be specified." assert ( req.specs[0][0] == "==" ), "Error parsing requirements: The exact version must specified as 'package==version'." def make_requirement(req: pkg_resources.Requirement) -> Requirement: validate_requirement(req) return Requirement(package=req.project_name, version=req.specs[0][1]) reqs = pkg_resources.parse_requirements(requirements_txt) return [make_requirement(req) for req in reqs] @classmethod def parse_file(cls, file) -> List[Requirement]: """Parses a requirements.txt file into a list of Requirement objects.""" if hasattr(file, "read"): req_txt = file.read() else: req_txt = pathlib.Path(file).read_text(encoding="utf-8") return cls.parse_string(req_txt) # Cache typealias # This is meant for caching responses when querying package information. # A cache can either be a dict for in-memory caching, or a shelve.Shelf Cache = Union[dict, shelve.Shelf] class PypiClient: """Queries package information from the PyPi package index.""" cache: Cache = {} """A dict-like object for caching responses from PyPi.""" @classmethod def _query_from_cache(cls, url) -> Optional[str]: try: return cls.cache[url] except KeyError: return None @classmethod def _query_from_pypi(cls, url) -> str: # url scheme might be `file:/` if not urlparse(url).scheme == "https": raise ValueError("URL scheme not `https`.") with urllib.request.urlopen(url) as response: # nosec: B310 json_string = response.read().decode("utf-8") cls.cache[url] = json_string return json_string @classmethod def _query(cls, url) -> str: return cls._query_from_cache(url) or cls._query_from_pypi(url) @classmethod def get_release(cls, req: Requirement) -> Release: """Queries pypi regarding available releases for this requirement.""" url = f"https://pypi.org/pypi/{req.package}/{req.version}/json" json_string = cls._query(url) json_dict = json.loads(json_string) return Release( package=req.package, version=req.version, downloads=[ Download( package=req.package, version=req.version, filename=url["filename"], url=url["url"], sha256=url["digests"]["sha256"], ) for url in json_dict["urls"] ], ) @classmethod def get_releases(cls, reqs: Iterable[Requirement]) -> List[Release]: """Queries pypi regarding available releases for these requirements.""" return [cls.get_release(req) for req in reqs] class DownloadChooser: """ Provides methods for choosing package downloads. This class implements logic for filtering wheel and sdist downloads that are compatible with a given target platform. """ @classmethod def matches(cls, download: Download, platform_tag: str) -> bool: """Returns whether a download is compatible with a target platform tag.""" if download.is_sdist: return True return platform_tag in (download.tags or []) @classmethod def downloads( cls, release: Release, platform: Platform, wheels_only=False, sdists_only=False, ) -> Iterator[Download]: """ Yields suitable downloads for a specific platform. The order of downloads matches the order of platform tags, i.e., preferred downloads are returned first. """ cache = set() for platform_tag, download in product(platform.python_tags, release.downloads): if download in cache: continue if wheels_only and not download.is_wheel: continue if sdists_only and not download.is_sdist: continue if cls.matches(download, platform_tag): cache.add(download) yield download @classmethod def wheel( cls, release: Release, platform: Platform, ) -> Optional[Download]: """Returns the preferred wheel download for this release.""" try: return next(cls.downloads(release, platform, wheels_only=True)) except StopIteration: return None @classmethod def sdist(cls, release: Release) -> Optional[Download]: """Returns the source package download for this release.""" try: return next(filter(lambda d: d.is_sdist, release.downloads)) except StopIteration: return None @classmethod def wheel_or_sdist(cls, release: Release, platform: Platform) -> Optional[Download]: """Returns a wheel or an sdist for this release, in this order of preference.""" return cls.wheel(release, platform) or cls.sdist(release) @classmethod def sdist_or_wheel(cls, release: Release, platform: Platform) -> Optional[Download]: """Returns an sdist or a wheel for this release, in this order of preference.""" return cls.sdist(release) or cls.wheel(release, platform) class FlatpakGenerator: """Provides methods for generating a flatpak-builder build module.""" @staticmethod def build_module( requirements: Iterable[Requirement], downloads: Iterable[Download], module_name="python3-package-installation", pip_install_template: str = "pip3 install --verbose --exists-action=i " '--no-index --find-links="file://${PWD}" ' "--prefix=${FLATPAK_DEST} --no-build-isolation ", ) -> dict: """Generates a build module for inclusion in a flatpak-builder build manifest.""" def source(download: Download) -> dict: source: Dict[str, Any] = { "type": "file", "url": download.url, "sha256": download.sha256, } if download.arch: source["only-arches"] = [download.arch] return source def sources(downloads: Iterable[Download]) -> List[dict]: return [source(download) for download in sorted(downloads)] return { "name": module_name, "buildsystem": "simple", "build-commands": [ pip_install_template + " ".join([req.package for req in requirements]) ], "sources": sources(downloads), } @classmethod def build_module_as_str(cls, *args, **kwargs) -> str: """ Generate JSON build module for inclusion in a flatpak-builder build manifest. The args and kwargs are the same as in :py:meth:`~req2flatpak.FlatpakGenerator.build_module` """ return json.dumps(cls.build_module(*args, **kwargs), indent=4) @classmethod def build_module_as_yaml_str(cls, *args, **kwargs) -> str: """ Generate YAML build module for inclusion in a flatpak-builder build manifest. The args and kwargs are the same as in :py:meth:`~req2flatpak.FlatpakGenerator.build_module` """ # optional dependency, not imported at top if not yaml: raise ImportError( "Package `pyyaml` has to be installed for the yaml format." ) return yaml.dump( cls.build_module(*args, **kwargs), default_flow_style=False, sort_keys=False ) # ============================================================================= # CLI commandline interface # ============================================================================= def cli_parser() -> argparse.ArgumentParser: """Returns the req2flatpak commandline interface parser.""" parser = argparse.ArgumentParser( description="req2flatpak generates a flatpak-builder build module for installing required python packages." ) parser.add_argument( "--requirements", nargs="*", help="One or more requirements can be specified as commandline arguments, e.g., 'pandas==1.4.4'.", ) parser.add_argument( "--requirements-file", "-r", nargs="?", type=argparse.FileType("r"), help="Requirements can be read from a specified requirements.txt file.", ) parser.add_argument( "--target-platforms", "-t", nargs="+", help="Target platforms can be specified as, e.g., '39-x86_64' or '310-aarch64'.", ) parser.add_argument( "--cache", action="store_true", default=False, help="Uses a persistent cache when querying pypi.", ) parser.add_argument( "--yaml", action="store_true", help="Write YAML instead of the default JSON. Needs the 'pyyaml' package.", ) parser.add_argument( "--outfile", "-o", nargs="?", type=argparse.FileType("w"), default=sys.stdout, help=""" By default, writes JSON but specify a '.yaml' extension and YAML will be written instead, provided you have the 'pyyaml' package. """, ) parser.add_argument( "--platform-info", action="store_true", default=False, help="Prints information about the current platform.", ) parser.add_argument( "--installed-packages", action="store_true", default=False, help="Prints installed packages in requirements.txt format.", ) return parser def main(): # pylint: disable=too-many-branches """Main function that provides req2flatpak's commandline interface.""" # process commandline arguments parser = cli_parser() options = parser.parse_args() # stream output to a file or to stdout if hasattr(options.outfile, "write"): output_stream = options.outfile if pathlib.Path(output_stream.name).suffix.casefold() in (".yaml", ".yml"): options.yaml = True else: output_stream = sys.stdout if options.yaml and not yaml: parser.error( "Outputing YAML requires 'pyyaml' package: try 'pip install pyyaml'" ) # print platform info if requested, and exit if options.platform_info: info = asdict(PlatformFactory.from_current_interpreter()) if options.yaml: yaml.dump(info, output_stream, default_flow_style=False, sort_keys=False) else: json.dump(info, output_stream, indent=4) parser.exit() # print installed packages if requested, and exit if options.installed_packages: # pylint: disable=not-an-iterable pkgs = {p.key: p.version for p in pkg_resources.working_set} for pkg, version in pkgs.items(): print(f"{pkg}=={version}", file=output_stream) parser.exit() # parse requirements requirements = [] with suppress(AttributeError): if options.requirements: requirements += RequirementsParser.parse_string( "\n".join(options.requirements) ) if options.requirements_file: requirements += RequirementsParser.parse_file(options.requirements_file) if not requirements: parser.error( "Error parsing requirements: At least one requirement must be specified." ) # parse target platforms if not options.target_platforms: parser.error( "Error parsing target platforms. " "Missing commandline argument, at least one target platform must " "be specified as, e.g., '39-x86_64' or '310-aarch64'." ) platforms = [ PlatformFactory.from_string(platform) for platform in options.target_platforms ] if not platforms: parser.error( "Error parsing target platforms. " "At least one target platform must be specified " "as, e.g., '39-x86_64' or '310-aarch64'." ) # query released downloads from PyPi, optionally using a shelve.Shelf to cache responses: with ( shelve.open("pypi_cache") if options.cache else nullcontext() # nosec: B301 ) as cache: PypiClient.cache = cache or {} releases = PypiClient.get_releases(requirements) # choose suitable downloads for the target platforms downloads = { DownloadChooser.wheel_or_sdist(release, platform) for release in releases for platform in platforms if platform } # generate flatpak-builder build module if options.yaml: try: name = pathlib.Path(__file__).name except NameError: name = "req2flatpak" output_stream.write(f"# Generated by {name} {' '.join(sys.argv[1:])}\n") output_stream.write( FlatpakGenerator.build_module_as_yaml_str(requirements, downloads) ) else: # write json output_stream.write( FlatpakGenerator.build_module_as_str(requirements, downloads) ) if __name__ == "__main__": main() mrvladus-Errands-cbe30b3/build-aux/requirements.txt000066400000000000000000000004061464651330500226130ustar00rootroot00000000000000caldav==1.3.9 certifi==2024.2.2 charset-normalizer==3.3.2 icalendar==5.0.12 idna==3.7 lxml==5.2.1 python-dateutil==2.9.0.post0 pytz==2024.1 recurring-ical-events==2.2.1 requests==2.31.0 six==1.16.0 tzlocal==5.2 urllib3==2.2.1 vobject==0.9.7 x-wr-timezone==0.0.7 mrvladus-Errands-cbe30b3/build-aux/run.sh000077500000000000000000000061411464651330500204740ustar00rootroot00000000000000#!/usr/bin/bash SDK_VER=46 APP_ID=io.github.mrvladus.List.Devel BIN_NAME=errands CWD=$(pwd) REPO_DIR=$CWD/.flatpak/repo FLATPAK_BUILDER_DIR=$CWD/.flatpak/flatpak-builder MANIFEST_JSON=$CWD/io.github.mrvladus.List.Devel.json build() { echo "====== INIT REPO ======" flatpak build-init $REPO_DIR $APP_ID org.gnome.Sdk org.gnome.Platform $SDK_VER echo "====== BUILD 1 ======" flatpak run org.flatpak.Builder --ccache --force-clean --disable-updates --build-only --state-dir=$FLATPAK_BUILDER_DIR --stop-at=$BIN_NAME $REPO_DIR $MANIFEST_JSON --disable-rofiles-fuse echo "====== BUILD 2 ======" flatpak build --share=network --filesystem=$CWD --filesystem=$REPO_DIR --env=PATH=$PATH:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/app/bin:/usr/bin --env=LD_LIBRARY_PATH=/app/lib --env=PKG_CONFIG_PATH=/app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig --filesystem=$CWD/_build $REPO_DIR meson --prefix /app _build -Dprofile=development } run() { echo "====== RUN 1 ======" flatpak build --share=network --filesystem=$CWD --filesystem=$REPO_DIR --env=PATH=$PATH:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/app/bin:/usr/bin --env=LD_LIBRARY_PATH=/app/lib --env=PKG_CONFIG_PATH=/app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig --filesystem=$CWD/_build $REPO_DIR ninja -C _build echo "====== RUN 2 ======" flatpak build --share=network --filesystem=$CWD --filesystem=$REPO_DIR --env=PATH=$PATH:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/app/bin:/usr/bin --env=LD_LIBRARY_PATH=/app/lib --env=PKG_CONFIG_PATH=/app/lib/pkgconfig:/app/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig --filesystem=$CWD/_build $REPO_DIR meson install -C _build echo "====== RUN 3 ======" flatpak build --with-appdir --allow=devel --bind-mount=/run/user/$UID/doc=/run/user/$UID/doc/by-app/$APP_ID --device=dri --socket=wayland --socket=fallback-x11 --share=ipc --share=network --talk-name=org.freedesktop.secrets --talk-name=org.gnome.OnlineAccounts --talk-name=org.freedesktop.portal.* --talk-name=org.a11y.Bus --bind-mount=/run/flatpak/at-spi-bus=/run/user/$UID/at-spi/bus --env=AT_SPI_BUS_ADDRESS=unix:path=/run/flatpak/at-spi-bus --env=DESKTOP_SESSION=$DESKTOP_SESSION --env=LANG=$LANG --env=WAYLAND_DISPLAY=wayland-0 --env=XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP --env=XDG_SESSION_DESKTOP=$XDG_SESSION_DESKTOP --env=XDG_SESSION_TYPE=$XDG_SESSION_TYPE --bind-mount=/run/host/fonts=/usr/share/fonts --bind-mount=/run/host/fonts-cache=/usr/lib/fontconfig/cache --filesystem=$HOME/.local/share/fonts:ro --filesystem=$HOME/.cache/fontconfig:ro --bind-mount=/run/host/user-fonts-cache=$HOME/.cache/fontconfig --bind-mount=/run/host/font-dirs.xml=$HOME/.cache/font-dirs.xml $REPO_DIR $BIN_NAME } rebuild() { echo "====== RE-BUILDING ======" rm -rf .flatpak _build build run } # Check if the first argument is "rebuild" if [ "$1" = "rebuild" ]; then rebuild else if [ -d "$REPO_DIR" ]; then run else build run fi fi mrvladus-Errands-cbe30b3/build-aux/update_python_deps.sh000077500000000000000000000002111464651330500235560ustar00rootroot00000000000000#!/usr/bin/bash build-aux/req2flatpak.py --requirements-file requirements.txt --target-platforms 311-x86_64 311-aarch64 > manifest.json mrvladus-Errands-cbe30b3/data/000077500000000000000000000000001464651330500163465ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/000077500000000000000000000000001464651330500174615ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/000077500000000000000000000000001464651330500211205ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/scalable/000077500000000000000000000000001464651330500226665ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/scalable/apps/000077500000000000000000000000001464651330500236315ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/scalable/apps/io.github.mrvladus.List.Devel.svg000066400000000000000000000217051464651330500320530ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/scalable/apps/io.github.mrvladus.List.svg000066400000000000000000000074501464651330500310160ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/000077500000000000000000000000001464651330500227415ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001464651330500237045ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-add-symbolic.svg000066400000000000000000000003441464651330500304310ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-add-tag-symbolic.svg000066400000000000000000000052441464651330500312060ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-appearance-symbolic.svg000066400000000000000000000047231464651330500320050ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-attachment-symbolic.svg000066400000000000000000000031531464651330500320320ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-calendar-symbolic.svg000066400000000000000000000012331464651330500314500ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-check-toggle-symbolic.svg000066400000000000000000000046501464651330500322410ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-click-symbolic.svg000066400000000000000000000050711464651330500307700ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-clock-symbolic.svg000066400000000000000000000030111464651330500307660ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-close-symbolic.svg000066400000000000000000000045631464651330500310150ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-color-symbolic.svg000066400000000000000000000022141464651330500310150ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-copy-symbolic.svg000066400000000000000000000013751464651330500306600ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-daytime-morning-symbolic.svg000066400000000000000000000055041464651330500330070ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-daytime-sunset-symbolic.svg000066400000000000000000000032041464651330500326520ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-delete-all-symbolic.svg000066400000000000000000000023131464651330500317070ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-edit-symbolic.svg000066400000000000000000000010761464651330500306310ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-folder-symbolic.svg000066400000000000000000000012671464651330500311610ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-info-symbolic.svg000066400000000000000000000014631464651330500306370ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-lists-symbolic.svg000066400000000000000000000022311464651330500310340ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-more-symbolic.svg000066400000000000000000000007631464651330500306500ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-notes-symbolic.svg000066400000000000000000000046611464651330500310370ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-notification-symbolic.svg000066400000000000000000000025421464651330500323710ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-priority-set-symbolic.svg000066400000000000000000000007101464651330500323500ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-priority-symbolic.svg000066400000000000000000000044371464651330500315710ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-progressbar-symbolic.svg000066400000000000000000000007131464651330500322320ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-restore-symbolic.svg000066400000000000000000000012731464651330500313660ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-right-symbolic.svg000066400000000000000000000007441464651330500310220ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-select-symbolic.svg000066400000000000000000000013471464651330500311640ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-settings-symbolic.svg000066400000000000000000000035731464651330500315500ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-share-symbolic.svg000066400000000000000000000017041464651330500310040ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-sidebar-left-symbolic.svg000066400000000000000000000011421464651330500322370ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-sidebar-right-symbolic.svg000066400000000000000000000011441464651330500324240ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-sync-symbolic.svg000066400000000000000000000025551464651330500306630ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-tag-add-symbolic.svg000066400000000000000000000052441464651330500312060ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-tag-symbolic.svg000066400000000000000000000051071464651330500304560ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-theme-dark-symbolic.svg000066400000000000000000000021521464651330500317210ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-theme-light-symbolic.svg000066400000000000000000000041551464651330500321140ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-theme-system-symbolic.svg000066400000000000000000000036751464651330500323370ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-toolbar-symbolic.svg000066400000000000000000000051641464651330500313500ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-trash-full-symbolic.svg000066400000000000000000000040161464651330500317620ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-trash-symbolic.svg000066400000000000000000000020501464651330500310160ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/errands-up-symbolic.svg000066400000000000000000000041401464651330500303230ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/hicolor/symbolic/apps/io.github.mrvladus.List-symbolic.svg000066400000000000000000000017211464651330500327030ustar00rootroot00000000000000 mrvladus-Errands-cbe30b3/data/icons/io.github.mrvladus.List.Source.svg000066400000000000000000000641251464651330500261070ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template Hicolor Symbolic mrvladus-Errands-cbe30b3/data/io.github.mrvladus.List.desktop.in.in000066400000000000000000000004751464651330500254170ustar00rootroot00000000000000[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; DBusActivatable=true StartupNotify=true X-GNOME-UsesNotifications=true X-Purism-FormFactor=Workstation;Mobile; mrvladus-Errands-cbe30b3/data/io.github.mrvladus.List.gschema.xml.in000066400000000000000000000021201464651330500255340ustar00rootroot00000000000000 1000 700 false 0 "" 0 "" "" true true true true mrvladus-Errands-cbe30b3/data/io.github.mrvladus.List.metainfo.xml.in.in000066400000000000000000001022431464651330500263430ustar00rootroot00000000000000 @APP_ID@ CC0-1.0 MIT Errands Manage your tasks Vlad Krupinskii

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
@APP_ID@.desktop errands #a9a9da #45457c https://github.com/mrvladus/Errands/issues https://github.com/mrvladus/Errands https://github.com/mrvladus/Errands/blob/main/DONATIONS.md https://github.com/mrvladus/Errands/blob/main/TRANSLATIONS.md https://github.com/mrvladus/Errands/ https://raw.githubusercontent.com/mrvladus/Errands/main/screenshots/main.png Main Window View errands touch keyboard pointing tablet always mobile 360

Translations:

  • Added Norwegian Bokmaal translation (Brage Fuglseth)
  • Updated Polish translation (Marcin Stasiak)
  • Updated Croatian translation (Milo Ivir)
  • Updated Brazilian Portuguese translation (Gabriel de Moura)

Fixed bug with task date changing while using sync.

Translations:

  • Added Hindi translation (Scrambled777)
  • Updated Dutch translation (Heimen Stoffels)
  • Updated Hungarian translation (zoli111)

Bug fixes and UI improvements

Translations:

  • Updated Italian translation (Albano Battistella)

Improved perfomance. Startup time and memory consumption is now cut by up to 50%.

Fixed:

  • CalDAV and ical errors

Translations:

  • Updated German translation (Philipp Kiemle)
  • Updated French translation (Wedone)

Added:

  • Colors for Task Lists (Compatable with Nextcloud)
  • Right-click menu for Tasks. Moved all task actions from toolbar menu to it.
  • If task has attachments - attachments button will have blue accent

Fixed:

  • Sending notification for completed and deleted tasks
  • CalDAV sync errors

Translations:

  • Updated Occitan translation (Mejans)
  • Updated Japanese translation (Gnuey56)

Added:

  • Task Attachments. Add any local files to your Tasks.

Changed:

  • Sync indicator now has animation

Fixed:

  • App reloading

Fix bug with export

Changed:

  • Improved Import / Export
  • Now only number of un-completed Tasks shows in sidebar rows
  • All overdue tasks now showing inside of Today page
  • Shortcut for adding Task List from Ctrl+A to Ctrl+Shift+A

Added:

  • Info button in sync url entry
  • Better sync errors
  • Red accent color for date button of overdue tasks
  • Logs are now written in log.txt file
  • Setting for disabling autostart

Translations:

  • Updated German translation (Otmar Grünn)
  • Updated Italian translation (Albano Battistella)
  • Updated Japanese translation (Gnuey56)

Changed:

  • "Task is Due" notification icon

Fixed:

  • Notifications not showing correctly

Translations:

  • Updated Japanese translation (Lemon73)

Added:

  • Right-click menu instead of menu buttons on sidebar items
  • Accent color now applied for check button and progress bar
  • Preference for disabling running the app in background

Added:

  • Quit menu item for completely closing the app

Fixed:

  • Trash errors

Translations:

  • Updated Dutch translation (Heimen Stoffels)
  • Updated Czech translation (32GRat)
  • Updated German translation (Otmar Grünn)

Fixed:

  • CATEGORIES field not showing tags correctly in ical format on sync remote

Translations:

  • Updated Simplified Chinese translation (jexjws)

One year anniversary release!

Some fun statistics for the past year:

  • New contributors: 50
  • Commits: 1610
  • Lines of code: 6980
  • Installs on Flathub: 26 350

Changes in this release:

  • Details panel is replaced with toolbar for each task
  • Added Today page for tasks planned for today
  • Added Tags page where you can manage your tags
  • Added desktop notifications for due tasks
  • Errands now will run in the background and on startup
  • Completed tasks now moved down the list
  • Toggle for each list for hiding / showing completed tasks
  • Added Tags bar under task text. If task have tags, they will be visible.
  • Added priority flags
  • Added setting for selecting new task position
  • Sidebar redesign
  • Using GNOME 46 platform with latest libadwaita widgets

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-cbe30b3/data/io.github.mrvladus.List.service.in000066400000000000000000000001121464651330500247650ustar00rootroot00000000000000[D-BUS Service] Name=@APP_ID@ Exec=@bindir@/errands --gapplication-servicemrvladus-Errands-cbe30b3/data/meson.build000066400000000000000000000034571464651330500205210ustar00rootroot00000000000000subdir('resources') install_subdir('icons', install_dir: get_option('datadir')) 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 configure_file( input: 'io.github.mrvladus.List.service.in', output: '@0@.service'.format(app_id), configuration: conf, install: true, install_dir: get_option('datadir') / 'dbus-1/services', )mrvladus-Errands-cbe30b3/data/resources/000077500000000000000000000000001464651330500203605ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/resources/errands.gresource.xml000066400000000000000000000005051464651330500245350ustar00rootroot00000000000000 style.css style-dark.css gtk/help-overlay.ui mrvladus-Errands-cbe30b3/data/resources/gtk/000077500000000000000000000000001464651330500211455ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/data/resources/gtk/help-overlay.ui000066400000000000000000000055271464651330500241240ustar00rootroot00000000000000 General Show keyboard shortcuts <Control>question Preferences <Control>comma Quit <Control>q <Control>w Sync Sync / Fetch Tasks <Control>F Lists Add List <Control><Shift>A Import List <Control>I Details Toggle Details F9 mrvladus-Errands-cbe30b3/data/resources/meson.build000066400000000000000000000002051464651330500225170ustar00rootroot00000000000000gnome.compile_resources('errands', 'errands.gresource.xml', gresource_bundle: true, install: true, install_dir: pkgdatadir, )mrvladus-Errands-cbe30b3/data/resources/style-dark.css000066400000000000000000000022341464651330500231520ustar00rootroot00000000000000/* Task lists item */ .task-lists-item:drop(active) { background-color: @blue_2; } .task-blue { background: darker(#3584e4); } .progressbar-blue progress, .checkbtn-blue check:checked { background-color: @blue_2; } .task-green { background: darker(#33d17a); } .progressbar-green progress, .checkbtn-green check:checked { background-color: @green_3; } .task-yellow { background: darker(#f5c211); } .progressbar-yellow progress, .checkbtn-yellow check:checked { background-color: @yellow_4; } .task-orange { background: darker(#ff7800); } .progressbar-orange progress, .checkbtn-orange check:checked { background-color: @orange_2; } .task-red { background: darker(#e01b24); } .progressbar-red progress, .checkbtn-red check:checked { background-color: @red_1; } .task-purple { background: darker(#9141ac); } .progressbar-purple progress, .checkbtn-purple check:checked { background-color: @purple_2; } .task-brown { background: #986a44; } .progressbar-brown progress, .checkbtn-brown check:checked { background-color: @brown_1; } .tag { background-color: alpha(white, 0.25); } link { color: white; }mrvladus-Errands-cbe30b3/data/resources/style.css000066400000000000000000000072131464651330500222350ustar00rootroot00000000000000/* Sidebar */ .sidebar-item { transition: background-color 0.2s; } .sidebar-item:drop(active) { background-color: @blue_1; } .sidebar-item-trash:drop(active) { background-color: @orange_1; } /* Task */ .task-title:drop(active) { border-radius: 10px; } .task { padding: 0px; border-radius: 12px; } .task-expand-icon { transition: transform 0.25s; } .task-drop-area { padding: 8px; margin: 0px 0px 8px 0px; border-radius: 10px; border-width: 3px; border-style: dotted; border-color: @light_4; } .task-completed box.title { opacity: 0.5; } .task-completed label.title { text-decoration: line-through; } /* Task accent colors */ .task-blue { background: #dde9f7; } .progressbar-blue progress, .checkbtn-blue check:checked { background-color: @blue_2; } .task-green { background: #daf7e0; } .progressbar-green progress, .checkbtn-green check:checked { background-color: @green_3; } .task-yellow { background: #faf7cf; } .progressbar-yellow progress, .checkbtn-yellow check:checked { background-color: @yellow_4; } .task-orange { background: #fce8d0; } .progressbar-orange progress, .checkbtn-orange check:checked { background-color: @orange_2; } .task-red { background: #f9ccc7; } .progressbar-red progress, .checkbtn-red check:checked { background-color: @red_1; } .task-purple { background: #f1d8f1; } .progressbar-purple progress, .checkbtn-purple check:checked { background-color: @purple_2; } .task-brown { background: #ece2da; } .progressbar-brown progress, .checkbtn-brown check:checked { background-color: @brown_2; } /* Accent color buttons */ .accent-color-btn radio { all: unset; border: 2px solid transparent; border-radius: 9999px; min-width: 14px; min-height: 14px; color: @light_1; } .accent-color-btn radio:hover { filter: brightness(1.2); } .accent-color-btn radio:checked { -gtk-icon-transform: scale(0.7); -gtk-icon-source: -gtk-icontheme("errands-select-symbolic"); } .accent-color-btn-none radio { border-color: alpha(@view_fg_color, 0.3); } .accent-color-btn-none radio:checked { color: @window_fg_color; } .accent-color-btn-blue radio { background-color: @blue_2; } .accent-color-btn-green radio { background-color: @green_2; color: @window_fg_color; } .accent-color-btn-yellow radio { background-color: @yellow_2; color: @window_fg_color; } .accent-color-btn-orange radio { background-color: @orange_2; color: @window_fg_color; } .accent-color-btn-red radio { background-color: @red_2; } .accent-color-btn-purple radio { background-color: @purple_2; } .accent-color-btn-brown radio { background-color: @brown_2; } /* Tag */ .tag { border-radius: 5px; padding-top: 3px; padding-bottom: 3px; padding-left: 5px; padding-right: 5px; background-color: alpha(black, 0.07); } .tag>button { all: unset; margin-left: 6px; } .tags-menu contents { padding: 0px; } /* Sub-task */ .sub-tasks:last-child { margin-bottom: 6px; } /* Utils */ .rounded-corners { border-radius: 12px; } .transparent { background-color: transparent; } .fade { transition: 0.2s; } /* Expand indicator */ .expand-indicator { transition: 0.2s; } .expand-indicator-expanded { transform: rotate(180deg); } /* Overrides */ checkbutton check { transition: background-color 0.2s; } progressbar.osd { background-color: @shade_color; } textview text { background-color: @card_bg_color; } calendar { background: @background; } calendar, calendar header { border: none; } colorbutton { transform: scale(0.6); } colorbutton button { border-radius: 9999px; margin: 0px; padding: 4px; } colorbutton button colorswatch { border-radius: 9999px; }mrvladus-Errands-cbe30b3/errands/000077500000000000000000000000001464651330500170735ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/__builtins__.pyi000066400000000000000000000001501464651330500222370ustar00rootroot00000000000000# This file needed to fix warnings of LSP about gettext _ function. # Used only for completion. _ = str mrvladus-Errands-cbe30b3/errands/application.py000066400000000000000000000121421464651330500217500ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import os from subprocess import getoutput import subprocess from time import sleep from gi.repository import Adw, Gio, GLib, Xdp # type:ignore from errands.lib.data import UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.notifications import ErrandsNotificationsDaemon # from errands.lib.plugins import PluginsLoader from errands.lib.utils import threaded from errands.state import State from errands.widgets.window import Window class ErrandsApplication(Adw.Application): # plugins_loader: PluginsLoader = None def __init__(self) -> None: super().__init__( application_id=State.APP_ID, flags=Gio.ApplicationFlags.DEFAULT_FLAGS, ) self.set_resource_base_path("/io/github/mrvladus/Errands/") State.application = self @threaded def check_reload(self) -> None: """Check if there is newer version installed""" if State.PROFILE == "development": return TIMEOUT_SECONDS: int = 60 portal: Xdp.Portal = Xdp.Portal() is_flatpak: bool = portal.running_under_flatpak() def __restart(*args): """Restart the app""" State.application.quit() if is_flatpak: cmd: str = "flatpak-spawn --host flatpak run io.github.mrvladus.List" else: cmd: str = "errands" subprocess.run(cmd) exit() def __inner_check() -> bool: """Get installed version""" try: version: str = "" if is_flatpak: version: str = getoutput( "flatpak-spawn --host flatpak list --app | grep io.github.mrvladus.List | awk '{ print $3 }'" ) else: version: str = ( getoutput( "cat $(whereis -b errands | cut -d ' ' -f 2) | grep VERSION" ) .split(" ")[-1] .strip('"') ) if version: # If installed version is different from running then show message if version != State.VERSION: restart_message = Adw.MessageDialog( heading=_("Errands was updated"), body=_("Restart is required"), transient_for=State.main_window, ) restart_message.add_response("restart", _("Restart")) restart_message.set_default_response("restart") restart_message.connect("response", __restart) if State.main_window.get_visible(): GLib.idle_add(restart_message.present) else: GLib.idle_add(__restart) return False else: return True except Exception: return True while True: sleep(TIMEOUT_SECONDS) if not __inner_check(): break def run_in_background(self): """Create or remove autostart desktop file""" Log.debug("Application: Checking autostart") portal: Xdp.Portal = Xdp.Portal() # Request background if GSettings.get("launch-on-startup"): portal.request_background( None, _("Errands need to run in the background for notifications"), ["errands", "--gapplication-service"], Xdp.BackgroundFlags.AUTOSTART, None, None, None, ) else: try: os.remove( os.path.join( GLib.get_home_dir(), ".config", "autostart", State.APP_ID + ".desktop", ) ) except Exception: pass def do_startup(self) -> None: Adw.Application.do_startup(self) # Logging Log.init() Log.debug("Application: Startup") # User database UserData.init() # GSettings GSettings.init() # Background self.run_in_background() # Start notifications daemon ErrandsNotificationsDaemon() # Plugins # self.plugins_loader = PluginsLoader(self) # Initialize State State.init() # Main window State.main_window = Window(application=State.application) self.add_window(State.main_window) # self.check_reload() def do_activate(self) -> None: Log.debug("Application: Activate") if not State.main_window: State.main_window = Window(application=State.application) self.add_window(State.main_window) State.main_window.present() mrvladus-Errands-cbe30b3/errands/errands.py000066400000000000000000000024241464651330500211050ustar00rootroot00000000000000#!@PYTHON@ # Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import os import sys 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") gi.require_version("Xdp", "1.0") APP_ID = "@APP_ID@" VERSION = "@VERSION@" PREFIX = "@PREFIX@" PROFILE = "@PROFILE@" pkgdatadir = "@pkgdatadir@" localedir = "@localedir@" def setup_gettext(): import gettext import locale import signal sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) gettext.install("errands", localedir) locale.bindtextdomain("errands", localedir) locale.textdomain("errands") def setup_state(): from errands.state import State State.PROFILE = PROFILE State.APP_ID = APP_ID State.VERSION = VERSION def register_resources(): from gi.repository import Gio # type:ignore resource = Gio.Resource.load(os.path.join(pkgdatadir, "errands.gresource")) resource._register() def main() -> None: setup_gettext() register_resources() setup_state() from errands.application import ErrandsApplication sys.exit(ErrandsApplication().run(sys.argv)) if __name__ == "__main__": main() mrvladus-Errands-cbe30b3/errands/lib/000077500000000000000000000000001464651330500176415ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/lib/animation.py000066400000000000000000000022221464651330500221700ustar00rootroot00000000000000# 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-cbe30b3/errands/lib/data.py000066400000000000000000000543621464651330500211360ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations import datetime import json import os import shutil import sqlite3 from copy import deepcopy from dataclasses import asdict, dataclass, field from queue import Empty, Queue from threading import Thread from typing import Any, Iterable from uuid import uuid4 from gi.repository import GLib # type:ignore from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.utils import random_hex_color @dataclass class ErrandsData: tags: list[TagsData] lists: list[TaskListData] tasks: list[TaskData] @dataclass class TagsData: text: str @dataclass class TaskListData: color: str = "" deleted: bool = False name: str = "" show_completed: bool = True synced: bool = False uid: str = "" def __post_init__(self): if not self.uid: self.uid = str(uuid4()) if not self.color: self.color = random_hex_color() def to_ical(self, single_task: str = None) -> str: """Build VTODO iCal component from TaskData properties""" ical: str = "" ical += "BEGIN:VCALENDAR\n" ical += "VERSION:2.0\n" ical += "PROID:-//Errands\n" ical += f"X-WR-CALNAME:{self.name}\n" ical += f"X-APPLE-CALENDAR-COLOR:{self.color}\n" ical += f"X-ERRANDS-LIST-UID:{self.uid}\n" if single_task: ical += single_task else: for task in UserData.get_tasks_as_dicts(self.uid): ical += task.to_ical() ical += "END:VCALENDAR" return ical @staticmethod def from_ical(ical: str | bytes) -> tuple[TaskListData, list[TaskData]]: ical: str = str(ical) task_list: TaskListData = TaskListData() assert ical != "" for line in ical.split("BEGIN:")[1].splitlines(): prop: str = line.split(":")[0] value: str = line.split(":")[-1] if "X-WR-CALNAME" in prop: task_list.name = value elif "X-APPLE-CALENDAR-COLOR" in prop: task_list.color = value elif "X-ERRANDS-LIST-UID" in prop: task_list.uid = value if not task_list.name: task_list.name = _("New Task List") tasks: list[TaskData] = [] for todo in ical.split("BEGIN:VTODO")[1:]: todo = "BEGIN:VTODO\n" + todo tasks.append(TaskData.from_ical(todo, task_list.uid)) return task_list, tasks @dataclass class TaskData: attachments: list[str] = field(default_factory=lambda: []) color: str = "" completed: bool = False changed_at: str = "" created_at: str = "" deleted: bool = False due_date: str = "" expanded: bool = False list_uid: str = "" notes: str = "" notified: bool = False parent: str = "" percent_complete: int = 0 priority: int = 0 rrule: str = "" start_date: str = "" synced: bool = False tags: list[str] = field(default_factory=lambda: []) text: str = "" toolbar_shown: bool = False trash: bool = False uid: str = "" def __post_init__(self): """Set default values that need to be calculated""" now: str = datetime.datetime.now().strftime("%Y%m%dT%H%M%S") if not self.created_at: self.created_at = now if not self.changed_at: self.changed_at = now def to_ical(self, as_calendar: bool = False) -> str: """Build VTODO iCal component from TaskData properties""" ical: str = "" ical += "BEGIN:VTODO\n" ical += f"X-ERRANDS-COLOR:{self.color}\n" ical += f"STATUS:{'COMPLETED' if self.completed else 'NEEDS-ACTION'}\n" ical += f"LAST-MODIFIED:{self.changed_at}\n" ical += f"DTSTAMP:{self.created_at}\n" if self.due_date: ical += f"DUE{';VALUE=DATE' if 'T' not in self.due_date else ''}:{self.due_date}\n" ical += f"X-ERRANDS-EXPANDED:{int(self.expanded)}\n" ical += f"DESCRIPTION:{self.notes}\n" ical += f"RELATED-TO:{self.parent}\n" ical += f"PERCENT-COMPLETE:{self.percent_complete}\n" ical += f"PRIORITY:{self.priority}\n" if self.start_date: ical += f"DTSTART{';VALUE=DATE' if 'T' not in self.due_date else ''}:{self.start_date}\n" ical += f"CATEGORIES:{','.join(self.tags)}\n" ical += f"SUMMARY:{self.text}\n" ical += f"X-ERRANDS-TOOLBAR-SHOWN:{int(self.toolbar_shown)}\n" ical += f"UID:{self.uid}\n" ical += "END:VTODO\n" if as_calendar: return UserData.get_list(self.list_uid).to_ical(ical) return ical @staticmethod def from_ical(ical: str | bytes, list_uid: str) -> TaskData: """Build TaskData from iCal string""" task: TaskData = TaskData(list_uid=list_uid) assert ical != "" ical = ical[ical.find("BEGIN:VTODO") : ical.find("END:VTODO")] for line in ical.splitlines(): prop: str = line.split(":")[0] value: str = line.split(":")[-1] if "DTSTAMP" in prop: task.created_at = value.strip("Z") elif "LAST-MODIFIED" in prop: task.changed_at = value.strip("Z") elif "PERCENT-COMPLETE" in prop: task.percent_complete = int(float(value)) elif "PRIORITY" in prop: task.priority = int(value) elif "RELATED-TO" in prop: task.parent = value elif "STATUS" in prop: task.completed = True if value == "COMPLETED" else False elif "SUMMARY" in prop: task.text = value elif "UID" == prop: task.uid = value elif "DUE" in prop: task.due_date = value.strip("Z") elif "DTSTART" in prop: task.start_date = value.strip("Z") elif "DESCRIPTION" in prop: task.notes = value elif "CATEGORIES" in prop: task.tags = value.split(",") if value else [] elif "X-ERRANDS-COLOR" in prop: task.color = value elif "X-ERRANDS-EXPANDED" in prop: task.expanded = bool(int(value)) elif "X-ERRANDS-TOOLBAR-SHOWN" in prop: task.toolbar_shown = bool(int(value)) return task class UserDataJSON: def __init__(self) -> None: self.__data_dir: str = os.path.join(GLib.get_user_data_dir(), "errands") self.__data_file_path: str = os.path.join(self.__data_dir, "data.json") self.__tags_data: list[TagsData] = [] self.__task_lists_data: list[TaskListData] = [] self.__tasks_data: list[TaskData] = [] # ------ PROPERTIES ------ # @property def data(self) -> ErrandsData: return ErrandsData( tags=self.__tags_data, lists=self.__task_lists_data, tasks=self.__tasks_data ) @data.setter def data(self, new_data: ErrandsData): self.__tags_data = new_data.tags self.__task_lists_data = new_data.lists self.__tasks_data = new_data.tasks self.__write_data() @property def tags(self) -> list[TagsData]: return self.__tags_data @tags.setter def tags(self, new_data: list[TagsData]): self.__tags_data = new_data self.__write_data() @property def task_lists(self) -> list[TaskListData]: return self.__task_lists_data @task_lists.setter def task_lists(self, lists_data: list[TaskListData]): self.__task_lists_data = lists_data self.__write_data() @property def tasks(self) -> list[TaskData]: return self.__tasks_data @tasks.setter def tasks(self, tasks_data: list[TaskData]): self.__tasks_data = tasks_data self.__write_data() # ------ PUBLIC METHODS ------ # def add_list( self, name: str, uuid: str = None, synced: bool = False, color: str = "" ) -> TaskListData: Log.debug(f"Data: Create list '{uuid}'") new_list = TaskListData( deleted=False, name=name, uid=uuid, synced=synced, color=color ) data: list[TaskListData] = self.task_lists data.append(new_list) self.task_lists = data return new_list def get_list(self, list_uid: str) -> TaskListData | None: for list in self.task_lists: if list.uid == list_uid: return list return None def add_task(self, **kwargs) -> TaskData: data: list[TaskData] = self.tasks new_task = TaskData(**kwargs) if not new_task.uid: new_task.uid = str(uuid4()) Log.debug(f"Data: Add task '{new_task.uid}'") if not GSettings.get("task-list-new-task-position-top"): data.append(new_task) else: data.insert(0, new_task) self.tasks = data return new_task def clean_deleted(self) -> None: Log.debug("Data: Clean deleted") data: ErrandsData = self.data data.lists = [lst for lst in data.lists if not lst.deleted] data.tasks = [t for t in data.tasks if not t.deleted] self.data = data def delete_list(self, list_uid: str) -> None: lists: list[TaskListData] = self.task_lists for lst in lists: if lst.uid == list_uid: lst.deleted = True break tasks: list[TaskData] = [t for t in self.tasks if not t.list_uid == list_uid] self.tasks = tasks self.task_lists = lists def delete_task(self, list_uid: str, uid: str) -> None: tasks: list[TaskData] = self.tasks for task in tasks: if task.list_uid == list_uid and task.uid == uid: tasks.remove(task) break self.tasks = tasks def delete_tasks_from_trash(self) -> None: tasks: list[TaskData] = self.tasks for task in tasks: if task.trash and not task.deleted: task.deleted = True task.synced = False self.tasks = tasks def get_lists_as_dicts(self) -> list[TaskListData]: return self.task_lists def get_prop(self, list_uid: str, uid: str, prop: str) -> Any: tasks: list[TaskData] = self.tasks for t in tasks: if t.list_uid == list_uid and t.uid == uid: task = t break return getattr(task, prop) def get_list_prop(self, list_uid: str, prop: str) -> Any: property: Any = getattr(self.get_list(list_uid), prop) return property if property else None def update_list_prop(self, list_uid: str, prop: str, value: Any) -> None: lists: list[TaskListData] = self.task_lists for lst in lists: if lst.uid == list_uid: setattr(lst, prop, value) break self.task_lists = lists def update_list_props( self, list_uid: str, props: list[str], values: list[Any] ) -> None: lists: list[TaskListData] = self.task_lists for lst in lists: if lst.uid == list_uid: for i, prop in enumerate(props): setattr(lst, prop, values[i]) break self.task_lists = lists def get_status(self, list_uid: str, parent_uid: str = None) -> tuple[int, int]: """Gets tuple (total_tasks, completed_tasks)""" tasks: list[TaskData] = [ t for t in self.tasks if t.list_uid == list_uid and not t.deleted and not t.trash ] if parent_uid: tasks: list[TaskData] = [t for t in tasks if t.parent == parent_uid] total: int = len(tasks) completed: int = len([t for t in tasks if t.completed]) return total, completed def add_tag(self, tag: str) -> None: new_tags = self.tags for t in new_tags: if t.text == tag: return new_tags.append(TagsData(text=tag)) self.tags = new_tags def update_tags(self) -> None: tasks_tags_texts: set[str] = set() for task in self.tasks: tasks_tags_texts.update(task.tags) current_tags = self.tags current_tags_texts = [t.text for t in current_tags] added_tag: bool = False for tag in tasks_tags_texts: if tag not in current_tags_texts: current_tags.append(TagsData(text=tag)) added_tag = True if added_tag: self.tags = current_tags def remove_tag(self, tag: str) -> None: self.tags = [t for t in self.tags if t.text != tag] changed = False tasks = self.tasks for task in tasks: if task.tags != [] and tag in task.tags: task.tags = [t for t in task.tags if t != tag] task.synced = False changed = True if changed: self.tasks = tasks def get_parents_uids_tree(cls, list_uid: str, task_uid: str) -> list[str]: parents_uids: list[str] = [] parent: str = cls.get_prop(list_uid, task_uid, "parent") while parent != "": parents_uids.append(parent) parent = cls.get_prop(list_uid, parent, "parent") return parents_uids def get_task(self, list_uid: str, uid: str) -> TaskData: try: task: TaskData = [ t for t in self.tasks if t.list_uid == list_uid and t.uid == uid ][0] return task except Exception as e: Log.error(f"Data: can't get task '{uid}'. {e}") return TaskData() def get_tasks_as_dicts( self, list_uid: str = None, parent: str = None ) -> list[TaskData]: if not list_uid: return self.tasks elif list_uid and parent is None: return [t for t in self.tasks if t.list_uid == list_uid] elif list_uid and parent is not None: return [ t for t in self.tasks if t.list_uid == list_uid and t.parent == parent ] def init(self) -> None: Log.debug("Data: Initialize") if not os.path.exists(self.__data_dir): Log.debug("Data: Create data directory") os.mkdir(self.__data_dir) self.__convert_data() if not os.path.exists(self.__data_file_path): Log.debug("Data: Create data.json file") self.__write_data() self.__read_data() def move_task_after( self, list_uid: str, task_uid: str, task_after_uid: str ) -> None: tasks: list[TaskData] = self.tasks def __move_task(uid: str, after_uid: str): task_to_move: TaskData = tasks.pop( tasks.index(self.get_task(list_uid, uid)) ) index_to_insert: int = tasks.index(self.get_task(list_uid, after_uid)) + 1 tasks[index_to_insert:index_to_insert] = [task_to_move] __move_task(task_uid, task_after_uid) # Move sub-tasks after_uid: str = task_uid for task in self.__get_sub_tasks_tree(list_uid, task_uid): __move_task(task.uid, after_uid) after_uid = task.uid self.tasks = tasks def move_task_before( self, list_uid: str, task_uid: str, task_before_uid: str ) -> None: tasks: list[TaskData] = self.tasks def __move_task(uid: str): task_to_move: TaskData = tasks.pop( tasks.index(self.get_task(list_uid, uid)) ) index_to_insert: int = tasks.index(self.get_task(list_uid, task_before_uid)) tasks[index_to_insert:index_to_insert] = [task_to_move] __move_task(task_uid) # Move sub-tasks for task in self.__get_sub_tasks_tree(list_uid, task_uid): __move_task(task.uid) self.tasks = tasks def move_task_to_list( self, task_uid: str, from_list_uid: str, to_list_uid: str, new_parent: str = "" ) -> TaskData: tasks: list[TaskData] = self.tasks tasks_to_delete: list[TaskData] = [self.get_task(from_list_uid, task_uid)] base_task: TaskData = deepcopy(self.get_task(from_list_uid, task_uid)) base_task.list_uid = to_list_uid base_task.parent = new_parent base_task.synced = False tasks.append(base_task) for task in self.__get_sub_tasks_tree(from_list_uid, task_uid): new_sub_task: TaskData = deepcopy(task) new_sub_task.list_uid = to_list_uid new_sub_task.synced = False tasks.append(new_sub_task) tasks_to_delete.append(task) for task in tasks: if task in tasks_to_delete: task.deleted = True task.synced = False self.tasks = tasks return base_task def update_props( self, list_uid: str, uid: str, props: Iterable[str], values: Iterable[Any] ): tasks = self.tasks for task in tasks: if task.list_uid == list_uid and task.uid == uid: for idx, prop in enumerate(props): setattr(task, prop, values[idx]) if "due_date" in props: setattr(task, "notified", False) break self.tasks = tasks def clean_orphans(self) -> list[TaskData]: orphans: list[TaskData] = [] tasks: list[TaskData] = self.tasks uids: list[str] = [t.uid for t in tasks] for task in tasks: if task.parent not in uids: task.parent = "" orphans.append(task) self.tasks = tasks return orphans # ------ PRIVATE METHODS ------ # def __get_sub_tasks(self, list_uid: str, task_uid: str) -> list[TaskData]: return [ t for t in self.tasks if t.list_uid == list_uid and t.parent == task_uid ] def __get_sub_tasks_tree(self, list_uid: str, task_uid: str) -> list[TaskData]: tree: list[TaskData] = [] def __add_sub_tasks(uid: str): sub_tasks: list[TaskData] = self.__get_sub_tasks(list_uid, uid) if sub_tasks: tree.extend(sub_tasks) for sub_task in sub_tasks: __add_sub_tasks(sub_task.uid) __add_sub_tasks(task_uid) return tree def __get_task_parents_tree(self, list_uid: str, task_uid: str) -> list[TaskData]: tree: list[TaskData] = [] tasks = [t for t in self.tasks if t.list_uid == list_uid] def __add_parent(task_uid: str): for task in tasks: if task.parent: tree.append(task) __add_parent(task.parent) __add_parent(task_uid) return tree def __backup_data(self) -> None: Log.info("Data: Backup") shutil.copyfile(self.__data_file_path, self.__data_file_path + ".old") def __convert_data(self): old_db_path: str = os.path.join(self.__data_dir, "data.db") if not os.path.exists(old_db_path): return Log.info("Data: Convert old data format to a new one") connection = sqlite3.connect(old_db_path) cur = connection.cursor() # Convert lists cur.execute("SELECT * FROM lists") lists_data: tuple[tuple] = cur.fetchall() for item in lists_data: self.__task_lists_data.append( TaskListData(deleted=item[0], synced=item[2], name=item[1], uid=item[3]) ) # Convert tasks cur.execute("SELECT * FROM tasks") tasks_data: tuple[tuple] = cur.fetchall() for item in tasks_data: self.__tasks_data.append( TaskData( color=item[0], completed=item[1], deleted=item[2], due_date=item[3], expanded=item[4], list_uid=item[5], notes=item[6], parent=item[7], percent_complete=item[8], priority=item[9], start_date=item[10], synced=item[11], tags=item[12].split(",") if item[12] else [], text=item[13], trash=item[14], uid=item[15], ) ) os.remove(old_db_path) self.clean_orphans() self.__write_data() def __read_data(self) -> None: try: Log.debug("Data: Read data") with open(self.__data_file_path, "r") as f: data: dict[str, Any] = json.load(f) self.__task_lists_data = [TaskListData(**lst) for lst in data["lists"]] self.__tasks_data = [TaskData(**t) for t in data["tasks"]] self.__tags_data = [TagsData(**t) for t in data["tags"]] except Exception as e: Log.error( f"Data: Can't read data file from disk. {e}. Creating new data file" ) self.__backup_data() self.__write_data() def __write_data(self) -> None: try: Log.debug("Data: Write data") data: dict[str, list[TaskListData | TaskData]] = { "lists": [asdict(lst) for lst in self.task_lists], "tags": [asdict(t) for t in self.tags], "tasks": [asdict(t) for t in self.tasks], } w = ThreadSafeWriter(self.__data_file_path, "w") w.write(json.dumps(data, ensure_ascii=False)) w.close() except Exception as e: Log.error(f"Data: Can't write to disk. {e}.") class ThreadSafeWriter: def __init__(self, path: str, mode: str) -> None: self.filewriter = open(path, mode) self.queue = Queue() self.finished = False Thread(name="ThreadSafeWriter", target=self.internal_writer).start() def write(self, data): self.queue.put(data) def internal_writer(self): while not self.finished: try: data = self.queue.get(True, 1) except Empty: continue self.filewriter.write(data) self.queue.task_done() def close(self): self.queue.join() self.finished = True self.filewriter.close() # Handle for UserData. For easily changing serialization methods. UserData = UserDataJSON() mrvladus-Errands-cbe30b3/errands/lib/goa.py000066400000000000000000000044361464651330500207700ustar00rootroot00000000000000# 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() .rsplit("@", 1)[0] ) 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-cbe30b3/errands/lib/gsettings.py000066400000000000000000000047101464651330500222240ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import GLib, Gio, Gtk, Secret # type:ignore from errands.lib.logging import Log from errands.state import State SECRETS_SCHEMA: Secret.Schema = Secret.Schema.new( State.APP_ID, Secret.SchemaFlags.NONE, { "account": Secret.SchemaAttributeType.STRING, }, ) class GSettings: """Class for accessing gsettings""" gsettings: Gio.Settings = None @classmethod def bind( self, setting: str, obj: Gtk.Widget, prop: str, invert: bool = False ) -> None: self.gsettings.bind( setting, obj, prop, ( Gio.SettingsBindFlags.INVERT_BOOLEAN if invert else Gio.SettingsBindFlags.DEFAULT ), ) @classmethod def get(self, setting: str): return self.gsettings.get_value(setting).unpack() @classmethod def set(self, setting: str, gvariant: str, value) -> None: self.gsettings.set_value(setting, GLib.Variant(gvariant, value)) @classmethod def get_secret(self, account: str): return Secret.password_lookup_sync(SECRETS_SCHEMA, {"account": account}, None) @classmethod def set_secret(self, account: str, secret: str) -> None: 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("GSettings: Initialize") self.gsettings = Gio.Settings.new(State.APP_ID) # Migrate old password if "sync-password" not in self.gsettings.list_keys(): return 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 Exception as e: Log.error(f"GSettings: {e}") mrvladus-Errands-cbe30b3/errands/lib/logging.py000066400000000000000000000027701464651330500216470ustar00rootroot00000000000000# Copyright 2023 Vlad Krupinskii # SPDX-License-Identifier: MIT import datetime import os from gi.repository import GLib # type:ignore from errands.state import State 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") @classmethod def init(self): # Create data dir if not os.path.exists(self.data_dir): os.mkdir(self.data_dir) # Start new log self.empty( f""" ------------------------------------------------- Starting Errands {State.VERSION} at "{datetime.datetime.now().strftime("%Y %d %B %H:%M:%S")}" ------------------------------------------------- """ ) @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}") @classmethod def empty(self, msg: str) -> None: print(msg) self._log(self, 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-cbe30b3/errands/lib/markup.py000066400000000000000000000011411464651330500215070ustar00rootroot00000000000000# 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-cbe30b3/errands/lib/notifications.py000066400000000000000000000042011464651330500230610ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from datetime import datetime from gi.repository import Gio, GLib # type:ignore from errands.lib.data import TaskData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.state import State class ErrandsNotificationsDaemon: CHECK_INTERVAL_SEC: int = 20 # Check tasks every _ seconds def __init__(self) -> None: State.notifications_daemon = self self.start() # ------ PROPERTIES ------ # @property def due_tasks(self) -> list[TaskData]: """Get due tasks that haven't been notified yet""" now: datetime = datetime.now() tasks: list[TaskData] = [ t for t in UserData.tasks if t.due_date and datetime.fromisoformat(t.due_date) < now and not t.deleted and not t.completed and not t.trash and not t.notified ] return tasks # ------ PUBLIC METHODS ------ # def send(self, id: str, notification: Gio.Notification) -> None: """Send desktop Notification""" State.application.send_notification(id, notification) def start(self) -> None: """Start notifications daemon""" GLib.timeout_add_seconds(self.CHECK_INTERVAL_SEC, self.__check_data) # ------ PRIVATE METHODS ------ # def __check_data(self) -> bool: """Get due tasks and send notifications""" # If notifications is disabled - do nothing if not GSettings.get("notifications-enabled"): return True Log.debug("Notifications: Check") for task in self.due_tasks: self.__send_due_notification(task) UserData.update_props(task.list_uid, task.uid, ["notified"], [True]) return True def __send_due_notification(self, task: TaskData) -> None: Log.debug(f"Notifications: Send: {task.uid}") notification = Gio.Notification() notification.set_title(_("Task is Due")) notification.set_body(task.text) self.send(task.uid, notification) mrvladus-Errands-cbe30b3/errands/lib/plugins.py000066400000000000000000000064241464651330500217020ustar00rootroot00000000000000from __future__ import annotations from abc import ABC from typing import TYPE_CHECKING if TYPE_CHECKING: from errands.application import ErrandsApplication import os import subprocess import sys import importlib from gi.repository import Gtk, GLib, Gdk # type:ignore from errands.lib.logging import Log class PluginBase(ABC): author: str # Name of the author description: str # Short description icon_name: str # Icon that shows beside name main_view: Gtk.Widget # Main widget to put inside Errands view stack name: str # Name of the plugin url: str # Repo url class PluginsLoader: plugins: list[PluginBase] = [] def __init__(self, app: ErrandsApplication) -> None: self.app = app self._load_plugins() def _add_resources_path(self, dir): res_path: str = os.path.join(dir, "resources") if os.path.exists(res_path): # Icons icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) icon_theme.add_search_path(os.path.join(res_path, "icons")) def _get_user_plugins_dir(self) -> str: """Get plugins directory. Create if needed.""" plugin_dir: str = os.path.join(GLib.get_user_data_dir(), "errands", "plugins") sys.path.insert(1, plugin_dir) if not os.path.exists(plugin_dir): os.mkdir(plugin_dir) return plugin_dir def _get_plugins_dirs(self, plugin_dir: str) -> list[dict[str, str]]: """Get all dirs that contains 'plugin.py' file.""" plugin_names: list[str] = os.listdir(plugin_dir) plugins_dirs: list[dict[str, str]] = [] for name in plugin_names: dir = os.path.join(plugin_dir, name) if os.path.exists(os.path.join(dir, "plugin.py")): plugins_dirs.append({"name": name, "dir": dir}) sys.path.insert(1, dir) return plugins_dirs def _install_plugin_deps(self, plugin_dir: str): """ If dir contains 'requirements.txt' run pip to install deps to 'dependencies' dir. """ requirements_path: str = os.path.join(plugin_dir, "requirements.txt") if not os.path.exists(requirements_path): return dependencies_path: str = os.path.join(plugin_dir, "dependencies") if os.path.exists(dependencies_path): sys.path.insert(1, dependencies_path) else: os.mkdir(dependencies_path) sys.path.insert(1, dependencies_path) subprocess.check_call( [ sys.executable, "-m", "pip", "install", "-t", dependencies_path, "-r", requirements_path, ] ) def _load_plugin(self, name: str, path: str) -> None: Log.info(f"Plugins: Loading {name}") self._install_plugin_deps(path) plugin: PluginBase = importlib.import_module("plugin", path).Plugin() self.plugins.append(plugin) def _load_plugins(self): sys.dont_write_bytecode = True for i in self._get_plugins_dirs(self._get_user_plugins_dir()): self._add_resources_path(i["dir"]) self._load_plugin(i["name"], i["dir"]) mrvladus-Errands-cbe30b3/errands/lib/sync/000077500000000000000000000000001464651330500206155ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/lib/sync/providers/000077500000000000000000000000001464651330500226325ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/lib/sync/providers/caldav.py000066400000000000000000000464201464651330500244440ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from copy import deepcopy import datetime import time from dataclasses import asdict, dataclass, field from typing import Any import urllib3 import caldav from caldav import Calendar, DAVClient, Principal, Todo from caldav.elements import dav from errands.lib.data import TaskData, TaskListData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.utils import idle_add from errands.state import State @dataclass class UpdateUIArgs: update_trash: bool = False update_tags: bool = False tasks_to_change_parent: list[TaskData] = field(default_factory=lambda: []) tasks_to_change_list: list[tuple[TaskData, TaskData]] = field( default_factory=lambda: [] ) tasks_to_update: list[TaskData] = field(default_factory=lambda: []) tasks_to_purge: list[TaskData] = field(default_factory=lambda: []) lists_to_add: list[TaskListData] = field(default_factory=lambda: []) lists_to_update_tasks: list[str] = field(default_factory=lambda: []) lists_to_update_name: list[str] = field(default_factory=lambda: []) lists_to_purge_uids: list[str] = field(default_factory=lambda: []) class SyncProviderCalDAV: can_sync: bool = False calendars: list[Calendar] = None err: Exception = None def __init__(self, testing: bool, name: str = "CalDAV") -> bool: Log.info(f"Sync: Initialize '{name}' sync provider") self.name: str = name self.testing: bool = testing # Only for connection test if not self._check_credentials(): return self._check_url() 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: State.main_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("Sync: Attempting connection") self.err = None 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: time.sleep(2) self.err = e Log.error( f"Sync: Can't connect to {self.name} server at '{self.url}'. {e}" ) if not self.testing: State.main_window.add_toast( _("Can't connect to CalDAV server at:") + " " + self.url ) def __get_tasks(self, calendar: Calendar) -> list[TaskData]: """ Get todos from calendar and convert them to TaskData list """ try: Log.debug(f"Sync: Getting tasks for list '{calendar.id}'") todos: list[Todo] = calendar.todos(include_completed=True) tasks: list[TaskData] = [] for todo in todos: task: TaskData = TaskData.from_ical(todo.data, calendar.id) task.text = str(todo.icalendar_component.get("summary", "")) task.notes = str(todo.icalendar_component.get("description", "")) tasks.append(task) return tasks except BaseException 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 Exception as e: Log.error(f"Sync: Can't get caldendars from remote. {e}") return False @idle_add def __finish_sync(self) -> None: """Update UI thread safe""" Log.debug("Sync: Update UI") # Remove lists for lst in State.get_task_lists(): if lst.list_uid in self.update_ui_args.lists_to_purge_uids: Log.debug(f"Sync: Remove Task List '{lst.list_uid}'") lst.purge() # Add lists for lst in self.update_ui_args.lists_to_add: State.sidebar.add_task_list(lst) # Rename lists for uid in self.update_ui_args.lists_to_update_name: task_list = State.get_task_list(uid) task_list.update_title() task_list.sidebar_row.update_ui(False) # Move orphans on top-level for task in UserData.clean_orphans(): if task.list_uid not in self.update_ui_args.lists_to_update_tasks: self.update_ui_args.lists_to_update_tasks.append(task.list_uid) # Update lists for uid in self.update_ui_args.lists_to_update_tasks: list_to_upd = State.get_task_list(uid) list_to_upd.update_ui() for task in list_to_upd.all_tasks: task.update_tasks(False) task.update_title() task.update_progress_bar() # Remove tasks for task in self.update_ui_args.tasks_to_purge: to_remove = State.get_task(task.list_uid, task.uid) to_remove.parent.update_ui() to_remove.task_list.update_title() to_remove.purge() # Update tasks for task in self.update_ui_args.tasks_to_update: try: Log.debug(f"Sync: Update task '{task.uid}'") State.get_task(task.list_uid, task.uid).update_ui() except Exception: pass # Update tags if self.update_ui_args.update_tags: UserData.update_tags() State.tags_sidebar_row.update_ui() State.tags_page.update_ui() # Update trash if self.update_ui_args.update_trash: State.trash_sidebar_row.update_ui() if State.view_stack.get_visible_child_name() == "errands_today_page": State.today_page.update_ui() def sync(self) -> None: Log.info("Sync: Sync tasks with remote") if not self.__update_calendars(): return self.update_ui_args: UpdateUIArgs = UpdateUIArgs() self.__sync_lists() if not self.__update_calendars(): return self.__sync_tasks() self.__finish_sync() # ----- SYNC LISTS FUNCTIONS ----- # def __sync_lists(self): self.__add_local_lists() remote_lists_uids = [c.id for c in self.calendars] for list in UserData.get_lists_as_dicts(): for cal in self.calendars: if cal.id == list.uid: if list.synced: self.__update_local_list(cal, list) else: self.__update_remote_list(cal, list) if ( list.uid not in remote_lists_uids and not list.synced and not list.deleted ): self.__create_remote_list(list) elif list.uid not in remote_lists_uids and list.synced and not list.deleted: self.__delete_local_list(list) elif list.uid in remote_lists_uids and list.deleted and list.synced: self.__delete_remote_list(list) def __add_local_lists(self) -> None: user_lists_uids = [lst.uid for lst in UserData.get_lists_as_dicts()] for calendar in self.calendars: if calendar.id not in user_lists_uids: Log.debug(f"Sync: Copy list from remote '{calendar.id}'") new_list: TaskListData = UserData.add_list( name=calendar.name, uuid=calendar.id, synced=True ) self.update_ui_args.lists_to_add.append(new_list) def __delete_local_list(self, list: TaskListData) -> None: Log.debug(f"Sync: Delete local list deleted on remote '{list.uid}'") UserData.delete_list(list.uid) self.update_ui_args.lists_to_purge_uids.append(list.uid) self.update_ui_args.update_trash = True self.update_ui_args.update_tags = True def __delete_remote_list(self, list: TaskListData) -> None: for cal in self.calendars: if cal.id == list.uid: Log.debug(f"Sync: Delete list on remote '{cal.id}'") try: cal.delete() UserData.delete_list(cal.id) except BaseException: Log.debug(f"Sync: Can't delete list on remote '{cal.id}'") return def __create_remote_list(self, list: TaskListData) -> None: Log.debug(f"Sync: Create remote list {list.uid}") try: cal = self.principal.make_calendar( cal_id=list.uid, supported_calendar_component_set=["VTODO"], name=list.name, ) # Set color try: cal.set_properties([caldav.elements.ical.CalendarColor(list.color)]) except BaseException as e: Log.error(f"Sync: Can't set calendar color for list '{list.uid}'. {e}") UserData.update_list_prop(list.uid, "synced", True) except BaseException as e: Log.error(f"Sync: Can't create remote list '{list.uid}'. {e}") def __update_local_list(self, cal: Calendar, list: TaskListData): color: str | None = None color = cal.get_property(caldav.elements.ical.CalendarColor()) if not color: color = list.color if list.color != color or list.name != cal.name: Log.debug(f"Sync: Update local list '{list.uid}'") UserData.update_list_props( cal.id, ["name", "color", "synced"], [cal.name, color, True] ) self.update_ui_args.lists_to_update_name.append(cal.id) self.update_ui_args.update_trash = True def __update_remote_list(self, cal: Calendar, list: TaskListData): color: str | None = None color = cal.get_property(caldav.elements.ical.CalendarColor()) if not color: color = list.color if list.name != cal.name or list.color != color: try: Log.debug(f"Sync: Update remote list '{list.uid}'") cal.set_properties( [ dav.DisplayName(list.name), caldav.elements.ical.CalendarColor(list.color), ] ) UserData.update_list_props(cal.id, ["synced"], [True]) except BaseException as e: Log.error(f"Sync: Can't update remote list '{list.uid}'. {e}") # ----- SYNC TASKS FUNCTIONS ----- # def __sync_tasks(self): for calendar in self.calendars: # Get tasks local_tasks: list[TaskData] = UserData.get_tasks_as_dicts(calendar.id) remote_tasks: list[TaskData] = self.__get_tasks(calendar) # Create tasks local_ids: list[str] = [t.uid for t in local_tasks] deleted_uids: list[str] = [ t.uid for t in UserData.get_tasks_as_dicts() if t.deleted ] for task in remote_tasks: if task.uid not in local_ids and task.uid not in deleted_uids: self.__create_local_task(calendar, task) remote_ids: list[str] = [task.uid for task in remote_tasks] for task in local_tasks: if task.uid not in remote_ids and task.synced: self.__delete_local_task(calendar, task) elif task.uid in remote_ids and task.deleted: self.__delete_remote_task(calendar, task) elif task.uid not in remote_ids and not task.synced: self.__create_remote_task(calendar, task) elif task.uid in remote_ids and not task.synced: self.__update_remote_task(calendar, task) elif task.uid in remote_ids and task.synced: self.__update_local_task(calendar, task, remote_tasks) def __update_local_task( self, calendar: Calendar, task: TaskData, remote_tasks: list[TaskData] ): remote_task: TaskData = [t for t in remote_tasks if t.uid == task.uid][0] remote_task_keys = asdict(remote_task).keys() exclude_keys: str = "attachments synced trash expanded toolbar_shown deleted notified created_at" updated_props: list[str] = [] updated_values: list[Any] = [] for key in remote_task_keys: if key not in exclude_keys and getattr(remote_task, key) != getattr( task, key ): updated_props.append(key) updated_values.append(getattr(remote_task, key)) if not updated_props or ( updated_props == ["changed_at"] and updated_values == [""] ): return Log.debug(f"Sync: Update local task '{task.uid}'. Updated: {updated_props}") old_task: TaskData = deepcopy(task) UserData.update_props(calendar.id, task.uid, updated_props, updated_values) if "tags" in updated_props: self.update_ui_args.update_tags = True if "parent" in updated_props: if "list_uid" in updated_props: if old_task.list_uid not in self.update_ui_args.lists_to_update_tasks: self.update_ui_args.lists_to_update_tasks.append(old_task.list_uid) if task.list_uid not in self.update_ui_args.lists_to_update_tasks: self.update_ui_args.lists_to_update_tasks.append(task.list_uid) else: self.update_ui_args.tasks_to_update.append(task) def __update_remote_task(self, calendar: Calendar, task: TaskData) -> None: Log.debug(f"Sync: Update remote task '{task.uid}'") try: todo: Todo = calendar.todo_by_uid(task.uid) if task.due_date: todo.icalendar_component["due"] = task.due_date else: try: del todo.icalendar_component["due"] except BaseException: pass if task.start_date: todo.icalendar_component["dtstart"] = task.start_date else: try: del todo.icalendar_component["dtstart"] except BaseException: pass if task.created_at: todo.icalendar_component["dtstamp"] = task.created_at else: try: del todo.icalendar_component["dtstamp"] except BaseException: pass if task.changed_at: todo.icalendar_component["last-modified"] = task.changed_at else: try: del todo.icalendar_component["last-modified"] except BaseException: pass todo.icalendar_component["summary"] = task.text todo.icalendar_component["percent-complete"] = int(task.percent_complete) todo.icalendar_component["description"] = task.notes todo.icalendar_component["priority"] = task.priority todo.icalendar_component["categories"] = ( ",".join(task.tags) if task.tags else [] ) todo.icalendar_component["related-to"] = task.parent todo.icalendar_component["x-errands-color"] = task.color todo.icalendar_component["x-errands-toolbar-shown"] = int( task.toolbar_shown ) todo.icalendar_component["x-errands-expanded"] = int(task.expanded) todo.save() todo.uncomplete() 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}") def __create_remote_task(self, calendar: Calendar, task: TaskData) -> None: Log.debug(f"Sync: Create remote task '{task.uid}'") try: new_todo = calendar.save_todo( **{ "categories": ",".join(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.due_date) if task.due_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, "x-errands-expanded": int(task.expanded), "x-errands-toolbar-shown": int(task.toolbar_shown), } ) 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}. {e}") def __delete_local_task(self, calendar: Calendar, task: TaskData) -> None: Log.debug(f"Sync: Delete local task '{task.uid}'") UserData.delete_task(calendar.id, task.uid) self.update_ui_args.tasks_to_purge.append(task) self.update_ui_args.update_trash = True self.update_ui_args.update_tags = True def __delete_remote_task(self, calendar: Calendar, task: TaskData) -> None: Log.debug(f"Sync: Delete remote task '{task.uid}'") try: 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}") def __create_local_task(self, calendar: Calendar, task: TaskData) -> None: Log.debug( f"Sync: Copy new task from remote to list '{calendar.id}': {task.uid}" ) UserData.add_task(**asdict(task)) if task.list_uid not in self.update_ui_args.lists_to_update_tasks: self.update_ui_args.lists_to_update_tasks.append(task.list_uid) mrvladus-Errands-cbe30b3/errands/lib/sync/providers/nextcloud.py000066400000000000000000000017051464651330500252140ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from 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 "remote.php" not 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-cbe30b3/errands/lib/sync/sync.py000066400000000000000000000047551464651330500221560ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import GLib # type:ignore from errands.lib.data import UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.providers.caldav import SyncProviderCalDAV from errands.lib.sync.providers.nextcloud import SyncProviderNextcloud from errands.lib.utils import threaded from errands.state import State class Sync: provider = None syncing: bool = False sync_again: bool = False @classmethod def init(self, testing: bool = False) -> None: 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(testing=testing) case 2: self.provider = SyncProviderCalDAV(testing=testing) @classmethod @threaded def sync(self) -> None: """ Sync tasks without blocking the UI """ if GSettings.get("sync-provider") == 0: UserData.clean_deleted() return if not self.provider: GLib.idle_add(State.sidebar.toggle_sync_indicator, True) self.init() GLib.idle_add(State.sidebar.toggle_sync_indicator, False) if self.provider and self.provider.can_sync: if self.syncing: self.sync_again = True return self.syncing = True if State.view_stack.get_visible_child_name() == "errands_status_page": State.view_stack.set_visible_child_name("errands_syncing_page") GLib.idle_add(State.sidebar.toggle_sync_indicator, True) self.provider.sync() UserData.clean_deleted() if self.sync_again: self.sync() self.sync_again = False GLib.idle_add(State.sidebar.toggle_sync_indicator, False) self.syncing = False if ( State.view_stack.get_visible_child_name() == "errands_syncing_page" and UserData.task_lists ): State.view_stack.set_visible_child_name("errands_today_page") # TODO: Needs to be threaded to not block UI @classmethod def test_connection(self) -> tuple: self.init(testing=True) return self.provider.can_sync, self.provider.err mrvladus-Errands-cbe30b3/errands/lib/utils.py000066400000000000000000000042061464651330500213550ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import random import time from datetime import datetime from functools import wraps from threading import Thread from typing import Callable from gi.repository import GLib, Gtk # type:ignore def get_human_datetime(date_time: str) -> str: if date_time: dt: datetime = datetime.fromisoformat(date_time) if "T" not in date_time: out: str = dt.strftime("%d %B") else: out: str = dt.strftime("%d %B %H:%M") if "00:00" in out: out: str = out.removesuffix("00:00") else: out: str = _("Date") return out 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) 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 def idle_add(func: Callable): """Call function with GLib.idle_add() without blocking UI""" @wraps(func) def wrapper(*args, **kwargs): GLib.idle_add(func, *args) return wrapper def timeit(func): @wraps(func) def timeit_wrapper(*args, **kwargs): global PROFILING_LOG start_time = time.perf_counter() result = func(*args, **kwargs) end_time = time.perf_counter() total_time = end_time - start_time print(f"{func.__name__} | {args} | {total_time:.4f}") return result return timeit_wrapper def rgb_to_hex(r: str, g: str, b: str) -> str: return "#{:02x}{:02x}{:02x}".format(int(r), int(g), int(b)) def random_hex_color() -> str: hex_chars: str = "0123456789ABCDEF" return "#" + "".join(random.choice(hex_chars) for _ in range(6)) mrvladus-Errands-cbe30b3/errands/meson.build000066400000000000000000000007651464651330500212450ustar00rootroot00000000000000configure_file( input: 'errands.py', output: 'errands', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr--r--' ) install_data('application.py', install_dir: moduledir) install_data('state.py', install_dir: moduledir) 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-cbe30b3/errands/state.py000066400000000000000000000073061464651330500205730ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from gi.repository import Adw # type:ignore if TYPE_CHECKING: from errands.application import ErrandsApplication from errands.lib.notifications import ErrandsNotificationsDaemon from errands.widgets.loading_page import ErrandsLoadingPage from errands.widgets.shared.task_toolbar import ( ErrandsDateTimeWindow, ErrandsAttachmentsWindow, ErrandsNotesWindow, ) from errands.widgets.sidebar import Sidebar from errands.widgets.tags.tags import Tags from errands.widgets.tags.tags_sidebar_row import TagsSidebarRow from errands.widgets.task import Task from errands.widgets.task_list.task_list import TaskList from errands.widgets.today.today import Today from errands.widgets.today.today_sidebar_row import TodaySidebarRow from errands.widgets.today.today_task import TodayTask from errands.widgets.trash.trash import Trash from errands.widgets.trash.trash_sidebar_row import TrashSidebarRow from errands.widgets.window import Window class State: """Application's state class for accessing core widgets globally and some utils for quick access to deeper nested widgets""" # Constants PROFILE: str = None APP_ID: str = None VERSION: str = None # Notifications notifications_daemon: ErrandsNotificationsDaemon | None = None # Application application: ErrandsApplication | None = None # Main window main_window: Window | None = None split_view: Adw.NavigationSplitView | None = None # View Stack loading_page: ErrandsLoadingPage | None = None view_stack: Adw.ViewStack | None = None today_page: Today | None = None tags_page: Tags | None = None trash_page: Trash | None = None # Sidebar sidebar: Sidebar | None = None today_sidebar_row: TodaySidebarRow | None = None tags_sidebar_row: TagsSidebarRow | None = None trash_sidebar_row: TrashSidebarRow | None = None # Notes window notes_window: ErrandsNotesWindow | None = None # Date and time window datetime_window: ErrandsDateTimeWindow | None = None # Attachments window attachments_window: ErrandsAttachmentsWindow | None = None @classmethod def init(cls) -> None: from errands.widgets.shared.task_toolbar import ( ErrandsNotesWindow, ErrandsDateTimeWindow, ErrandsAttachmentsWindow, ) cls.notes_window = ErrandsNotesWindow() cls.datetime_window = ErrandsDateTimeWindow() cls.attachments_window = ErrandsAttachmentsWindow() @classmethod def get_task_list(cls, uid: str) -> TaskList: return [lst for lst in cls.get_task_lists() if lst.list_uid == uid][0] @classmethod def get_task_lists(cls) -> list[TaskList]: """All Task Lists""" return cls.sidebar.task_lists @classmethod def get_tasks(cls) -> list[Task]: """All Tasks in all Task Lists""" all_tasks: list[Task] = [] for list in cls.get_task_lists(): all_tasks.extend(list.all_tasks) return all_tasks @classmethod def get_task(cls, list_uid: str, uid: str) -> Task: for list in cls.get_task_lists(): if list.list_uid == list_uid: for task in list.all_tasks: if task.uid == uid: return task @classmethod def get_today_task(cls, list_uid: str, uid: str) -> TodayTask | None: for task in cls.today_page.tasks: if task.list_uid == list_uid and task.uid == uid: return task return None mrvladus-Errands-cbe30b3/errands/widgets/000077500000000000000000000000001464651330500205415ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/loading_page.py000066400000000000000000000020701464651330500235230ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, Gtk # type:ignore from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView class ErrandsLoadingPage(Adw.Bin): def __init__(self): super().__init__() State.loading_page = self self.__build_ui() def __build_ui(self): self.set_child( ErrandsToolbarView( top_bars=[Adw.HeaderBar(show_title=False)], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[ Adw.StatusPage( title=_("Loading Tasks..."), icon_name="errands-progressbar-symbolic", vexpand=True, css_classes=["compact"], ) ], ), ) ) mrvladus-Errands-cbe30b3/errands/widgets/preferences.py000066400000000000000000000221111464651330500234110ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, Gtk # type:ignore from errands.lib.goa import get_goa_credentials from errands.lib.gsettings import GSettings from errands.lib.sync.sync import Sync from caldav.lib import error from requests import exceptions from errands.state import State from errands.widgets.shared.components.buttons import ErrandsButton, ErrandsInfoButton class PreferencesWindow(Adw.PreferencesDialog): selected_provider: int = 0 def __init__(self) -> None: super().__init__() self._build_ui() self._setup_sync() def _build_ui(self) -> None: # 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")) # New task position new_task_position = Adw.ComboRow( title=_("Add new Tasks"), model=Gtk.StringList.new([_("At the Bottom"), _("At the Top")]), icon_name="errands-add-symbolic", ) new_task_position.set_selected( int(GSettings.get("task-list-new-task-position-top")) ) new_task_position.connect( "notify::selected", lambda row, *_: GSettings.set( "task-list-new-task-position-top", "b", bool(row.get_selected()) ), ) task_list_group.add(new_task_position) # Notifications notifications = Adw.SwitchRow( title=_("Show Notifications"), icon_name="errands-notification-symbolic", ) GSettings.bind("notifications-enabled", notifications, "active") # Background background = Adw.SwitchRow( title=_("Run in Background"), subtitle=_("Hide the application window instead of closing it"), icon_name="errands-progressbar-symbolic", ) GSettings.bind("run-in-background", background, "active") # Background launch_on_startup = Adw.SwitchRow( title=_("Launch on Startup"), subtitle=_("Launch application when user logs in"), icon_name="errands-progressbar-symbolic", ) GSettings.bind("launch-on-startup", launch_on_startup, "active") launch_on_startup.connect( "notify::active", lambda *_: State.application.run_in_background() ) notifications_and_bg_group = Adw.PreferencesGroup( title=_("Notifications and Background") ) notifications_and_bg_group.add(notifications) notifications_and_bg_group.add(background) notifications_and_bg_group.add(launch_on_startup) # 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") self.sync_url.add_suffix( ErrandsInfoButton( info_text=_( "URL needs to include protocol, like http:// or https://. If you have problems with connection - try to change protocol first." ) ) ) 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 = ErrandsButton( label=_("Test"), valign="center", on_click=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) # Appearance Page appearance_page = Adw.PreferencesPage( title=_("General"), icon_name="errands-settings-symbolic" ) appearance_page.add(theme_group) appearance_page.add(task_list_group) appearance_page.add(notifications_and_bg_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, err = Sync.test_connection() msg: str = _("Connected") if not res: match type(err): case error.AuthorizationError: msg: str = _("Authorization failed") case exceptions.ConnectionError: msg: str = _("Could not locate server. Check network and url.") case error.PropfindError: msg: str = _("Can't connect") case _: # NOTE: Also catches invalid credentials msg: str = _("Can't connect. Check credentials") 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) mrvladus-Errands-cbe30b3/errands/widgets/shared/000077500000000000000000000000001464651330500220075ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/shared/color_selector.py000066400000000000000000000100001464651330500253660ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from gi.repository import GObject, Gtk # type:ignore from errands.lib.logging import Log from errands.lib.utils import get_children from errands.widgets.shared.components.buttons import ErrandsCheckButton class ErrandsColorSelector(Gtk.Box): color_selected: GObject.Signal = GObject.Signal( name="color-selected", arg_types=(ErrandsCheckButton, str), ) def __init__(self, on_color_selected: Callable): super().__init__() self.__build_ui() self.connect("color-selected", on_color_selected) @property def buttons(self) -> list[ErrandsCheckButton]: return get_children(self) def __build_ui(self) -> None: none_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="none", on_toggle=lambda *_: self.emit("color-selected", none_color_btn, "none"), css_classes=["accent-color-btn", "accent-color-btn-none"], tooltip_text=_("None"), ) self.append(none_color_btn) blue_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="blue", group=none_color_btn, on_toggle=lambda *_: self.emit("color-selected", blue_color_btn, "blue"), css_classes=["accent-color-btn", "accent-color-btn-blue"], tooltip_text=_("Blue"), ) self.append(blue_color_btn) green_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="green", group=none_color_btn, on_toggle=lambda *_: self.emit("color-selected", green_color_btn, "green"), css_classes=["accent-color-btn", "accent-color-btn-green"], tooltip_text=_("Green"), ) self.append(green_color_btn) yellow_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="yellow", group=none_color_btn, on_toggle=lambda *_: self.emit( "color-selected", yellow_color_btn, "yellow" ), css_classes=["accent-color-btn", "accent-color-btn-yellow"], tooltip_text=_("Yellow"), ) self.append(yellow_color_btn) orange_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="orange", group=none_color_btn, on_toggle=lambda *_: self.emit( "color-selected", orange_color_btn, "orange" ), css_classes=["accent-color-btn", "accent-color-btn-orange"], tooltip_text=_("Orange"), ) self.append(orange_color_btn) red_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="red", group=none_color_btn, on_toggle=lambda *_: self.emit("color-selected", red_color_btn, "red"), css_classes=["accent-color-btn", "accent-color-btn-red"], tooltip_text=_("Red"), ) self.append(red_color_btn) purple_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="purple", group=none_color_btn, on_toggle=lambda *_: self.emit( "color-selected", purple_color_btn, "purple" ), css_classes=["accent-color-btn", "accent-color-btn-purple"], tooltip_text=_("Purple"), ) self.append(purple_color_btn) brown_color_btn: ErrandsCheckButton = ErrandsCheckButton( name="brown", group=none_color_btn, on_toggle=lambda *_: self.emit("color-selected", brown_color_btn, "brown"), css_classes=["accent-color-btn", "accent-color-btn-brown"], tooltip_text=_("Brown"), ) self.append(brown_color_btn) def select_color(self, color: str): if color == "": color = "none" Log.debug(f"Color Selector: set color to '{color}'") for btn in self.buttons: if btn.get_name() == color: btn.set_active(True) break mrvladus-Errands-cbe30b3/errands/widgets/shared/components/000077500000000000000000000000001464651330500241745ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/shared/components/boxes.py000066400000000000000000000036041464651330500256710ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from gi.repository import Gtk # type:ignore from errands.lib.utils import get_children class ErrandsBox(Gtk.Box): def __init__(self, children: list[Gtk.Widget], **kwargs) -> None: super().__init__(**kwargs) for child in children: self.append(child) @property def children(self) -> list[Gtk.Widget]: return get_children(self) def for_each(self, func: Callable) -> None: """Call func for each child. Child passed as first argument""" for child in self.children: func(child) class ErrandsFlowBox(Gtk.FlowBox): def __init__(self, children: list[Gtk.Widget], **kwargs) -> None: super().__init__(**kwargs) for child in children: self.append(child) @property def children(self) -> list[Gtk.Widget]: return get_children(self) def for_each(self, func: Callable) -> None: """Call func for each child. Child passed as first argument""" for child in self.children: func(child) class ErrandsListBox(Gtk.ListBox): def __init__( self, children: list[Gtk.Widget], on_row_activated: Callable = None, on_row_selected: Callable = None, **kwargs, ) -> None: super().__init__(**kwargs) for child in children: self.append(child) if on_row_selected: self.connect("row-selected", on_row_selected) if on_row_activated: self.connect("row-activated", on_row_activated) @property def children(self) -> list[Gtk.Widget]: return get_children(self) def for_each(self, func: Callable) -> None: """Call func for each child. Child passed as first argument""" for child in self.children: func(child) mrvladus-Errands-cbe30b3/errands/widgets/shared/components/buttons.py000066400000000000000000000034671464651330500262560ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from gi.repository import Gtk # type:ignore class ErrandsButton(Gtk.Button): def __init__(self, on_click: Callable = None, **kwargs) -> None: super().__init__(**kwargs) if on_click: self.connect("clicked", on_click) class ErrandsCheckButton(Gtk.CheckButton): def __init__(self, on_toggle: Callable = None, **kwargs) -> None: super().__init__(**kwargs) if on_toggle: self.connect("toggled", on_toggle) class ErrandsToggleButton(Gtk.ToggleButton): def __init__(self, on_toggle: Callable = None, **kwargs) -> None: super().__init__(**kwargs) if on_toggle: self.connect("toggled", on_toggle) class ErrandsSpinButton(Gtk.SpinButton): def __init__(self, on_value_changed: Callable = None, **kwargs) -> None: super().__init__(**kwargs) if on_value_changed: self.connect("value-changed", on_value_changed) class ErrandsInfoButton(Gtk.MenuButton): """Button with text inside a popover""" def __init__(self, info_text: str, **kwargs) -> None: super().__init__(**kwargs) self.set_valign(Gtk.Align.CENTER) self.set_icon_name("errands-info-symbolic") self.set_tooltip_text(_("Info")) self.add_css_class("flat") self.set_popover( Gtk.Popover( child=Gtk.Label( label=info_text, use_markup=True, wrap_mode=0, wrap=True, max_width_chars=20, margin_bottom=6, margin_top=6, margin_end=3, margin_start=3, ) ) ) mrvladus-Errands-cbe30b3/errands/widgets/shared/components/controllers.py000066400000000000000000000000001464651330500271020ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/shared/components/dialogs.py000066400000000000000000000021271464651330500261720ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from gi.repository import Adw, Gio from errands.state import State # type:ignore class ConfirmDialog(Adw.MessageDialog): """Confirmation dialog""" def __init__( self, text: str, confirm_text: str, style: Adw.ResponseAppearance, confirm_callback: Callable, ): super().__init__() self.__text = text self.__confirm_text = confirm_text self.__style = style self.__build_ui() self.connect("response", confirm_callback) self.present() def __build_ui(self): self.set_transient_for(State.main_window) self.set_hide_on_close(True) self.set_heading(_("Are you sure?")) self.set_body(self.__text) self.set_default_response("confirm") self.set_close_response("cancel") self.add_response("cancel", _("Cancel")) self.add_response("confirm", self.__confirm_text) self.set_response_appearance("confirm", self.__style) mrvladus-Errands-cbe30b3/errands/widgets/shared/components/entries.py000066400000000000000000000010471464651330500262210ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from typing import Callable from gi.repository import Adw, Gtk # type:ignore class ErrandsEntryRow(Adw.EntryRow): def __init__(self, on_entry_activated: Callable, **kwargs) -> None: super().__init__(**kwargs) self.connect("entry-activated", on_entry_activated) class ErrandsEntry(Gtk.Entry): def __init__(self, on_activate: Callable, **kwargs) -> None: super().__init__(**kwargs) self.connect("activate", on_activate) mrvladus-Errands-cbe30b3/errands/widgets/shared/components/header_bar.py000066400000000000000000000011041464651330500266160ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, Gtk # type:ignore def ErrandsHeaderBar( start_children: list[Gtk.Widget] = None, end_children: list[Gtk.Widget] = None, **kwargs, ) -> Adw.HeaderBar: """Create AdwHeaderBar with children packed""" hb: Adw.HeaderBar = Adw.HeaderBar(**kwargs) if start_children: for child in start_children: hb.pack_start(child) if end_children: for child in end_children: hb.pack_end(child) return hb mrvladus-Errands-cbe30b3/errands/widgets/shared/components/menus.py000066400000000000000000000012361464651330500256770ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from dataclasses import dataclass from gi.repository import Gio # type:ignore @dataclass class ErrandsMenuItem: label: str detailed_action: str class ErrandsSimpleMenu(Gio.Menu): def __init__(self, items: tuple[ErrandsMenuItem]) -> None: super().__init__() for item in items: self.append(item.label, item.detailed_action) class ErrandsSectionedMenu(Gio.Menu): def __init__(self, sections: tuple[ErrandsSimpleMenu]) -> None: super().__init__() for section in sections: self.append_section(None, section) mrvladus-Errands-cbe30b3/errands/widgets/shared/components/toolbar_view.py000066400000000000000000000011621464651330500272420ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, Gtk # type:ignore def ErrandsToolbarView( top_bars: list[Gtk.Widget] = None, bottom_bars: list[Gtk.Widget] = None, **kwargs, ) -> Adw.ToolbarView: """Create AdwToolbarView with top and bottom bars added""" toolbar_view: Adw.ToolbarView = Adw.ToolbarView(**kwargs) if top_bars: for child in top_bars: toolbar_view.add_top_bar(child) if bottom_bars: for child in bottom_bars: toolbar_view.add_bottom_bar(child) return toolbar_view mrvladus-Errands-cbe30b3/errands/widgets/shared/datetime_picker.py000066400000000000000000000246761464651330500255310ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import datetime from gi.repository import Adw, GLib, Gtk # type:ignore from errands.lib.utils import get_human_datetime from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ErrandsButton, ErrandsSpinButton class DateTimePicker(Gtk.Box): # STATE __datetime: str = "" lock_signals: bool = True def __init__(self, **kwargs): super().__init__(**kwargs) self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: self.set_orientation(Gtk.Orientation.VERTICAL) self.set_spacing(12) # Date and Time label self.label = Gtk.Label(halign=Gtk.Align.CENTER, css_classes=["title-2"]) self.append(self.label) # Separator self.append( Gtk.Separator(margin_end=6, margin_start=6, css_classes=["dim-label"]) ) # Time self.hours: ErrandsSpinButton = ErrandsSpinButton( orientation=Gtk.Orientation.VERTICAL, numeric=True, adjustment=Gtk.Adjustment(lower=0, upper=23, step_increment=1), on_value_changed=self._on_date_time_changed, ) self.minutes: ErrandsSpinButton = ErrandsSpinButton( orientation=Gtk.Orientation.VERTICAL, numeric=True, adjustment=Gtk.Adjustment(lower=0, upper=59, step_increment=1), on_value_changed=self._on_date_time_changed, ) self.append( ErrandsBox( halign=Gtk.Align.CENTER, spacing=6, children=[ # Time ErrandsBox( halign=Gtk.Align.CENTER, spacing=6, children=[ self.hours, Gtk.Label(label=":", css_classes=["heading"]), self.minutes, ], ), # Presets ErrandsBox( orientation=Gtk.Orientation.VERTICAL, spacing=6, children=[ # Time presets ErrandsBox( orientation=Gtk.Orientation.VERTICAL, spacing=6, children=[ ErrandsBox( spacing=6, homogeneous=True, children=[ ErrandsButton( on_click=self._on_time_preset_clicked, css_classes=["flat"], child=Adw.ButtonContent( label="09:00", icon_name="errands-daytime-morning-symbolic", ), ), ErrandsButton( on_click=self._on_time_preset_clicked, css_classes=["flat"], child=Adw.ButtonContent( label="13:00", icon_name="errands-theme-light-symbolic", ), ), ], ), ErrandsBox( spacing=6, homogeneous=True, children=[ ErrandsButton( on_click=self._on_time_preset_clicked, css_classes=["flat"], child=Adw.ButtonContent( label="17:00", icon_name="errands-daytime-sunset-symbolic", ), ), ErrandsButton( on_click=self._on_time_preset_clicked, css_classes=["flat"], child=Adw.ButtonContent( label="20:00", icon_name="errands-theme-dark-symbolic", ), ), ], ), ], ), # Separator Gtk.Separator( margin_end=6, margin_start=6, css_classes=["dim-label"] ), # Day presets ErrandsBox( orientation=Gtk.Orientation.VERTICAL, spacing=6, children=[ ErrandsBox( spacing=6, homogeneous=True, children=[ ErrandsButton( on_click=self._on_today_clicked, css_classes=["flat"], label=_("Today"), ), ErrandsButton( on_click=self._on_tomorrow_clicked, css_classes=["flat"], label=_("Tomorrow"), ), ], ), ErrandsBox( spacing=6, homogeneous=True, children=[ ErrandsButton( on_click=self._on_now_clicked, css_classes=["flat"], label=_("Now"), ), ErrandsButton( on_click=self._on_clear_clicked, css_classes=["flat"], child=Adw.ButtonContent( label=_("Clear"), icon_name="errands-delete-all-symbolic", ), ), ], ), ], ), ], ), ], ) ) # Separator self.append( Gtk.Separator(margin_end=6, margin_start=6, css_classes=["dim-label"]) ) # Calendar self.calendar = Gtk.Calendar() self.calendar.connect("day-selected", self._on_date_time_changed) self.append(self.calendar) # ------ PROPERTIES ------ # @property def datetime(self) -> str: return self.__datetime @datetime.setter def datetime(self, dt: str) -> str: self.lock_signals = True if dt: if "T" not in dt: self.hours.set_value(0) self.minutes.set_value(0) else: dt = datetime.datetime.fromisoformat(dt).strftime("%Y%m%dT%H%M%S") self.hours.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.hours.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 self.label.set_label(self.human_datetime if dt else _("Set Date")) @property def human_datetime(self) -> str: return get_human_datetime(self.datetime) # ------ SIGNAL HANDLERS ------ # def _on_clear_clicked(self, btn: Gtk.Button): self.datetime = "" def _on_date_time_changed(self, *_args): # Get hour hour: str = str(self.hours.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" def _on_now_clicked(self, btn: Gtk.Button): self.datetime = datetime.datetime.now().strftime("%Y%m%dT%H%M00") def _on_time_preset_clicked(self, btn: Gtk.Button): hour, min = btn.get_child().props.label.split(":") self.hours.set_value(int(hour)) self.minutes.set_value(int(min)) def _on_today_clicked(self, btn: Gtk.Button): self.datetime = datetime.datetime.now().strftime("%Y%m%d") def _on_tomorrow_clicked(self, btn: Gtk.Button): self.datetime = (datetime.datetime.now() + datetime.timedelta(1)).strftime( "%Y%m%d" ) mrvladus-Errands-cbe30b3/errands/widgets/shared/sidebar_item.py000066400000000000000000000010441464651330500250070ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Gio, Gtk # type:ignore class ErrandsSidebarItem(Gtk.Box): def __init__( self, title: str | None = None, icon_name: str | None = None, menu_model: Gio.Menu | None = None, ): super().__init__() self.title: str = title self.icon_name: str = icon_name self.menu_model: Gio.Menu = menu_model self.__build_ui() def __build_ui(self) -> None: pass mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/000077500000000000000000000000001464651330500244735ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/__init__.py000066400000000000000000000005261464651330500266070ustar00rootroot00000000000000from errands.widgets.shared.task_toolbar.toolbar import ErrandsTaskToolbar from errands.widgets.shared.task_toolbar.attachments_window import ( ErrandsAttachmentsWindow, ) from errands.widgets.shared.task_toolbar.datetime_window import ErrandsDateTimeWindow from errands.widgets.shared.task_toolbar.notes_window import ErrandsNotesWindow mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/attachments_window.py000066400000000000000000000130011464651330500307420ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations import os from typing import TYPE_CHECKING from gi.repository import Adw, Gio, Gtk # type:ignore from errands.lib.logging import Log from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ErrandsButton from errands.widgets.shared.components.header_bar import ErrandsHeaderBar from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView if TYPE_CHECKING: from errands.widgets.task import Task class ErrandsAttachmentsWindow(Adw.Dialog): def __init__(self): super().__init__() self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: self.set_follows_content_size(True) self.set_title(_("Attachments")) self.status_page: Adw.StatusPage = Adw.StatusPage( title=_("No Files Attached"), icon_name="errands-attachment-symbolic", css_classes=["compact"], vexpand=True, ) self.attachments_list: Gtk.ListBox = Gtk.ListBox( selection_mode=Gtk.SelectionMode.NONE, css_classes=["boxed-list"], margin_bottom=12, margin_top=6, margin_end=12, margin_start=12, valign=Gtk.Align.START, ) self.set_child( ErrandsToolbarView( top_bars=[ ErrandsHeaderBar( start_children=[ ErrandsButton( icon_name="errands-add-symbolic", tooltip_text=_("Add Attachment"), on_click=self.__on_attachment_btn_clicked, ) ] ) ], content=Gtk.ScrolledWindow( child=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[self.status_page, self.attachments_list], ), propagate_natural_height=True, ), width_request=360, ) ) def show(self, task: Task): self.task = task self.attachments_list.remove_all() for path in self.task.task_data.attachments: self.attachments_list.append(ErrandsAttachment(path)) self.update_ui() self.present(State.main_window) def update_ui(self): size: int = len(self.task.task_data.attachments) self.status_page.set_visible(size == 0) self.attachments_list.set_visible(size > 0) def __on_attachment_btn_clicked(self, _btn: ErrandsButton): def __confirm(dialog: Gtk.FileDialog, res) -> None: try: file: Gio.File = dialog.open_finish(res) except Exception as e: Log.debug(f"Attachments: Selecting file cancelled. {e}") return path: str = file.get_path() if path not in self.task.task_data.attachments: new_attachments: list[str] = self.task.task_data.attachments new_attachments.append(path) self.task.update_props(["attachments"], [new_attachments]) self.attachments_list.append(ErrandsAttachment(path)) self.update_ui() dialog = Gtk.FileDialog() dialog.open(State.main_window, None, __confirm) def do_closed(self): self.task.update_toolbar() class ErrandsAttachment(Adw.ActionRow): def __init__(self, path: str): super().__init__() self.path: str = path self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: self.set_activatable(True) self.set_tooltip_text(_("Open File")) self.set_title(os.path.basename(self.path)) self.add_suffix( ErrandsButton( tooltip_text=_("Delete"), valign=Gtk.Align.CENTER, icon_name="errands-trash-symbolic", css_classes=["error", "flat"], on_click=self.__on_delete_btn_clicked, ) ) self.add_prefix( ErrandsButton( tooltip_text=_("Open Containing Folder"), valign=Gtk.Align.CENTER, icon_name="errands-folder-symbolic", css_classes=["flat"], on_click=self.__on_show_folder_btn_clicked, ) ) self.connect("activated", self.__on_click) def __on_click(self, *_args): Log.info(f"Attachments: Open file '{self.path}'") file: Gio.File = Gio.File.new_for_path(self.path) Gtk.FileLauncher(file=file).launch(State.main_window, None) def __on_delete_btn_clicked(self, _btn: ErrandsButton): task: Task = State.attachments_window.task new_attachments: list[str] = task.task_data.attachments new_attachments.remove(self.path) task.update_props(["attachments"], [new_attachments]) State.attachments_window.attachments_list.remove(self) State.attachments_window.update_ui() del self def __on_show_folder_btn_clicked(self, _btn: ErrandsButton): Log.info(f"Attachments: Open folder '{self.path}'") file: Gio.File = Gio.File.new_for_path(self.path) Gtk.FileLauncher(file=file).open_containing_folder(State.main_window, None) mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/datetime_window.py000066400000000000000000000062621464651330500302360ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from gi.repository import Adw, Gtk # type:ignore from errands.lib.sync.sync import Sync from errands.state import State from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.shared.datetime_picker import DateTimePicker if TYPE_CHECKING: from errands.widgets.task import Task from errands.widgets.today.today_task import TodayTask class ErrandsDateTimeWindow(Adw.Dialog): def __init__(self): super().__init__() self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: self.set_follows_content_size(True) self.set_title(_("Date and Time")) # View Stack stack: Adw.ViewStack = Adw.ViewStack() # Due Page self.due_date_time: DateTimePicker = DateTimePicker( margin_start=12, margin_end=12, margin_top=12, margin_bottom=12 ) stack.add_titled_with_icon( name=_("Due"), icon_name="errands-calendar-symbolic", title=_("Due"), child=Gtk.ScrolledWindow( propagate_natural_height=True, propagate_natural_width=True, child=self.due_date_time, ), ) # Start Page self.start_date_time: DateTimePicker = DateTimePicker( margin_start=12, margin_end=12, margin_top=12, margin_bottom=12 ) stack.add_titled_with_icon( name=_("Start"), icon_name="errands-calendar-symbolic", title=_("Start"), child=Gtk.ScrolledWindow( propagate_natural_height=True, propagate_natural_width=True, child=self.start_date_time, ), ) self.set_child( ErrandsToolbarView( top_bars=[ Adw.HeaderBar( title_widget=Adw.ViewSwitcher( policy=Adw.ViewSwitcherPolicy.WIDE, stack=stack ) ) ], content=stack, ) ) # ------ PUBLIC METHODS ------ # def show(self, task: Task | TodayTask): self.task = task self.start_date_time.datetime = self.task.task_data.start_date self.due_date_time.datetime = self.task.task_data.due_date self.present(State.main_window) # ------ SIGNAL HANDLERS ------ # def do_closed(self): changed: bool = False if self.due_date_time.datetime != self.task.task_data.due_date: self.task.update_props( ["due_date", "synced"], [self.due_date_time.datetime, False] ) self.task.update_toolbar() changed = True if self.start_date_time.datetime != self.task.task_data.start_date: self.task.update_props( ["start_date", "synced"], [self.start_date_time.datetime, False] ) changed = True State.today_page.update_ui() if changed: Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/notes_window.py000066400000000000000000000051251464651330500275670ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from gi.repository import Adw, GObject, Gtk, GtkSource # type:ignore from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.state import State from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView if TYPE_CHECKING: from errands.widgets.task import Task class ErrandsNotesWindow(Adw.Dialog): def __init__(self): super().__init__() self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: self.set_content_width(600) self.set_content_height(600) self.set_title(_("Notes")) # Buffer self.buffer: GtkSource.Buffer = GtkSource.Buffer() Adw.StyleManager.get_default().bind_property( "dark", self.buffer, "style-scheme", GObject.BindingFlags.SYNC_CREATE, lambda _, is_dark: self.buffer.set_style_scheme( GtkSource.StyleSchemeManager.get_default().get_scheme( "Adwaita-dark" if is_dark else "Adwaita" ) ), ) self.buffer.set_language( GtkSource.LanguageManager.get_default().get_language("markdown") ) # Toolbar View self.set_child( ErrandsToolbarView( top_bars=[Adw.HeaderBar()], top_bar_style=Adw.ToolbarStyle.RAISED, content=Gtk.ScrolledWindow( propagate_natural_height=True, propagate_natural_width=True, child=GtkSource.View( wrap_mode=3, top_margin=6, bottom_margin=6, left_margin=6, right_margin=6, show_line_numbers=True, buffer=self.buffer, ), ), ) ) # ------ PUBLIC METHODS ------ # def show(self, task: Task): self.task = task self.buffer.props.text = self.task.task_data.notes self.present(State.main_window) # ------ SIGNAL HANDLERS ------ # def do_closed(self): text: str = self.buffer.props.text if text == self.task.task_data.notes: return Log.info("Task: Change notes") self.task.update_props(["notes", "synced"], [self.buffer.props.text, False]) self.task.update_toolbar() Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/shared/task_toolbar/toolbar.py000066400000000000000000000342611464651330500265150ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from datetime import datetime from typing import TYPE_CHECKING from gi.repository import Adw, Gio, GLib, GObject, Gtk # type:ignore from errands.lib.data import UserData from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import get_children, get_human_datetime from errands.state import State from errands.widgets.shared.color_selector import ErrandsColorSelector from errands.widgets.shared.components.boxes import ErrandsBox, ErrandsListBox from errands.widgets.shared.components.buttons import ErrandsButton, ErrandsCheckButton from errands.widgets.shared.titled_separator import TitledSeparator if TYPE_CHECKING: from errands.widgets.task import Task class ErrandsTaskToolbar(Gtk.FlowBox): def __init__(self, task: Task) -> None: super().__init__() self.task: Task = task self.__build_ui() def __build_ui(self) -> None: self.set_margin_bottom(2) self.set_margin_start(9) self.set_margin_end(9) self.set_max_children_per_line(2) self.set_selection_mode(Gtk.SelectionMode.NONE) # Date and Time button self.date_time_btn: ErrandsButton = ErrandsButton( valign=Gtk.Align.CENTER, halign=Gtk.Align.START, hexpand=True, tooltip_text=_("Start / Due Date"), css_classes=["flat", "caption"], child=Adw.ButtonContent( icon_name="errands-calendar-symbolic", can_shrink=True, label=_("Date"), ), on_click=lambda *_: State.datetime_window.show(self.task), ) self.append(self.date_time_btn) # Notes button self.notes_btn: ErrandsButton = ErrandsButton( valign=Gtk.Align.CENTER, icon_name="errands-notes-symbolic", tooltip_text=_("Notes"), css_classes=["flat"], on_click=lambda *_: State.notes_window.show(self.task), ) # Priority button self.custom_priority_btn: Gtk.SpinButton = Gtk.SpinButton( valign=Gtk.Align.CENTER, adjustment=Gtk.Adjustment(upper=9, lower=0, step_increment=1), ) self.priority_btn: Gtk.MenuButton = Gtk.MenuButton( valign=Gtk.Align.CENTER, icon_name="errands-priority-symbolic", tooltip_text=_("Priority"), css_classes=["flat"], popover=Gtk.Popover( css_classes=["menu"], child=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, margin_bottom=6, margin_top=6, margin_end=6, margin_start=6, spacing=3, children=[ ErrandsListBox( on_row_activated=self._on_priority_selected, selection_mode=Gtk.SelectionMode.NONE, children=[ Gtk.ListBoxRow( css_classes=["error"], child=Gtk.Label(label=_("High")), ), Gtk.ListBoxRow( css_classes=["warning"], child=Gtk.Label(label=_("Medium")), ), Gtk.ListBoxRow( css_classes=["accent"], child=Gtk.Label(label=_("Low")), ), Gtk.ListBoxRow(child=Gtk.Label(label=_("None"))), ], ), TitledSeparator(title=_("Custom")), self.custom_priority_btn, ], ), ), ) self.priority_btn.connect("notify::active", self._on_priority_btn_toggled) # Tags button tags_status_page: Adw.StatusPage = Adw.StatusPage( title=_("No Tags"), icon_name="errands-info-symbolic", css_classes=["compact"], ) self.tags_list: Gtk.Box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=6, margin_bottom=6, margin_end=6, margin_start=6, margin_top=6, ) self.tags_list.bind_property( "visible", tags_status_page, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) self.tags_btn: Gtk.MenuButton = Gtk.MenuButton( valign=Gtk.Align.CENTER, icon_name="errands-tag-add-symbolic", tooltip_text=_("Tags"), css_classes=["flat"], popover=Gtk.Popover( css_classes=["tags-menu"], child=Gtk.ScrolledWindow( max_content_width=200, max_content_height=200, width_request=200, propagate_natural_height=True, propagate_natural_width=True, vexpand=True, child=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, vexpand=True, valign=Gtk.Align.CENTER, children=[self.tags_list, tags_status_page], ), ), ), ) self.tags_btn.connect("notify::active", self._on_tags_btn_toggled) self.attachments_btn: ErrandsButton = ErrandsButton( tooltip_text=_("Attachments"), icon_name="errands-attachment-symbolic", css_classes=["flat"], on_click=lambda *_: State.attachments_window.show(self.task), ) # Menu button menu_top_section: Gio.Menu = Gio.Menu() menu_colors_item: Gio.MenuItem = Gio.MenuItem() menu_colors_item.set_attribute_value("custom", GLib.Variant("s", "color")) menu_top_section.append_item(menu_colors_item) menu: Gio.Menu = Gio.Menu() menu.append_section(None, menu_top_section) menu_bottom_section: Gio.Menu = Gio.Menu() menu_created_item: Gio.MenuItem = Gio.MenuItem() menu_created_item.set_attribute_value("custom", GLib.Variant("s", "created")) menu_bottom_section.append_item(menu_created_item) menu_changed_item: Gio.MenuItem = Gio.MenuItem() menu_changed_item.set_attribute_value("custom", GLib.Variant("s", "changed")) menu_bottom_section.append_item(menu_changed_item) menu.append_section(None, menu_bottom_section) popover_menu = Gtk.PopoverMenu(menu_model=menu) # Colors self.color_selector: ErrandsColorSelector = ErrandsColorSelector( on_color_selected=self.__on_accent_color_selected ) popover_menu.add_child(self.color_selector, "color") # Created label self.created_label = Gtk.Label( label=_("Created:"), halign=Gtk.Align.START, margin_bottom=6, margin_end=6, margin_start=6, css_classes=["caption-heading"], ) popover_menu.add_child(self.created_label, "created") # Changed label self.changed_label = Gtk.Label( label=_("Changed:"), halign=Gtk.Align.START, margin_end=6, margin_start=6, css_classes=["caption-heading"], ) popover_menu.add_child(self.changed_label, "changed") menu_btn: Gtk.MenuButton = Gtk.MenuButton( popover=popover_menu, icon_name="errands-more-symbolic", css_classes=["flat"], valign=Gtk.Align.CENTER, tooltip_text=_("More"), ) menu_btn.connect("notify::active", self._on_menu_toggled) self.append( ErrandsBox( spacing=2, halign=Gtk.Align.END, children=[ self.notes_btn, self.priority_btn, self.tags_btn, self.attachments_btn, menu_btn, ], ) ) def update_ui(self): # Update Date and Time self.date_time_btn.get_child().props.label = get_human_datetime( self.task.task_data.due_date ) self.date_time_btn.remove_css_class("error") if ( self.task.task_data.due_date and datetime.fromisoformat(self.task.task_data.due_date).date() < datetime.today().date() ): self.date_time_btn.add_css_class("error") # Update notes button css if self.task.task_data.notes: self.notes_btn.add_css_class("accent") else: self.notes_btn.remove_css_class("accent") # Update priority button css priority: int = self.task.task_data.priority self.priority_btn.props.css_classes = ["flat"] if 0 < priority < 5: self.priority_btn.add_css_class("error") elif 4 < priority < 9: self.priority_btn.add_css_class("warning") elif priority == 9: self.priority_btn.add_css_class("accent") self.priority_btn.set_icon_name( f"errands-priority{'-set' if priority>0 else ''}-symbolic" ) # Update attachments button css self.attachments_btn.remove_css_class("accent") if len(self.task.task_data.attachments) > 0: self.attachments_btn.add_css_class("accent") def __on_accent_color_selected( self, _color_selector, btn: ErrandsCheckButton, color: str ) -> None: if not btn.get_active() or self.task.block_signals: return Log.debug(f"Task: change color to '{color}'") if color != self.task.task_data.color: self.task.update_props( ["color", "synced"], [color if color != "none" else "", False] ) self.task.update_color() Sync.sync() def _on_menu_toggled(self, btn: Gtk.MenuButton, active: bool) -> None: if not btn.get_active(): return # Update dates created_date: str = datetime.fromisoformat( self.task.task_data.created_at ).strftime("%Y.%m.%d %H:%M:%S") changed_date: str = datetime.fromisoformat( self.task.task_data.changed_at ).strftime("%Y.%m.%d %H:%M:%S") self.created_label.set_label(_("Created:") + " " + created_date) self.changed_label.set_label(_("Changed:") + " " + changed_date) # Update color self.task.block_signals = True self.color_selector.select_color(self.task.task_data.color) self.task.block_signals = False def _on_priority_btn_toggled(self, btn: Gtk.MenuButton, *_) -> None: priority: int = self.task.task_data.priority if btn.get_active(): self.custom_priority_btn.set_value(priority) else: new_priority: int = self.custom_priority_btn.get_value_as_int() if priority != new_priority: Log.debug(f"Task Toolbar: Set priority to '{new_priority}'") self.task.update_props(["priority", "synced"], [new_priority, False]) self.task.update_toolbar() Sync.sync() def _on_priority_selected(self, box: Gtk.ListBox, row: Gtk.ListBoxRow) -> None: rows: list[Gtk.ListBoxRow] = get_children(box) for i, r in enumerate(rows): if r == row: index = i break match index: case 0: self.custom_priority_btn.set_value(1) case 1: self.custom_priority_btn.set_value(5) case 2: self.custom_priority_btn.set_value(9) case 3: self.custom_priority_btn.set_value(0) self.priority_btn.popdown() def _on_tags_btn_toggled(self, btn: Gtk.MenuButton, *_) -> None: if not btn.get_active(): return tags: list[str] = [t.text for t in UserData.tags] tags_list_items: list[ErrandsToolbarTagsListItem] = get_children(self.tags_list) tags_list_items_text = [t.title for t in tags_list_items] # Remove tags for item in tags_list_items: if item.title not in tags: self.tags_list.remove(item) # Add tags for tag in tags: if tag not in tags_list_items_text: self.tags_list.append(ErrandsToolbarTagsListItem(tag, self.task)) # Toggle tags task_tags: list[str] = [t.title for t in self.task.tags] tags_items: list[ErrandsToolbarTagsListItem] = get_children(self.tags_list) for t in tags_items: t.block_signals = True t.toggle_btn.set_active(t.title in task_tags) t.block_signals = False self.tags_list.set_visible(len(get_children(self.tags_list)) > 0) class ErrandsToolbarTagsListItem(Gtk.Box): block_signals = False def __init__(self, title: str, task: Task) -> None: super().__init__() self.set_spacing(6) self.title = title self.task = task self.toggle_btn = ErrandsCheckButton(on_toggle=self.__on_toggle) self.append(self.toggle_btn) self.append( Gtk.Label( label=title, hexpand=True, halign=Gtk.Align.START, max_width_chars=20 ) ) self.append( Gtk.Image(icon_name="errands-tag-symbolic", css_classes=["dim-label"]) ) def __on_toggle(self, btn: Gtk.CheckButton) -> None: if self.block_signals: return tags: list[str] = self.task.task_data.tags if btn.get_active(): if self.title not in tags: tags.append(self.title) else: if self.title in tags: tags.remove(self.title) self.task.update_props(["tags", "synced"], [tags, False]) self.task.update_tags_bar() Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/shared/titled_separator.py000066400000000000000000000021531464651330500257270ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Gtk, GObject # type:ignore class TitledSeparator(Gtk.Box): title = GObject.Property(type=str, default="") def __init__( self, title: str = "", margins: tuple[int, int, int, int] = (0, 0, 0, 0) ): super().__init__() self.__build_ui() self.label.set_label(title) self.set_margin_start(margins[0]) self.set_margin_end(margins[1]) self.set_margin_top(margins[2]) self.set_margin_bottom(margins[3]) def __build_ui(self) -> None: self.add_css_class("dim-label") self.set_spacing(12) # Label self.label = Gtk.Label(css_classes=["caption"]) self.label.bind_property( "label", self, "title", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) self.append(Gtk.Separator(hexpand=True, valign=Gtk.Align.CENTER)) self.append(self.label) self.append(Gtk.Separator(hexpand=True, valign=Gtk.Align.CENTER)) mrvladus-Errands-cbe30b3/errands/widgets/sidebar.py000066400000000000000000000270571464651330500225370ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Adw, GObject, Gtk # type:ignore from errands.lib.data import TaskListData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox, ErrandsListBox from errands.widgets.shared.components.buttons import ErrandsButton from errands.widgets.shared.components.header_bar import ErrandsHeaderBar from errands.widgets.shared.components.menus import ( ErrandsMenuItem, ErrandsSectionedMenu, ErrandsSimpleMenu, ) from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.shared.titled_separator import TitledSeparator from errands.widgets.tags.tags_sidebar_row import TagsSidebarRow from errands.widgets.task_list.task_list import TaskList from errands.widgets.task_list.task_list_sidebar_row import TaskListSidebarRow from errands.widgets.today.today_sidebar_row import TodaySidebarRow from errands.widgets.trash.trash_sidebar_row import TrashSidebarRow class Sidebar(Adw.Bin): def __init__(self) -> None: super().__init__() State.sidebar = self self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self) -> None: # Add List button self.add_list_btn = ErrandsButton( icon_name="errands-add-symbolic", tooltip_text=_("Add List (Ctrl+Shift+A)"), on_click=self._on_add_list_btn_clicked, ) add_list_ctrl = Gtk.ShortcutController(scope=Gtk.ShortcutScope.MANAGED) add_list_ctrl.add_shortcut( Gtk.Shortcut( action=Gtk.ShortcutAction.parse_string("activate"), trigger=Gtk.ShortcutTrigger.parse_string("a"), ) ) self.add_list_btn.add_controller(add_list_ctrl) # Sync indicator self.sync_indicator_rev: Gtk.Revealer = Gtk.Revealer( transition_type=Gtk.RevealerTransitionType.CROSSFADE, transition_duration=200, reveal_child=False, child=Gtk.Spinner( spinning=True, tooltip_text=_("Syncing..."), ), ) # Status page self.status_page = Adw.StatusPage( title=_("Add new List"), description=_('Click "+" button'), icon_name="errands-lists-symbolic", css_classes=["compact"], vexpand=True, ) # List box self.list_box = ErrandsListBox( activate_on_single_click=False, on_row_selected=self._on_row_selected, selection_mode=Gtk.SelectionMode.SINGLE, css_classes=["navigation-sidebar"], children=[ TodaySidebarRow(), TagsSidebarRow(), TrashSidebarRow(), ], ) self.status_page.bind_property( "visible", self.list_box, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) self.list_box.set_header_func( lambda row, before: ( row.set_header(TitledSeparator(_("Task Lists"), (12, 12, 0, 2))) if isinstance(row, TaskListSidebarRow) and not isinstance(before, TaskListSidebarRow) else ... ) ) self.set_child( ErrandsToolbarView( top_bars=[ ErrandsHeaderBar( title_widget=Gtk.Label( label=_("Errands"), css_classes=["heading"], ), start_children=[self.add_list_btn], end_children=[ # Main Menu Gtk.MenuButton( primary=True, tooltip_text=_("Main Menu"), icon_name="open-menu-symbolic", menu_model=ErrandsSectionedMenu( sections=( ErrandsSimpleMenu( items=( ErrandsMenuItem( _("Sync / Fetch Tasks"), "app.sync" ), ) ), ErrandsSimpleMenu( items=( ErrandsMenuItem( _("Import Task List"), "app.import" ), ) ), ErrandsSimpleMenu( items=( ErrandsMenuItem( _("Preferences"), "app.preferences" ), ErrandsMenuItem( _("Keyboard Shortcuts"), "win.show-help-overlay", ), ErrandsMenuItem( _("About Errands"), "app.about" ), ErrandsMenuItem(_("Quit"), "app.quit"), ) ), ) ), ), # Sync indicator self.sync_indicator_rev, ], ) ], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[ Gtk.ScrolledWindow( propagate_natural_height=True, child=self.list_box ), self.status_page, ], ), ) ) def remove_task_list(self, row: TaskListSidebarRow) -> None: Log.debug(f"Sidebar: Delete list {row.uid}") self.list_box.select_row(row.get_prev_sibling()) State.view_stack.remove(row.task_list) self.list_box.remove(row) State.trash_sidebar_row.update_ui() State.today_page.update_ui() self.update_status() def __select_last_opened_item(self) -> None: for row in self.rows: if hasattr(row, "name") and row.name == GSettings.get("last-open-list"): Log.debug("Sidebar: Select last opened page") if not row.get_realized(): row.connect("realize", lambda *_: self.list_box.select_row(row)) else: self.list_box.select_row(row) break def update_status(self) -> None: length: int = len(self.task_lists_rows) self.status_page.set_visible(length == 0) if length == 0: State.view_stack.set_visible_child_name("errands_status_page") # ------ PROPERTIES ------ # @property def rows(self) -> list[Gtk.ListBoxRow]: """Get all rows""" return get_children(self.list_box) @property def task_lists_rows(self) -> list[TaskListSidebarRow]: """Get only task list rows""" return [r for r in self.rows if isinstance(r, TaskListSidebarRow)] @property def task_lists(self) -> list[TaskList]: return [lst.task_list for lst in self.task_lists_rows] # ------ PUBLIC METHODS ------ # def add_task_list(self, list_dict: TaskListData) -> TaskListSidebarRow: Log.debug(f"Sidebar: Add Task List '{list_dict.uid}'") row: TaskListSidebarRow = TaskListSidebarRow(list_dict) self.list_box.append(row) self.status_page.set_visible(False) return row def load_task_lists(self) -> None: Log.debug("Sidebar: Load Task Lists") list_added: bool = False for list in ( list for list in UserData.get_lists_as_dicts() if not list.deleted ): self.add_task_list(list) list_added = True self.__select_last_opened_item() if list_added: self.status_page.set_visible(False) def toggle_sync_indicator(self, on: bool) -> None: self.sync_indicator_rev.set_reveal_child(on) def update_task_lists(self, update_lists_ui: bool = True) -> None: lists: list[TaskListData] = UserData.get_lists_as_dicts() # Delete lists uids: list[str] = [lst.uid for lst in lists] for row in self.task_lists_rows: if row.uid not in uids: self.remove_task_list(row) # Add lists lists_uids = [lst.uid for lst in self.task_lists_rows] for lst in lists: if lst.uid not in lists_uids: self.add_task_list(lst) if update_lists_ui: for row in self.rows: if hasattr(row, "update_ui"): row.update_ui() def update_ui(self) -> None: Log.debug("Sidebar: Update UI") self.update_task_lists() # Update rows for row in self.rows: if hasattr(row, "update_ui"): row.update_ui() self.update_status() # ------ TEMPLATE HANDLERS ------ # def _on_add_list_btn_clicked(self, btn: ErrandsButton) -> None: lists_names: list[str] = [i.name for i in UserData.get_lists_as_dicts()] def _entry_activated(_, dialog): if dialog.get_response_enabled("add"): dialog.response("add") dialog.close() def _entry_changed(entry: Gtk.Entry, _, dialog): text = entry.props.text.strip(" \n\t") dialog.set_response_enabled("add", text and text not in lists_names) def _confirm(_, res, entry: Gtk.Entry): if res == "cancel": return name = entry.props.text.rstrip().lstrip() list_dict = UserData.add_list(name) row = self.add_task_list(list_dict) row.activate() Sync.sync() entry = Gtk.Entry(placeholder_text=_("New List Name")) dialog = Adw.MessageDialog( transient_for=State.main_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() def _on_row_selected(self, _, row: Gtk.ListBoxRow) -> None: if row: row.activate() mrvladus-Errands-cbe30b3/errands/widgets/tags/000077500000000000000000000000001464651330500214775ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/tags/tags.py000066400000000000000000000144011464651330500230070ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from gi.repository import Adw, GObject, Gtk # type:ignore from errands.lib.data import UserData from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox, ErrandsListBox from errands.widgets.shared.components.entries import ErrandsEntryRow from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView class Tags(Adw.Bin): def __init__(self): super().__init__() State.tags_page = self self.__build_ui() # Load tags for tag in UserData.tags: self.tags_list.append(Tag(tag.text, self)) self.update_ui() def __build_ui(self): # Status Page self.status_page = Adw.StatusPage( title=_("No Tags Found"), description=_("Add new Tags in the entry above"), icon_name="errands-info-symbolic", vexpand=True, css_classes=["compact"], ) # Content self.tags_list = Gtk.ListBox( selection_mode=Gtk.SelectionMode.NONE, margin_bottom=32, margin_end=12, margin_start=12, margin_top=6, css_classes=["boxed-list"], ) content = Gtk.ScrolledWindow( propagate_natural_height=True, child=Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=self.tags_list ), ) content.bind_property( "visible", self.status_page, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) self.set_child( ErrandsToolbarView( top_bars=[Adw.HeaderBar(title_widget=Adw.WindowTitle(title=_("Tags")))], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[ self.status_page, Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=ErrandsListBox( selection_mode=Gtk.SelectionMode.NONE, margin_bottom=6, margin_start=12, margin_end=12, css_classes=["boxed-list"], children=[ ErrandsEntryRow( on_entry_activated=self._on_tag_added, height_request=60, activatable=False, title=_("Add new Tag"), ) ], ), ), content, ], ), ) ) @property def tags(self) -> list[Tag]: return get_children(self.tags_list) def update_ui(self, update_tag_rows: bool = True): UserData.update_tags() tags: list[str] = [t.text for t in UserData.tags] # Remove tags for row in self.tags: if row.get_title() not in tags: self.tags_list.remove(row) # Add tags tags_rows_texts: list[str] = [t.get_title() for t in self.tags] for tag in tags: if tag not in tags_rows_texts: self.tags_list.append(Tag(tag, self)) # Set activatable rows if update_tag_rows: tags_in_tasks = [t.tags for t in UserData.tasks if t.tags] for tag in self.tags: tag.update_ui(tags_in_tasks) self.tags_list.set_visible(len(self.tags) > 0) if State.main_window: State.tags_sidebar_row.update_ui() def _on_tag_added(self, entry: Adw.EntryRow): text: str = entry.get_text().strip().strip(",") if text.strip(" \n\t") == "" or text in [t.text for t in UserData.tags]: return self.tags_list.append(Tag(text, self)) UserData.add_tag(text) entry.set_text("") self.update_ui() class Tag(Adw.ActionRow): def __init__(self, title: str, tags: Tags): super().__init__() self.tags = tags self.set_title(title) delete_btn = Gtk.Button( icon_name="errands-trash-symbolic", css_classes=["flat", "error"], tooltip_text=_("Delete"), valign=Gtk.Align.CENTER, ) delete_btn.connect("clicked", self.delete) self.add_prefix(delete_btn) arrow = Gtk.Image(icon_name="errands-right-symbolic") arrow.bind_property( "visible", self, "activatable", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) self.number_of_tasks: Gtk.Button = Gtk.Button( css_classes=["flat", "dim-label", "circular"], can_target=False, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, ) self.add_suffix(self.number_of_tasks) def delete(self, _btn: Gtk.Button): Log.info(f"Tags: Delete Tag '{self.get_title()}'") for task in State.get_tasks(): for tag in task.tags: if self.get_title() == tag.title: task.tags_bar.remove(tag) if len(task.tags) == 0: task.tags_bar_rev.set_reveal_child(False) break UserData.remove_tag(self.get_title()) self.tags.update_ui(False) Sync.sync() def update_ui(self, tags_in_tasks: list[list[str]] = None): if not tags_in_tasks: tags_in_tasks: list[list[str]] = [t.tags for t in UserData.tasks if t.tags] count: int = 0 for tags in tags_in_tasks: if self.get_title() in tags: count += 1 self.set_activatable(False) self.number_of_tasks.set_label(str(count) if count > 0 else "") mrvladus-Errands-cbe30b3/errands/widgets/tags/tags_sidebar_row.py000066400000000000000000000034561464651330500253770ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Gtk # type:ignore from errands.lib.data import UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox class TagsSidebarRow(Gtk.ListBoxRow): def __init__(self) -> None: super().__init__() self.name = "errands_tags_page" State.tags_sidebar_row = self self.__build_ui() self.update_ui() def __build_ui(self) -> None: self.props.height_request = 45 self.add_css_class("sidebar-item") self.connect("activate", self._on_row_activated) # Icon self.icon = Gtk.Image(icon_name="errands-tag-symbolic") # Title self.label: Gtk.Label = Gtk.Label( hexpand=True, halign=Gtk.Align.START, label=_("Tags") ) # Counter self.size_counter = Gtk.Button( css_classes=["dim-label", "caption", "flat", "circular"], halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, can_target=False, ) self.set_child( ErrandsBox( spacing=12, margin_start=6, children=[self.icon, self.label, self.size_counter], ) ) def update_ui(self) -> None: size: int = len(UserData.tags) self.size_counter.set_label(str(size) if size > 0 else "") def _on_row_activated(self, *args) -> None: Log.debug("Sidebar: Open Tags") State.view_stack.set_visible_child_name(self.name) State.split_view.set_show_content(True) GSettings.set("last-open-list", "s", self.name) State.tags_page.update_ui() mrvladus-Errands-cbe30b3/errands/widgets/task.py000066400000000000000000000766541464651330500220770ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from datetime import datetime from typing import TYPE_CHECKING, Any from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk # type:ignore from errands.lib.data import TaskData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.markup import Markup from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ( ErrandsButton, ErrandsCheckButton, ErrandsToggleButton, ) from errands.widgets.shared.components.entries import ErrandsEntry from errands.widgets.shared.components.menus import ErrandsMenuItem, ErrandsSimpleMenu from errands.widgets.shared.task_toolbar import ErrandsTaskToolbar from errands.widgets.shared.titled_separator import TitledSeparator if TYPE_CHECKING: from errands.widgets.task_list.task_list import TaskList class Task(Gtk.Revealer): block_signals: bool = True purging: bool = False can_sync: bool = True def __init__(self, task_data: TaskData, parent: TaskList | Task) -> None: super().__init__() self.task_data = task_data self.list_uid = task_data.list_uid self.uid = task_data.uid self.parent = parent self.__build_ui() self.__add_actions() self.__load_sub_tasks() self.block_signals = False def __repr__(self) -> str: return f"" def __add_actions(self) -> None: self.group: Gio.SimpleActionGroup = Gio.SimpleActionGroup() self.insert_action_group(name="task", group=self.group) def __create_action(name: str, callback: callable) -> None: action: Gio.SimpleAction = Gio.SimpleAction(name=name) action.connect("activate", callback) self.group.add_action(action) def __edit(*args): self.edit_row.set_text(self.task_data.text) self.edit_row.set_visible(True) self.edit_row.grab_focus() def __export(*args): def __confirm(dialog, res): try: file = dialog.save_finish(res) except Exception as e: Log.debug(f"List: Export cancelled. {e}") return Log.info(f"Task: Export '{self.uid}'") with open(file.get_path(), "w") as f: f.write(self.task_data.to_ical(True)) State.main_window.add_toast(_("Exported")) dialog = Gtk.FileDialog(initial_name=f"{self.uid}.ics") dialog.save(State.main_window, None, __confirm) def __copy_to_clipboard(*args): Log.info("Task: Copy text to clipboard") self.get_clipboard().set(self.task_data.text) State.main_window.add_toast(_("Copied to Clipboard")) __create_action("edit", __edit) __create_action("copy_to_clipboard", __copy_to_clipboard) __create_action("export", __export) __create_action("move_to_trash", lambda *_: self.delete()) def __build_ui(self): # --- TOP DROP AREA --- # top_drop_area_img: Gtk.Image = Gtk.Image( icon_name="errands-add-symbolic", margin_start=12, margin_end=12, css_classes=["task-drop-area"], ) top_drop_area_drop_ctrl: Gtk.DropTarget = Gtk.DropTarget.new( type=Task, actions=Gdk.DragAction.MOVE ) top_drop_area_drop_ctrl.connect("drop", self._on_task_top_area_drop) top_drop_area_img.add_controller(top_drop_area_drop_ctrl) self.top_drop_area = Gtk.Revealer(child=top_drop_area_img) # Drop Motion Controller drop_controller: Gtk.DropControllerMotion = Gtk.DropControllerMotion() drop_controller.bind_property( "contains-pointer", self.top_drop_area, "reveal-child", GObject.BindingFlags.SYNC_CREATE, ) self.add_controller(drop_controller) # --- TITLE --- # title_box: Gtk.ListBox = Gtk.ListBox( css_classes=["transparent", "rounded-corners"] ) # Hover controller hover_ctrl: Gtk.EventControllerMotion = Gtk.EventControllerMotion() title_box.add_controller(hover_ctrl) # Click controller click_ctrl: Gtk.GestureClick = Gtk.GestureClick() click_ctrl.connect("released", self._on_title_row_clicked) title_box.add_controller(click_ctrl) # Drop controller drop_ctrl: Gtk.DropTarget = Gtk.DropTarget.new( type=Task, actions=Gdk.DragAction.MOVE ) drop_ctrl.connect("drop", self._on_task_drop) title_box.add_controller(drop_ctrl) # Drag controller drag_ctrl: Gtk.DragSource = Gtk.DragSource(actions=Gdk.DragAction.MOVE) drag_ctrl.connect("prepare", self._on_drag_prepare) drag_ctrl.connect("drag-begin", self._on_drag_begin) drag_ctrl.connect("drag-cancel", self._on_drag_end) drag_ctrl.connect("drag-end", self._on_drag_end) title_box.add_controller(drag_ctrl) # Title row self.title_row = Adw.ActionRow( height_request=60, use_markup=True, tooltip_text=_("Toggle Sub-Tasks"), cursor=Gdk.Cursor(name="pointer"), css_classes=["transparent", "rounded-corners"], ) title_box.append(self.title_row) # Complete button self.complete_btn: ErrandsCheckButton = ErrandsCheckButton( tooltip_text=_("Toggle Completion"), valign=Gtk.Align.CENTER, css_classes=["selection-mode"], on_toggle=self._on_complete_btn_toggled, ) self.title_row.add_prefix(self.complete_btn) # Expand indicator self.expand_indicator = Gtk.Image( icon_name="errands-up-symbolic", css_classes=["expand-indicator"], halign=Gtk.Align.END, ) expand_indicator_rev = Gtk.Revealer( child=self.expand_indicator, transition_type=1, reveal_child=False, can_target=False, ) hover_ctrl.bind_property( "contains-pointer", expand_indicator_rev, "reveal-child", GObject.BindingFlags.SYNC_CREATE, ) # Toolbar toggle self.toolbar_toggle_btn: ErrandsToggleButton = ErrandsToggleButton( icon_name="errands-toolbar-symbolic", valign=Gtk.Align.CENTER, tooltip_text=_("Toggle Toolbar"), css_classes=["circular", "flat"], on_toggle=self._on_toolbar_toggle_btn_toggled, ) # Right click menu right_click_ctrl = Gtk.GestureClick(button=3) right_click_ctrl.connect("released", self.__on_right_click) self.title_row.add_controller(right_click_ctrl) self.popover_menu: Gtk.PopoverMenu = Gtk.PopoverMenu( halign=Gtk.Align.START, has_arrow=False, menu_model=ErrandsSimpleMenu( items=( ErrandsMenuItem(_("Edit"), "task.edit"), ErrandsMenuItem(_("Move to Trash"), "task.move_to_trash"), ErrandsMenuItem(_("Copy to Clipboard"), "task.copy_to_clipboard"), ErrandsMenuItem(_("Export"), "task.export"), ) ), ) self.title_row.add_suffix( ErrandsBox( spacing=6, children=[ expand_indicator_rev, self.toolbar_toggle_btn, ], ) ) # Edit row self.edit_row: Adw.EntryRow = Adw.EntryRow( title=_("Edit"), visible=False, height_request=60, show_apply_button=True, css_classes=["transparent", "rounded-corners"], ) self.edit_row.bind_property( "visible", self.title_row, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.INVERT_BOOLEAN, ) self.edit_row.connect("apply", self._on_edit_row_applied) title_box.append(self.edit_row) # Cancel edit button self.edit_row.add_suffix( ErrandsButton( tooltip_text=_("Cancel"), valign=Gtk.Align.CENTER, icon_name="window-close-symbolic", css_classes=["circular"], on_click=self._on_cancel_edit_btn_clicked, ) ) # --- TAGS BAR --- # self.tags_bar: Gtk.FlowBox = Gtk.FlowBox( height_request=20, margin_start=12, margin_end=12, margin_bottom=3, selection_mode=Gtk.SelectionMode.NONE, max_children_per_line=1000, ) self.tags_bar_rev: Gtk.Revealer = Gtk.Revealer(child=self.tags_bar) # --- PROGRESS BAR --- # self.progress_bar: Gtk.ProgressBar = Gtk.ProgressBar( margin_start=12, margin_end=12, margin_bottom=2, ) self.progress_bar.add_css_class("osd") self.progress_bar.add_css_class("dim-label") self.progress_bar_rev: Gtk.Revealer = Gtk.Revealer( child=self.progress_bar, reveal_child=True ) # --- TOOL BAR --- # self.toolbar_rev: Gtk.Revealer = Gtk.Revealer() self.toolbar_toggle_btn.bind_property( "active", self.toolbar_rev, "reveal-child", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL, ) # Build toolbar if needed self.toolbar = None if self.task_data.toolbar_shown: self.__build_toolbar() # --- SUB TASKS --- # # Uncompleted tasks self.uncompleted_task_list: Gtk.Box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL ) # Separator self.task_lists_separator: Adw.Bin = Adw.Bin( child=TitledSeparator(_("Completed"), (24, 24, 0, 0)) ) # Completed tasks self.completed_task_list: Gtk.Box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL ) self.completed_task_list.bind_property( "visible", self.task_lists_separator, "visible", GObject.BindingFlags.SYNC_CREATE, ) self.sub_tasks = Gtk.Revealer( child=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, css_classes=["sub-tasks"], children=[ ErrandsEntry( margin_start=12, margin_end=12, margin_top=3, margin_bottom=4, placeholder_text=_("Add new Sub-Task"), on_activate=self._on_sub_task_added, ), self.uncompleted_task_list, self.task_lists_separator, self.completed_task_list, ], ) ) # --- MAIN BOX --- # self.main_box: ErrandsBox = ErrandsBox( orientation=Gtk.Orientation.VERTICAL, margin_start=12, margin_end=12, css_classes=["card", "fade"], children=[ title_box, self.popover_menu, self.tags_bar_rev, self.progress_bar_rev, self.toolbar_rev, self.sub_tasks, ], ) self.set_child( ErrandsBox( orientation=Gtk.Orientation.VERTICAL, margin_bottom=6, margin_top=6, children=[self.top_drop_area, self.main_box], ) ) def __build_toolbar(self) -> None: """ Separate func for building toolbar. Needed for lazy loading of the toolbar. If toolbar doesn't need to be shown on startup - don't load it. It's saves memory. About 50 Mb for each 100 Tasks. """ self.toolbar = ErrandsTaskToolbar(self) self.toolbar_rev.set_child(self.toolbar) def __load_sub_tasks(self) -> None: tasks: list[TaskData] = ( t for t in UserData.tasks if not t.deleted and t.list_uid == self.list_uid and t.parent == self.uid ) for task in tasks: new_task = Task(task, self) if task.completed: self.completed_task_list.append(new_task) else: self.uncompleted_task_list.append(new_task) self.set_reveal_child(self.task_data.expanded) self.toggle_visibility(not self.task_data.trash) self.expand(self.task_data.expanded) self.update_color() self.update_title() self.update_progress_bar() self.update_tags_bar() self.update_toolbar() # ------ PROPERTIES ------ # @property def task_list(self) -> TaskList: return State.get_task_list(self.task_data.list_uid) @property def 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 @property def tags(self) -> list[Tag]: return [item.get_child() for item in get_children(self.tags_bar)] @property def all_tasks(self) -> list[Task]: """All sub tasks""" all_tasks: list[Task] = [] def __add_task(tasks: list[Task]) -> None: for task in tasks: all_tasks.append(task) __add_task(task.tasks) __add_task(self.tasks) return all_tasks @property def tasks(self) -> list[Task]: """Top-level Tasks""" return self.uncompleted_tasks + self.completed_tasks @property def uncompleted_tasks(self) -> list[Task]: return get_children(self.uncompleted_task_list) @property def completed_tasks(self) -> list[Task]: return get_children(self.completed_task_list) # ------ PUBLIC METHODS ------ # def add_tag(self, tag: str) -> None: self.tags_bar.append(Tag(tag, self)) def add_rm_crossline(self, add: bool) -> None: if add: self.title_row.add_css_class("task-completed") else: self.title_row.remove_css_class("task-completed") def add_task(self, task: TaskData) -> Task: Log.info(f"Task '{self.uid}': Add sub-task '{task.uid}'") new_task: Task = Task(task, self) if task.completed: self.completed_task_list.prepend(new_task) else: if GSettings.get("task-list-new-task-position-top"): self.uncompleted_task_list.prepend(new_task) else: self.uncompleted_task_list.append(new_task) def get_prop(self, prop: str) -> Any: return UserData.get_prop(self.list_uid, self.uid, prop) def get_status(self) -> tuple[int, int]: """Get total tasks and completed tasks tuple""" return UserData.get_status(self.list_uid, self.uid) 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.complete_btn.set_active(True) State.today_page.update_ui() State.trash_sidebar_row.update_ui() State.tags_page.update_ui() self.task_list.update_title() if isinstance(self.parent, Task): self.parent.update_title() self.parent.update_progress_bar() def expand(self, expanded: bool) -> None: if expanded != self.task_data.expanded: self.update_props(["expanded"], [expanded]) self.sub_tasks.set_reveal_child(expanded) if expanded: self.expand_indicator.remove_css_class("expand-indicator-expanded") else: self.expand_indicator.add_css_class("expand-indicator-expanded") def purge(self) -> None: """Completely remove widget""" if self.purging: return def __finish_remove(): GLib.idle_add(self.get_parent().remove, self) return False self.purging = True self.toggle_visibility(False) GLib.timeout_add(300, __finish_remove) def update_props(self, props: list[str], values: list[Any]) -> None: # Update 'changed_at' if it's not in local props local_props: tuple[str] = ( "deleted", "expanded", "synced", "toolbar_shown", "trash", "color", "notified", ) for prop in props: if prop not in local_props: props.append("changed_at") values.append(datetime.now().strftime("%Y%m%dT%H%M%S")) break if "synced" not in props and "changed_at" in props: props.append("synced") values.append(False) UserData.update_props(self.list_uid, self.uid, props, values) def toggle_visibility(self, on: bool) -> None: GLib.idle_add(self.set_reveal_child, on) def update_title(self) -> None: # Update title self.title_row.set_title(Markup.find_url(Markup.escape(self.task_data.text))) # Update subtitle n_total, n_completed = self.get_status() self.title_row.set_subtitle( _("Completed:") + f" {n_completed} / {n_total}" if n_total > 0 else "" ) # Update toolbar button self.toolbar_toggle_btn.set_active(self.task_data.toolbar_shown) # Update completion completed: bool = self.task_data.completed self.add_rm_crossline(completed) if self.complete_btn.get_active() != completed: self.just_added = True self.complete_btn.set_active(completed) self.just_added = False # Update separator self.task_lists_separator.get_child().set_visible( n_completed > 0 and n_completed != n_total ) def update_tags_bar(self) -> None: tags: str = self.task_data.tags tags_list_text: list[str] = [tag.title for tag in self.tags] # Delete tags for tag in self.tags: if tag.title not in tags: self.tags_bar.remove(tag) # Add tags for tag in tags: if tag not in tags_list_text: self.add_tag(tag) self.tags_bar_rev.set_reveal_child(tags != []) def update_progress_bar(self) -> None: # Log.debug(f"Task '{self.uid}': Update progress bar") total, completed = self.get_status() pc: int = ( completed / total * 100 if total > 0 else (100 if self.task_data.completed else 0) ) if self.task_data.percent_complete != pc: self.update_props(["percent_complete", "synced"], [pc, False]) self.progress_bar.set_fraction(pc / 100) self.progress_bar_rev.set_reveal_child(total > 0) def update_toolbar(self) -> None: # If toolbar exists then update it if self.toolbar: self.toolbar.update_ui() def update_tasks(self, update_tasks: bool = True) -> None: # Tasks sub_tasks_data: list[TaskData] = UserData.get_tasks_as_dicts( self.list_uid, self.uid ) sub_tasks_data_uids: list[str] = [task.uid for task in sub_tasks_data] sub_tasks_widgets: list[Task] = self.tasks sub_tasks_widgets_uids: list[str] = [task.uid for task in sub_tasks_widgets] # Add sub tasks for task in sub_tasks_data: if task.uid not in sub_tasks_widgets_uids: self.add_task(task) for task in self.tasks: # Remove task if task.uid not in sub_tasks_data_uids: task.purge() # Move task to completed tasks elif task.task_data.completed and task in self.uncompleted_tasks: if ( len(self.uncompleted_tasks) > 1 and task.uid != self.uncompleted_tasks[-1].uid ): UserData.move_task_after( self.list_uid, task.uid, self.uncompleted_tasks[-1].uid ) self.uncompleted_task_list.remove(task) self.completed_task_list.prepend(task) # Move task to uncompleted tasks elif not task.task_data.completed and task in self.completed_tasks: if ( len(self.uncompleted_tasks) > 0 and task.uid != self.uncompleted_tasks[-1].uid ): UserData.move_task_after( self.list_uid, task.uid, self.uncompleted_tasks[-1].uid ) self.completed_task_list.remove(task) self.uncompleted_task_list.append(task) def update_color(self) -> None: for cls in self.main_box.get_css_classes(): if "task-" in cls: self.main_box.remove_css_class(cls) break for cls in self.complete_btn.get_css_classes(): if "checkbtn-" in cls: self.complete_btn.remove_css_class(cls) break for cls in self.progress_bar.get_css_classes(): if "progressbar-" in cls: self.progress_bar.remove_css_class(cls) break if color := self.task_data.color: self.main_box.add_css_class(f"task-{color}") self.complete_btn.add_css_class(f"checkbtn-{color}") self.progress_bar.add_css_class(f"progressbar-{color}") def update_ui(self) -> None: self.update_title() self.update_tags_bar() self.update_toolbar() self.update_progress_bar() self.update_tasks() self.update_color() # ------ SIGNAL HANDLERS ------ # def __on_right_click(self, _gesture_click, _n_press, x: int, y: int) -> None: position: Gdk.Rectangle = Gdk.Rectangle() position.x = x position.y = y self.popover_menu.set_pointing_to(position) self.popover_menu.popup() def _on_complete_btn_toggled(self, btn: Gtk.CheckButton) -> None: self.add_rm_crossline(btn.get_active()) if self.block_signals: return Log.debug(f"Task '{self.uid}': Set completed to '{btn.get_active()}'") # Change prop self.update_props(["completed", "synced"], [btn.get_active(), False]) # Move section self.get_parent().remove(self) if btn.get_active(): self.parent.completed_task_list.prepend(self) else: self.parent.uncompleted_task_list.append(self) # Complete all sub-tasks if toggle is active if btn.get_active(): for task in self.uncompleted_tasks: task.can_sync = False task.complete_btn.set_active(True) task.can_sync = True # Uncomplete parents if sub-task is uncompleted else: for task in self.parents_tree: if task.complete_btn.get_active(): task.can_sync = False task.complete_btn.set_active(False) task.can_sync = True # Update parent Task if isinstance(self.parent, Task): self.parent.update_progress_bar() self.parent.update_title() # Update parent TaskList self.task_list.update_title() self.update_title() self.update_progress_bar() State.today_page.update_status() if self.can_sync: Sync.sync() def _on_edit_row_applied(self, entry: Adw.EntryRow) -> None: text: str = entry.props.text.strip() entry.set_visible(False) if not text or text == self.task_data.text: return self.update_props(["text", "synced"], [text, False]) self.update_title() Sync.sync() def _on_cancel_edit_btn_clicked(self, _btn: Gtk.Button) -> None: self.edit_row.props.text = "" self.edit_row.emit("apply") def _on_toolbar_toggle_btn_toggled(self, btn: Gtk.ToggleButton) -> None: if btn.get_active() != self.task_data.toolbar_shown: self.update_props(["toolbar_shown"], [btn.get_active()]) # Create toolbar if needed if not self.toolbar and btn.get_active(): self.__build_toolbar() self.update_toolbar() def _on_title_row_clicked(self, *args) -> None: self.expand(not self.sub_tasks.get_child_revealed()) # --- DND --- # def _on_drag_prepare(self, *_) -> Gdk.ContentProvider: # Bug workaround when task is not sensitive after short dnd for task in self.task_list.all_tasks: task.set_sensitive(True) self.set_sensitive(False) value: GObject.Value = GObject.Value(Task) value.set_object(self) return Gdk.ContentProvider.new_for_value(value) def _on_drag_begin(self, _, drag) -> bool: text: str = self.task_data.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.set_sensitive(True) # KDE dnd bug workaround for issue #111 for task in self.task_list.all_tasks: task.top_drop_area.set_reveal_child(False) task.set_sensitive(True) def _on_task_top_area_drop(self, _drop, task: Task, _x, _y) -> None: """When task is dropped on "+" area on top of task""" if task.get_next_sibling() == self: return task_data: TaskData = task.task_data task_parent: Task = task.parent old_task_list: TaskList = task.task_list task.purge() # Change data parent_changed: bool = False if task_data.list_uid == self.task_data.list_uid: if task_data.parent != self.task_data.parent: UserData.update_props( self.list_uid, task_data.uid, ["parent", "synced"], [self.task_data.parent, False], ) parent_changed = True else: task_data: TaskData = UserData.move_task_to_list( task_data.uid, task_data.list_uid, self.list_uid, self.task_data.parent ) parent_changed = True old_task_list.update_title() UserData.move_task_before(self.list_uid, task_data.uid, self.uid) if isinstance(task_parent, Task): task_parent.update_title() task_parent.update_progress_bar() # Move widget task_data.completed = self.task_data.completed new_task: Task = self.parent.add_task(task_data) self.get_parent().reorder_child_after(new_task, self) self.get_parent().reorder_child_after(self, new_task) # KDE dnd bug workaround for issue #111 for task in self.task_list.all_tasks: task.top_drop_area.set_reveal_child(False) task.set_sensitive(True) if isinstance(self.parent, Task): self.parent.update_title() self.parent.update_progress_bar() self.task_list.update_title() # Sync if parent_changed: Sync.sync() def _on_task_drop(self, _drop, task: Task, _x, _y) -> None: """When task is dropped on task and becomes sub-task""" if task.parent == self: return # Expand sub-tasks if not self.task_data.expanded: self.expand(True) task_data: TaskData = task.task_data task_parent: Task = task.parent old_task_list: TaskList = task.task_list task.purge() # Change parent parent_changed: bool = False if task_data.list_uid == self.list_uid: UserData.update_props( self.list_uid, task_data.uid, ["parent", "synced"], [self.uid, False] ) parent_changed = True else: task_data: TaskData = UserData.move_task_to_list( task_data.uid, task_data.list_uid, self.list_uid, self.uid ) parent_changed = True old_task_list.update_title() UserData.move_task_after(self.list_uid, task_data.uid, self.uid) self.add_task(task_data) if isinstance(task_parent, Task): task_parent.update_title() task_parent.update_progress_bar() if self.task_data.completed and not task_data.completed: self.complete_btn.set_active(False) for parent in self.parents_tree: parent.complete_btn.set_active(False) self.task_list.update_title() self.update_title() self.update_progress_bar() # KDE dnd bug workaround for issue #111 for task in self.task_list.all_tasks: task.top_drop_area.set_reveal_child(False) task.set_sensitive(True) # Sync if parent_changed: Sync.sync() def _on_sub_task_added(self, entry: Gtk.Entry) -> None: text: str = entry.get_text().strip() # Return if entry is empty if text.strip(" \n\t") == "": return # Add sub-task self.add_task( UserData.add_task( list_uid=self.list_uid, text=text, parent=self.uid, ) ) # Clear entry entry.set_text("") # Update status if self.task_data.completed: self.update_props(["completed", "synced"], [False, False]) self.update_title() self.update_progress_bar() self.task_list.update_title() # Sync Sync.sync() class Tag(Gtk.Box): def __init__(self, title: str, task: Task): super().__init__() self.title: str = title self.task: Task = task self.tags_bar: Gtk.FlowBox = task.tags_bar self.__build_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self): self.set_hexpand(False) self.set_valign(Gtk.Align.CENTER) self.add_css_class("tag") # Text text: Gtk.Label = Gtk.Label( label=self.title, css_classes=["caption-heading"], max_width_chars=15, ellipsize=3, hexpand=True, halign=Gtk.Align.START, ) self.append(text) # Delete button self.append( ErrandsButton( icon_name="errands-close-symbolic", cursor=Gdk.Cursor(name="pointer"), tooltip_text=_("Delete Tag"), on_click=self._on_delete_btn_clicked, ) ) # ------ SIGNAL HANDLERS ------ # def _on_delete_btn_clicked(self, _btn: Gtk.Button) -> None: Log.debug(f"Task '{self.task.uid}': Delete tag '{self.title}'") tags: list[str] = self.task.task_data.tags tags.remove(self.title) self.task.update_props(["tags", "synced"], [tags, False]) self.task.update_tags_bar() Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/task_list/000077500000000000000000000000001464651330500225365ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/task_list/task_list.py000066400000000000000000000312521464651330500251100ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from typing import TYPE_CHECKING from gi.repository import Adw, Gtk, GLib, GObject # type:ignore from errands.lib.animation import scroll from errands.lib.data import TaskData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ErrandsButton, ErrandsToggleButton from errands.widgets.shared.components.header_bar import ErrandsHeaderBar from errands.widgets.shared.components.entries import ErrandsEntryRow from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.shared.titled_separator import TitledSeparator from errands.widgets.task import Task if TYPE_CHECKING: from errands.widgets.task_list.task_list_sidebar_row import TaskListSidebarRow class TaskList(Adw.Bin): def __init__(self, sidebar_row: TaskListSidebarRow) -> None: super().__init__() self.list_uid: str = sidebar_row.uid self.sidebar_row: TaskListSidebarRow = sidebar_row self.__build_ui() self.__load_tasks() # ------ PRIVATE METHODS ------ # def __repr__(self) -> str: return f"" def __build_ui(self) -> None: # Title self.title = Adw.WindowTitle() # Toggle completed btn self.toggle_completed_btn: ErrandsToggleButton = ErrandsToggleButton( icon_name="errands-check-toggle-symbolic", valign=Gtk.Align.CENTER, tooltip_text=_("Toggle Completed Tasks"), on_toggle=self._on_toggle_completed_btn_toggled, ) # Delete completed btn self.delete_completed_btn: ErrandsButton = ErrandsButton( icon_name="errands-delete-all-symbolic", valign=Gtk.Align.CENTER, tooltip_text=_("Delete Completed Tasks"), on_click=self._on_delete_completed_btn_clicked, ) self.toggle_completed_btn.bind_property( "active", self.delete_completed_btn, "visible", GObject.BindingFlags.SYNC_CREATE, ) # Scroll up btn self.scroll_up_btn: ErrandsButton = ErrandsButton( icon_name="errands-up-symbolic", visible=False, valign=Gtk.Align.CENTER, tooltip_text=_("Scroll Up"), on_click=self._on_scroll_up_btn_clicked, ) # Uncompleted list self.uncompleted_task_list: Gtk.Box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL ) # Separator self.task_lists_separator: Adw.Bin = Adw.Bin( child=TitledSeparator(_("Completed"), (24, 24, 0, 0)) ) # Completed list self.completed_task_list: Gtk.Box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, visible=False ) self.completed_task_list.bind_property( "visible", self.task_lists_separator, "visible", GObject.BindingFlags.SYNC_CREATE, ) # Scrolled window self.scrl: Gtk.ScrolledWindow = Gtk.ScrolledWindow( child=Adw.Clamp( tightening_threshold=300, maximum_size=1000, child=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, margin_bottom=32, children=[ self.uncompleted_task_list, self.task_lists_separator, self.completed_task_list, ], ), ) ) # Adjustment adj: Gtk.Adjustment = Gtk.Adjustment() adj.connect("value-changed", self._on_scroll) self.scrl.set_vadjustment(adj) # Drop controller self.dnd_ctrl: Gtk.DropControllerMotion = Gtk.DropControllerMotion() self.dnd_ctrl.connect("motion", self._on_dnd_scroll, adj) self.add_controller(self.dnd_ctrl) self.set_child( ErrandsToolbarView( top_bars=[ ErrandsHeaderBar( start_children=[ self.toggle_completed_btn, self.delete_completed_btn, ], title_widget=self.title, ), Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=ErrandsEntryRow( margin_top=3, margin_bottom=3, margin_end=12, margin_start=12, title=_("Add new Task"), activatable=False, height_request=60, css_classes=["card"], on_entry_activated=self._on_task_added, ), ), ], content=self.scrl, ) ) def __load_tasks(self) -> None: Log.info(f"Task List {self.list_uid}: Load Tasks") tasks: list[TaskData] = [ t for t in UserData.get_tasks_as_dicts(self.list_uid, "") if not t.deleted ] for task in tasks: new_task = Task(task, self) if task.completed: self.completed_task_list.append(new_task) else: self.uncompleted_task_list.append(new_task) self.toggle_completed_btn.set_active( UserData.get_list_prop(self.list_uid, "show_completed") ) self.update_title() # ------ PROPERTIES ------ # @property def tasks(self) -> list[Task]: """Top-level Tasks""" return self.uncompleted_tasks + self.completed_tasks @property def all_tasks(self) -> list[Task]: """All tasks in the list""" all_tasks: list[Task] = [] def __add_task(tasks: list[Task]) -> None: for task in tasks: all_tasks.append(task) __add_task(task.tasks) __add_task(self.tasks) return all_tasks @property def uncompleted_tasks(self) -> list[Task]: return get_children(self.uncompleted_task_list) @property def completed_tasks(self) -> list[Task]: return get_children(self.completed_task_list) # ------ PUBLIC METHODS ------ # def add_task(self, task: TaskData) -> Task: Log.info(f"Task List: Add task '{task.uid}'") on_top: bool = GSettings.get("task-list-new-task-position-top") new_task = Task(task, self) if not task.completed: if on_top: self.uncompleted_task_list.prepend(new_task) else: self.uncompleted_task_list.append(new_task) else: self.completed_task_list.prepend(new_task) return new_task def purge(self) -> None: State.sidebar.list_box.select_row(self.sidebar_row.get_prev_sibling()) State.sidebar.list_box.remove(self.sidebar_row) State.view_stack.remove(self) self.sidebar_row.run_dispose() self.run_dispose() # - UPDATE UI FUNCTIONS - # def update_title(self) -> None: Log.debug(f"Task List '{self.list_uid}': Update title") # Update title self.title.set_title(UserData.get_list_prop(self.list_uid, "name")) n_total, n_completed = UserData.get_status(self.list_uid) # Update headerbar subtitle self.title.set_subtitle( _("Completed:") + f" {n_completed} / {n_total}" if n_total > 0 else "" ) # Update sidebar item counter n_uncompleted: int = n_total - n_completed self.sidebar_row.size_counter.set_label( str(n_uncompleted) if n_uncompleted > 0 else "" ) # Update delete completed button self.delete_completed_btn.set_sensitive(n_completed > 0) # Update separator toplevel_tasks: list[TaskData] = [ t for t in UserData.get_tasks_as_dicts(self.list_uid, "") if not t.deleted and not t.trash ] n_completed: int = len([t for t in toplevel_tasks if t.completed]) n_total: int = len(toplevel_tasks) self.task_lists_separator.get_child().set_visible( n_completed > 0 and n_completed != n_total ) def update_tasks(self) -> None: # Update tasks tasks: list[TaskData] = [ t for t in UserData.get_tasks_as_dicts(self.list_uid, "") if not t.deleted ] tasks_uids: list[str] = [t.uid for t in tasks] widgets_uids: list[str] = [t.uid for t in self.tasks] # Add tasks for task in tasks: if task.uid not in widgets_uids: self.add_task(task) for task in self.tasks: # Remove task if task.uid not in tasks_uids: task.purge() # Move task to completed tasks elif task.task_data.completed and task in self.uncompleted_tasks: if ( len(self.uncompleted_tasks) > 1 and task.uid != self.uncompleted_tasks[-1].uid ): UserData.move_task_after( self.list_uid, task.uid, self.uncompleted_tasks[-1].uid, ) self.uncompleted_task_list.remove(task) self.completed_task_list.prepend(task) # Move task to uncompleted tasks elif not task.task_data.completed and task in self.completed_tasks: if ( len(self.uncompleted_tasks) > 0 and task.uid != self.uncompleted_tasks[-1].uid ): UserData.move_task_after( self.list_uid, task.uid, self.uncompleted_tasks[-1].uid, ) self.completed_task_list.remove(task) self.uncompleted_task_list.append(task) if not task.get_reveal_child() and not task.task_data.trash: task.toggle_visibility(True) def update_ui(self) -> None: self.update_title() self.update_tasks() # ------ SIGNAL HANDLERS ------ # def _on_delete_completed_btn_clicked(self, btn: Gtk.Button) -> None: """Hide completed tasks and move them to trash""" Log.info(f"Task List '{self.list_uid}': Delete completed tasks") for task in self.all_tasks: if not task.task_data.trash and task.task_data.completed: task.delete() self.update_ui() def _on_toggle_completed_btn_toggled(self, btn: Gtk.ToggleButton) -> None: if not hasattr(self, "completed_task_list"): return self.completed_task_list.set_visible(btn.get_active()) for task in self.all_tasks: task.completed_task_list.set_visible(btn.get_active()) UserData.update_list_prop(self.list_uid, "show_completed", btn.get_active()) def _on_scroll_up_btn_clicked(self, btn: Gtk.ToggleButton) -> None: scroll(self.scrl, False) def _on_dnd_scroll(self, _motion, _x, y: float, adj: Gtk.Adjustment) -> None: 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.set_value(adj.get_value() - (2 if scroll_up else -2)) return True MARGIN: int = 100 if y < MARGIN: self.scrolling = True GLib.timeout_add(100, __auto_scroll, True) elif y > self.get_height() - MARGIN: self.scrolling = True GLib.timeout_add(100, __auto_scroll, False) else: self.scrolling = False def _on_scroll(self, adj: Gtk.Adjustment) -> None: self.scroll_up_btn.set_visible(adj.get_value() > 0) def _on_task_added(self, entry: Adw.EntryRow) -> None: text: str = entry.get_text() if text.strip(" \n\t") == "": return self.add_task( UserData.add_task( list_uid=self.list_uid, text=text, ) ) entry.set_text("") if not GSettings.get("task-list-new-task-position-top"): scroll(self.scrl, True) self.update_title() Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/task_list/task_list_sidebar_row.py000066400000000000000000000244301464651330500274700ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT import time from gi.repository import Adw, Gdk, Gio, GLib, Gtk # type:ignore from errands.lib.data import TaskListData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import rgb_to_hex from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.dialogs import ConfirmDialog from errands.widgets.shared.components.menus import ErrandsMenuItem, ErrandsSimpleMenu from errands.widgets.task import Task from errands.widgets.task_list.task_list import TaskList class TaskListSidebarRow(Gtk.ListBoxRow): block_signals: bool = False def __init__(self, list_data: TaskListData) -> None: super().__init__() self.list_data = list_data self.uid: str = list_data.uid self.name: str = list_data.name self.__add_actions() self.__build_ui() # Add Task List page self.task_list: TaskList = TaskList(self) self.stack_page: Adw.ViewStackPage = State.view_stack.add_titled( child=self.task_list, name=self.name, title=self.name ) self.update_ui(False) def __add_actions(self) -> None: group: Gio.SimpleActionGroup = Gio.SimpleActionGroup() self.insert_action_group(name="list_row", 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.delete_list(self.uid) State.sidebar.remove_task_list(self) Sync.sync() ConfirmDialog( _("List will be permanently deleted"), _("Delete"), Adw.ResponseAppearance.DESTRUCTIVE, __confirm, ) 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.update_list_props(self.uid, ["name", "synced"], [text, False]) self.update_ui() State.trash_sidebar_row.update_ui() State.today_sidebar_row.update_ui() 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=State.main_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 Exception as e: Log.debug(f"List: Export cancelled. {e}") return Log.info(f"List: Export '{self.uid}'") try: with open(file.get_path(), "w") as f: f.write(self.list_data.to_ical()) except Exception as e: Log.error(f"List: Export failed. {e}") State.main_window.add_toast(_("Export failed")) State.main_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(State.main_window, None, _confirm) _create_action("delete", _delete) _create_action("rename", _rename) _create_action("export", _export) def __build_ui(self) -> None: self.props.height_request = 45 self.add_css_class("sidebar-item") self.connect("activate", self._on_row_activated) # Drop controller drop_ctrl: Gtk.DropTarget = Gtk.DropTarget.new( type=Task, actions=Gdk.DragAction.MOVE ) drop_ctrl.connect("drop", self._on_task_drop) self.add_controller(drop_ctrl) # Drag Hover controller drag_hover_ctrl: Gtk.DropControllerMotion = Gtk.DropControllerMotion() drag_hover_ctrl.connect("enter", self._on_drop_hover) self.add_controller(drag_hover_ctrl) # Color button color_dialog: Gtk.ColorDialog = Gtk.ColorDialog(with_alpha=False) self.color_btn: Gtk.ColorDialogButton = Gtk.ColorDialogButton( dialog=color_dialog, tooltip_text=_("Color") ) self.color_btn.connect("notify::rgba", self.__on_color_selected) # Title self.label: Gtk.Label = Gtk.Label( hexpand=True, halign=Gtk.Align.START, ellipsize=3 ) # Counter self.size_counter = Gtk.Button( css_classes=["dim-label", "caption", "flat", "circular"], halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, can_target=False, label="...", ) # Right-click right_click = Gtk.GestureClick(button=3) right_click.connect("released", self._on_row_pressed) self.add_controller(right_click) # Context menu self.popover_menu = Gtk.PopoverMenu( halign=Gtk.Align.START, has_arrow=False, menu_model=ErrandsSimpleMenu( items=[ ErrandsMenuItem(_("Rename"), "list_row.rename"), ErrandsMenuItem(_("Delete"), "list_row.delete"), ErrandsMenuItem(_("Export"), "list_row.export"), ] ), ) self.set_child( ErrandsBox( spacing=4, children=[ self.color_btn, self.label, self.size_counter, self.popover_menu, ], ) ) def update_ui(self, update_task_list_ui: bool = True): Log.debug(f"Task List Row: Update UI '{self.uid}'") # Update title self.name = UserData.get_list_prop(self.uid, "name") self.label.set_label(self.name) self.stack_page.set_name(self.name) self.stack_page.set_title(self.name) color: Gdk.RGBA = Gdk.RGBA() color.parse(self.list_data.color) self.block_signals = True self.color_btn.set_rgba(color) self.block_signals = False # Update task list if update_task_list_ui: self.task_list.update_ui() 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 old_task_list = task.task_list Log.info(f"Lists: Move '{task.uid}' to '{self.uid}' list") UserData.move_task_to_list(task.uid, task.list_uid, self.uid, "") if isinstance(task.parent, Task): task.parent.update_progress_bar() task.parent.update_title() task.purge() old_task_list.update_title() self.task_list.update_ui() Sync.sync() def _on_row_activated(self, *args) -> None: Log.debug(f"Sidebar: Switch to list '{self.uid}'") State.view_stack.set_visible_child_name(self.label.get_label()) State.split_view.set_show_content(True) GSettings.set("last-open-list", "s", self.name) def _on_row_pressed(self, _gesture_click, _n_press, x, y) -> None: position = Gdk.Rectangle() position.x = x position.y = y self.popover_menu.set_pointing_to(position) self.popover_menu.popup() def __on_color_selected(self, btn: Gtk.ColorDialogButton, _): if self.block_signals: return try: r, g, b = btn.get_rgba().to_string().strip("rgba()").split(",")[:3] color: str = rgb_to_hex(r, g, b) except BaseException: color: str = "#3584e4" Log.debug(f"Task List '{self.list_data.uid}': Set color to '{color}'") UserData.update_list_props( self.list_data.uid, ["color", "synced"], [color, False] ) Sync.sync() mrvladus-Errands-cbe30b3/errands/widgets/today/000077500000000000000000000000001464651330500216615ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/today/today.py000066400000000000000000000065541464651330500233650ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from datetime import datetime from gi.repository import Adw, GObject, Gtk # type:ignore from errands.lib.data import TaskData, UserData from errands.lib.logging import Log from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.today.today_task import TodayTask class Today(Adw.Bin): def __init__(self): super().__init__() Log.debug("Today Page: Load") State.today_page = self self.__build_ui() self.update_ui() # ------ PRIVATE METHODS ------ # def __build_ui(self): # Status Page self.status_page = Adw.StatusPage( title=_("No Tasks for Today"), icon_name="errands-info-symbolic", vexpand=True, css_classes=["compact"], ) # Task List self.task_list = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin_bottom=32) # Content content = Gtk.ScrolledWindow( propagate_natural_height=True, child=Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=self.task_list ), ) self.status_page.bind_property( "visible", content, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) self.set_child( ErrandsToolbarView( top_bars=[ Adw.HeaderBar(title_widget=Adw.WindowTitle(title=_("Today"))) ], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[self.status_page, content], ), ) ) # ------ PROPERTIES ------ # @property def tasks(self) -> list[TodayTask]: return get_children(self.task_list) @property def tasks_data(self) -> list[TaskData]: return [ t for t in UserData.tasks if not t.deleted and not t.completed and not t.trash and t.due_date and datetime.fromisoformat(t.due_date).date() <= datetime.today().date() ] # ------ PUBLIC METHODS ------ # def add_task(self, task_data: TaskData) -> TodayTask: self.task_list.append(TodayTask(task_data, self)) self.status_page.set_visible(False) def update_status(self): """Update status and counter""" total: int = len(self.tasks_data) self.status_page.set_visible(total == 0) State.today_sidebar_row.size_counter.set_label(str(total) if total > 0 else "") def update_ui(self): Log.debug("Today Page: Update UI") tasks = self.tasks_data tasks_uids: list[str] = [t.uid for t in tasks] widgets_uids: list[str] = [t.uid for t in self.tasks] # Add tasks for task in tasks: if task.uid not in widgets_uids: self.add_task(task) # Remove tasks for task in self.tasks: if task.uid not in tasks_uids: task.purge() for task in self.tasks: task.update_ui() self.update_status() mrvladus-Errands-cbe30b3/errands/widgets/today/today_sidebar_row.py000066400000000000000000000032441464651330500257360ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from gi.repository import Gtk # type:ignore from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox class TodaySidebarRow(Gtk.ListBoxRow): def __init__(self) -> None: super().__init__() self.name = "errands_today_page" State.today_sidebar_row = self self.__build_ui() def __build_ui(self): self.props.height_request = 45 self.add_css_class("sidebar-item") self.connect("activate", self._on_row_activated) # Icon self.icon = Gtk.Image(icon_name="errands-calendar-symbolic") # Title self.label: Gtk.Label = Gtk.Label( hexpand=True, halign=Gtk.Align.START, label=_("Today") ) # Counter self.size_counter = Gtk.Button( css_classes=["dim-label", "caption", "flat", "circular"], halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, can_target=False, ) self.set_child( ErrandsBox( spacing=12, margin_start=6, children=[self.icon, self.label, self.size_counter], ) ) def update_ui(self): State.today_page.update_ui() def _on_row_activated(self, *args) -> None: Log.debug("Sidebar: Open Today") State.view_stack.set_visible_child_name(self.name) State.split_view.set_show_content(True) GSettings.set("last-open-list", "s", self.name) State.today_page.update_ui() mrvladus-Errands-cbe30b3/errands/widgets/today/today_task.py000066400000000000000000000276541464651330500244130ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations import datetime from typing import TYPE_CHECKING, Any from gi.repository import Adw, Gdk, Gio, GLib, GObject, Gtk # type:ignore from errands.lib.data import TaskData, UserData from errands.lib.logging import Log from errands.lib.markup import Markup from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox, ErrandsListBox from errands.widgets.shared.components.buttons import ErrandsButton, ErrandsCheckButton from errands.widgets.shared.components.menus import ErrandsMenuItem, ErrandsSimpleMenu from errands.widgets.shared.task_toolbar.toolbar import ErrandsTaskToolbar from errands.widgets.task import Tag, Task from errands.widgets.task_list.task_list import TaskList if TYPE_CHECKING: from errands.widgets.today.today import Today class TodayTask(Gtk.Revealer): block_signals: bool = True purging: bool = False def __init__(self, task_data: TaskData, today_page: Today) -> None: super().__init__() self.task_data = task_data self.list_uid = task_data.list_uid self.uid = task_data.uid self.today_page = today_page self.__build_ui() self.__add_actions() self.update_ui() self.block_signals = False def __repr__(self) -> str: return f"" def __add_actions(self) -> None: self.group: Gio.SimpleActionGroup = Gio.SimpleActionGroup() self.insert_action_group(name="task", group=self.group) def __create_action(name: str, callback: callable) -> None: action: Gio.SimpleAction = Gio.SimpleAction(name=name) action.connect("activate", callback) self.group.add_action(action) def __edit(*args): self.edit_row.set_text(self.task_data.text) self.edit_row.set_visible(True) self.edit_row.grab_focus() def __export(*args): def __confirm(dialog, res): try: file = dialog.save_finish(res) except Exception as e: Log.debug(f"List: Export cancelled. {e}") return Log.info(f"Task: Export '{self.uid}'") with open(file.get_path(), "w") as f: f.write(self.task_data.to_ical(True)) State.main_window.add_toast(_("Exported")) dialog = Gtk.FileDialog(initial_name=f"{self.uid}.ics") dialog.save(State.main_window, None, __confirm) def __copy_to_clipboard(*args): Log.info("Task: Copy text to clipboard") self.get_clipboard().set(self.task_data.text) State.main_window.add_toast(_("Copied to Clipboard")) __create_action("edit", __edit) __create_action("copy_to_clipboard", __copy_to_clipboard) __create_action("export", __export) __create_action("move_to_trash", lambda *_: self.delete()) def __build_ui(self): # --- TITLE --- # # Title row self.title_row = Adw.ActionRow( height_request=60, use_markup=True, css_classes=["transparent", "rounded-corners"], ) # Complete button self.complete_btn: ErrandsCheckButton = ErrandsCheckButton( tooltip_text=_("Toggle Completion"), valign=Gtk.Align.CENTER, css_classes=["selection-mode"], on_toggle=self._on_complete_btn_toggled, ) self.title_row.add_prefix(self.complete_btn) # Right click menu right_click_ctrl = Gtk.GestureClick(button=3) right_click_ctrl.connect("released", self.__on_right_click) self.title_row.add_controller(right_click_ctrl) self.popover_menu: Gtk.PopoverMenu = Gtk.PopoverMenu( halign=Gtk.Align.START, has_arrow=False, menu_model=ErrandsSimpleMenu( items=( ErrandsMenuItem(_("Edit"), "task.edit"), ErrandsMenuItem(_("Move to Trash"), "task.move_to_trash"), ErrandsMenuItem(_("Copy to Clipboard"), "task.copy_to_clipboard"), ErrandsMenuItem(_("Export"), "task.export"), ) ), ) # Edit row self.edit_row: Adw.EntryRow = Adw.EntryRow( title=_("Edit"), visible=False, height_request=60, show_apply_button=True, css_classes=["transparent", "rounded-corners"], ) self.edit_row.bind_property( "visible", self.title_row, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN | GObject.BindingFlags.INVERT_BOOLEAN, ) self.edit_row.connect("apply", self._on_edit_row_applied) # Cancel edit button self.edit_row.add_suffix( ErrandsButton( tooltip_text=_("Cancel"), valign=Gtk.Align.CENTER, icon_name="window-close-symbolic", css_classes=["circular"], on_click=self._on_cancel_edit_btn_clicked, ) ) # --- TAGS BAR --- # self.tags_bar: Gtk.FlowBox = Gtk.FlowBox( height_request=20, margin_start=12, margin_end=12, margin_bottom=3, selection_mode=Gtk.SelectionMode.NONE, max_children_per_line=1000, ) self.tags_bar_rev: Gtk.Revealer = Gtk.Revealer(child=self.tags_bar) # --- TOOL BAR --- # self.toolbar: ErrandsTaskToolbar = ErrandsTaskToolbar(self) # --- MAIN BOX --- # self.main_box: ErrandsBox = ErrandsBox( orientation=Gtk.Orientation.VERTICAL, margin_start=12, margin_end=12, margin_bottom=6, margin_top=6, css_classes=["card", "fade"], children=[ # Title box ErrandsListBox( css_classes=["transparent", "rounded-corners"], children=[self.title_row, self.edit_row], ), self.popover_menu, # Tags self.tags_bar_rev, # Toolbar self.toolbar, ], ) self.set_child(self.main_box) # ------ PROPERTIES ------ # @property def task(self) -> Task: return State.get_task(self.task_data.list_uid, self.task_data.uid) @property def task_list(self) -> TaskList: return State.get_task_list(self.task_data.list_uid) @property def tags(self) -> list[Tag]: return [item.get_child() for item in get_children(self.tags_bar)] # ------ PUBLIC METHODS ------ # def add_rm_crossline(self, add: bool) -> None: if add: self.title_row.add_css_class("task-completed") else: self.title_row.remove_css_class("task-completed") def add_tag(self, tag: str) -> None: self.tags_bar.append(Tag(tag, self)) def get_prop(self, prop: str) -> Any: return UserData.get_prop(self.list_uid, self.uid, prop) def get_status(self) -> tuple[int, int]: """Get total tasks and completed tasks tuple""" return UserData.get_status(self.list_uid, self.uid) def delete(self, *_) -> None: self.toggle_visibility(False) self.task.delete() self.today_page.update_status() def purge(self) -> None: """Completely remove widget""" if self.purging: return def __finish_remove(): GLib.idle_add(self.get_parent().remove, self) return False self.purging = True self.toggle_visibility(False) GLib.timeout_add(300, __finish_remove) def update_props(self, props: list[str], values: list[Any]) -> None: # Update 'changed_at' if it's not in local props local_props: tuple[str] = ( "deleted", "expanded", "synced", "toolbar_shown", "trash", ) for prop in props: if prop not in local_props: props.append("changed_at") values.append(datetime.datetime.now().strftime("%Y%m%dT%H%M%S")) break UserData.update_props(self.list_uid, self.uid, props, values) # Update linked today task if props == ["expanded"] or props == ["toolbar_shown"]: State.today_page.update_ui() def toggle_visibility(self, on: bool) -> None: GLib.idle_add(self.set_reveal_child, on) def update_title(self) -> None: # Update title self.title_row.set_title(Markup.find_url(Markup.escape(self.task_data.text))) # Update subtitle self.title_row.set_subtitle( UserData.get_list_prop(self.task_data.list_uid, "name") ) # Update completion completed: bool = self.task_data.completed self.add_rm_crossline(completed) if self.complete_btn.get_active() != completed: self.block_signals = True self.complete_btn.set_active(completed) self.block_signals = False def update_tags_bar(self) -> None: tags: str = self.task_data.tags tags_list_text: list[str] = [tag.title for tag in self.tags] # Delete tags for tag in self.tags: if tag.title not in tags: self.tags_bar.remove(tag) # Add tags for tag in tags: if tag not in tags_list_text: self.add_tag(tag) self.tags_bar_rev.set_reveal_child(tags != []) linked_task = State.get_task(self.task_data.list_uid, self.task_data.uid) if linked_task: linked_task.update_tags_bar() def update_toolbar(self) -> None: self.toolbar.update_ui() linked_task = State.get_task(self.task_data.list_uid, self.task_data.uid) if linked_task: linked_task.update_toolbar() def update_color(self) -> None: for cls in self.main_box.get_css_classes(): if "task-" in cls: self.main_box.remove_css_class(cls) break for cls in self.complete_btn.get_css_classes(): if "checkbtn-" in cls: self.complete_btn.remove_css_class(cls) break if color := self.task_data.color: self.main_box.add_css_class(f"task-{color}") self.complete_btn.add_css_class(f"checkbtn-{color}") def update_ui(self) -> None: self.toggle_visibility(not self.task_data.trash) self.update_color() self.update_title() self.update_tags_bar() self.update_toolbar() # ------ SIGNAL HANDLERS ------ # def _on_complete_btn_toggled(self, btn: Gtk.CheckButton) -> None: self.add_rm_crossline(btn.get_active()) if self.block_signals: return self.task.complete_btn.set_active(btn.get_active()) if btn.get_active(): self.purge() State.today_page.update_status() def _on_edit_row_applied(self, entry: Adw.EntryRow) -> None: text: str = entry.props.text.strip() entry.set_visible(False) if not text or text == self.task_data.text: return self.update_props(["text", "synced"], [text, False]) self.update_title() self.task.update_title() Sync.sync() def _on_cancel_edit_btn_clicked(self, _btn: Gtk.Button) -> None: self.edit_row.props.text = "" self.edit_row.emit("apply") def __on_right_click(self, _gesture_click, _n_press, x: int, y: int) -> None: position: Gdk.Rectangle = Gdk.Rectangle() position.x = x position.y = y self.popover_menu.set_pointing_to(position) self.popover_menu.popup() mrvladus-Errands-cbe30b3/errands/widgets/trash/000077500000000000000000000000001464651330500216625ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/errands/widgets/trash/trash.py000066400000000000000000000160401464651330500233560ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from gi.repository import Adw, GObject, Gtk # type:ignore from errands.lib.data import TaskData, UserData from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.lib.utils import get_children from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ErrandsButton from errands.widgets.shared.components.dialogs import ConfirmDialog from errands.widgets.shared.components.header_bar import ErrandsHeaderBar from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.task import Task class Trash(Adw.Bin): def __init__(self): super().__init__() Log.debug("Trash Page: Load") State.trash_page = self self.__build_ui() def __build_ui(self): # Status Page self.status_page = Adw.StatusPage( title=_("Empty Trash"), description=_("No deleted items"), icon_name="errands-trash-symbolic", vexpand=True, css_classes=["compact"], ) # Clear button clear_btn: ErrandsButton = ErrandsButton( tooltip_text=_("Clear"), on_click=self.on_trash_clear, icon_name="errands-trash-symbolic", css_classes=["flat"], valign=Gtk.Align.CENTER, ) self.status_page.bind_property( "visible", clear_btn, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) # Restore button restore_btn: ErrandsButton = ErrandsButton( tooltip_text=_("Restore"), on_click=self.on_trash_restore, icon_name="errands-restore-symbolic", css_classes=["flat"], valign=Gtk.Align.CENTER, ) self.status_page.bind_property( "visible", restore_btn, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) # Trash List self.trash_list = Gtk.ListBox( selection_mode=Gtk.SelectionMode.NONE, margin_bottom=32, margin_end=12, margin_start=12, css_classes=["transparent"], ) self.trash_list.bind_property( "visible", self.status_page, "visible", GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.INVERT_BOOLEAN, ) self.set_child( ErrandsToolbarView( top_bars=[ ErrandsHeaderBar( start_children=[clear_btn], end_children=[restore_btn], title_widget=Adw.WindowTitle(title=_("Trash")), ) ], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, children=[ self.status_page, Gtk.ScrolledWindow( propagate_natural_height=True, child=Adw.Clamp( maximum_size=1000, tightening_threshold=300, child=self.trash_list, ), ), ], ), ) ) @property def trash_items(self) -> list[TrashItem]: return get_children(self.trash_list) def add_trash_item(self, uid: str) -> None: self.trash_list.append(TrashItem(uid)) self.status_page.set_visible(False) def update_ui(self): tasks_dicts: list[TaskData] = [ t for t in UserData.get_tasks_as_dicts() if t.trash and not t.deleted ] tasks_uids: list[str] = [t.uid for t in tasks_dicts] # Add items items_uids = [t.task_dict.uid for t in self.trash_items] for t in tasks_dicts: if t.uid not in items_uids: self.add_trash_item(t) for item in self.trash_items: # Remove items if item.task_dict.uid not in tasks_uids: self.trash_list.remove(item) continue # Update title and subtitle item.update_ui() # Show status self.status_page.set_visible(len(self.trash_items) == 0) def on_trash_clear(self, *args) -> None: def __confirm(_, res) -> None: if res == "cancel": Log.debug("Trash: Clear cancelled") return Log.info("Trash: Clear") UserData.delete_tasks_from_trash() State.trash_sidebar_row.update_ui() State.today_page.update_ui() # Sync Sync.sync() Log.debug("Trash: Show confirm dialog") ConfirmDialog( _("Tasks will be permanently deleted"), _("Delete"), Adw.ResponseAppearance.DESTRUCTIVE, __confirm, ) def on_trash_restore(self, *args) -> None: """ Remove trash items and restore all tasks """ Log.info("Trash: Restore") for task in self.trash_items: task.on_restore_btn_clicked(None) class TrashItem(Adw.ActionRow): def __init__(self, task: TaskData) -> None: super().__init__() self.task_dict: TaskData = task self.__build_ui() def __build_ui(self) -> None: self.props.height_request = 60 self.set_title_selectable(True) self.set_margin_top(6) self.set_margin_bottom(6) self.add_css_class("card") self.add_suffix( ErrandsButton( tooltip_text=_("Restore"), icon_name="errands-check-toggle-symbolic", valign=Gtk.Align.CENTER, css_classes=["circular", "flat"], on_click=self.on_restore_btn_clicked, ) ) def update_ui(self): self.set_title(self.task_dict.text) self.set_subtitle(UserData.get_list_prop(self.task_dict.list_uid, "name")) def on_restore_btn_clicked(self, _) -> None: """Restore task and its parents""" Log.info(f"Restore task: {self.task_dict.uid}") parents_uids: list[str] = UserData.get_parents_uids_tree( self.task_dict.list_uid, self.task_dict.uid ) parents_uids.append(self.task_dict.uid) for uid in parents_uids: UserData.update_props(self.task_dict.list_uid, uid, ["trash"], [False]) task: Task = State.get_task(self.task_dict.list_uid, uid) task.task_list.update_title() task.toggle_visibility(True) if isinstance(task.parent, Task): task.parent.update_title() task.parent.update_progress_bar() State.trash_sidebar_row.update_ui() State.today_page.update_ui() mrvladus-Errands-cbe30b3/errands/widgets/trash/trash_sidebar_row.py000066400000000000000000000101211464651330500257300ustar00rootroot00000000000000# Copyright 2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from gi.repository import Gio, Gtk, Gdk # type:ignore from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.state import State from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.menus import ErrandsMenuItem, ErrandsSimpleMenu from errands.widgets.task import Task class TrashSidebarRow(Gtk.ListBoxRow): def __init__(self) -> None: super().__init__() self.name = "errands_trash_page" State.trash_sidebar_row = self self.__add_actions() self.__build_ui() def __build_ui(self) -> None: self.props.height_request = 45 self.add_css_class("sidebar-item") self.add_css_class("sidebar-item-trash") self.connect("activate", self._on_row_activated) # Drop controller drop_ctrl: Gtk.DropTarget = Gtk.DropTarget.new( type=Task, actions=Gdk.DragAction.MOVE ) drop_ctrl.connect("drop", self._on_task_drop) self.add_controller(drop_ctrl) # Icon self.icon = Gtk.Image(icon_name="errands-trash-symbolic") # Title self.label: Gtk.Label = Gtk.Label( hexpand=True, halign=Gtk.Align.START, label=_("Trash") ) # Counter self.size_counter = Gtk.Button( css_classes=["dim-label", "caption", "flat", "circular"], halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, can_target=False, ) # Gesture click self.gesture_click = Gtk.GestureClick(button=3) self.gesture_click.connect("released", self._on_row_pressed) # Context menu self.popover_menu = Gtk.PopoverMenu( halign=Gtk.Align.START, has_arrow=False, menu_model=ErrandsSimpleMenu( items=[ ErrandsMenuItem(_("Clear"), "trash_row.clear"), ErrandsMenuItem(_("Restore"), "trash_row.restore"), ] ), ) self.set_child( ErrandsBox( spacing=12, margin_start=6, children=[self.icon, self.label, self.size_counter, self.popover_menu], ) ) self.add_controller(self.gesture_click) def __add_actions(self) -> None: self.group: Gio.SimpleActionGroup = Gio.SimpleActionGroup() self.insert_action_group(name="trash_row", group=self.group) def __create_action(name: str, callback: callable) -> None: action: Gio.SimpleAction = Gio.SimpleAction(name=name) action.connect("activate", callback) self.group.add_action(action) __create_action("clear", lambda *_: State.trash_page.on_trash_clear()) __create_action("restore", lambda *_: State.trash_page.on_trash_restore()) def update_ui(self) -> None: # Update trash State.trash_page.update_ui() # Get trash size size: int = len(State.trash_page.trash_items) # Update actions state self.group.lookup_action("restore").set_enabled(size > 0) self.group.lookup_action("clear").set_enabled(size > 0) # Update icon name self.icon.set_from_icon_name( f"errands-trash{'-full' if size > 0 else ''}-symbolic" ) # Update subtitle self.size_counter.set_label("" if size == 0 else str(size)) def _on_row_activated(self, *args) -> None: Log.debug("Sidebar: Open Trash") State.view_stack.set_visible_child_name("errands_trash_page") State.split_view.set_show_content(True) GSettings.set("last-open-list", "s", "errands_trash_page") def _on_row_pressed(self, _gesture_click, _n_press, x, y) -> None: position = Gdk.Rectangle() position.x = x position.y = y self.popover_menu.set_pointing_to(position) self.popover_menu.popup() def _on_task_drop(self, _d, task: Task, _x, _y) -> None: task.delete() mrvladus-Errands-cbe30b3/errands/widgets/window.py000066400000000000000000000212341464651330500224240ustar00rootroot00000000000000# Copyright 2023-2024 Vlad Krupinskii # SPDX-License-Identifier: MIT from __future__ import annotations from dataclasses import asdict from uuid import uuid4 from gi.repository import Adw, Gio, Gtk # type:ignore from errands.lib.data import TaskListData, UserData from errands.lib.gsettings import GSettings from errands.lib.logging import Log from errands.lib.sync.sync import Sync from errands.state import State from errands.widgets.loading_page import ErrandsLoadingPage from errands.widgets.preferences import PreferencesWindow from errands.widgets.shared.components.boxes import ErrandsBox from errands.widgets.shared.components.buttons import ErrandsButton from errands.widgets.shared.components.toolbar_view import ErrandsToolbarView from errands.widgets.sidebar import Sidebar from errands.widgets.tags.tags import Tags from errands.widgets.today.today import Today from errands.widgets.trash.trash import Trash class Window(Adw.ApplicationWindow): about_window: Adw.AboutWindow = None def __init__(self, **kwargs) -> None: super().__init__(**kwargs) Log.debug("Main Window: Load") self.__build_ui() self._create_actions() # 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")) self.__finish_load() def __build_ui(self) -> None: self.set_title(_("Errands")) self.props.width_request = 360 self.props.height_request = 200 GSettings.bind("run-in-background", self, "hide-on-close") # View Stack self.view_stack: Adw.ViewStack = Adw.ViewStack() # Split View self.split_view: Adw.NavigationSplitView = Adw.NavigationSplitView( show_content=True, max_sidebar_width=300, min_sidebar_width=200, sidebar=Adw.NavigationPage(child=Sidebar(), title=_("Sidebar")), content=Adw.NavigationPage( child=self.view_stack, title=_("Content"), width_request=360 ), ) self.view_stack.add_titled( child=ErrandsLoadingPage(), name="errands_loading_page", title=_("Loading Tasks"), ) self.view_stack.add_titled( child=Today(), name="errands_today_page", title=_("Today") ) self.view_stack.add_titled( child=Tags(), name="errands_tags_page", title=_("Tags") ) self.view_stack.add_titled( child=Trash(), name="errands_trash_page", title=_("Trash") ) # Status Page self.view_stack.add_titled( child=ErrandsToolbarView( top_bars=[Adw.HeaderBar(show_title=False)], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, hexpand=True, valign=Gtk.Align.CENTER, children=[ Adw.StatusPage( title=_("No Task Lists"), description=_("Create new or import existing one"), icon_name="io.github.mrvladus.List", ), ErrandsButton( label=_("Create List"), css_classes=["pill", "suggested-action"], halign=Gtk.Align.CENTER, on_click=lambda btn: State.sidebar.add_list_btn.activate(), ), ], ), ), name="errands_status_page", title=_("Create new List"), ) # Syncing Page self.view_stack.add_titled( child=ErrandsToolbarView( top_bars=[Adw.HeaderBar(show_title=False)], content=ErrandsBox( orientation=Gtk.Orientation.VERTICAL, hexpand=True, valign=Gtk.Align.CENTER, children=[ Adw.StatusPage( title=_("Syncing"), description=_("First syncronization is running"), icon_name="errands-sync-symbolic", ), ], ), ), name="errands_syncing_page", title=_("Syncing"), ) # Toast Overlay self.toast_overlay: Adw.ToastOverlay = Adw.ToastOverlay(child=self.split_view) self.set_content(self.toast_overlay) # Breakpoints bp = Adw.Breakpoint(condition=Adw.BreakpointCondition.parse("max-width: 600px")) bp.add_setter(self.split_view, "collapsed", True) self.add_breakpoint(bp) def __finish_load(self, *_): State.view_stack = self.view_stack State.split_view = self.split_view State.view_stack.set_visible_child_name("errands_status_page") State.sidebar.load_task_lists() State.trash_sidebar_row.update_ui() # Sync Sync.sync() def add_toast(self, text: str) -> None: self.toast_overlay.add_toast(Adw.Toast.new(title=text)) def _create_action(self, 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 _create_actions(self) -> None: """ Create actions for main menu """ def _about(*args) -> None: """ Show about window """ if not self.about_window: self.about_window = Adw.AboutDialog( version=State.VERSION, application_icon=State.APP_ID, application_name=_("Errands"), copyright="© 2023-2024 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"), ) self.about_window.present(self) def _sync(*args): if GSettings.get("sync-provider") == 0: self.add_toast(_("Sync is disabled")) return Sync.sync() def _import(*args) -> None: def _confirm(dialog: Gtk.FileDialog, res) -> None: try: file: Gio.File = dialog.open_finish(res) except Exception as e: Log.debug(f"Lists: Import cancelled. {e}") return with open(file.get_path(), "r") as f: task_list, tasks = TaskListData.from_ical(f.read()) if task_list.uid in [ lst.uid for lst in UserData.get_lists_as_dicts() ]: task_list.uid = uuid4() for task in tasks: task.list_uid = task_list.uid if task_list.name in [ lst.name for lst in UserData.get_lists_as_dicts() ]: task_list.name = f"{task_list.name}_{task_list.uid}" new_task_list: TaskListData = UserData.add_list( name=task_list.name, uuid=task_list.uid, color=task_list.color ) for task in tasks: UserData.add_task(**asdict(task)) State.sidebar.add_task_list(new_task_list) self.add_toast(_("Imported")) Sync.sync() filter = Gtk.FileFilter() filter.add_pattern("*.ics") dialog = Gtk.FileDialog(default_filter=filter) dialog.open(self, None, _confirm) self._create_action( "preferences", lambda *_: PreferencesWindow().present(self), ["comma"], ) self._create_action("about", _about) self._create_action("import", _import, ["i"]) self._create_action("quit", lambda *_: State.application.quit(), ["q"]) self._create_action("sync", _sync, ["f"]) self._create_action( "quit", lambda *_: self.props.application.quit(), ["q", "w"], ) mrvladus-Errands-cbe30b3/io.github.mrvladus.List.Devel.json000066400000000000000000000043541464651330500240320ustar00rootroot00000000000000{ "id": "io.github.mrvladus.List.Devel", "runtime": "org.gnome.Platform", "runtime-version": "46", "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", "--filesystem=home" ], "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", "-Dms_graph=false", "-Dvapi=false" ], "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/GNOME/gnome-online-accounts.git", "branch": "master" } ] }, { "name": "libportal", "buildsystem": "meson", "config-opts": [ "-Dbackend-gtk4=enabled", "-Dvapi=false", "-Ddocs=false", "-Dtests=false" ], "sources": [ { "type": "git", "url": "https://github.com/flatpak/libportal.git", "tag": "0.7.1" } ] }, "build-aux/python3-caldav.json", { "name": "errands", "buildsystem": "meson", "config-opts": [ "-Dprofile=development" ], "sources": [ { "type": "dir", "path": "." } ] } ] }mrvladus-Errands-cbe30b3/meson.build000066400000000000000000000040761464651330500176060ustar00rootroot00000000000000project( 'errands', version: '46.2.4', meson_version: '>= 0.62.0', ) # Declare dependencies dependency('libadwaita-1', version: '>= 1.5') dependency('libsecret-1') dependency('libportal') dependency('gtksourceview-5') dependency('pygobject-3.0') dependency('goa-1.0', required: false) # Import modules i18n = import('i18n') gnome = import('gnome') python = import('python') # Define dirs pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) moduledir = join_paths(pkgdatadir, 'errands') # Set profile 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 # Set config 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) conf.set('bindir', get_option('prefix') / get_option('bindir')) # Install data subdir('data') # Install source files configure_file( input: join_paths('errands', 'errands.py'), output: 'errands', configuration: conf, install: true, install_dir: get_option('bindir'), install_mode: 'r-xr--r--', ) install_data(join_paths('errands', 'application.py'), install_dir: moduledir) install_data(join_paths('errands', 'state.py'), install_dir: moduledir) install_subdir(join_paths('errands', 'utils'), install_dir: moduledir) install_subdir(join_paths('errands', 'lib'), install_dir: moduledir) install_subdir(join_paths('errands', 'widgets'), install_dir: moduledir) # Install translations subdir('po') # Update cache, icons and compile gsettings gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, )mrvladus-Errands-cbe30b3/meson_options.txt000066400000000000000000000001561464651330500210740ustar00rootroot00000000000000option( 'profile', type: 'combo', choices: [ 'release', 'development', ], value: 'release' )mrvladus-Errands-cbe30b3/po/000077500000000000000000000000001464651330500160535ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/po/LINGUAS000066400000000000000000000001351464651330500170770ustar00rootroot00000000000000ar ca cs da_DK de en_GB es eu fa fr hi hr hu it ja nb nl oc pl pt_BR ru tr uk zh_CN zh_TW el mrvladus-Errands-cbe30b3/po/POTFILES000066400000000000000000000032711464651330500172260ustar00rootroot00000000000000# .py errands/widgets/shared/components/boxes.py errands/widgets/shared/components/buttons.py errands/widgets/shared/components/controllers.py errands/widgets/shared/components/dialogs.py errands/widgets/shared/components/entries.py errands/widgets/shared/components/header_bar.py errands/widgets/shared/components/menus.py errands/widgets/shared/components/toolbar_view.py errands/widgets/shared/color_selector.py errands/widgets/shared/datetime_picker.py errands/widgets/shared/titled_separator.py errands/widgets/shared/task_toolbar/toolbar.py errands/widgets/shared/task_toolbar/__init__.py errands/widgets/shared/task_toolbar/attachments_window.py errands/widgets/shared/task_toolbar/datetime_window.py errands/widgets/shared/task_toolbar/notes_window.py errands/widgets/sidebar.py errands/widgets/tags/tags.py errands/widgets/tags/tags_sidebar_row.py errands/widgets/task.py errands/widgets/task_list/task_list.py errands/widgets/task_list/task_list_sidebar_row.py errands/widgets/today/today.py errands/widgets/today/today_sidebar_row.py errands/widgets/today/today_task.py errands/widgets/trash/trash.py errands/widgets/trash/trash_sidebar_row.py errands/widgets/window.py errands/widgets/preferences.py errands/lib/sync/providers/nextcloud.py errands/lib/sync/providers/caldav.py errands/lib/sync/sync.py errands/lib/animation.py errands/lib/goa.py errands/lib/markup.py errands/lib/data.py errands/lib/gsettings.py errands/lib/logging.py errands/lib/notifications.py errands/lib/plugins.py errands/lib/utils.py errands/application.py errands/errands.py errands/state.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-cbe30b3/po/ar.po000066400000000000000000000461171464651330500170260ustar00rootroot00000000000000# 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. # FULL NAME , 2024. # علي , 2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-03-03 14:25+0200\n" "Last-Translator: علي \n" "Language-Team: Arabic <>\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-DL-Lang: Arabic\n" "X-DL-Module: ar\n" "X-DL-Branch: \n" "X-DL-Domain: \n" "X-Generator: Gtranslator 45.3\n" "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "أَ متأكد أنت؟" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "ألغ" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "اليوم" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "غدا" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "الآن" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "أفرغ" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "حدد تاريخا" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "حدد تاريخا" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "ملاحظات" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "الأهمية" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "الآن" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "الوسوم" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "الوسوم" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "مكمَّل" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "احذف" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "الاستحقاق" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "ابدأ" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "إضافة قائمة" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "يُزامَن..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "إضافة قائمة جديدة" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "إضغط زر الـ \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "لا قوائم تطبيقات" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "إيراندس" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "القائمة الرئيسة" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "زامن / استع المهام" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "استيراد قائمة" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "التفضيلات" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "اختصارات لوحة المفاتيح" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "عن إيراندس" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "الخروج" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "اسم القائمة الجديد" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "إضافة قائمة" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "أضف" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "إضافة مهمة جديدة" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "صُدِّرَ" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "نُسِخَ إلى الحافظة" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "عرض الماهم الفرعية" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "تبديل أوضاع عرض التفاصيل" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "بدل بين أوضاع الشريط الجانبي" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "نُسِخَ إلى الحافظة" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "صدِّر" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "مكمَّل" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "أضف مهمة فرعية جديدة" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "مكمَّل" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "احذف" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "احذف المهام المكمَّلة" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "احذف المهام المكمَّلة" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "مرِّر للأعلى" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "إضافة مهمة جديدة" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "يُزامَن..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "ستحذف القائمة أبدأً" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "الاسم الجديد" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "أعد تسمية القائمة" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "احفظ" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "فشل التصدير" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "أعد التسمية" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "تخلص من المهملات" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "لا عناصر محذوفة" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "استعادة" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "المهملات" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "ستحذف العناصر أبداً" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "بدل بين أوضاع الشريط الجانبي" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "لا قوائم تطبيقات" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "أنشئ قائمة" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "أنشئ قائمة" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "العرفان للمترجمين" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "المزامنة معطلة" # لم أجد سياق هذه الكلمة، قد أكون مخطئا #: errands/widgets/window.py:194 msgid "Imported" msgstr "مستورد" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "مظهر التطبيق" #: errands/widgets/preferences.py:34 msgid "System" msgstr "النظام" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "نهاري" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "ليلي" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "إضافة مهمة جديدة" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "زامن" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "معطل" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "موفر خدمة المزامنة" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "عنوان الخادم" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "اسم المستخدم" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "كلمة السر" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "اختبر" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "اختبر الاتصال" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "عامّ" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "متصل" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "فشل التصدير" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "عاجز عن الاتصال" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "لم توفر مواثيق المزامنة كلها، تفقد الإعدادات رجاءً" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "فشل الاتصال بخادم CalDAV في:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "لا قوائم تطبيقات" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "المهام" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "استعادة" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "اعرض اختصارات لوحة المفاتيح" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "القوائم" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "استيراد قائمة" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "التفاصيل" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "تبديل أوضاع عرض التفاصيل" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "تطبيق لإدارة المهام لمحبي البساطة." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "المميزات:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "دعم قوائم مهمات عدَّة" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "إضافة,حذف,تعديل المهام الرئيسية والفرعية" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "عُدَّ المهمة الرئيسية ومهماتها الفرعية مكمَّلة" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "ميز كل مهمة بلون" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "زامن المهمات عن طريق نكست كلاود أو موفري خدمة كال داف الآخرين" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "دعم السحب والإسقاط" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "استيراد ملف .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "لم يُحدَّد" #~ msgid "Click Action" #~ msgstr "المترتب على الضغط" #~ msgid "Open Details Panel" #~ msgstr "عرض قائمة التفاصيل" #~ msgid "Complete Button Size" #~ msgstr "استغلال المساحة الأزرار كاملة" #~ msgid "Small" #~ msgstr "صغير" #~ msgid "Big" #~ msgstr "كبير" #~ msgid "Progress Bar" #~ msgstr "شريط التقدم" #~ msgid "Tool Bar" #~ msgstr "شريط الأدوات" #~ msgid "Details Panel" #~ msgstr "قائمة التفاصيل" #~ msgid "Position" #~ msgstr "المكان" #~ msgid "Left" #~ msgstr "اليسار" #~ msgid "Right" #~ msgstr "اليمين" #~ msgid "Appearance" #~ msgstr "المظهر" #~ msgid "More Options" #~ msgstr "المزيد من الخيارات" #~ msgid "Menu" #~ msgstr "القائمة" #~ msgid "No Details" #~ msgstr "لا تفاصيل" #~ msgid "Click on task to show more info" #~ msgstr "اضغط المهمة لعرض المزيد من المعلومت" #~ msgid "Clear Style" #~ msgstr "شفاف" #~ msgid "Text" #~ msgstr "نصّ" #~ msgid "Copy Text" #~ msgstr "نسخ النَّص" #~ msgid "Properties" #~ msgstr "خصائص" #~ msgid "Complete %" #~ msgstr "انجزت %" #~ msgid "Add Tag" #~ msgstr "سِمْ" #~ msgid "Save Task as .ics file" #~ msgstr "احفظ المهمة في ملف .ics" #~ msgid "Mark as Completed" #~ msgstr "عُدها مكتملة" #~ msgid "Expand / Fold" #~ msgstr "اقبض / ابسط" #~ msgid "Restore All" #~ msgstr "استعد المهام كلها" mrvladus-Errands-cbe30b3/po/ca.po000066400000000000000000000441321464651330500170020ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "N'estàs segur?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Cancel·la" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Buida la paperera" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Completat:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Suprimeix" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 #, fuzzy msgid "Add new List" msgstr "Afegir una tasca nova" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Tasques" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Tasques" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Sincronitzar/Recuperar les Tasques" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Importar tasques" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferències" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Quan a Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Surt" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Afegir una tasca nova" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 #, fuzzy msgid "Exported" msgstr "Tasques exportades" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copiat al portaretalls" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Afegeix una subtasca" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Commuta la barra lateral" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Commuta la barra lateral" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Edita" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Moure a la paperera" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Copiat al portaretalls" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 #, fuzzy msgid "Export" msgstr "Exportar tasques" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Completat:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Afegeix una subtasca" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Completat:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Tasques esborrades" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Suprimeix les tasques completades" #: errands/widgets/task_list/task_list.py:58 #, fuzzy msgid "Delete Completed Tasks" msgstr "Suprimeix les tasques completades" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Llisca cap amunt" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Afegir una tasca nova" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 #, fuzzy msgid "List will be permanently deleted" msgstr "Les tasques s'esborraran definitivament" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:123 #, fuzzy msgid "Export failed" msgstr "Tasques exportades" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 #, fuzzy msgid "Rename" msgstr "Usuari" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Paperera buida" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Cap tasca eliminada" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restableix" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 #, fuzzy msgid "Trash" msgstr "Tanca la paperera" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Les tasques s'esborraran definitivament" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Commuta la barra lateral" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 #, fuzzy msgid "Create List" msgstr "Importar tasques" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Importar tasques" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "cubells \n" "arnau ferreres " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:194 #, fuzzy msgid "Imported" msgstr "Tasques importades" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tema de l'aplicació" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Clar" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Fosc" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Afegir una tasca nova" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronització" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Inhabilitat" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Proveïdor de sincornització" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Enllaç del servidor" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Usuari" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Contrasenya" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Prova" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Comprovar la connexió" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Tasques exportades" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "No es pot establir la connexió amb el servidor CalDAV a:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Tasques" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Tasques" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Restableix" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostra les dreceres de teclat" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: data/resources/gtk/help-overlay.ui:64 #, fuzzy msgid "Import List" msgstr "Importar tasques" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "" #: data/resources/gtk/help-overlay.ui:79 #, 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:7 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:12 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:13 msgid "Features:" msgstr "Característiques:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Suport Drag and Drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 #, fuzzy msgid "Import .ics files" msgstr "Importar tasques" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Completat:" #, fuzzy #~ msgid "Right" #~ msgstr "Clar" #~ msgid "Menu" #~ msgstr "Menú" #, fuzzy #~ msgid "Clear Style" #~ msgstr "Neteja l'estil" #, fuzzy #~ msgid "Copy Text" #~ msgstr "Còpia" #, fuzzy #~ msgid "Complete %" #~ msgstr "Completat:" #, fuzzy #~ msgid "Add Tag" #~ msgstr "Afegir una tasca nova" # 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. #~ msgid "Mark as Completed" #~ msgstr "Marca com a feta" #~ msgid "Restore All" #~ msgstr "Restableix tot" #, 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 "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 "Cancel (Escape)" #~ msgstr "Cancel·la" mrvladus-Errands-cbe30b3/po/cs.po000066400000000000000000000445601464651330500170310ustar00rootroot00000000000000# Czech translation for Errands. # 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-02 18:35+0200\n" "Last-Translator: 32GRat\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.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Jste si jistý?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Zrušit" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 #, fuzzy msgid "None" msgstr "Žádná" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Modrá" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Zelená" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Žlutá" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Oranžová" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Červená" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Fialová" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Hnědá" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Dnes" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Zítra" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Teď" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Zrušit výběr" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Vybrat datum" #: errands/widgets/shared/task_toolbar/toolbar.py:44 #, fuzzy msgid "Start / Due Date" msgstr "Start / Do čas" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Datum" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Poznámky" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priorita" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Vysoká" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Střední" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Nízká" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Vlastní" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Žádné tagy" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Štítky" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Vytvořeno:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Změněno:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Více" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Vymazat" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Datum a čas" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Do" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Start" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Přidat list (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Synchronizace..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Přidat nový list" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Stiskni klávesu \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Seznamy úkolů" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Pochůzky" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Hlavní menu" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Synchronizace / načítání úkolů" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Importovat list úkolů" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Předvolby" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "O aplikaci Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Ukončit" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Jméno nového listu" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Přidat list" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Přidat" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nebyly nalezeny žádné štítky" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Přidej nový štítek z položek výše" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Přidat nový štítek" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 #, fuzzy msgid "Exported" msgstr "Úkoly byly exportovány" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Zkopírováno do schránky" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Přepnout podúkol" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Přepnout dokončení" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Přepnout postranní panel" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Upravit" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Přesunout do koše" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Zkopírovat do schránky" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportovat" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Dokončeno" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Přidat nový podúkol" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Dokončeno:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Smazat štítek" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Přepnout viditelnost splněných úkolů" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Smazat hotové úkoly" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Posunout nahoru" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Přidat nový úkol" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Synchronizace..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 #, fuzzy msgid "List will be permanently deleted" msgstr "Úkoly budou trvale smazány" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nové jméno" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Přejmenovat list" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Uložit" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Export selhal" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Přejmenovat" #: errands/widgets/today/today.py:31 #, fuzzy msgid "No Tasks for Today" msgstr "Žádné úkoly pro dnešek" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Vyprázdnit koš" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Žádné smazané položky" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Obnovit" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Koš" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Úkoly budou trvale smazány" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Postranní panel" #: errands/widgets/window.py:59 msgid "Content" msgstr "Obsah" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Žádné listy úkolů" #: errands/widgets/window.py:91 #, fuzzy msgid "Create new or import existing one" msgstr "Vytvořit nebo importovat stávajicí" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Vytvořit list" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Vytvořit nová list" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Amerey.eu" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synchronizace je vypnuta" #: errands/widgets/window.py:194 #, fuzzy msgid "Imported" msgstr "Úkoly byly importovány" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Motiv aplikace" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Systém" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Světlý" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Tmavý" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Přidat nový úkol" #: errands/widgets/preferences.py:71 #, fuzzy msgid "At the Bottom" msgstr "Na spodku" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Na vrchu" #: errands/widgets/preferences.py:87 #, fuzzy msgid "Show Notifications" msgstr "Zobrazovat oznámení" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 #, fuzzy msgid "Notifications and Background" msgstr "Oznámení" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronizace" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Zakázáno" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Poskytovatel synchronizace" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Adresa URL serveru" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Uživatelské jméno" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Heslo" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Test připojení" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Obecné" #: errands/widgets/preferences.py:217 #, fuzzy msgid "Connected" msgstr "Připojeno" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Export selhal" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 #, fuzzy msgid "Can't connect" msgstr "Nemůžu se připojit" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Nelze se připojit k serveru CalDAV na adrese:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Žádné listy úkolů" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Je na čase splnit úkol" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Obnovit" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Pochůzky potřebují běžet v pozadí aby mohly posílat oznámení" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Zobrazit klávesové zkratky" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listy" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importovat listy" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Podrobnosti" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Přepnout podrobnosti" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Aplikace pro ty, kteří preferují jednoduchost." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Funkce:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Podpora více listů" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Podpora drag and drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importovat .ics soubor" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Dokončeno:" #, fuzzy #~ msgid "Right" #~ msgstr "Světlý" #~ msgid "Menu" #~ msgstr "Menu" #, fuzzy #~ msgid "Clear Style" #~ msgstr "Zrušit zvýraznění" #, fuzzy #~ msgid "Copy Text" #~ msgstr "Kopírovat" #, fuzzy #~ msgid "Complete %" #~ msgstr "Dokončeno:" #, fuzzy #~ msgid "Add Tag" #~ msgstr "Přidat nový úkol" #~ msgid "Mark as Completed" #~ msgstr "Označit jako dokončené" #~ msgid "Restore All" #~ msgstr "Obnovit vše" #, 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 "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 "Cancel (Escape)" #~ msgstr "Zrušit (ESC)" mrvladus-Errands-cbe30b3/po/da_DK.po000066400000000000000000000424311464651330500173610ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Er du sikker?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Fortryd" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "I dag" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "I morgen" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Nu" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Ryd" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Angiv dato" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Angiv dato" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Noter" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioritet" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Nu" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Mærkat" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Mærkat" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Opret" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Slet" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Slutdato" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Start" #: errands/widgets/sidebar.py:42 #, fuzzy msgid "Add List (Ctrl+Shift+A)" msgstr "Tilføj liste" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Tilføj ny liste" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Tryk på \"+\" knappen" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Ingen opgavelister" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Hovedmenu" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Hent og synkronisér opgaver" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Importér liste" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Indstillinger" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Tastaturgenveje" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Om Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Afslut" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nyt listenavn" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Tilføj liste" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Tilføj" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Tilføj ny opgave" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Eksporteret" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Kopieret til udklipsholder" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Tilføj ny under-opgave" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Ingen oplysninger" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Skift sidebar" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Kopieret til udklipsholder" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Eksportér" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Afsluttet:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Tilføj ny under-opgave" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Afsluttet:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Slet" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Slet afsluttede opgaver" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Slet afsluttede opgaver" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Rul op" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Tilføj ny opgave" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Listen vil blive slettet permanent" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nyt navn" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Omdøb liste" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Gem" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Eksporting mislykkedes" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Omdøb" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Tøm papirkurv" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Ingen slettede elementer" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Genskab" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Papirkurv" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Opgaver vil blive slettet permanent" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Skift sidebar" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Ingen opgavelister" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Opret liste" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Opret liste" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "oversættelses-akkrediteringer" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synkronisering er slået fra" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importeret" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Farvetema" #: errands/widgets/preferences.py:34 msgid "System" msgstr "System" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Lyst" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Mørkt" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Tilføj ny opgave" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synkronisér" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Deaktiveret" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Synkroniseringsvært" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Server URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Brugernavn" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Kodeord" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Test forbindelse" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Generel" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Forbundet" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Eksporting mislykkedes" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Kan ikke tilslutte" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Ikke alle synkroniseringsoplysninger er angivet. Tjek dine indstillinger." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Kan ikke få en forbindelse til følgende CalDAV vært:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Ingen opgavelister" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Genskab" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Vis tastaturgenveje" #: data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Tilføj liste" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importér liste" #: data/resources/gtk/help-overlay.ui:75 #, fuzzy msgid "Details" msgstr "Ingen oplysninger" #: data/resources/gtk/help-overlay.ui:79 #, 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:7 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:12 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:13 msgid "Features:" msgstr "Features:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Understøtter flere opgavelister" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 msgid "Add accent color for each task" msgstr "Tilføj accentfarve til hver opgave" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Understøtter Træk og Slip" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importér .ics filer" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Ikke angivet" #, fuzzy #~ msgid "Click Action" #~ msgstr "Tryk på \"+\" knappen" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Afsluttet %" #, fuzzy #~ msgid "Details Panel" #~ msgstr "Ingen oplysninger" #, fuzzy #~ msgid "Right" #~ msgstr "Lyst" #~ msgid "More Options" #~ msgstr "Flere valg" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "No Details" #~ msgstr "Ingen oplysninger" #~ msgid "Click on task to show more info" #~ msgstr "Klik på opgave for at se flere detaljer" #~ msgid "Clear Style" #~ msgstr "Ryd formattering" #~ msgid "Text" #~ msgstr "Tekst" #~ msgid "Copy Text" #~ msgstr "Kopier tekst" #~ msgid "Properties" #~ msgstr "Egenskaber" #~ msgid "Complete %" #~ msgstr "Afsluttet %" #~ msgid "Add Tag" #~ msgstr "Tilføj Mærkat" #~ msgid "Save Task as .ics file" #~ msgstr "Gem opgave som .ics fil" #~ msgid "Mark as Completed" #~ msgstr "Markér som afsluttet" #~ msgid "Expand / Fold" #~ msgstr "Fold ud / Fold ind" #~ msgid "Restore All" #~ msgstr "Genskab alle" #~ msgid "Load" #~ msgstr "Hent" #~ msgid "Click for Details" #~ msgstr "Klik for detaljer" #~ msgid "Toggle sidebar" #~ msgstr "Skift sidebar" mrvladus-Errands-cbe30b3/po/de.po000066400000000000000000000465641464651330500170220ustar00rootroot00000000000000# 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-2024. # Milo Ivir , 2023. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-20 13:02+0200\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.3\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Info" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Sind Sie sicher?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Abbrechen" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Keine" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Blau" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Grün" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Gelb" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Orange" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Rot" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Violett" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Braun" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Heute" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Morgen" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Jetzt" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Leeren" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Datum wählen" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Start-/Fälligkeitsdatum" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Datum" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Anmerkungen" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priorität" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Hoch" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Mittel" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Gering" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Benutzerdefiniert" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Keine Tags" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Tags" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Anhänge" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Erstellt:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Geändert:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Mehr" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Keine Dateien angehängt" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Anhang hinzufügen" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Datei öffnen" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Löschen" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Beinhaltenden Ordner öffnen" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Datum und Uhrzeit" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Fällig" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Start" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Liste hinzufügen (Strg+Umschalt+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Synchronisieren …" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Neue Liste hinzufügen" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Drücken Sie den »+«-Knopf" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Aufgabenlisten" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Hauptmenü" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Aufgaben synchronisieren/holen" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Aufgabenliste importieren" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Einstellungen" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Tastenkürzel" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Info zu Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Beenden" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Name der neuen Liste" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Liste hinzufügen" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Hinzufügen" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Keine Tags gefunden" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Neue Tags zu obigem Eintrag hinzufügen" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Neuen Tag hinzufügen" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exportiert" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "In die Zwischenablage kopiert" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Unteraufgaben ein-/ausblenden" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Abschließen" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Werkzeugleiste ein-/ausblenden" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Bearbeiten" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "In den Papierkorb verschieben" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "In die Zwischenablage kopieren" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportieren" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Abgeschlossen" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Neue Unteraufgabe hinzufügen" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Abgeschlossen:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Tag löschen" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Abgeschlossene Aufgaben ausblenden" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Abgeschlossene Aufgaben löschen" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Nach oben scrollen" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Neue Aufgabe hinzufügen" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Laden …" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Die Liste wird un­wi­der­ruf­lich gelöscht" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Neuer Name" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Liste umbenennen" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Speichern" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Export fehlgeschlagen" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Farbe" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Umbenennen" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Keine Aufgaben für heute" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Papierkorb leeren" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Keine gelöschten Einträge" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Wiederherstellen" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Papierkorb" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Die Aufgaben werden unwiderruflich gelöscht" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Seitenleiste" #: errands/widgets/window.py:59 msgid "Content" msgstr "Inhalt" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Keine Aufgabenlisten" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Neu erstellen oder bestehende importieren" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Liste erstellen" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Neue Liste erstellen" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "Christoph Bähr\n" "Philipp Kiemle \n" "Milo Ivir \n" "Otmar Grünn " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synchronisation ist deaktiviert" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importiert" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Anwendungsthema" #: errands/widgets/preferences.py:34 msgid "System" msgstr "System" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Hell" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Dunkel" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Neue Aufgaben hinzufügen" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Am Ende" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Am Anfang" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Benachrichtigungen anzeigen" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Im Hintergrund laufen" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Das Anwendungsfenster ausblenden, statt es zu schließen" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Bei Systemstart starten" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Anwendung bei Benutzeranmeldung starten" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Benachrichtigungen und Hintergrund" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronisierung" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Deaktiviert" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Synchronisierungsanbieter" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Serveradresse" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "Die URL muss das Protokoll enthalten, z. B. http:// oder https://. Falls Sie Verbindungsprobleme haben, versuchen Sie zunächst das " "Protokoll zu ändern." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Benutzername" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Passwort" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Verbindung testen" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Allgemein" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Verbunden" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Autorisieren fehlgeschlagen" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" "Server konnte nicht gefunden werden. Überprüfen Sie das Netzwerk und die URL." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Kann keine Verbindung herstellen" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Verbindung fehlgeschlagen. Überprüfen Sie die Anmeldedaten" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Kann keine Verbindung zu diesem CalDAV-Server herstellen:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Neue Aufgabenliste" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Aufgabe ist fällig" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands wurde aktualisiert" #: errands/application.py:81 msgid "Restart is required" msgstr "Neustart ist erforderlich" #: errands/application.py:84 msgid "Restart" msgstr "Neu starten" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Für Benachrichtigungen muss Errands im Hintergrund laufen" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Tastenkürzel anzeigen" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listen" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Liste importieren" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Details" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Details ein-/ausblenden" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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;caldav;nextcloud;sync;Aufgaben;Liste;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:12 msgid "Todo application for those who prefer simplicity." msgstr "Todo-Anwendung für alle, die es lieber einfach haben." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Funktionen:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Unterstützung mehrerer Aufgabenlisten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 msgid "Mark task and sub-tasks as completed" msgstr "Aufgaben und Unteraufgaben als abgeschlossen markieren" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Akzentfarbe für jede Aufgabe hinzufügen" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Unterstützung von Drag and Drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr ".ics-Dateien importieren" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Hauptfenster" #~ msgid "Not Set" #~ msgstr "Nicht gesetzt" #~ msgid "Click Action" #~ msgstr "Klick-Aktion" #~ msgid "Open Details Panel" #~ msgstr "Details-Panel öffnen" #~ msgid "Complete Button Size" #~ msgstr "Größe des \"Abgeschlossen\"-Knopfs" #~ msgid "Small" #~ msgstr "Klein" #~ msgid "Big" #~ msgstr "Groß" #~ msgid "Progress Bar" #~ msgstr "Fortschrittsbalken" #~ msgid "Tool Bar" #~ msgstr "Werkzeugleiste" #~ msgid "Details Panel" #~ msgstr "Details-Panel" #~ msgid "Position" #~ msgstr "Position" #~ msgid "Left" #~ msgstr "Links" #~ msgid "Right" #~ msgstr "Rechts" #~ msgid "Appearance" #~ msgstr "Erscheinungsbild" #~ msgid "More Options" #~ msgstr "Mehr Optionen" #~ msgid "Menu" #~ msgstr "Menü" #~ msgid "No Details" #~ msgstr "Keine Details" #~ msgid "Click on task to show more info" #~ msgstr "Klicken Sie auf die Aufgabe, um weitere Informationen anzuzeigen" #~ msgid "Clear Style" #~ msgstr "Stil entfernen" #~ msgid "Text" #~ msgstr "Text" #~ msgid "Copy Text" #~ msgstr "Text kopieren" #~ msgid "Properties" #~ msgstr "Eigenschaften" #~ msgid "Complete %" #~ msgstr "Abgeschlossen %" #~ msgid "Add Tag" #~ msgstr "Schlagwort hinzufügen" #~ msgid "Save Task as .ics file" #~ msgstr "Aufgabe als .ics-Datei speichern" #~ msgid "Mark as Completed" #~ msgstr "Als abgeschlossen markieren" #~ msgid "Expand / Fold" #~ msgstr "Aufklappen / Zuklappen" #~ msgid "Restore All" #~ msgstr "Alles wiederherstellen" #~ msgid "Save changed details" #~ msgstr "Geänderte Details speichern" #~ msgid "Save (Ctrl+S)" #~ msgstr "Speichern (Strg+S)" #~ 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-cbe30b3/po/el.po000066400000000000000000000476141464651330500170270ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Είστε σίγουροι;" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Ακύρωση" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Σήμερα" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Αύριο" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Τώρα" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Εκκαθάριση" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Ρύθμιση Ημερομηνίας" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Ρύθμιση Ημερομηνίας" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Σημειώσεις" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Προτεραιότητα" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Τώρα" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Ετικέτες" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Ετικέτες" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Ολοκληρωμένα:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Διαγραφή" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Τέλος" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Αρχή" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Προσθήκη Λίστας (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Συγχρονισμός..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Προσθήκη νέας Λίστας" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Πατήστε το κουμπί \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Δεν υπάρχουν λίστες" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Εrrands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Κεντρικό Μενού" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Συγχρονισμός/ Εύρεση Δουλειών" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Εισαγωγή Λίστας" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Προτιμήσεις" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Συντομεύσεις Πληκτρολογίου" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Περί Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Έξοδος" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Όνομα Νέας Λίστας" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Προσθήκη Λίστας" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Προσθήκη" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Προσθήκη νέας Δουλειάς" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Εξαγωγή ολοκληρώθηκε" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Αντιγράφηκε στο Πρόχειρο" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Εμφάνιση Υπο-Δουλειών" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Εναλλαγή Λεπτομερειών" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Εναλλαγή Πλευρικής Εργαλειοθήκης" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Αντιγράφηκε στο Πρόχειρο" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Εξαγωγή" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Ολοκληρωμένα:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Προσθήκη νέας υπο-δουλειάς" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Ολοκληρωμένα:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Διαγραφή" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Διαγραφή Ολοκληρωμένων Δουλειών" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Διαγραφή Ολοκληρωμένων Δουλειών" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Κύλιση προς τ' απάνω" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Προσθήκη νέας Δουλειάς" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Συγχρονισμός..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Η Λίστα θα διαγραφεί διαπαντός" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Νέο Όνομα" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Μετονομασία Λίστας" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Αποθήκευση" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Εξαγωγή απέτυχε" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Μετονομασία" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Άδειασμα Απορριμάτων" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Δεν υπάρχουν διαγραμμένα αντικείμενα" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Επαναφορά" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Απορρίμματα" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Οι δουλειές θα διαγραφούν διαπαντός" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Εναλλαγή Πλευρικής Εργαλειοθήκης" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Δεν υπάρχουν λίστες" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Δημιουργία Λίστας" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Δημιουργία Λίστας" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "itsnotAZ" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Ο Συγχρονισμός είναι απενεργοποιημένος" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Εισαγωγές" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Θέμα Εφαρμογής" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Σύστημα" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Φωτεινό" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Σκοτεινό" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Προσθήκη νέας Δουλειάς" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Συγχρονισμός" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Απενεργοποιημένο" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Παροχέας Συγχρονισμού" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL Σέρβερ" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Όνομα Χρήστη" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Συνθηματικό" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Δοκιμή" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Δοκιμή Σύνδεσης" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Γενικά" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Συνδεδεμένο" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Εξαγωγή απέτυχε" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Αδυναμία Σύνδεσης" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Λείπουν στοιχεία για τον συγχρονισμό. Παρακαλώ ελέγξτε τις ρυθμίσεις." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Αδυναμία σύνδεσης σε σέρβερ CalDAV στο:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Δεν υπάρχουν λίστες" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Δουλείες" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Επαναφορά" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Προβολή συντομεύσεων πληκτρολογίου" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Λίστες" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Εισαγωγή Λίστας" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Λεπτομέρειες" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Εναλλαγή Λεπτομερειών" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Εφαρμογή to-do για εκείνους που προτιμούν την απλότητα." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Χαρακτηριστικά:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Υποστήριξη για πολλαπλές λίστες από δουλείες" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Προσθήκη, Αφαίρεση και επεξεργασία δουλειών και υπο-δουλειών" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Σημείωση δουλειών και υπο-δουλειών σαν ολοκληρωμένα" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Προσθήκη χρώματος έμφασης για κάθε δουλειά" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Συγχρονισμός δουλειών με Nextcloud ή άλλους παροχείς CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "Υποστήριξη για Τράβηγμα και Απόθεση" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Εισαγωγή αρχείων .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Μη Ρυθμισμένο" #~ msgid "Click Action" #~ msgstr "Δράση Κλικ" #~ msgid "Open Details Panel" #~ msgstr "Άνοιγμα Πίνακα Λεπομερειών" #~ msgid "Complete Button Size" #~ msgstr "Ολοκληρωμένο Μέγεθος Κουμπιού" #~ msgid "Small" #~ msgstr "Μικρό" #~ msgid "Big" #~ msgstr "Μεγάλο" #~ msgid "Details Panel" #~ msgstr "Πίνακας Λεπτομερειών" #~ msgid "Position" #~ msgstr "Θέση" #~ msgid "Left" #~ msgstr "Αριστερά" #~ msgid "Right" #~ msgstr "Δεξιά" #~ msgid "Appearance" #~ msgstr "Εμφάνιση" #~ msgid "More Options" #~ msgstr "Περισσότερες Επιλογές" #~ msgid "Menu" #~ msgstr "Μενού" #~ msgid "No Details" #~ msgstr "Χωρίς Λεπτομέρειες" #~ msgid "Click on task to show more info" #~ msgstr "Κάντε κλικ πάνω στην Δουλεία για περισσότερες πληροφορίες" #~ msgid "Clear Style" #~ msgstr "Καθαρό Στυλ" #~ msgid "Text" #~ msgstr "Κείμενο" #~ msgid "Copy Text" #~ msgstr "Αντιγραφή Κειμένου" #~ msgid "Properties" #~ msgstr "Ιδιότητες" #~ msgid "Complete %" #~ msgstr "Ολοκλήρωση %" #~ msgid "Add Tag" #~ msgstr "Προσθήκη Ετικέτας" #~ msgid "Save Task as .ics file" #~ msgstr "Αποθήκευση ως αρχείο .ics" #~ msgid "Mark as Completed" #~ msgstr "Σημείωση ως Ολοκληρωμένο" #~ msgid "Expand / Fold" #~ msgstr "Ανάπτυξη / Δίπλωμα" #~ msgid "Restore All" #~ msgstr "Επαναφορά όλων" #~ msgid "Save changed details" #~ msgstr "Αποθήκευση αλλαγών" mrvladus-Errands-cbe30b3/po/en_GB.po000066400000000000000000000422651464651330500173760ustar00rootroot00000000000000# Copyright (C) 2024 THE errands COPYRIGHT HOLDER # This file is distributed under the same license as the errands package. # Bruce Cowan # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-02-13 14:00+0000\n" "Last-Translator: Bruce Cowan \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Are you sure?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Cancel" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Today" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Tomorrow" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Now" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Clear" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Set Date" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Set Date" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notes" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priority" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Now" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Tags" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Tags" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Completed:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Delete" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Due" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Start" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Add List (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Syncing..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Add new List" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Click \"+\" button" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "No Task Lists" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Main Menu" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sync / Fetch Tasks" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Import List" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferences" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Keyboard Shortcuts" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "About Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Quit" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "New List Name" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Add List" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Add" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Add new Task" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exported" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copied to Clipboard" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Show Sub-Tasks" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Toggle Details" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Toggle Sidebar" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Copied to Clipboard" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Export" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Completed:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Add new Sub-Task" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Completed:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Delete" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Delete Completed Tasks" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Delete Completed Tasks" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Scroll Up" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Add new Task" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Syncing..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "List will be permanently deleted" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "New Name" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Rename List" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Save" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Export failed" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Rename" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Empty Wastebasket" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "No deleted items" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restore" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Wastebasket" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Tasks will be permanently deleted" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Toggle Sidebar" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "No Task Lists" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Create List" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Create List" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Bruce Cowan " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Sync is disabled" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Imported" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Application Theme" #: errands/widgets/preferences.py:34 msgid "System" msgstr "System" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Light" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Dark" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Add new Task" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sync" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Disabled" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Sync Provider" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Server URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Username" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Password" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Test Connection" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Connected" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Export failed" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Can't connect" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Not all sync credentials provided. Please check settings." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Can't connect to CalDAV server at:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "No Task Lists" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Tasks" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Restore" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Show keyboard shortcuts" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Lists" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Import List" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Details" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Toggle Details" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 msgid "Manage your tasks" msgstr "Manage your tasks" #: 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Todo application for those who prefer simplicity." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Features:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Multiple task lists support" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Add, remove, edit tasks and sub-tasks" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Mark task and sub-tasks as completed" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Add accent colour for each task" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Sync tasks with Nextcloud or other CalDAV providers" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "Drag and Drop support" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Import .ics files" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Not Set" #~ msgid "Click Action" #~ msgstr "Click Action" #~ msgid "Open Details Panel" #~ msgstr "Open Details Panel" #~ msgid "Complete Button Size" #~ msgstr "Complete Button Size" #~ msgid "Small" #~ msgstr "Small" #~ msgid "Big" #~ msgstr "Big" #~ msgid "Progress Bar" #~ msgstr "Progress Bar" #~ msgid "Tool Bar" #~ msgstr "Tool Bar" #~ msgid "Details Panel" #~ msgstr "Details Panel" #~ msgid "Position" #~ msgstr "Position" #~ msgid "Left" #~ msgstr "Left" #~ msgid "Right" #~ msgstr "Right" #~ msgid "Appearance" #~ msgstr "Appearance" #~ msgid "More Options" #~ msgstr "More Options" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "No Details" #~ msgstr "No Details" #~ msgid "Click on task to show more info" #~ msgstr "Click on task to show more info" #~ msgid "Clear Style" #~ msgstr "Clear Style" #~ msgid "Text" #~ msgstr "Text" #~ msgid "Copy Text" #~ msgstr "Copy Text" #~ msgid "Properties" #~ msgstr "Properties" #~ msgid "Complete %" #~ msgstr "Complete %" #~ msgid "Add Tag" #~ msgstr "Add Tag" #~ msgid "Save Task as .ics file" #~ msgstr "Save Task as .ics file" #~ msgid "Mark as Completed" #~ msgstr "Mark as Completed" #~ msgid "Expand / Fold" #~ msgstr "Expand / Fold" #~ msgid "Restore All" #~ msgstr "Restore All" mrvladus-Errands-cbe30b3/po/errands.pot000066400000000000000000000344351464651330500202460ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:194 msgid "Imported" msgstr "" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "" #: errands/widgets/preferences.py:34 msgid "System" msgstr "" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "" #: errands/lib/data.py:92 msgid "New Task List" msgstr "" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 msgid "Restart" msgstr "" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" mrvladus-Errands-cbe30b3/po/es.po000066400000000000000000000464711464651330500170360ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "¿Estás seguro?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Cancelar" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Hoy" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Mañana" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Ahora" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Limpiar" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Establecer fecha" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Establecer fecha" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notas" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioridad" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Ahora" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Etiquetas" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Etiquetas" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Crear" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Eliminar" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Pendiente" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Comienzo" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Añadir lista (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Sincronizando..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Añadir nueva lista" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Presiona el botón \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "No hay listas de tareas" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Recados" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizar/recuperar tareas" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Importar lista" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferencias" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Acerca de Recados" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Salir" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nombre de nueva lista" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Añadir lista" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Añadir" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Añadir nueva tarea" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Listas exportadas" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copiado al portapapeles" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Mostrar subtareas" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Mostrar detalles" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Alternar barra lateral" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Editar" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Mover a la papelera" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Copiado al portapapeles" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportar" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Completado:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Añadir subtarea" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Completado:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Tareas eliminadas" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Eliminar tareas completadas" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Eliminar tareas completadas" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Desplazarse hacia arriba" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Añadir nueva tarea" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Sincronizando..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "La lista será eliminada de forma permanente" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nuevo nombre" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Renombrar lista" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Guardar" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "El exportado ha fallado" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Renombrar" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Papelera vacía" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "No hay elementos eliminados" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restaurar" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Papelera" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Las tareas serán eliminadas de forma permanente" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Alternar barra lateral" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "No hay listas de tareas" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Crear lista" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Crear lista" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "Sergio Varela\n" "Clay Gomera" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "La sincronización está desactivada" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Listas importadas" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tema de la aplicación" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Claro" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Oscuro" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Añadir nueva tarea" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronización" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Deshabilitado" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Proveedor de sincronización" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL del servidor" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Nombre de usuario" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Contraseña" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Prueba" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Prueba de conexión" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Conectado" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "El exportado ha fallado" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "No se pudo conectar" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "No se puede conectar al servidor CalDAV en:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "No hay listas de tareas" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Tareas" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Restaurar" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar atajos del teclado" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listas" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importar lista" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Detalles" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Mostrar detalles" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 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:13 msgid "Features:" msgstr "Características:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Soporte de múltiples listas de tareas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Compatibilidad con la opción de arrastrar y soltar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importar tareas desde archivo .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Sin establecer" #~ msgid "Click Action" #~ msgstr "Acción al pulsar" #~ msgid "Open Details Panel" #~ msgstr "Abrir panel de detalles" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Tamaño del botón de completar" #~ msgid "Small" #~ msgstr "Pequeño" #~ msgid "Big" #~ msgstr "Grande" #~ msgid "Details Panel" #~ msgstr "Panel de detalles" #~ msgid "Position" #~ msgstr "Posición" #~ msgid "Left" #~ msgstr "Izquierda" #~ msgid "Right" #~ msgstr "Derecha" #~ msgid "Appearance" #~ msgstr "Apariencia" #~ msgid "More Options" #~ msgstr "Más opciones" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "No Details" #~ msgstr "Sin detalles" #~ msgid "Click on task to show more info" #~ msgstr "Haz clic en una tarea para ver sus detalles" #~ msgid "Clear Style" #~ msgstr "Limpiar estilo" #~ msgid "Text" #~ msgstr "Texto" #~ msgid "Copy Text" #~ msgstr "Copiar texto" #~ msgid "Properties" #~ msgstr "Propiedades" #~ msgid "Complete %" #~ msgstr "Completado %" #~ msgid "Add Tag" #~ msgstr "Añadir etiqueta" #~ msgid "Save Task as .ics file" #~ msgstr "Guardar tarea como archivo .ics" #~ msgid "Mark as Completed" #~ msgstr "Marcar como completada" #~ msgid "Expand / Fold" #~ msgstr "Expandir / Recoger" #~ msgid "Restore All" #~ msgstr "Restaurar todas" #~ msgid "Save changed details" #~ msgstr "Guardar detalles cambiados" #~ msgid "Save (Ctrl+S)" #~ msgstr "Guardar (Ctrl+S)" #~ 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 "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 "Cancel (Escape)" #~ msgstr "Cancelar (Esc)" mrvladus-Errands-cbe30b3/po/eu.po000066400000000000000000000441641464651330500170350ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Ziur zaude?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Ezeztatu" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Ezabatu" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Eginda:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Ezabatu" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 #, fuzzy msgid "Add new List" msgstr "Gehitu ataza berria" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "" # ES_EU: Use "Atazak" instead of "Zereginak". # https://hiztegiak.elhuyar.eus/es/tarea# #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Atazak" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menu nagusia" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "Atazak sinkronizatu/lortu" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Inportatu atazak" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Hobespenak" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Teklatuko lasterbideak" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Errands-i buruz" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Irten" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Gehitu ataza berria" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 #, fuzzy msgid "Exported" msgstr "Atazak esportatu egin dira" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Arbelean kopiatuta" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Erantsi azpiataza berri bat" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Txandakatu alboko barra" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Txandakatu alboko barra" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Editatu" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Zakarrontzira mugitu" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Arbelean kopiatuta" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 #, fuzzy msgid "Export" msgstr "Esportatu atazak" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Eginda:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Erantsi azpiataza berri bat" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Eginda:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Ezabatutako atazak" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Ezabatu betetako atazak" #: errands/widgets/task_list/task_list.py:58 #, fuzzy msgid "Delete Completed Tasks" msgstr "Ezabatu betetako atazak" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Gorantz egin" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Gehitu ataza berria" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 #, fuzzy msgid "List will be permanently deleted" msgstr "Atazak etengabe ezabatuko dira" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:123 #, fuzzy msgid "Export failed" msgstr "Atazak esportatu egin dira" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 #, fuzzy msgid "Rename" msgstr "Erabiltzailearen izena" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Zakarrontzia hustu" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Ez dago elementurik ezabatuta" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Leheneratu" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 #, fuzzy msgid "Trash" msgstr "Zakarrontzia itxi" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Atazak etengabe ezabatuko dira" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Txandakatu alboko barra" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 #, fuzzy msgid "Create List" msgstr "Inportatu atazak" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Inportatu atazak" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "Sergio Varela\n" "https://ingrownmink4.codeberg.page" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:194 #, fuzzy msgid "Imported" msgstr "Atazak inportatu egin dira" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Aplikazioaren gaia" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistemarena" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Argia" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Iluna" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Gehitu ataza berria" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sinkronizatu" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Desgaitua" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Sinkronizazio-hornitzailea" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Zerbitzariaren URLa" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Erabiltzailearen izena" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Pasahitza" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Proba" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Konexio-proba" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Orokorra" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Atazak esportatu egin dira" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Ez dira eman sinkronizazio-kredentzial guztiak. Egiaztatu hobespenak." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Ezin da CalDAV zerbitzariarekin konektatu:" # ES_EU: Use "Atazak" instead of "Zereginak". # https://hiztegiak.elhuyar.eus/es/tarea# #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Atazak" # ES_EU: Use "Atazak" instead of "Zereginak". # https://hiztegiak.elhuyar.eus/es/tarea# #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Atazak" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Leheneratu" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Erakutsi teklatuko lasterbideak" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: data/resources/gtk/help-overlay.ui:64 #, fuzzy msgid "Import List" msgstr "Inportatu atazak" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "" #: data/resources/gtk/help-overlay.ui:79 #, 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:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Sinpletasuna nahiago dutenentzat, atazak kudeatzeko aplikazioa." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Ezaugarriak:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 msgid "Mark task and sub-tasks as completed" msgstr "Ataza eta azpiatazak eginda bezala markatu" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Erantsi azentu-kolore bat ataza bakoitzerako" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Arrastatzeko eta askatzeko euskarria" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 #, fuzzy msgid "Import .ics files" msgstr "Inportatu atazak" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Eginda:" #, fuzzy #~ msgid "Right" #~ msgstr "Argia" #~ msgid "Menu" #~ msgstr "Menua" #, fuzzy #~ msgid "Clear Style" #~ msgstr "Estiloa garbitu" #, fuzzy #~ msgid "Copy Text" #~ msgstr "Kopiatu" #, fuzzy #~ msgid "Complete %" #~ msgstr "Eginda:" #, fuzzy #~ msgid "Add Tag" #~ msgstr "Gehitu ataza berria" #~ msgid "Mark as Completed" #~ msgstr "Markatu eginda bezala" #~ msgid "Restore All" #~ msgstr "Dena leheneratu" #, 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 "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 "Cancel (Escape)" #~ msgstr "Ezeztatu (Esc)" mrvladus-Errands-cbe30b3/po/fa.po000066400000000000000000000464721464651330500170160ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "مطمئنید؟" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "انصراف" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "امروز" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "فردا" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "اکنون" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "پاک‌سازی" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "تنظیم تاریخ" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "تنظیم تاریخ" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "یادداشت‌ها" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "اولویت" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "اکنون" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "برچسب‌ها" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "برچسب‌ها" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "کامل شده:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "حذف" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "سررسید" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "آغاز" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "افزودن سیاهه (مهار+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "هم‌گام ساختن…" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "افزودن سیاههٔ جدید" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "زدن دکمهٔ «+»" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "بدون سیاههٔ تکلیف" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "مأموریت‌ها" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "فهرست اصلی" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "همگام‌سازی و واکشی تکلیف‌ها" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "درون‌ریزی سیاهه‌ها" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "ترجیحات" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "میان‌برهای صفحه‌کلید" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "دربارهٔ مأموریت‌ها" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "ترک" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "نام سیاههٔ جدید" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "افزودن سیاهه" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "افزودن" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "افزودن تکلیف جدید" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "برون ریخته" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "رونوشت شده در تخته‌گیره" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "نمایش زیرتکلیف‌ها" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "تغغیر وضعیت جزییات" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "تغییر وضعیت نوار کناری" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "رونوشت شده در تخته‌گیره" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "برون‌ریزی" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "کامل شده:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "افزودن زیرتکلیف جدید" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "کامل شده:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "حذف" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "حذف تکلیف‌های انجام شده" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "حذف تکلیف‌های انجام شده" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "لغزش به بالا" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "افزودن تکلیف جدید" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "هم‌گام ساختن…" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "سیاهه برای همیشه از دست خواهد رفت" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "نام جدید" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "تغییر نام سیاهه" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "ذخیره" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "برون‌ریزی شکست خورد" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "تغییر نام" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "خالی کردن زباله‌دان" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "بدون مورد حذف شده" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "بازآوری" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "زباله‌دان" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "تکلیف برای همیشه حذف خواهد شد" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "تغییر وضعیت نوار کناری" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "بدون سیاههٔ تکلیف" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "ایجاد سیاهه" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "ایجاد سیاهه" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "دانیال بهزادی " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "همگام سازی از کار افتاده" #: errands/widgets/window.py:194 msgid "Imported" msgstr "درون ریخته" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "زمینهٔ برنامه" #: errands/widgets/preferences.py:34 msgid "System" msgstr "سامانه" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "روشن" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "تیره" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "افزودن تکلیف جدید" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "همگام‌سازی" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "از کار افتاده" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "فراهم‌کنندهٔ همگام‌سازی" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "نشانی کارساز" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "نام‌کاربری" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "گذرواژه" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "آزمایش" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "آزمون اتّصال" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "عمومی" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "وصل شده" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "برون‌ریزی شکست خورد" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "نمی‌توان وصل شد" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "همهٔ گواهی‌ّای همگام سازی فراهم نشده. لطفاً تنظیمات را بررسی کنید." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "نتواسنت به این کارساز CalDAV وصل شود:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "بدون سیاههٔ تکلیف" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "تکلیف‌ها" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "بازآوری" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "نمایش میان‌برهای صفحه‌کلید" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "سیاهه‌ها" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "درون‌ریزی سیاهه‌ها" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "جزییات" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "تغغیر وضعیت جزییات" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "برنامهٔ تکلیف‌ها برای آنان که سادگی را ترجیح می دهند." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "ویژگی‌ها:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "پشتیبانی از چندین سیاههٔ تکلیف" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "افزودن، برداشتن و ویرایش تکلیف‌ها و زیرتکلیف‌ها" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "علامت زدن تکلیف‌ها و زیرتکلیف‌ها به کامل شده" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "افزودن لهجهٔ رنگی برای هر تکلیف" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "همگام سازی تکلیف‌ها با نکست‌کلود یا دیگر فراهم‌کنندگان CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "پشتیبانی از کشیدن و رها کردن" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "درون‌ریزی پرونده‌های ‪.ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "تنظیم نشده" #~ msgid "Click Action" #~ msgstr "کنش کلیک" #~ msgid "Open Details Panel" #~ msgstr "گشودن تابلوی جزییات" #~ msgid "Complete Button Size" #~ msgstr "اندازهٔ‌ دکمهٔ کامل" #~ msgid "Small" #~ msgstr "کوچک" #~ msgid "Big" #~ msgstr "بزرگ" #~ msgid "Details Panel" #~ msgstr "تابلوی جزییات" #~ msgid "Position" #~ msgstr "جایگاه" #~ msgid "Left" #~ msgstr "چپ" #~ msgid "Right" #~ msgstr "راست" #~ msgid "Appearance" #~ msgstr "ظاهر" #~ msgid "More Options" #~ msgstr "گزینه‌های بیش‌تر" #~ msgid "Menu" #~ msgstr "فهرست" #~ msgid "No Details" #~ msgstr "بدون جزییات" #~ msgid "Click on task to show more info" #~ msgstr "کلیک روی تکلیف برای نمایش اطّلاعات بیش‌تر" #~ msgid "Clear Style" #~ msgstr "پاک سازی سبک" #~ msgid "Text" #~ msgstr "متن" #~ msgid "Copy Text" #~ msgstr "رونوشت از متن" #~ msgid "Properties" #~ msgstr "ترجیحات" #~ msgid "Complete %" #~ msgstr "٪ انجام شده" #~ msgid "Add Tag" #~ msgstr "افزودن برچسب" #~ msgid "Save Task as .ics file" #~ msgstr "ذخیرهٔ تکلیف به شکل پروندهٔ ‪.ics" #~ msgid "Mark as Completed" #~ msgstr "علامت به کامل شده" #~ msgid "Expand / Fold" #~ msgstr "گسترش یا جمع کردن" #~ msgid "Restore All" #~ msgstr "بازگردانی همه" #~ msgid "Save changed details" #~ msgstr "ذخیرهٔ جزییات تغییر یافته" mrvladus-Errands-cbe30b3/po/fr.po000066400000000000000000000470331464651330500170310ustar00rootroot00000000000000# 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. # Wedone , 2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-01-16 17:50+0100\n" "Last-Translator: Wedone \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/shared/components/buttons.py:45 msgid "Info" msgstr "Info" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Supprimer les éléments de la corbeille ?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Annuler" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Aucun" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Bleu" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Vert" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Jaune" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Orange" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Rouge" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Violet" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Marron" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Aujourd’hui" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Demain" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Maintenant" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Effacer" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Définir une date" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Date de début / Date d'échéance" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Définir une date" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notes" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priorité" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Élevé" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Moyen" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Faible" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Personnalisé" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Étiquettes" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Étiquettes" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Pièces jointes" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Créer" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Modifié :" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Plus d'informations" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Aucun fichier joint" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Ajouter une pièce jointe" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Ouvrir un Fichier" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Supprimer" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Ouvrir le dossier contenant" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Date et Heure" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Échéance" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Début" #: errands/widgets/sidebar.py:42 #, fuzzy msgid "Add List (Ctrl+Shift+A)" msgstr "Ajouter une liste" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Synchronisation…" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Ajouter une nouvelle liste" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Cliquez sur le bouton +" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Aucune liste de tâches" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menu principal" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Synchroniser / Récupérer les tâches" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Importer une liste de tâches" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Préférences" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "À propos de Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Quitter" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nouveau nom de liste" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Ajouter une liste" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Ajouter" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Aucune tâche n'a été trouvé" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Ajouter de nouvelles tâches dans l'entrée ci-dessus" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Ajouter une tâche" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Tâches exportée" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copié dans le presse-papier" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Affiche les sous-tâches" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Basculer les détails" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Afficher ou masquer le panneau latéral" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Déplacer vers la corbeille" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Copié dans le presse-papier" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exporter" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Terminé :" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Ajouter une sous-tâche" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Terminé :" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Supprimer" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Supprimer les tâches terminées" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Supprimer les tâches terminées" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Défiler vers le haut" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Ajouter une tâche" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Synchronisation…" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "La liste sera définitivement supprimée" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nouveau nom" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Renommer la liste" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Enregistrer" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Exportation échouée" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Couleur" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Renommer" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Pas de tâches pour aujourd'hui" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Corbeille vide" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Aucun élément supprimé" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restaurer" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Corbeille" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Tous les éléments seront définitivement supprimés" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Afficher ou masquer le panneau latéral" #: errands/widgets/window.py:59 msgid "Content" msgstr "Contenu" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Aucune liste de tâches" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Créer un nouveau fichier ou importer un fichier existant" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Créer une liste" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Créer une liste" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "Jeremy Castel \n" "Irénée THIRION \n" "Wedone " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synchronisation désactivée" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importée" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Thème de l'application" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Système" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Clair" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Sombre" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Ajouter une tâche" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "En bas" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "En haut" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Montrer les notifications" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Lancer en arrière plan" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Masquer la fenêtre de l'application au lieu de la fermer" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Lancer au démarrage" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Lancer l'application lorsque l'utilisateur se connecte" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Notifications et historique" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronisation" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Désactivé" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Fournisseur de synchronisation" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL du serveur" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL doit inclure le protocole, comme http:// or https://. Si " "vous avez des problèmes de connexion, essayez d'abord de changer de protocole." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Nom d’utilisateur" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Mot de passe" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Tester" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Tester la connexion" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Général" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Connecté" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Exportation échouée" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Impossible de localiser le serveur. Vérifiee le réseau et l'url." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Impossible de se connecter" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Impossible de se connecter. Vérifiez les informations d'identification" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Impossible de se connecter au serveur CalDAV à l’adresse suivante :" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Aucune liste de tâches" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Tâches" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands a été mis à jour" #: errands/application.py:81 msgid "Restart is required" msgstr "Un redémarrage est nécessaire" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Restaurer" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Les tâches doivent être effectuées en arrière-plan pour les notifications" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Afficher les raccourcis clavier" #: data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Ajouter une liste" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importer une liste" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Détails" #: data/resources/gtk/help-overlay.ui:79 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:7 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:12 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:13 msgid "Features:" msgstr "Fonctionnalités :" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Prise en charger des listes de tâches multiples" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Prise en charge du glisser-déposer" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Import de fichiers .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Non défini" #~ msgid "Click Action" #~ msgstr "Action du clic" #~ msgid "Open Details Panel" #~ msgstr "Ouvre le panneau des détails" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Terminé %" #~ msgid "Details Panel" #~ msgstr "Panneau des détails" #~ msgid "Position" #~ msgstr "Position" #~ msgid "Left" #~ msgstr "Gauche" #~ msgid "Right" #~ msgstr "Droite" #~ msgid "Appearance" #~ msgstr "Apparence" #~ msgid "More Options" #~ msgstr "Plus d’options" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "No Details" #~ msgstr "Aucun détail" #~ msgid "Click on task to show more info" #~ msgstr "Cliquez sur une tâche pour afficher plus d’informations" #~ msgid "Clear Style" #~ msgstr "Effacer le style" #~ msgid "Text" #~ msgstr "Texte" #~ msgid "Copy Text" #~ msgstr "Copier le texte" #~ msgid "Properties" #~ msgstr "Propriétés" #~ msgid "Complete %" #~ msgstr "Terminé %" #~ msgid "Add Tag" #~ msgstr "Ajouter une étiquette" #~ msgid "Save Task as .ics file" #~ msgstr "Enregistrer la tâche en fichier .ics" #~ msgid "Mark as Completed" #~ msgstr "Marquer comme terminée" #~ msgid "Expand / Fold" #~ msgstr "Dérouler / Replier" #~ msgid "Restore All" #~ msgstr "Tout restaurer" #~ msgid "Save changed details" #~ msgstr "Enregistrer les modifications des détails" #~ msgid "Save (Ctrl+S)" #~ msgstr "Enregistrer (Ctrl+S)" #~ msgid "Load" #~ msgstr "Charger" #~ msgid "Click for Details" #~ msgstr "Cliquez pour afficher les détails" mrvladus-Errands-cbe30b3/po/hi.po000066400000000000000000000516601464651330500170230ustar00rootroot00000000000000# 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. # Scrambled777 , 2024. # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-30 21:53+0530\n" "Last-Translator: Scrambled777 \n" "Language-Team: Hindi \n" "Language: hi\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 46.1\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "जानकारी" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "क्या आप निश्चित हैं?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "रद्द करें" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "कोई नहीं" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "नीला" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "हरा" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "पीला" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "नारंगी" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "लाल" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "बैंगनी" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "भूरा" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "आज" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "कल" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "अभी" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "साफ करें" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "तिथि निर्धारित करें" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "प्रारंभ / नियत तिथि" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "तिथि" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "नोट्स" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "प्राथमिकता" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "उच्च" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "मध्यम" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "निम्न" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "तदनुकूल" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "कोई टैग नहीं" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "टैग" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "अनुलग्नक" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "निर्मित:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "संशोधित:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "अधिक" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "कोई फाइल संलग्न नहीं" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "अनुलग्नक जोड़ें" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "फाइल खोलें" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "मिटाएं" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "धारक फोल्डर खोलें" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "तिथि और समय" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "नियत तिथि" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "प्रारंभ" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "सूची जोड़ें (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "समन्वयित हो रहा है..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "नई सूची जोड़ें" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "\"+\" बटन क्लिक करें" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "कार्य सूचियां" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "मुख्य मेनू" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "कार्य समन्वयित/प्राप्त करें" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "कार्य सूची आयात करें" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "प्राथमिकताएं" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "कीबोर्ड शॉर्टकट" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Errands के बारे में" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "छोड़ें" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "नई सूची का नाम" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "सूची जोड़ें" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "जोड़ें" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "कोई टैग नहीं मिला" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "उपरोक्त प्रविष्टि में नए टैग जोड़ें" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "नया टैग जोड़ें" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "निर्यातित" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "क्लिपबोर्ड पर कॉपी किया गया" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "उप-कार्य टॉगल करें" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "पूर्णता टॉगल करें" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "टूलबार टॉगल करें" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "संपादित करें" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "रद्दी में ले जाएं" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "क्लिपबोर्ड पर कॉपी करें" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "निर्यात" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "पूर्ण" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "नया उप-कार्य जोड़ें" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "पूर्ण:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "टैग मिटाएं" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "पूर्ण कार्यों को टॉगल करें" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "पूर्ण कार्य मिटाएं" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "ऊपर स्क्रॉल करें" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "नया कार्य जोड़ें" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "लोड हो रहा है..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "सूची स्थायी रूप से मिटा दी जाएगी" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "नया नाम" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "सूची का नाम बदलें" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "सहेजें" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "निर्यात विफल" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "रंग" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "नाम बदलें" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "आज के लिए कोई कार्य नहीं" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "रद्दी खाली करें" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "कोई मिटाया गयी वस्तुएं नहीं" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "पुनर्स्थापित करें" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "रद्दी" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "कार्य स्थायी रूप से मिटा दिए जाएंगे" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "पार्श्वपट्टी" #: errands/widgets/window.py:59 msgid "Content" msgstr "अंतर्वस्तु" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "कोई कार्य सूची नहीं" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "नई बनाएं या मौजूदा आयात करें" #: errands/widgets/window.py:95 msgid "Create List" msgstr "सूची बनाएं" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "नई सूची बनाएं" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Scrambled777 " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "समन्वयन अक्षम है" #: errands/widgets/window.py:194 msgid "Imported" msgstr "आयातित" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "अनुप्रयोग थीम" #: errands/widgets/preferences.py:34 msgid "System" msgstr "सिस्टम" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "हल्का रंग" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "गहरा रंग" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "नये कार्य जोड़ें" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "सबसे नीचे" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "सबसे ऊपर" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "अधिसूचनाएं दिखाएं" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "पृष्ठभूमि में चलाएं" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "अनुप्रयोग विंडो को बंद करने के बजाय छुपाएं" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "शुरुआत पर चलाएं" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "उपयोक्ता के लॉगिन करने पर एप्लिकेशन लॉन्च करें" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "अधिसूचनाएं और पृष्ठभूमि" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "समन्वयन" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "अक्षम" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "समन्वयन प्रदाता" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "सर्वर URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL में प्रोटोकॉल शामिल होना चाहिए, जैसे http:// या https://। अगर " "आपको कनेक्शन में समस्या है - तो पहले प्रोटोकॉल बदलने की कोशिश करें।" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "उपयोक्तानाम" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "पासवर्ड" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "जांचे" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "कनेक्शन जांचे" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "सामान्य" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "जुड़ा हुआ" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "प्रमाणीकरण विफल" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "सर्वर नहीं मिल सका। नेटवर्क और URL जांचे।" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "जुड़ नहीं सकते" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "जुड़ नहीं सकते। क्रेडेंशियल जांचें" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "सभी समन्वयन क्रेडेंशियल प्रदान नहीं किए गए। कृपया सेटिंग जांचें।" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV सर्वर से जुड़ नहीं सके:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "नई कार्य सूची" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "कार्य देय है" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands अद्यतित किया गया" #: errands/application.py:81 msgid "Restart is required" msgstr "पुनरारंभ आवश्यक है" #: errands/application.py:84 msgid "Restart" msgstr "पुनरारंभ" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "अधिसूचनाओं के लिए Errands को पृष्ठभूमि में चलाना होगा" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "कीबोर्ड शॉर्टकट दिखाएं" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "सूचियां" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "सूची आयात करें" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "विवरण" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "विवरण टॉगल करें" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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;समन्वयन;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:12 msgid "Todo application for those who prefer simplicity." msgstr "जो लोग सादगी पसंद करते हैं उनके लिए कार्य सूची अनुप्रयोग।" #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "विशेषताएं:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "एकाधिक कार्य सूचियों का समर्थन" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "कार्य और उप-कार्य जोड़ें, हटाएं, संपादित करें" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "कार्य और उप-कार्यों को पूर्ण चिह्नित करें" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "प्रत्येक कार्य के लिए रंग जोड़ें" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Nextcloud या अन्य CalDAV प्रदाताओं के साथ कार्यों को समन्वयित करें" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "खींचने और छोड़ने का समर्थन" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr ".ics फाइलें आयात करें" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "मुख्य विंडो दृश्य" mrvladus-Errands-cbe30b3/po/hr.po000066400000000000000000000423731464651330500170350ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-06-29 16:36+0200\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" "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" "X-Generator: Poedit 3.4.4\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Informacije" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Jesi li siguran/na?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Odustani" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Ništa" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Plava" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Zelena" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Žuta" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Narančasta" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Crvena" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Ljubičasta" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Smeđa" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Danas" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Sutra" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Sada" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Izbriši" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Postavi datum" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Datum početka/roka" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Datum" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Bilješke" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioritet" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Visoki" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Srednji" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Niski" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Prilagođeno" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Nema oznaka" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Oznake" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Prilozi" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Stvoreno:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Promijenjeno:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Više" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Nema priloženih datoteka" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Dodaj prilog" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Otvori datoteku" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Izbriši" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Otvori mapu" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Datum i vrijeme" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Rok" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Početak" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Dodaj popis (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Sinkroniziranje …" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Dodaj novi popis" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Pritisni gumb „+”" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Popisi zadataka" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Glavni izbornik" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sinkroniziraj/Preuzmi zadatke" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Uvezi popis zadataka" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Postavke" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Tipkovnički prečaci" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "O aplikaciji Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Zatvori aplikaciju" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Ime novog popisa" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Dodaj popis" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Dodaj" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nije pronađena nijedna oznaka" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Dodaj nove oznake u gornje polje" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Dodaj novu oznaku" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Izvezeno" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Kopirano u međuspremnik" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Uključi/Isključi podzadatke" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Uključi/Isključi završetak" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Uključi/Isključi alatnu traku" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Uredi" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Premjesti u smeće" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Kopiraj u međuspremnik" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Izvezi" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Završeno" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Dodaj novi podzadatak" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Završeno:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Izbriši oznaku" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Uključi/Isključi završene zadatke" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Izbriši završene zadatke" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Klizni gore" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Dodaj novi zadatak" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Učitavanje …" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Popis će se zauvijek izbrisati" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Novo ime" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Preimenuj popis" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Spremi" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Izvoz nije uspio" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Boja" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Preimenuj" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Nema zadataka za danas" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Isprazni smeće" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Nema izbrisanih stavki" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Obnovi" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Smeće" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Zadaci će se zauvijek izbrisati" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Bočni stupac" #: errands/widgets/window.py:59 msgid "Content" msgstr "Sadržaj" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Nema popisa zadataka" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Stvori novu ili uvezi postojeću" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Stvori popis" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Stvori novi popis" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Milo Ivir " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Sinkronizacija je deaktivirana" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Uvezeno" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tema aplikacije" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sustav" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Svijetla" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Tamna" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Dodaj nove zadatke" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Na kraj" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Na početak" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Prikaži obavijesti" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Izvodi u pozadini" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Sakrij prozor aplikacije umjesto zatvaranja prozora" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Pokreni nakon pokretanja sustava" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Pokreni aplikaciju kada se korisnik prijavi" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Obavijesti i pozadina" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sinkronizacija" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Isključeno" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Pružatelj usluge sinkronizacije" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL servera" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL adresa mora sadržati protokol, kao što su http:// ili https://" ". Ako dođe do problema s vezom – najprije pokušaj promijeniti protokol." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Korisničko ime" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Lozinka" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Provjeri" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Testiraj vezu" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Općenito" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Povezano" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Autorizacija nije uspjela" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Server nije pronađen. Provjeri mrežu i URL adresu." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Povezivanje nije moguće" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Povezivanje nije moguće. Provjeri podatke za prijavu" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Neuspjelo povezivanje s CalDAV serverom pri:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Novi popis zadataka" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Rok za zadatak je" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands je aktualiziran" #: errands/application.py:81 msgid "Restart is required" msgstr "Potrebno je ponovno pokretanje" #: errands/application.py:84 msgid "Restart" msgstr "Pokreni ponovo" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Za obavijesti se Errands mora izvoditi u pozadini" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Prikaži tipkovničke prečace" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Popisi" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Uvezi popis" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Detalji" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Uključi/Isključi detalje" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 msgid "Manage your tasks" msgstr "Upravljaj svojim zadacima" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "" "errands;zadaci;popis;popis zadataka;popisi zadataka;caldav;nextcloud;" "sinkronizacija;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:12 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:13 msgid "Features:" msgstr "Značajke:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Podrška za višestruke popise zadataka" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Dodaj, ukloni, uredi zadatke i podzadatke" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Označi zadatak i podzadatke kao završene" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Dodaj boju za svaki zadatak" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Podrška za povuci i ispusti" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Uvezi .ics datoteke" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Prikaz glavnog prozora" mrvladus-Errands-cbe30b3/po/hu.po000066400000000000000000000460721464651330500170400ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-06-11 16:08+0200\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.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Információ" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Biztos benne?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Mégse" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Nincs" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Kék" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Zöld" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Sárga" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Narancs" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Piros" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Lila" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Barna" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Ma" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Holnap" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Most" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Ürítés" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Dátum beállítása" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Kezdet / esedékesség dátuma" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Dátum" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Jegyzetek" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioritás" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Magas" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Közepes" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Alacsony" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Egyéni" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Nincsenek címkék" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Címkék" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Csatolmányok" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Létrehozva:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Módosítva:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Több" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Nincsenek csatolt fájlok" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Csatolmány hozzáadása" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Fájl megnyitása" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Törlés" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Tartalmazó mappa megnyitása" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Dátum és idő" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Esedékesség" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Kezdet" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Lista hozzáadása (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Szinkronizálás..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Új lista hozzáadása" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Kattintson a \"+\" gombra" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Feladatlisták" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Tennivalók" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Főmenü" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Feladatok szinkronizálása / lekérése" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Feladatlista importálása" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Beállítások" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "A Tennivalók névjegye" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Kilépés" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Új listanév" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Lista hozzáadása" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Hozzáadás" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nem találhatók címkék" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Adjon hozzá új címkéket a fenti szövegdobozban" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Új címke hozzáadása" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exportálva" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Vágólapra másolva" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Alfeladatok megjelenítése / elrejtése" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Befejezettek megjelenítése / elrejtése" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Eszköztár megjelenítése / elrejtése" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Szerkesztés" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Kukába helyezés" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Másolás vágólapra" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportálás" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Befejezve" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Új alfeladat hozzáadása" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Befejezett:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Címke törlése" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Befejezett feladatok megjelenítése / elrejtése" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Befejezett feladatok törlése" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "A tetejére" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Új feladat hozzáadása" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Betöltés..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "A lista véglegesen törölve lesz" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Új név" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Lista átnevezése" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Mentés" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Az exportálás sikertelen" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Szín" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Átnevezés" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Nincsenek feladatok mára" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Kuka ürítése" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Nincsenek törölt elemek" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Visszaállítás" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Kuka" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "A feladatok véglegesen törölve lesznek" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Oldalsáv" #: errands/widgets/window.py:59 msgid "Content" msgstr "Tartalom" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Nincsenek feladatlisták" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Új létrehozása vagy létező importálása" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Lista létrehozása" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Új lista létrehozása" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "zoli111" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "A szinkronizáció letiltva" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importálva" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Alkalmazástéma" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Rendszer" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Világos" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Sötét" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Új feladatok hozzáadása" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Alul" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Felül" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Értesítések megjelenítése" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Futtatás a háttérben" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Az alkalmazásablak elrejtése bezárás helyett" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Indítás a munkamenettel" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Alkalmazás elindítása, amikor a felhasználó bejelentkezik" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Értesítések és háttér" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Szinkronizáció" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Letiltva" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Szinkronizáció szolgáltató" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Kiszolgáló URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "Az URL-címnek tartalmaznia kell a protokollt, például http:// vagy " "https://. Ha problémái vannak a csatlakozással - először próbálja " "meg megváltoztatni a protokollt." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Felhasználónév" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Jelszó" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Teszt" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Kapcsolat tesztelése" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Általános" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Csatlakozva" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "A hitelesítés sikertelen" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Nem található kiszolgáló. Ellenőrizze a hálózatot és az URL-t." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Nem lehet csatlakozni" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Nem lehet csatlakozni. Ellenőrizze a hitelesítő adatokat" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Nem lehet csatlakozni a CalDAV kiszolgálóhoz itt:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Új feladatlista" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "A feladat esedékes" #: errands/application.py:80 msgid "Errands was updated" msgstr "A tennivalók frissítve lett" #: errands/application.py:81 msgid "Restart is required" msgstr "Újraindítás szükséges" #: errands/application.py:84 msgid "Restart" msgstr "Újraindítás" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "A Tennivalóknak a háttérben kell futnia az értesítésekhez" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Gyorsbillentyűk megjelenítése" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listák" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Lista importálása" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Részletek" #: data/resources/gtk/help-overlay.ui:79 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:7 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:12 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:13 msgid "Features:" msgstr "Funkciók:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Több feladatlista támogatása" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Húzd és ejtsd támogatás" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr ".ics fájlok importálása" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Főablak nézet" #~ msgid "Not Set" #~ msgstr "Nincs beállítva" #~ msgid "Click Action" #~ msgstr "Kattintás művelete" #~ msgid "Open Details Panel" #~ msgstr "Részletek panel megnyitása" #~ msgid "Complete Button Size" #~ msgstr "Befejezés gomb mérete" #~ msgid "Small" #~ msgstr "Kicsi" #~ msgid "Big" #~ msgstr "Nagy" #~ msgid "Progress Bar" #~ msgstr "Folyamatsáv" #~ msgid "Tool Bar" #~ msgstr "Eszköztár" #~ msgid "Details Panel" #~ msgstr "Részletek panel" #~ msgid "Position" #~ msgstr "Pozíció" #~ msgid "Left" #~ msgstr "Bal" #~ msgid "Right" #~ msgstr "Jobb" #~ msgid "Appearance" #~ msgstr "Megjelenés" #~ msgid "More Options" #~ msgstr "További lehetőségek" #~ msgid "Menu" #~ msgstr "Menü" #~ msgid "No Details" #~ msgstr "Nincsenek részletek" #~ msgid "Click on task to show more info" #~ msgstr "Kattintson a feladatra a további információ megjelenítéséhez" #~ msgid "Clear Style" #~ msgstr "Stílus törlése" #~ msgid "Text" #~ msgstr "Szöveg" #~ msgid "Copy Text" #~ msgstr "Szöveg másolása" #~ msgid "Properties" #~ msgstr "Tulajdonságok" #~ msgid "Complete %" #~ msgstr "Befejezett %" #~ msgid "Add Tag" #~ msgstr "Címke hozzáadása" #~ msgid "Save Task as .ics file" #~ msgstr "Feladat mentése .ics fájlként" #~ msgid "Mark as Completed" #~ msgstr "Befejezettként jelölés" #~ msgid "Expand / Fold" #~ msgstr "Kinyitás / becsukás" #~ msgid "Restore All" #~ msgstr "Összes visszaállítása" #~ msgid "Save changed details" #~ msgstr "Megváltoztatott részletek mentése" mrvladus-Errands-cbe30b3/po/it.po000066400000000000000000000502071464651330500170330ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-23 13: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/shared/components/buttons.py:45 msgid "Info" msgstr "Informazioni" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Sei sicuro?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Annulla" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Nessuna" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Blu" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Verde" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Giallo" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Arancio" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Rosso" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Viola" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Marrone" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Oggi" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Domani" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Ora" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Chiaro" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Imposta data" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Data di inizio / scadenza" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Data" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Note" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priorità" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Alta" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Media" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Bassa" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Personalizzato" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Nessun tag" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Tag" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Allegati" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Creato:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Modificato:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Altro" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Nessun file allegato" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Aggiungi allegato" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Apri file" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Cancella" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Apri la cartella dei documenti" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Data e ora" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Scadenza" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Inizio" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Aggiungi lista (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Sincronizzazione..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Aggiungi nuova lista" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Fare clic sul pulsante \"+\"." #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Elenchi di attività" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menù principale" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizza / Recupera attività" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Importa liste delle attività" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferenze" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Informazioni su Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Esci" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nuovo nome della lista" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Aggiungi lista" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Aggiungi" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nessun tag trovato" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Aggiungi nuovi tag nella voce sopra" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Aggiungi nuovo tag" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Esportato" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copiato negli appunti" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Attiva attività secondarie" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Attiva completamento" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Attiva barra degli strumenti" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Modifica" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Sposta nel cestino" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Copia negli appunti" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Esporta" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Completato" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Aggiungi una nuova attività secondaria" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Completato:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Elimina tag" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Attiva le attività completate" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Elimina attività completate" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Scorri verso l'alto" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Aggiungi nuova attività" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Caricamento..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "La lista verrà eliminata definitivamente" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nuovo nome" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Rinomina lista" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Salva" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Esportazione non riuscita" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Colore" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Rinomina" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Nessuna attività per oggi" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Cestino vuoto" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Nessun elemento eliminato" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Ripristina" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Cestino" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Le attività verranno eliminate definitivamente" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Barra laterale" #: errands/widgets/window.py:59 msgid "Content" msgstr "Contenuto" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Nessun elenco di attività" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Creane uno nuovo o importane uno esistente" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Crea lista" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Crea nuova lista" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Albano Battistella " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "La sincronizzazione è disabilitata" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importato" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tema applicazione" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Chiaro" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Scuro" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Aggiungi nuove attività" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "In basso" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "In alto" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Mostra notifiche" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Esegui in background" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Nascondi la finestra dell'applicazione invece di chiuderla" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Avvia all'avvio del sistema" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Avvia l'applicazione quando l'utente accede" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Notifiche e background" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizzazione" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Disabilitato" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Provider di sincronizzazione" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL Server" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "L'URL deve includere un protocollo, ad esempio http:// o https://. Se " "hai problemi con la connessione: prova prima a cambiare protocollo." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Nome utente" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Password" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Test di connessione" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Generale" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Connesso" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Autorizzazione non concessa" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Impossibile individuare il server. Controlla la rete e l'URL." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Impossibile connettere" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Impossibile connettersi. Controlla le credenziali" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Impossibile connettersi al server CalDAV su:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Nuovo elenco di attività" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "L'attività è scaduta" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands è stato aggiornato" #: errands/application.py:81 msgid "Restart is required" msgstr "È richiesto il riavvio" #: errands/application.py:84 msgid "Restart" msgstr "Riavvia" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands deve essere eseguito in background per le notifiche" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostra scorciatoie da tastiera" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Liste" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importa lista" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Dettaglio" #: data/resources/gtk/help-overlay.ui:79 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:7 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:12 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:13 msgid "Features:" msgstr "Caratteristiche:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Supporto per più elenchi di attività" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Supporto trascina e rilascia" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importa file .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Vista della finestra principale" #~ msgid "Not Set" #~ msgstr "Non impostato" #~ msgid "Click Action" #~ msgstr "Premere il tasto »+«" #~ msgid "Open Details Panel" #~ msgstr "Apri il pannello dei dettagli" #~ msgid "Complete Button Size" #~ msgstr "Dimensione pulsante completa" #~ msgid "Small" #~ msgstr "Piccolo" #~ msgid "Big" #~ msgstr "Grande" #~ msgid "Progress Bar" #~ msgstr "Barra di avanzamento" #~ msgid "Tool Bar" #~ msgstr "Barra degli strumenti" #~ msgid "Details Panel" #~ msgstr "Pannello dei dettagli" #~ msgid "Position" #~ msgstr "Posizione" #~ msgid "Left" #~ msgstr "Sinistra" #~ msgid "Right" #~ msgstr "Destra" #~ msgid "Appearance" #~ msgstr "Aspetto" #~ msgid "More Options" #~ msgstr "Altre opzioni" #~ msgid "Menu" #~ msgstr "Menù" #~ msgid "No Details" #~ msgstr "Nessun dettaglio" #~ msgid "Click on task to show more info" #~ msgstr "Fare clic sull'attività per visualizzare ulteriori informazioni" #~ msgid "Clear Style" #~ msgstr "Stile chiaro" #~ msgid "Text" #~ msgstr "Testo" #~ msgid "Copy Text" #~ msgstr "Copia testo" #~ msgid "Properties" #~ msgstr "Proprietà" #~ msgid "Complete %" #~ msgstr "Completo %:" #~ msgid "Add Tag" #~ msgstr "Aggiungi tag" #~ msgid "Save Task as .ics file" #~ msgstr "Salva attività come file .ics" #~ msgid "Mark as Completed" #~ msgstr "Contrassegna come completato" #~ msgid "Expand / Fold" #~ msgstr "Espandi / Piega" #~ msgid "Restore All" #~ msgstr "Ripristina tutto" #~ msgid "Save changed details" #~ msgstr "Salva i dettagli modificati" #~ msgid "Save (Ctrl+S)" #~ msgstr "Salva(Ctrl+S)" #~ 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 "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 "Cancel (Escape)" #~ msgstr "Annulla (Esc)" mrvladus-Errands-cbe30b3/po/ja.po000066400000000000000000000475441464651330500170230ustar00rootroot00000000000000# Japanese translation for Errands. # Copyright (C) 2023-2024 THE Errands'S COPYRIGHT HOLDER # This file is distributed under the same license as the Errands package. # Gnuey56 , 2023 # Lemon73 , 2024 # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-17 20:41+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.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "情報" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "本当に削除しますか?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "キャンセル" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "なし" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "青" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "緑" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "黄" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "橙" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "赤" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "紫" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "茶" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "今日" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "明日" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "現在" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "クリア" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "日付を設定" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "開始日 / 終了日" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "日付" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "メモ" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "優先度" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "高い" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "中" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "低い" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "カスタム" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "タグなし" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "タグ" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "添付ファイル" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "作成:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "変更:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "詳細" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "添付されたファイルはありません" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "添付ファイルを追加" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "ファイルを開く" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "削除" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "グループフォルダを開く" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "日付と時間" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "終了日" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "開始日" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "リストを追加 (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "同期中..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "新しいリストを追加" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "\"+\" ボタンをクリック" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "タスクのリスト" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "メインメニュー" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "タスクを同期" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "タスクリストをインポート" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "設定" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "キーボード・ショートカット" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Errands について" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "終了" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "新しいリストの名前" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "リストを追加" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "追加" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "タグが見つかりません" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "上記のエントリーに新しいタグを追加" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "新しいタグを追加" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "エクスポートされました" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "クリップボードにコピーされました" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "サブタスクを切り替え" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "完了に切り替え" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "ツールバーを切り替え" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "編集" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "ゴミ箱に移動" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "クリップボードにコピー" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "エクスポート" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "完了" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "新しいサブタスクを追加" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "完了:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "タグを削除" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "完了したタスクに切り替え" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "完了したタスクを削除" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "上へスクロール" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "新しいタスクを追加" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "読み込み中..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "削除されたリストは元に戻せません" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "新しい名前" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "リストの名前を変更" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "保存" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "エクスポートに失敗しました" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "名前を変更" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "今日はタスクがありません" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "空のゴミ箱" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "削除されたアイテムはありません" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "復元" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "ゴミ箱" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "削除されたタスクは元に戻せません" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "サイドバー" #: errands/widgets/window.py:59 msgid "Content" msgstr "内容" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "タスクのリストはありません" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "新規作成または既存のものをインポート" #: errands/widgets/window.py:95 msgid "Create List" msgstr "リストを作成" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "新しいリストを作成" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Gnuey56" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "同期は無効です" #: errands/widgets/window.py:194 msgid "Imported" msgstr "インポートしました" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "アプリケーションのテーマ" #: errands/widgets/preferences.py:34 msgid "System" msgstr "システム" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "ライト" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "ダーク" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "新しいタスクを追加" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "下" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "上" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "通知を表示" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "バックグランドで動作" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "アプリケーションを終了せずにウィンドウを非表示にします" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "自動起動" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "ユーザーがログインしたときにアプリケーションを起動します" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "通知とバックグランド動作" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同期" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "しない" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "同期プロバイダー" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "サーバーの URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL には http://https:// のようなプロトコルを含んでいる必要" "があります。接続で問題が発生した場合は、まず、プロトコルを変えてみてくださ" "い。" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "ユーザー名" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "パスワード" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "テスト" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "接続をテスト" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "全般" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "接続されています" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "認証に失敗しました" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" "サーバーが見つかりませんでした。ネットワークと URL を確認してください。" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "接続できません" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "接続できません。資格情報を確認してください" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "同期に必要な情報が入力されていません。設定を確認してください。" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV サーバーに接続できません:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "新しいタスクのリスト" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "タスクの期限を過ぎています" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands は更新されました" #: errands/application.py:81 msgid "Restart is required" msgstr "アプリケーションの再起動が必要です" #: errands/application.py:84 msgid "Restart" msgstr "再起動" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands は通知のため、バックグラウンドで実行する必要があります" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "キーボード・ショートカットを表示" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "リスト" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "リストをインポート" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "詳細" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "詳細を切り替え" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "シンプルを好む人のための To Do アプリケーション。" #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "機能:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "複数のタスクリストをサポート" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "タスク/サブタスクを、追加、削除、編集" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "タスク/サブタスクを完了済みにチェック" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "タスクごとにアクセントカラーを追加" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Nextcloud 又は他の CalDAV プロバイダーとタスクを同期" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "ドラッグアンドドロップをサポート" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr ".ics ファイルをインポート" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "メインウィンドウの画面" #~ msgid "Not Set" #~ msgstr "未設定" #~ msgid "Click Action" #~ msgstr "クリック時のアクション" #~ msgid "Open Details Panel" #~ msgstr "詳細パネルを開く" #~ msgid "Complete Button Size" #~ msgstr "完了ボタンのサイズ" #~ msgid "Small" #~ msgstr "小さい" #~ msgid "Big" #~ msgstr "大きい" #~ msgid "Progress Bar" #~ msgstr "進捗バー" #~ msgid "Tool Bar" #~ msgstr "ツールバー" #~ msgid "Details Panel" #~ msgstr "詳細パネル" #~ msgid "Position" #~ msgstr "位置" #~ msgid "Left" #~ msgstr "左" #~ msgid "Right" #~ msgstr "右" #~ msgid "Appearance" #~ msgstr "外観" #~ msgid "More Options" #~ msgstr "その他のオプション" #~ msgid "Menu" #~ msgstr "メニュー" #~ msgid "No Details" #~ msgstr "詳細なし" #~ msgid "Click on task to show more info" #~ msgstr "タスクをクリックして詳細を表示" #~ msgid "Clear Style" #~ msgstr "色をクリア" #~ msgid "Text" #~ msgstr "タイトル" #~ msgid "Copy Text" #~ msgstr "タイトルをコピー" #~ msgid "Properties" #~ msgstr "プロパティ" #~ msgid "Complete %" #~ msgstr "完了度 (パーセント)" #~ msgid "Add Tag" #~ msgstr "タグを追加" #~ msgid "Save Task as .ics file" #~ msgstr "タスクを .ics ファイルとして保存" #~ msgid "Mark as Completed" #~ msgstr "完了にする" #~ msgid "Expand / Fold" #~ msgstr "展開/折りたたみ" #~ msgid "Restore All" #~ msgstr "すべて復元" #~ msgid "Save changed details" #~ msgstr "変更された詳細を保存" #~ msgid "Save (Ctrl+S)" #~ msgstr "保存 (Ctrl+S)" #~ msgid "Load" #~ msgstr "読み込み" #~ msgid "Click for Details" #~ msgstr "クリックしてタスクの詳細を表示" #~ msgid "Toggle sidebar" #~ msgstr "サイドバーの切り替え" mrvladus-Errands-cbe30b3/po/meson.build000066400000000000000000000000501464651330500202100ustar00rootroot00000000000000i18n.gettext('errands', preset: 'glib') mrvladus-Errands-cbe30b3/po/nb.po000066400000000000000000000302131464651330500170110ustar00rootroot00000000000000# 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-03-25 18:10+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: nb\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 "Nå" #: errands/widgets/components.py:172 errands/widgets/trash.py:37 msgid "Clear" msgstr "Fjern" #. 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 valgt" #: errands/widgets/preferences.py:31 msgid "Application Theme" msgstr "Stil" #: errands/widgets/preferences.py:39 msgid "System" msgstr "Følg systemet" #: errands/widgets/preferences.py:51 msgid "Light" msgstr "Lys" #: errands/widgets/preferences.py:63 msgid "Dark" msgstr "Mørk" #. 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 "Gjøremål" #: errands/widgets/preferences.py:83 msgid "Click Action" msgstr "Handling ved trykk" #: errands/widgets/preferences.py:84 msgid "Open Details Panel" msgstr "Vis informasjon" #: errands/widgets/preferences.py:84 msgid "Show Sub-Tasks" msgstr "Vis undermål" #: errands/widgets/preferences.py:99 msgid "Complete Button Size" msgstr "Størrelse på fullføringsknapp" #: errands/widgets/preferences.py:100 msgid "Small" msgstr "Liten" #: errands/widgets/preferences.py:100 msgid "Big" msgstr "Stor" #: errands/widgets/preferences.py:113 msgid "Progress Bar" msgstr "Fremgangslinje" #: errands/widgets/preferences.py:119 msgid "Tool Bar" msgstr "Verktøylinje" #: errands/widgets/preferences.py:126 errands/widgets/preferences.py:194 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synkronisering" #. Provider #: errands/widgets/preferences.py:129 msgid "Disabled" msgstr "Ingen" #: errands/widgets/preferences.py:131 msgid "Sync Provider" msgstr "Tjeneste" #: errands/widgets/preferences.py:140 msgid "Server URL" msgstr "Nettadresse" #: errands/widgets/preferences.py:146 msgid "Username" msgstr "Brukernavn" #: errands/widgets/preferences.py:152 msgid "Password" msgstr "Passord" #: errands/widgets/preferences.py:158 msgid "Test" msgstr "Sjekk" #: errands/widgets/preferences.py:163 msgid "Test Connection" msgstr "Sjekk tilkobling" #: errands/widgets/preferences.py:171 msgid "Details Panel" msgstr "Informasjonsside" #: errands/widgets/preferences.py:174 msgid "Position" msgstr "Plassering" #: errands/widgets/preferences.py:175 msgid "Left" msgstr "Venstre" #: errands/widgets/preferences.py:175 msgid "Right" msgstr "Høyre" #: errands/widgets/preferences.py:184 msgid "Appearance" msgstr "Utseende" #: errands/widgets/preferences.py:230 msgid "Connected" msgstr "Tilkoblet" #: errands/widgets/preferences.py:230 msgid "Can't connect" msgstr "Tilkobling mislyktes" #: 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 liste" #: errands/widgets/sidebar.py:80 msgid "Add List (Ctrl+A)" msgstr "Ny liste" #: errands/widgets/sidebar.py:82 msgid "More Options" msgstr "Alternativer" #. 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 "Synkroniser" #: errands/widgets/sidebar.py:102 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Innstillinger" #: errands/widgets/sidebar.py:103 msgid "Keyboard Shortcuts" msgstr "Tastatursnarveier" #: errands/widgets/sidebar.py:104 msgid "About Errands" msgstr "Om Errands" #: errands/widgets/sidebar.py:110 msgid "Main Menu" msgstr "Hovedmeny" #: errands/widgets/sidebar.py:116 msgid "Syncing..." msgstr "Synkroniserer…" #: errands/widgets/sidebar.py:141 msgid "New List Name" msgstr "Navn" #: errands/widgets/sidebar.py:145 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Opprett liste" #: errands/widgets/sidebar.py:150 errands/widgets/sidebar.py:342 #: errands/widgets/sidebar.py:385 errands/widgets/trash.py:136 msgid "Cancel" msgstr "Avbryt" #: errands/widgets/sidebar.py:151 msgid "Add" msgstr "Opprett" #: errands/widgets/sidebar.py:168 msgid "Add new List" msgstr "Ingen lister" #: errands/widgets/sidebar.py:169 msgid "Click \"+\" button" msgstr "Opprett en liste for å komme i gang" #: errands/widgets/sidebar.py:337 errands/widgets/trash.py:131 msgid "Are you sure?" msgstr "Slette innhold?" #: errands/widgets/sidebar.py:338 msgid "List will be permanently deleted" msgstr "Listen vil forsvinne permanent" #: errands/widgets/sidebar.py:343 errands/widgets/sidebar.py:478 #: errands/widgets/details.py:54 errands/widgets/trash.py:137 msgid "Delete" msgstr "Slett" #: errands/widgets/sidebar.py:375 msgid "New Name" msgstr "Navn" #: errands/widgets/sidebar.py:380 msgid "Rename List" msgstr "Endre navn" #: errands/widgets/sidebar.py:386 errands/widgets/details.py:114 #: errands/widgets/details.py:155 msgid "Save" msgstr "Lagre" #: errands/widgets/sidebar.py:444 msgid "Export failed" msgstr "Eksportering mislyktes" #: errands/widgets/sidebar.py:446 errands/widgets/details.py:487 msgid "Exported" msgstr "Eksportert" #: errands/widgets/sidebar.py:477 msgid "Rename" msgstr "Endre navn" #. Export group #: errands/widgets/sidebar.py:479 errands/widgets/details.py:239 #: errands/widgets/details.py:247 msgid "Export" msgstr "Eksporter" #: errands/widgets/sidebar.py:505 msgid "Menu" msgstr "Listemeny" #: 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 "Vis sidelinje" #: errands/widgets/task_list.py:70 errands/widgets/task_list.py:120 msgid "Delete Completed Tasks" msgstr "Fjern fullførte gjøremål" #: errands/widgets/task_list.py:80 errands/widgets/task_list.py:134 msgid "Scroll Up" msgstr "Rull opp" #: errands/widgets/task_list.py:277 errands/widgets/task.py:217 msgid "Completed:" msgstr "Fullført:" #: errands/widgets/task_list.py:401 msgid "Add new Task" msgstr "Legg til gjøremål" #: errands/widgets/details.py:63 msgid "No Details" msgstr "Ingen informasjon" #: errands/widgets/details.py:64 msgid "Click on task to show more info" msgstr "Trykk på et gjøremål for å se mer informasjon om det" #: errands/widgets/details.py:81 msgid "Clear Style" msgstr "Ingen farge" #. Edit group #: errands/widgets/details.py:90 msgid "Text" msgstr "Navn" #: errands/widgets/details.py:124 errands/widgets/details.py:166 msgid "Copy Text" msgstr "Kopier" #. Notes group #: errands/widgets/details.py:131 msgid "Notes" msgstr "Notater" #. Properties group #: errands/widgets/details.py:173 msgid "Properties" msgstr "Egenskaper" #: errands/widgets/details.py:176 msgid "Start" msgstr "Start" #: errands/widgets/details.py:183 errands/widgets/details.py:204 msgid "Set Date" msgstr "Velg dato" #: errands/widgets/details.py:197 msgid "Due" msgstr "Slutt" #. Complete % row #: errands/widgets/details.py:212 msgid "Complete %" msgstr "Prosent fullført" #. Priority row #: errands/widgets/details.py:222 msgid "Priority" msgstr "Prioritet" #. Tags group #: errands/widgets/details.py:232 msgid "Tags" msgstr "Nøkkelord" #. Tags entry #: errands/widgets/details.py:234 msgid "Add Tag" msgstr "Legg til nøkkelord" #: errands/widgets/details.py:248 msgid "Save Task as .ics file" msgstr "Lagre som ICS-fil" #: errands/widgets/details.py:440 msgid "Copied to Clipboard" msgstr "Kopiert til utklippstavlen" #: errands/widgets/task.py:301 errands/widgets/task.py:312 msgid "Mark as Completed" msgstr "Merk som fullført" #: errands/widgets/task.py:399 msgid "Expand / Fold" msgstr "Utvid" #: errands/widgets/task.py:419 data/resources/gtk/help-overlay.ui:68 msgid "Details" msgstr "Informasjon" #: errands/widgets/task.py:530 msgid "Add new Sub-Task" msgstr "Legg til undermål" #: errands/widgets/trash.py:45 msgid "Restore All" msgstr "Gjenopprett alt" #: errands/widgets/trash.py:51 msgid "Empty Trash" msgstr "Tøm papirkurven" #: 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 "Gjøremålene vil forsvinne permanent" #: errands/widgets/trash.py:212 msgid "Restore" msgstr "Gjenopprett" #: errands/widgets/window.py:67 errands/widgets/window.py:84 msgid "No Task Lists" msgstr "Ingen lister" #: errands/widgets/window.py:69 msgid "Create List" msgstr "Opprett liste" #: errands/widgets/window.py:90 data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Lister" #: errands/widgets/window.py:134 msgid "translator-credits" msgstr "Brage Fuglseth https://bragefuglseth.dev" #: errands/widgets/window.py:143 msgid "Sync is disabled" msgstr "Synkronisering er slått av" #: errands/widgets/window.py:212 msgid "Imported" msgstr "Importert" #: errands/lib/sync/providers/caldav.py:42 msgid "Not all sync credentials provided. Please check settings." msgstr "Ikke all nødvendig innloggingsinformasjon for synkronisering er oppgitt. Sjekk innstillingene." #: errands/lib/sync/providers/caldav.py:81 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV-tjener utilgjengelig:" #: data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Generelt" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Vis tastatursnarveier" #: data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Avslutt" #: data/resources/gtk/help-overlay.ui:72 msgid "Toggle Details" msgstr "Vis informasjon" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:28 msgid "Manage your tasks" msgstr "Fullfør gjøremålene dine" #: data/io.github.mrvladus.List.desktop.in.in:10 msgid "errands;tasks;list;todo;todos;caldav;nextcloud;sync;" msgstr "errands;gjøremål;todo;list;caldav;nextcloud;sjekkliste;oppgaver;tasks;synkronisering;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:30 msgid "Todo application for those who prefer simplicity." msgstr "Drukner du i ting du skulle ha gjort? Dette er en gjøremålsapp som lar deg holde hodet over vann." #: data/io.github.mrvladus.List.metainfo.xml.in.in:31 msgid "Features:" msgstr "Errands er mer enn bare en sjekkliste:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:33 msgid "Multiple task lists support" msgstr "Opprett flere forskjellige gjøremålslister" #: data/io.github.mrvladus.List.metainfo.xml.in.in:34 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Legg til, fjern og rediger gjøremål og undermål" #: data/io.github.mrvladus.List.metainfo.xml.in.in:35 msgid "Mark task and sub-tasks as completed" msgstr "Merk gjøremål og undermål som fullførte" #: data/io.github.mrvladus.List.metainfo.xml.in.in:36 msgid "Add accent color for each task" msgstr "Uthev spesielle gjøremål med farger" #: data/io.github.mrvladus.List.metainfo.xml.in.in:37 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Synkroniser med Nextcloud eller andre CalDAV-tjenester" #: data/io.github.mrvladus.List.metainfo.xml.in.in:38 msgid "Drag and Drop support" msgstr "Endre rekkefølgen på gjøremål ved å dra dem rundt" #: data/io.github.mrvladus.List.metainfo.xml.in.in:39 msgid "Import .ics files" msgstr "Importer ICS-filer" mrvladus-Errands-cbe30b3/po/nl.po000066400000000000000000000462221464651330500170320ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-26 13:42+0200\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/shared/components/buttons.py:45 msgid "Info" msgstr "Informatie" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Weet u het zeker?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Annuleren" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Geen" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Blauw" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Groen" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Geel" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Oranje" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Rood" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Paars" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Bruin" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Vandaag" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Morgen" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Zojuist" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Standaard" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Datum instellen" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Begindatum" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Datum" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Aantekeningen" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioriteit" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Hoog" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Gemiddeld" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Laag" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Aangepast" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Geen labels" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Labels" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Bijlagen" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Aangemaakt op" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Bewerkt op" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Meer" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Er zijn geen bijlagen" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Bijlage toevoegen" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Bestand openen" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Verwijderen" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Bijbehorende map openen" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Datum en tijd" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Einddatum" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Starten" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Lijst toevoegen (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Bezig met synchroniseren…" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Lijst toevoegen" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Klik op de ‘+’-knop" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Takenlijsten" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Takenlijst" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Hoofdmenu" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Taken ophalen/synchroniseren" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Takenlijst importeren" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Voorkeuren" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Over Takenlijst" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Afsluiten" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nieuwe lijstnaam" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Lijst toevoegen" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Toevoegen" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Er zijn geen labels aangetroffen" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Voeg nieuwe labels toe in het vak hierboven" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Label toevoegen" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exporteren voltooid" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Gekopieerd naar het klembord" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Bijkomende taken tonen/verbergen" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Markeren als (on)afgerond" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Werkbalk tonen/verbergen" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Bewerken" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Verplaatsen naar prullenbak" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Kopiëren naar klembord" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exporteren" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Afgerond" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Bijkomende taak toevoegen" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Afgerond:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Label wissen" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Afgeronde taken tonen/verbergen" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Afgeronde taken wissen" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Omhoog schuiven" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Taak toevoegen" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Bezig met laden…" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "De lijst wordt permanent verwijderd" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nieuwe naam" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Lijstnaam wijzigen" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Opslaan" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Exporteren mislukt" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Kleur" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Naam wijzigen" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Er staan vandaag geen taken op de planning" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Prullenbak legen" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Er zijn geen verwijderde items" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Herstellen" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Prullenbak" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "De taken worden permanent verwijderd" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Zijbalk" #: errands/widgets/window.py:59 msgid "Content" msgstr "Inhoud" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Er zijn geen lijsten" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Maak een nieuwe aan of importeer een bestaande" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Lijst maken" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Lijst maken" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Heimen Stoffels " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synchronisatie is uitgeschakeld" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importeren voltooid" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Thema" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Systeemthema" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Licht thema" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Donker thema" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Taken toevoegen" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Onderaan" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Bovenaan" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Meldingen tonen" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Uitvoeren op achtergrond" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" "Verberg het toepassingsvenster in plaats van de toepassing af te sluiten" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Automatisch opstarten" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Start de toepassing op na het aanmelden" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Meldingen en achtergronddienst" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchroniseren" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Uitgeschakeld" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Synchronisatiedienst" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Server-url" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "De url dient voorzien te zijn van een protocol, zoals http:// of " "https://. Als u verbindingsproblemen heeft, probeer dan het protocol " "aan te passen." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Gebruikersnaam" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Wachtwoord" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Testen" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Verbinding testen" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Algemeen" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Verbonden" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Verificatie mislukt" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" "De server kan niet worden gevonden. Controleer de url en uw " "internetverbinding." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Verbinding mislukt" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Controleer uw inloggegevens" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Er zijn geen inloggegevens bekend. Controleer de voorkeuren." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Er kan geen verbinding worden gemaakt met de server:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Nieuwe takenlijst" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Taak is bijna verlopen" #: errands/application.py:80 msgid "Errands was updated" msgstr "Takenlijst is bijgewerkt" #: errands/application.py:81 msgid "Restart is required" msgstr "Herstart de toepassing" #: errands/application.py:84 msgid "Restart" msgstr "Herstarten" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" "Takenlijst dient op de achtergrond te worden uitgevoerd om meldingen te " "kunnen tonen" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Sneltoetsen tonen" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Lijsten" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Lijst importeren" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Details" #: data/resources/gtk/help-overlay.ui:79 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:7 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 "" "takenlijst;boodschappen;taken;lijst;taak;todo;caldav;nextcloud;" "synchronisatie;synchroniseren;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:12 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:13 msgid "Features:" msgstr "Kenmerken:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Ondersteuning voor meerdere lijsten" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 msgid "Add accent color for each task" msgstr "Voorzie elke taak van een andere kleur" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Sleep taken naar het venster" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importeer .ics-bestanden" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Hoofdvenster" #~ msgid "Not Set" #~ msgstr "Niet ingesteld" #~ msgid "Click Action" #~ msgstr "Klikactie" #~ msgid "Open Details Panel" #~ msgstr "Details tonen" #~ msgid "Complete Button Size" #~ msgstr "Grootte van afrondknop" #~ msgid "Small" #~ msgstr "Klein" #~ msgid "Big" #~ msgstr "Groot" #~ msgid "Details Panel" #~ msgstr "Detailpaneel" #~ msgid "Position" #~ msgstr "Locatie" #~ msgid "Left" #~ msgstr "Links" #~ msgid "Right" #~ msgstr "Rechts" #~ msgid "Appearance" #~ msgstr "Vormgeving" #~ msgid "More Options" #~ msgstr "Meer opties" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "No Details" #~ msgstr "Geen omschrijving" #~ msgid "Click on task to show more info" #~ msgstr "Klik op een taak om meer informatie te tonen" #~ msgid "Clear Style" #~ msgstr "Stijl wissen" #~ msgid "Text" #~ msgstr "Tekst" #~ msgid "Copy Text" #~ msgstr "Tekst kopiëren" #~ msgid "Properties" #~ msgstr "Eigenschappen" #~ msgid "Complete %" #~ msgstr "% afgerond" #~ msgid "Add Tag" #~ msgstr "Label toekennen" #~ msgid "Save Task as .ics file" #~ msgstr "Taak opslaan als .ics-bestand" #~ msgid "Mark as Completed" #~ msgstr "Markeren als afgerond" #~ msgid "Expand / Fold" #~ msgstr "Uit-/Inklappen" #~ msgid "Restore All" #~ msgstr "Alles herstellen" #~ msgid "Save changed details" #~ msgstr "Wijzigingen opslaan" #~ msgid "Save (Ctrl+S)" #~ msgstr "Opslaan (Ctrl+S)" #~ 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 "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" mrvladus-Errands-cbe30b3/po/oc.po000066400000000000000000000500061464651330500170150ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-17 19:29+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.4.3\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Info" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "O confirmatz ?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Anullar" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Cap" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Blau" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Verd" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Jaune" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Irange" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Roge" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Violet" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Marron" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Uèi" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Deman" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Ara" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Escafar" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Definir la data" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Data de debuta / fin" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Data" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Nòtas" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioritat" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Elevada" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Mejana" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Bassa" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Personalizada" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Cap d'etiqueta" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Etiquetas" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Pèças juntas" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Creat lo :" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Modificat :" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Mai" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Cap de fichièr pas junt" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Apondre una pèça junta" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Dobrir fichièr" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Suprimir" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Dobrir lo dossièr contenent" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Data e ora" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Tèrme" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Debuta" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Apondre una lista (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Sincronizacion..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Apondre una lista novèla" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Clicar lo boton « + »" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Listas de prètzfaches" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menú principal" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincro / Recuperacion prètzfaches" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Importar lista de prètzfaches" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferéncias" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Acorchis de clavièr" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "A prepaus d’Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Quitar" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nom de la lista novèla" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Apondre una lista" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Apondre" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Cap d’etiqueta pas trobada" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Apondre d’etiquetas novèlas a l’entrada de dessús" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Apondre una etiqueta novèla" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exportat" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copiat al quichapapièrs" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Alternar los jos prètzfaches" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Alternar realizacion" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Afichar o amagar lo panèl lateral" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Modificar" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Desplaçar al bordilhièr" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Copiar al quichapapièrs" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportar" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Acabat" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Apondre un jos prètzfach" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Acabat :" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Suprimir l'etiqueta" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Alternar los prètzfaches acabats" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Suprimir los prètzfaches acabats" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Desfilar cap amont" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Apondre un prètzfach novèl" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Cargament..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "La lista serà definitivament suprimida" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nom novèl" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Renonemar la lista" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Enregistrar" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Expòrt non reüssit" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Color" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Renomenar" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Cap de prètzfach per uèi" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Voidar lo bordilhièr" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Cap d’element pas suprimit" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restablir" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Bordilhièr" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Los prètzfaches seràn definitivament suprimits" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Panèl lateral" #: errands/widgets/window.py:59 msgid "Content" msgstr "Contengut" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Cap de lista de prètzfaches" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Ne crear o importar una existenta" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Crear una lista" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Crear una lista novèla" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Quentin PAGÈS" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "La sincronizacion es desactivada" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importat" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tèma de l’aplicacion" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistèma" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Clar" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Fosc" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Apondre prètzfaches novèls" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Enbàs" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Ennaut" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Afichar las notificacions" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Executar en rèireplan" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Rescondre la fenèstra de l’aplicacion a la plaça de la tampar" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Lançar a l'aviada" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Lançar l’aplicacion quand la session se dobrís" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Notificacion e rèireplan" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizacion" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Desactivada" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Provesidor de sincro." #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL servidor" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "L’URL deu inclure lo protocòl, coma http:// o https://. " "S’avètz de problèma de connexion – ensajatz de cambiar lo protocòl d’en " "primièr." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Nom d'utilizaire" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Senhal" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Ensag" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Ensajar connexion" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "General" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Connectat" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Fracàs de l'autorizacion" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Impossible de trobar lo servidor. Verificatz lo ret e l’url." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Connexion impossibla" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Connexion impossibla. Verificatz los identificants" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Connexion impossibla al servidor CalDAV de :" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Lista de prètzfaches novèlas" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Lo prètzfach es degut" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands es estat actualizat" #: errands/application.py:81 msgid "Restart is required" msgstr "Una reaviada es necessària" #: errands/application.py:84 msgid "Restart" msgstr "Reaviar" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands requerís de s’executar en rèireplan per las notificacions" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar los acorchis clavièr" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listas" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importar lista" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Detalhs" #: data/resources/gtk/help-overlay.ui:79 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:7 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:12 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:13 msgid "Features:" msgstr "Foncionalitats :" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Presa en carga de mantuna lista de prètzfaches" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Presa en carga del lisar e depausar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importar fichièrs .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Vista fenèstra principala" #~ msgid "Not Set" #~ msgstr "Non definida" #~ msgid "Click Action" #~ msgstr "Accion del clic" #~ msgid "Open Details Panel" #~ msgstr "Dobrir lo panèl de detalhs" #~ msgid "Complete Button Size" #~ msgstr "Talha del boton Acabat" #~ msgid "Small" #~ msgstr "Pichona" #~ msgid "Big" #~ msgstr "Granda" #~ msgid "Details Panel" #~ msgstr "Panèl de detalh" #~ msgid "Position" #~ msgstr "Posicion" #~ msgid "Left" #~ msgstr "Esquèrra" #~ msgid "Right" #~ msgstr "Drecha" #~ msgid "Appearance" #~ msgstr "Aparéncia" #~ msgid "More Options" #~ msgstr "Mai d'opcions" #~ msgid "Menu" #~ msgstr "Menú" #~ msgid "No Details" #~ msgstr "Cap de detalh" #~ msgid "Click on task to show more info" #~ msgstr "Clicar un prètzfach per afichar mai d'informacions" #~ msgid "Clear Style" #~ msgstr "Estil clar" #~ msgid "Text" #~ msgstr "Tèxte" #~ msgid "Copy Text" #~ msgstr "Copiar lo tèxte" #~ msgid "Properties" #~ msgstr "Proprietats" #~ msgid "Complete %" #~ msgstr "Acabar %" #~ msgid "Add Tag" #~ msgstr "Apondre una etiqueta" #~ msgid "Save Task as .ics file" #~ msgstr "Enregistrar lo prètzfach coma fichièr .ics" #~ msgid "Mark as Completed" #~ msgstr "Marcar coma acabat" #~ msgid "Expand / Fold" #~ msgstr "Desplegar / Plegar" #~ msgid "Restore All" #~ msgstr "Tot restaurar" #~ msgid "Save changed details" #~ msgstr "Enregistrar los details modificats" #~ msgid "Save (Ctrl+S)" #~ msgstr "Enregistrar (Ctrl+S)" #~ 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 "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 "Cancel (Escape)" #~ msgstr "Anullar (Escape)" mrvladus-Errands-cbe30b3/po/pl.po000066400000000000000000000446151464651330500170400ustar00rootroot00000000000000# Errands - Polish translate # Copyright (C) 2023 # This file is distributed under the same license as the errands package. # Szymon Zielonka , 2023 # Marcin Stasiak , 2024 # msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-06-20 11:10+0200\n" "Last-Translator: Marcin Stasiak " "Language-Team: Szymon Zielonka \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.4.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Informacje" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Jesteś pewien?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Anuluj" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Brak" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Niebieski" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Zielony" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Żółty" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Pomarańczowy" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Czerwony" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Fioletowy" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Brązowy" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Dziś" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Jutro" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Teraz" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Wyczyść" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Ustaw datę" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Data rozpoczęcia / zakończenia" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Data" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notatki" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Priorytet" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Wysoki" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Średni" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Niski" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Własne" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Brak tagów" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Tagi" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Załączniki" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Utworzono:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Zaktualizowano:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Więcej" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Brak załączonych plików" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Dodaj załącznik" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Otwórz plik" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Usuń" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Otwórz folder załącznika" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Data i czas" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Zakończenie" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Rozpoczeńcie" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Dodaj listę (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Synchronizowanie.." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Dodaj nową listę" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Kliknij przycisk \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Listy zadań" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menu główne" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Synchronizacja / pobieranie zadań" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Importuj listę zadań" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Ustawienia" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Skróty klawiaturowe" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "O Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Zamknij" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Nazwa nowej listy" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Dodaj listę" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Dodaj" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nie znaleziono żadnych tagów" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Dodaj nowe tagi w powyższym wpisie" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Dodaj nowy tag" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Wyeksportowane" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Skopiowano do schowka" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Pokaż podzadania" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Oznacz jako ukończone" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Pokaż pasek zadań" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Edytuj" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Przenieś do kosza" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Skopiuj do schowka" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Eksportuj" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Ukończone" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Dodaj nowe podzadanie" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Ukończone:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Usuń tag" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Zwiń zakończone zadania" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Usuń zakończone zadania" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Przenieś do góry" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Dodaj nowe zadanie" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Ładowanie..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Lista zostanie trwale usunięta" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Nowa nazwa" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Zmień nazwę listy" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Zapisz" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Eksport zakończył się niepowodzeniem" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Kolor" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Zmień nazwę" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Brak zadań na dziś" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Opróżnij kosz" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Nie ma zadań do usunięcia" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Przywróć" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Kosz" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Zadania zostaną usunięte" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Pasek boczny" #: errands/widgets/window.py:59 msgid "Content" msgstr "Treść" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Brak list zadań" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Utwórz nową lub zaimportuj istniejącą" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Utwórz listę" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Utwórz nową listę" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Szymon Zielonka \n" "Marcin Stasiak " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Synchronizacja jest wyłączona" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Zaimportowane" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Motyw aplikacji" #: errands/widgets/preferences.py:34 msgid "System" msgstr "System" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Jasny" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Ciemny" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Dodawanie nowych zadań" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Od dołu" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Od góry" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Pokaż powiadomienia" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Uruchamiaj w tle" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Ukryj okno aplikacji zamiast je zamykać" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Uruchom na starcie" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Uruchom aplikacje automatycznie po zalogowaniu" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Powiadomienia i uruchamianie w tle" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Synchronizacja" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Wyłączone" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Dostawca usługi synchronizacji" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Adres URL serwera" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "Adres URL musi zawierać protokół np http:// or https://." "Jeśli masz problemy z połączeniem w pierwszej kolejności zmienić protokół." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Użytkownik" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Hasło" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Test" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Test połaczenia" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Ogólne" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Podłączono" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Autoryzacja zakończona niepowodzeniem" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Nie można zlokalizować serwera. Sprawdź połączenie z siecią i adres URL." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Nie można się połączyć" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Nie można się połączyć. Sprawdź dane uwierzytelniające" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Nie podano wszystkich danych uwierzytelniających synchronizacji. Sprawdź ustawienia." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Nie można połączyć się z serwerem CalDAV pod adresem:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Nowa lista zadań" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Zadanie w trakcie" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands został zaktualizowany" #: errands/application.py:81 msgid "Restart is required" msgstr "Wymagane jest ponowne uruchomienie" #: errands/application.py:84 msgid "Restart" msgstr "Restart" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands musi działać w tle aby wyświetlać powiadomienia" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Pokarz skróty klawiaturowe" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listy" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importuj listę" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Szczegóły" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Pokaż szczegóły" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Aplikacja TODO dla tych, którzy preferują prostotę." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Funkcionalności:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Obsługa wielu list zadań" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Dodawanie, usuwanie i edytowanie zadań i podzadań" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Oznaczanie zadań i podzadań jako ukończone" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Dodawanie akcentów kolorystycznych dla każdego zadania" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Synchronizacja zadań z Nextcloud lub innymi dostawcami CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "Obsługa funkcji przeciągnij i upuść" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Import zadań z plików .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Widok okna głównego" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Ukończone:" #, fuzzy #~ msgid "Right" #~ msgstr "Jasny" #~ msgid "Menu" #~ msgstr "Menu" #, fuzzy #~ msgid "Clear Style" #~ msgstr "Wyczyść styl" #, fuzzy #~ msgid "Copy Text" #~ msgstr "Kopiuj" #, fuzzy #~ msgid "Complete %" #~ msgstr "Ukończone:" #, fuzzy #~ msgid "Add Tag" #~ msgstr "Dodaj nowe zadanie" #~ msgid "Mark as Completed" #~ msgstr "Oznacz jako ukończone" #~ msgid "Restore All" #~ msgstr "Odzyskaj wszystkie" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "Przełącz pasek boczny" #~ 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" mrvladus-Errands-cbe30b3/po/pt_BR.po000066400000000000000000000472761464651330500174410ustar00rootroot00000000000000# 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 # Gabriel de Moura , 2024 msgid "" msgstr "" "Project-Id-Version: errands\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-17 17:01+0300\n" "PO-Revision-Date: 2024-01-09 09:36-0300\n" "Last-Translator: Gabriel de Moura \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/shared/components/buttons.py:45 msgid "Info" msgstr "Informações" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Tem certeza?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Cancelar" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Nenhum" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Azul" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Verde" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Amarelo" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Laranja" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Vermelho" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Roxo" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Marrom" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Hoje" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Amanhã" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Agora" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Limpar" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Definir Data" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Início / Prazo" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Data" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notas" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Prioridade" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Alta" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Média" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Baixa" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Personalizado" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Sem Etiquetas" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Etiquetas" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Anexos" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Criado:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Alterado:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Mais" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Sem Arquivos Anexados" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Adicionar Anexo" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Abrir Arquivo" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Deletar" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Abrir Pasta contendo o arquivo" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Data e Hora" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Devido" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Iniciar" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Adicionar lista (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Sincronizando..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Adicionar nova lista" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Clique no botão \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Sem listas de tarefas" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Menu principal" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Sincronizar / Buscar tarefas" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Importar Lista de Tarefas" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Preferências" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Atalhos do teclado" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Sobre o Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Sair" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Novo nome da lista" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Adicionar listas" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Adicionar" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Nenhuma etiqueta foi encontrada" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Adicionar novas etiquetas na " #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Adicionar nova Etiqueta" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Exportado" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Copiado para a área de transferência" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Ver Subtarefas" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Ver Progresso" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Ver Barra de Ferramentas" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Editar" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Mover para lixeira" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Copiar para a área de transferência" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Exportar" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Completo" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Adicionar nova sub-tarefa" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Completado:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Apagar Etiqueta" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Ver Tarefas Completas" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Deletar tarefas concluídas" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Rolar para cima" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Adicionar nova tarefa" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Carregando..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "A lista será excluída permanentemente" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Novo nome" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Renomear lista" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Salvar" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Falha na exportação" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Cor" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Renomear" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Nenhuma Tarefa para Hoje" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Lixeira vazia" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Não há itens deletados" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189: #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Restaurar" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Lixeira" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "As tarefas serão excluídas permanentemente" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Barra lateral" #: errands/widgets/window.py:59 msgid "Content" msgstr "Conteúdo" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Sem listas de tarefas" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Criar novo ou importar um existente" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Criar lista" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Criar nova Lista" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "" "Leandro Cunha \n" "Guilherme Berbet \n" "Gabriel de Moura " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "A sincronização está desativada" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Importado" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Tema da aplicação" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistema" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Claro" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Escuro" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Adicionar novas Tarefas" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "No final" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "No topo" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Mostrar notificações" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Executar em Segundo Plano" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Esconder a janela da aplicação ao invés de fechá-la" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Iniciar aplicação na inicialização" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Executar aplicação quando o usuário entrar no sistema" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Notificações e Plano de fundo" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Sincronizar" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Desabilitado" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Provedor de sincronização" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL do servidor" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL precisa incluir o protocolo, como http:// ou https://." "Se estiver com problemas com a conexão, tente alterar o protocolo primeiro." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Nome de usuário" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Senha" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Teste" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Teste de conexão" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Geral" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Conectado" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Autorização falhou" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Não foi possível localizar servidor. Cheque a rede e a URL" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Não é possível conectar" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Não é possível conectar. Cheque as credenciais" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "Não é possível conectar-se ao servidor CalDAV em:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Nova Lista de Tarefas" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Tarefa está pendente" #: errands/application.py:80 msgid "Errands was updated" msgstr "Errands foi atualizado" #: errands/application.py:81 msgid "Restart is required" msgstr "Reinicialização é necessária" #: errands/application.py:84 msgid "Restart" msgstr "Reiniciar" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands precisa ser executado em plano de fundo para as notificações funcionarem" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Mostrar atalhos do teclado" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Listas" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Importar Listas" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Detalhes" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Ver Detalhes" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Aplicativo Todo para quem prefere simplicidade." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Funcionalidades:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Suporte para múltiplas listas de tarefas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Adicione, remova, edite tarefas e subtarefas" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 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:18 msgid "Add accent color for each task" msgstr "Adicione cores de destaque para cada tarefa" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 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:20 msgid "Drag and Drop support" msgstr "Suporte para arrastar e soltar" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Importar arquivo .ics" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Janela Principal" #~ msgid "Not Set" #~ msgstr "Não configurado" #, fuzzy #~ msgid "Click Action" #~ msgstr "Clique no botão \"+\"" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Completado %" #, fuzzy #~ msgid "Details Panel" #~ msgstr "Nenhum Detalhe" #, fuzzy #~ msgid "Right" #~ msgstr "Claro" #~ msgid "More Options" #~ msgstr "Mais opções" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "No Details" #~ msgstr "Nenhum Detalhe" #~ msgid "Click on task to show more info" #~ msgstr "Clique na tarefa para mostrar mais informações" #~ msgid "Clear Style" #~ msgstr "Estilo claro" #~ msgid "Text" #~ msgstr "Texto" #~ msgid "Copy Text" #~ msgstr "Copiar Texto" #~ msgid "Properties" #~ msgstr "Propriedades" #~ msgid "Complete %" #~ msgstr "Completado %" #~ msgid "Add Tag" #~ msgstr "Adicionar Etiquetas" #~ msgid "Save Task as .ics file" #~ msgstr "Salvar tarefa como arquivo .ics" #~ msgid "Mark as Completed" #~ msgstr "Marcar como concluído" #~ msgid "Expand / Fold" #~ msgstr "Expandir / Dobrar" #~ msgid "Restore All" #~ msgstr "Restaurar tudo" #~ 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 "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 "Cancel (Escape)" #~ msgstr "Cancelar (Escapar)" mrvladus-Errands-cbe30b3/po/ru.po000066400000000000000000000462641464651330500170550ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-04-22 18:45+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.4.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "Информация" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Вы уверены?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Отмена" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "Нет" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "Голубой" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "Зеленый" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "Желтый" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "Оранжевый" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "Красный" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "Фиолетовый" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "Коричневый" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Сегодня" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Завтра" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Сейчас" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Очистить" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Задать дату" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "Начало / Конец" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "Дата" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Заметки" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Приоритет" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "Высокий" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "Средний" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "Низкий" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "Настроить" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "Нет меток" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Метки" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "Вложения" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "Создано:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "Изменено:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "Больше" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "Нет вложенных файлов" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "Добавить вложение" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "Открыть файл" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Удалить" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "Открыть папку" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "Дата и время" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Конец" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Начало" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Добавить список (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Синхронизация..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Добавить новый список" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Нажмите на кнопку \"+\"" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "Списки задач" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Дела" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Главное меню" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Синхронизировать задачи" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "Импортировать список" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Параметры" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "О приложении" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Выйти" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Новое имя списка" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Добавить список" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Довавить" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "Меток не найдено" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "Добавьте новые метки выше" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "Добавить метку" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Экспортировано" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Скопировано в буфер обмена" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "Переключить подзадачи" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "Переключить выполнение" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "Переключить панель инструментов" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Редактировать" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Переместить в корзину" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "Скопировать в буфер обмена" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Экспорт" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "Выполнено" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Добавьте подзадачу" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Выполнено:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "Удалить метку" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "Переключить выполненные задачи" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Удалить выполненные задачи" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Прокрутить вверх" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Добавьте задачу" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "Загрузка..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Список будет безвозвратно удален" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Новое имя" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Переименовать список" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Сохранить" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Экспорт не удался" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "Цвет" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Переименовать" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "Нет задач на сегодня" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Корзина пуста" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Нет удаленных задач" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Восстановить" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Корзина" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Задачи будут безвозвратно удалены" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "Боковая панель" #: errands/widgets/window.py:59 msgid "Content" msgstr "Контент" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Нет списков задач" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "Создайте новый или импортируйте существующий" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Создать список" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "Создать новый список" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Vlad Krupinski " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Синхронизация отключена" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Импортировано" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Тема" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Системная" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Светлая" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Темная" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "Добавить задачу" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "Снизу" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "Сверху" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "Показывать уведомления" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "Работать в фоне" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "Прятать окно приложения вместо закрытия" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "Автозапуск" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "Запускать при старте системы" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "Уведомления и работа в фоне" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Синхронизация" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Отключено" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Способ синхронизации" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL сервера" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" "URL должен включать протокол: http:// или https://. Если у вас " "проблемы с соединением - попробуйте изменить протокол." #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Имя пользователя" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Пароль" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Тест" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Тест соединения" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Основные" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Соединено" #: errands/widgets/preferences.py:221 msgid "Authorization failed" msgstr "Экспорт не удался" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "Сервен не найден. Проверьте подключение." #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Соединение не удалось" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "Нет соединенияю. Проверьте данные" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "Не все данные для синхронизации предоставлены. Проверьте настройки." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Невозможно подключиться к CalDAV серверу по адресу:" #: errands/lib/data.py:92 msgid "New Task List" msgstr "Новый список задач" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "Напоминание о задаче" #: errands/application.py:80 msgid "Errands was updated" msgstr "Дела были обновлены" #: errands/application.py:81 msgid "Restart is required" msgstr "Необходим перезапуск приложения" #: errands/application.py:84 msgid "Restart" msgstr "Перезапустить" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "\"Дела\" должны работать в фоновом режиме для уведомлений" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Комбинации клавиш" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Списки" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Импортировать список" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Подробности" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Показать/Скрыть подробности" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "Список задач для тех, кто предпочитает простоту." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Главные функции:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Поддержка нескольких списков" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Добавляйте, удаляйте, редактируйте задачи и подзадачи" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Помечайте задачи как выполненные" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Добавляйте цвета к задачам" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Синхронизируйте задачи с Nextcloud или другими CalDAV провайдерами" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "Поддержка Drag and Drop" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Импорт .ics файлов" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "Вид основного окна" mrvladus-Errands-cbe30b3/po/tr.po000066400000000000000000000455601464651330500170520ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Emin misiniz?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "İptal" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Bugün" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Yarın" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Şimdi" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Temizle" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Tarih Ayarla" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Tarih Ayarla" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Notlar" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Öncelik" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Şimdi" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Etiketler" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Etiketler" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Oluştur" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Sil" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "Tamamlanma" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Başlangıç" #: errands/widgets/sidebar.py:42 #, fuzzy msgid "Add List (Ctrl+Shift+A)" msgstr "Liste Ekle" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Yeni Liste Ekle" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "\"+\" düğmesine tıklayın" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Görev Listesi Yok" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Ana Menü" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Görevleri Eşzamanla/Getir" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Listeyi İçe Aktar" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Tercihler" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Klavye Kısayolları" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Errands Hakkında" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Çık" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Yeni Liste Adı" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Liste Ekle" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Ekle" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Yeni Görev Ekle" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Dışa Aktarıldı" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Panoya Kopyalandı" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Yeni Alt Görev Ekle" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Ayrıntı Yok" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Kenar Çubuğunu Aç/Kapat" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Düzenle" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Çöpe Taşı" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Panoya Kopyalandı" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Dışa Aktar" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Tamamlandı:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Yeni Alt Görev Ekle" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Tamamlandı:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Silinmiş Görevler" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Tamamlanan Görevleri Sil" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Tamamlanan Görevleri Sil" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Yukarı Kaydır" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Yeni Görev Ekle" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Liste kalıcı olarak silinecek" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Yeni Ad" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Listeyi Yeniden Adlandır" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Kaydet" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Dışa aktarılamadı" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Yeniden Adlandır" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Çöpü Boşalt" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Silinmiş öge yok" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Geri Yükle" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Çöpe Taşı" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Görevler kalıcı olarak silinecek" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Kenar Çubuğunu Aç/Kapat" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Görev Listesi Yok" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 #, fuzzy msgid "Create List" msgstr "Listeyi Yeniden Adlandır" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Listeyi Yeniden Adlandır" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "Sabri Ünal " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Eşzamanlama devre dışı" #: errands/widgets/window.py:194 msgid "Imported" msgstr "İçe Aktarıldı" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Uygulama Teması" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Sistem" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Açık" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Koyu" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Yeni Görev Ekle" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Eşzamanla" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Devre dışı" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Eşzamanlama Sağlayıcı" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "Sunucu URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Kullanıcı adı" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Parola" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Sına" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Bağlantıyı Sına" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Genel" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "Bağlandı" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Dışa aktarılamadı" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Bağlanamadı" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 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:110 msgid "Can't connect to CalDAV server at:" msgstr "CalDAV sunucusuna bağlanılamıyor:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Görev Listesi Yok" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Görevler" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Geri Yükle" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Klavye kısayollarını göster" #: data/resources/gtk/help-overlay.ui:53 #, fuzzy msgid "Lists" msgstr "Liste Ekle" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Listeyi İçe Aktar" #: data/resources/gtk/help-overlay.ui:75 #, fuzzy msgid "Details" msgstr "Ayrıntı Yok" #: data/resources/gtk/help-overlay.ui:79 #, 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:7 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:12 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:13 msgid "Features:" msgstr "Özellikler:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Çoklu görev listesi desteği" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 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:17 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:18 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:19 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:20 msgid "Drag and Drop support" msgstr "Sürükle ve Bırak desteği" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr ".ics dosyalarını içe aktarma" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Ayarlanmadı" #, fuzzy #~ msgid "Click Action" #~ msgstr "\"+\" düğmesine tıklayın" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "Tamamlanma Yüzdesi" #, fuzzy #~ msgid "Details Panel" #~ msgstr "Ayrıntı Yok" #, fuzzy #~ msgid "Right" #~ msgstr "Açık" #~ msgid "More Options" #~ msgstr "Daha Çok Seçenek" #~ msgid "Menu" #~ msgstr "Menü" #~ msgid "No Details" #~ msgstr "Ayrıntı Yok" #~ msgid "Click on task to show more info" #~ msgstr "Daha fazla bilgi için göreve tıklayın" #~ msgid "Clear Style" #~ msgstr "Biçemi Temizle" #~ msgid "Text" #~ msgstr "Metin" #~ msgid "Copy Text" #~ msgstr "Metni Kopyala" #~ msgid "Properties" #~ msgstr "Özellikler" #~ msgid "Complete %" #~ msgstr "Tamamlanma Yüzdesi" #~ msgid "Add Tag" #~ msgstr "Etiket Ekle" #~ msgid "Save Task as .ics file" #~ msgstr "Görevi .ics dosyası olarak kaydet" #~ msgid "Mark as Completed" #~ msgstr "Tamamlanmadı Olarak İmle" #~ msgid "Expand / Fold" #~ msgstr "Genişlet / Katla" #~ msgid "Restore All" #~ msgstr "Tümünü Geri Yükle" #~ 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 "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 "Cancel (Escape)" #~ msgstr "İptal (Esc)" mrvladus-Errands-cbe30b3/po/uk.po000066400000000000000000000533341464651330500170420ustar00rootroot00000000000000# 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: \n" "POT-Creation-Date: 2024-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "Ви впевнені?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "Скасувати" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "Сьогодні" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "Завтра" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "Зараз" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "Очистити" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "Встановити дату" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 #, fuzzy msgid "Date" msgstr "Встановити дату" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "Примітки" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "Пріоритет" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 #, fuzzy msgid "Low" msgstr "Зараз" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 #, fuzzy msgid "No Tags" msgstr "Теги" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "Теги" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "Створити" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "Видалити" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "До" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "Розпочати" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "Додати список (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "Синхронізація…" #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "Додати новий список" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "Натисніть на \"+\" кнопку" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "Немає списків із задачами" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "Головне меню" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "Синхронізувати / отримати задачі" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "Імпортувати список" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "Налаштування" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "Клавіатурні скорочення" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "Про Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "Вийти" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "Назва нового списку" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "Додати список" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "Додати" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "Додати нову задачу" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "Експортовано" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "Скопійовано в буфер обміну" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "Показати підзадачі" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "Перемкнути подробиці" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "Показати / сховати бічну панель" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "Редагувати" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "Пересунути у смітник" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "Скопійовано в буфер обміну" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "Експортувати" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "Завершено:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "Додати нову підзадачу" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "Завершено:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "Видалені задачі" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "Видалити завершені задачі" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "Видалити завершені задачі" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "Прокрутити вгору" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "Додати нову задачу" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "Синхронізація…" #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "Список буде видалено назавжди" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "Нова назва" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "Перейменувати список" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "Зберегти" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "Не вдалося експортувати" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "Перейменувати" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "Смітник порожній" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "Немає видалених задач" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "Відновити" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "Видалити" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "Задачі будуть видалені назавжди" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "Показати / сховати бічну панель" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "Немає списків із задачами" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 msgid "Create List" msgstr "Створити список" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "Створити список" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "volkov " #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "Синхронізація вимкнена" #: errands/widgets/window.py:194 msgid "Imported" msgstr "Імпортовано" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "Стиль додатку" #: errands/widgets/preferences.py:34 msgid "System" msgstr "Використовувати системний стиль" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "Світлий стиль" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "Темний стиль" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "Додати нову задачу" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "Сінхронізація" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "Немає / Вимкнено" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "Постачальник синхронізації" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "URL-адреса сервера" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "Ім'я користувача" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "Пароль" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "Протестувати" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "Протестувати з'єднання" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "Загальні" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "З'єднаний" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "Не вдалося експортувати" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "Не вдалося з'єднатися" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "" "Надано не всі облікові дані синхронізації. Будь ласка, перевірте " "налаштування." #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "Не вдалося з'єднатися з CalDAV сервером за адресою:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "Немає списків із задачами" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "Задачі" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "Відновити" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "Показати клавіатурні скорочення" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "Списки" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "Імпортувати список" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "Подробиці" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "Перемкнути подробиці" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "" "Додаток для керуваннями списками справ для тих хто віддає перевагу простоті." #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "Можливості:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "Підтримка кількох списків задач" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "Додавання, видалення і редагування для задач і підзадач" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "Позначити задачу і підзадачу як завершену" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "Додавання акцентованих кольорів для кожної задачі" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "Синхронізація з Nextcloud та іншими постачальниками CalDAV" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "Підтримка перетягування до вікна" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "Імпортуват .ics файлів" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Not Set" #~ msgstr "Не встановлено" #~ msgid "Click Action" #~ msgstr "Дія при натисканні" #~ msgid "Open Details Panel" #~ msgstr "Відкрити панель подробиць" #~ msgid "Complete Button Size" #~ msgstr "Розмір кнопки завершеності задачі" #~ msgid "Small" #~ msgstr "Маленький" #~ msgid "Big" #~ msgstr "Великий" #~ msgid "Progress Bar" #~ msgstr "Індикатор виконання" #~ msgid "Tool Bar" #~ msgstr "Панель інструменту" #~ msgid "Details Panel" #~ msgstr "Панель подробиць" #~ msgid "Position" #~ msgstr "Розташування" #~ msgid "Left" #~ msgstr "Зліва" #~ msgid "Right" #~ msgstr "Справа" #~ msgid "Appearance" #~ msgstr "Зовнішній вигляд" #~ msgid "More Options" #~ msgstr "Більше опцій" #~ msgid "Menu" #~ msgstr "Меню" #~ msgid "No Details" #~ msgstr "Немає подробиць" #~ msgid "Click on task to show more info" #~ msgstr "Клацніть на задачу щоб побачити більше інформації" #~ msgid "Clear Style" #~ msgstr "Очистити стиль" #~ msgid "Text" #~ msgstr "Текст" #~ msgid "Copy Text" #~ msgstr "Скопіювати текст" #~ msgid "Properties" #~ msgstr "Властивості" #~ msgid "Complete %" #~ msgstr "Відсоток завершення %" #~ msgid "Add Tag" #~ msgstr "Додати тег" #~ msgid "Save Task as .ics file" #~ msgstr "Зберегти задачу як .ics файл" #~ msgid "Mark as Completed" #~ msgstr "Позначити як завершене" #~ msgid "Expand / Fold" #~ msgstr "Розкрити / сховати" #~ msgid "Restore All" #~ 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 "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 "Cancel (Escape)" #~ msgstr "Скасувати (Escape)" mrvladus-Errands-cbe30b3/po/zh_CN.po000066400000000000000000000404641464651330500174240ustar00rootroot00000000000000# 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-05-17 17:01+0300\n" "PO-Revision-Date: 2024-05-02 14:46+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.2\n" #: errands/widgets/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "您确定吗?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "取消" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "无" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "蓝色" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "绿色" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "黄色" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "橙色" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "红色" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "紫色" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "棕色" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "今天" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "明天" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "现在" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "清除" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "设置日期" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "开始/截止日期" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "日期" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "备注" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "优先级" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "高" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "中" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "低" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "自定义" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "没有标签" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "标签" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 msgid "Created:" msgstr "创建时间:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "修改时间:" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "更多" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "删除" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "日期和时间" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "截止" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "开始" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "添加列表 (Ctrl+Shift+A)" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "同步中..." #: errands/widgets/sidebar.py:67 msgid "Add new List" msgstr "添加新列表" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "点击 “+” 按钮" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 msgid "Task Lists" msgstr "任务列表" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "Errands" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "主菜单" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 msgid "Sync / Fetch Tasks" msgstr "同步/获取任务" #: errands/widgets/sidebar.py:128 msgid "Import Task List" msgstr "导入任务列表" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "偏好设置" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "键盘快捷方式" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "关于 Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "退出" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "新列表名称" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "添加列表" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "添加" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "未找到标签" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "在上方输入框中添加新标签" #: errands/widgets/tags/tags.py:82 msgid "Add new Tag" msgstr "添加新标签" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 msgid "Exported" msgstr "已导出" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "已复制到剪贴板" #: errands/widgets/task.py:153 msgid "Toggle Sub-Tasks" msgstr "切换子任务" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 msgid "Toggle Completion" msgstr "切换完成状态" #: errands/widgets/task.py:191 msgid "Toggle Toolbar" msgstr "切换工具栏" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "编辑" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "移动到回收站" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 msgid "Copy to Clipboard" msgstr "复制到剪贴板" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 msgid "Export" msgstr "导出" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 msgid "Completed" msgstr "已完成" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "添加新子任务" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "已完成:" #: errands/widgets/task.py:921 msgid "Delete Tag" msgstr "删除标签" #: errands/widgets/task_list/task_list.py:50 msgid "Toggle Completed Tasks" msgstr "显示/不显示 已完成的任务" #: errands/widgets/task_list/task_list.py:58 msgid "Delete Completed Tasks" msgstr "删除已完成的任务" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "向上滚动" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "添加新任务" #: errands/widgets/task_list/task_list.py:156 #, fuzzy msgid "Loading..." msgstr "同步中..." #: errands/widgets/task_list/task_list_sidebar_row.py:59 msgid "List will be permanently deleted" msgstr "列表将被永久删除" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "新名称" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "重命名列表" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "保存" #: errands/widgets/task_list/task_list_sidebar_row.py:123 msgid "Export failed" msgstr "导出失败" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 msgid "Rename" msgstr "重命名" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "今天没有任务" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "清空垃圾桶" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "无已删除项目" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "恢复" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 msgid "Trash" msgstr "回收站" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "任务将被永久删除" #: errands/widgets/window.py:56 msgid "Sidebar" msgstr "侧边栏" #: errands/widgets/window.py:59 msgid "Content" msgstr "内容" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "没有任务列表" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "创建新的或导入现有的" #: errands/widgets/window.py:95 msgid "Create List" msgstr "创建列表" #: errands/widgets/window.py:104 msgid "Create new List" msgstr "创建新列表" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "翻译者名单" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "同步已禁用" #: errands/widgets/window.py:194 msgid "Imported" msgstr "已导入" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "应用主题" #: errands/widgets/preferences.py:34 msgid "System" msgstr "系统" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "浅色" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "深色" #: errands/widgets/preferences.py:70 msgid "Add new Tasks" msgstr "添加新任务" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "在底部" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "在顶部" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "显示通知" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 #, fuzzy msgid "Notifications and Background" msgstr "通知" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同步" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "已禁用" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "同步提供者" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "服务器 URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "用户名" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "密码" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "测试" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "测试连接" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "通用" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "已连接" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "导出失败" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "无法连接" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "未提供所有同步凭据。请检查设置。" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "无法连接到 CalDAV 服务器:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "没有任务列表" #: errands/lib/notifications.py:75 msgid "Task is Due" msgstr "任务已到期" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "恢复" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "Errands 需要在后台运行以提供通知功能" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "显示键盘快捷键" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "列表" #: data/resources/gtk/help-overlay.ui:64 msgid "Import List" msgstr "导入列表" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "详情" #: data/resources/gtk/help-overlay.ui:79 msgid "Toggle Details" msgstr "切换详情" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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;任务;列表;待办;todos;日历;nextcloud;同步;" #: data/io.github.mrvladus.List.metainfo.xml.in.in:12 msgid "Todo application for those who prefer simplicity." msgstr "适合喜欢简洁的人的待办事项应用。" #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "支持多任务列表" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "添加、移除、编辑任务和子任务" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "将任务和子任务标记为完成" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "为每个任务添加强调色" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "与 Nextcloud 或其他 CalDAV 提供者同步任务" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "支持拖放操作" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 msgid "Import .ics files" msgstr "导入 .ics 文件" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #~ msgid "Menu" #~ msgstr "菜单" #~ msgid "Mark as Completed" #~ msgstr "标注为已完成" #~ msgid "Restore All" #~ msgstr "全部恢复" mrvladus-Errands-cbe30b3/po/zh_TW.po000066400000000000000000000426441464651330500174600ustar00rootroot00000000000000# 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-05-17 17:01+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/shared/components/buttons.py:45 msgid "Info" msgstr "" #: errands/widgets/shared/components/dialogs.py:31 msgid "Are you sure?" msgstr "您確定嗎?" #: errands/widgets/shared/components/dialogs.py:35 #: errands/widgets/sidebar.py:300 errands/widgets/task.py:246 #: errands/widgets/task_list/task_list_sidebar_row.py:99 #: errands/widgets/today/today_task.py:146 msgid "Cancel" msgstr "取消" #: errands/widgets/shared/color_selector.py:32 #: errands/widgets/shared/task_toolbar/toolbar.py:100 msgid "None" msgstr "" #: errands/widgets/shared/color_selector.py:41 msgid "Blue" msgstr "" #: errands/widgets/shared/color_selector.py:50 msgid "Green" msgstr "" #: errands/widgets/shared/color_selector.py:61 msgid "Yellow" msgstr "" #: errands/widgets/shared/color_selector.py:72 msgid "Orange" msgstr "" #: errands/widgets/shared/color_selector.py:81 msgid "Red" msgstr "" #: errands/widgets/shared/color_selector.py:92 msgid "Purple" msgstr "" #: errands/widgets/shared/color_selector.py:101 msgid "Brown" msgstr "" #: errands/widgets/shared/datetime_picker.py:138 #: errands/widgets/today/today.py:57 #: errands/widgets/today/today_sidebar_row.py:30 errands/widgets/window.py:67 msgid "Today" msgstr "" #: errands/widgets/shared/datetime_picker.py:143 msgid "Tomorrow" msgstr "" #: errands/widgets/shared/datetime_picker.py:154 msgid "Now" msgstr "" #: errands/widgets/shared/datetime_picker.py:160 #: errands/widgets/trash/trash.py:40 #: errands/widgets/trash/trash_sidebar_row.py:64 msgid "Clear" msgstr "清除" #: errands/widgets/shared/datetime_picker.py:210 msgid "Set Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:44 msgid "Start / Due Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:49 errands/lib/utils.py:20 msgid "Date" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:59 #: errands/widgets/shared/task_toolbar/notes_window.py:29 msgid "Notes" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:72 msgid "Priority" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:90 msgid "High" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:94 msgid "Medium" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:98 msgid "Low" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:103 msgid "Custom" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:113 msgid "No Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:134 #: errands/widgets/tags/tags.py:63 errands/widgets/tags/tags_sidebar_row.py:32 #: errands/widgets/window.py:72 msgid "Tags" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:157 #: errands/widgets/shared/task_toolbar/attachments_window.py:30 msgid "Attachments" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:191 #: errands/widgets/shared/task_toolbar/toolbar.py:294 #, fuzzy msgid "Created:" msgstr "已完成:" #: errands/widgets/shared/task_toolbar/toolbar.py:202 #: errands/widgets/shared/task_toolbar/toolbar.py:295 msgid "Changed:" msgstr "" #: errands/widgets/shared/task_toolbar/toolbar.py:215 msgid "More" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:33 msgid "No Files Attached" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:56 msgid "Add Attachment" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:119 msgid "Open File" msgstr "" #: errands/widgets/shared/task_toolbar/attachments_window.py:123 #: errands/widgets/tags/tags.py:140 #: errands/widgets/task_list/task_list_sidebar_row.py:60 #: errands/widgets/task_list/task_list_sidebar_row.py:187 #: errands/widgets/trash/trash.py:159 msgid "Delete" msgstr "刪除" #: errands/widgets/shared/task_toolbar/attachments_window.py:132 msgid "Open Containing Folder" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:29 msgid "Date and Time" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:39 #: errands/widgets/shared/task_toolbar/datetime_window.py:41 msgid "Due" msgstr "" #: errands/widgets/shared/task_toolbar/datetime_window.py:54 #: errands/widgets/shared/task_toolbar/datetime_window.py:56 msgid "Start" msgstr "" #: errands/widgets/sidebar.py:42 msgid "Add List (Ctrl+Shift+A)" msgstr "" #: errands/widgets/sidebar.py:61 msgid "Syncing..." msgstr "" #: errands/widgets/sidebar.py:67 #, fuzzy msgid "Add new List" msgstr "新增待辦事項" #: errands/widgets/sidebar.py:68 msgid "Click \"+\" button" msgstr "" #. Task lists group #: errands/widgets/sidebar.py:94 errands/widgets/preferences.py:66 #, fuzzy msgid "Task Lists" msgstr "待辦事項" #: errands/widgets/sidebar.py:106 errands/widgets/window.py:43 #: errands/widgets/window.py:148 data/io.github.mrvladus.List.desktop.in.in:3 #: data/io.github.mrvladus.List.metainfo.xml.in.in:6 msgid "Errands" msgstr "" #: errands/widgets/sidebar.py:114 msgid "Main Menu" msgstr "主選單" #: errands/widgets/sidebar.py:121 data/resources/gtk/help-overlay.ui:42 #, fuzzy msgid "Sync / Fetch Tasks" msgstr "同步待辦事項" #: errands/widgets/sidebar.py:128 #, fuzzy msgid "Import Task List" msgstr "匯入待辦事項" #: errands/widgets/sidebar.py:135 data/resources/gtk/help-overlay.ui:20 msgid "Preferences" msgstr "偏好設定" #: errands/widgets/sidebar.py:138 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" #: errands/widgets/sidebar.py:142 msgid "About Errands" msgstr "關於 Errands" #: errands/widgets/sidebar.py:144 data/resources/gtk/help-overlay.ui:27 msgid "Quit" msgstr "離開" #: errands/widgets/sidebar.py:291 msgid "New List Name" msgstr "" #: errands/widgets/sidebar.py:295 data/resources/gtk/help-overlay.ui:57 msgid "Add List" msgstr "" #: errands/widgets/sidebar.py:301 msgid "Add" msgstr "" #: errands/widgets/tags/tags.py:32 msgid "No Tags Found" msgstr "" #: errands/widgets/tags/tags.py:33 msgid "Add new Tags in the entry above" msgstr "" #: errands/widgets/tags/tags.py:82 #, fuzzy msgid "Add new Tag" msgstr "新增待辦事項" #: errands/widgets/task.py:79 #: errands/widgets/task_list/task_list_sidebar_row.py:125 #: errands/widgets/today/today_task.py:73 #, fuzzy msgid "Exported" msgstr "待辦事項已匯入" #: errands/widgets/task.py:87 errands/widgets/today/today_task.py:81 msgid "Copied to Clipboard" msgstr "已複製到剪貼簿" #: errands/widgets/task.py:153 #, fuzzy msgid "Toggle Sub-Tasks" msgstr "新增子項目" #: errands/widgets/task.py:161 errands/widgets/today/today_task.py:100 #, fuzzy msgid "Toggle Completion" msgstr "側選單開關" #: errands/widgets/task.py:191 #, fuzzy msgid "Toggle Toolbar" msgstr "側選單開關" #: errands/widgets/task.py:206 errands/widgets/task.py:226 #: errands/widgets/today/today_task.py:117 #: errands/widgets/today/today_task.py:127 msgid "Edit" msgstr "編輯" #: errands/widgets/task.py:207 errands/widgets/today/today_task.py:118 msgid "Move to Trash" msgstr "移到垃圾桶" #: errands/widgets/task.py:208 errands/widgets/today/today_task.py:119 #, fuzzy msgid "Copy to Clipboard" msgstr "已複製到剪貼簿" #: errands/widgets/task.py:209 #: errands/widgets/task_list/task_list_sidebar_row.py:188 #: errands/widgets/today/today_task.py:120 #, fuzzy msgid "Export" msgstr "匯出待辦事項" #: errands/widgets/task.py:299 errands/widgets/task_list/task_list.py:84 #, fuzzy msgid "Completed" msgstr "已完成:" #: errands/widgets/task.py:323 msgid "Add new Sub-Task" msgstr "新增子項目" #: errands/widgets/task.py:534 errands/widgets/task_list/task_list.py:246 msgid "Completed:" msgstr "已完成:" #: errands/widgets/task.py:921 #, fuzzy msgid "Delete Tag" msgstr "已刪除的待辦事項" #: errands/widgets/task_list/task_list.py:50 #, fuzzy msgid "Toggle Completed Tasks" msgstr "刪除已完成事項" #: errands/widgets/task_list/task_list.py:58 #, fuzzy msgid "Delete Completed Tasks" msgstr "刪除已完成事項" #: errands/widgets/task_list/task_list.py:73 msgid "Scroll Up" msgstr "往上捲動" #: errands/widgets/task_list/task_list.py:144 msgid "Add new Task" msgstr "新增待辦事項" #: errands/widgets/task_list/task_list.py:156 msgid "Loading..." msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:59 #, fuzzy msgid "List will be permanently deleted" msgstr "待辦事項將會永久刪除" #: errands/widgets/task_list/task_list_sidebar_row.py:89 msgid "New Name" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:94 msgid "Rename List" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:100 msgid "Save" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:123 #, fuzzy msgid "Export failed" msgstr "待辦事項已匯入" #: errands/widgets/task_list/task_list_sidebar_row.py:158 msgid "Color" msgstr "" #: errands/widgets/task_list/task_list_sidebar_row.py:186 #, fuzzy msgid "Rename" msgstr "帳號" #: errands/widgets/today/today.py:31 msgid "No Tasks for Today" msgstr "" #: errands/widgets/trash/trash.py:31 msgid "Empty Trash" msgstr "清空垃圾桶" #: errands/widgets/trash/trash.py:32 msgid "No deleted items" msgstr "沒有已刪除的項目" #: errands/widgets/trash/trash.py:55 errands/widgets/trash/trash.py:189 #: errands/widgets/trash/trash_sidebar_row.py:65 msgid "Restore" msgstr "還原" #: errands/widgets/trash/trash.py:89 #: errands/widgets/trash/trash_sidebar_row.py:43 errands/widgets/window.py:77 #, fuzzy msgid "Trash" msgstr "關閉垃圾桶" #: errands/widgets/trash/trash.py:158 msgid "Tasks will be permanently deleted" msgstr "待辦事項將會永久刪除" #: errands/widgets/window.py:56 #, fuzzy msgid "Sidebar" msgstr "側選單開關" #: errands/widgets/window.py:59 msgid "Content" msgstr "" #: errands/widgets/window.py:90 msgid "No Task Lists" msgstr "" #: errands/widgets/window.py:91 msgid "Create new or import existing one" msgstr "" #: errands/widgets/window.py:95 #, fuzzy msgid "Create List" msgstr "匯入待辦事項" #: errands/widgets/window.py:104 #, fuzzy msgid "Create new List" msgstr "匯入待辦事項" #: errands/widgets/window.py:153 msgid "translator-credits" msgstr "翻譯者名單" #: errands/widgets/window.py:159 msgid "Sync is disabled" msgstr "" #: errands/widgets/window.py:194 #, fuzzy msgid "Imported" msgstr "待辦事項已匯入" #: errands/widgets/preferences.py:26 msgid "Application Theme" msgstr "主題風格" #: errands/widgets/preferences.py:34 msgid "System" msgstr "跟隨系統配色" #: errands/widgets/preferences.py:46 msgid "Light" msgstr "亮色" #: errands/widgets/preferences.py:58 msgid "Dark" msgstr "暗色" #: errands/widgets/preferences.py:70 #, fuzzy msgid "Add new Tasks" msgstr "新增待辦事項" #: errands/widgets/preferences.py:71 msgid "At the Bottom" msgstr "" #: errands/widgets/preferences.py:71 msgid "At the Top" msgstr "" #: errands/widgets/preferences.py:87 msgid "Show Notifications" msgstr "" #: errands/widgets/preferences.py:94 msgid "Run in Background" msgstr "" #: errands/widgets/preferences.py:95 msgid "Hide the application window instead of closing it" msgstr "" #: errands/widgets/preferences.py:102 msgid "Launch on Startup" msgstr "" #: errands/widgets/preferences.py:103 msgid "Launch application when user logs in" msgstr "" #: errands/widgets/preferences.py:112 msgid "Notifications and Background" msgstr "" #: errands/widgets/preferences.py:120 errands/widgets/preferences.py:181 #: data/resources/gtk/help-overlay.ui:38 msgid "Sync" msgstr "同步" #. Provider #: errands/widgets/preferences.py:123 msgid "Disabled" msgstr "關閉" #: errands/widgets/preferences.py:125 msgid "Sync Provider" msgstr "同步服務" #: errands/widgets/preferences.py:134 msgid "Server URL" msgstr "伺服器 URL" #: errands/widgets/preferences.py:140 msgid "" "URL needs to include protocol, like http:// or https://. If " "you have problems with connection - try to change protocol first." msgstr "" #: errands/widgets/preferences.py:147 msgid "Username" msgstr "帳號" #: errands/widgets/preferences.py:153 msgid "Password" msgstr "密碼" #: errands/widgets/preferences.py:159 msgid "Test" msgstr "測試" #: errands/widgets/preferences.py:164 msgid "Test Connection" msgstr "測試連線" #: errands/widgets/preferences.py:172 data/resources/gtk/help-overlay.ui:9 msgid "General" msgstr "一般功能" #: errands/widgets/preferences.py:217 msgid "Connected" msgstr "" #: errands/widgets/preferences.py:221 #, fuzzy msgid "Authorization failed" msgstr "待辦事項已匯入" #: errands/widgets/preferences.py:223 msgid "Could not locate server. Check network and url." msgstr "" #: errands/widgets/preferences.py:225 msgid "Can't connect" msgstr "" #. NOTE: Also catches invalid credentials #: errands/widgets/preferences.py:227 msgid "Can't connect. Check credentials" msgstr "" #: errands/lib/sync/providers/caldav.py:66 msgid "Not all sync credentials provided. Please check settings." msgstr "沒有提供全部的驗證資訊。請檢查設定值。" #: errands/lib/sync/providers/caldav.py:110 msgid "Can't connect to CalDAV server at:" msgstr "無法連線到以下的 CalDAV 伺服器:" #: errands/lib/data.py:92 #, fuzzy msgid "New Task List" msgstr "待辦事項" #: errands/lib/notifications.py:75 #, fuzzy msgid "Task is Due" msgstr "待辦事項" #: errands/application.py:80 msgid "Errands was updated" msgstr "" #: errands/application.py:81 msgid "Restart is required" msgstr "" #: errands/application.py:84 #, fuzzy msgid "Restart" msgstr "還原" #: errands/application.py:113 msgid "Errands need to run in the background for notifications" msgstr "" #: data/resources/gtk/help-overlay.ui:13 msgid "Show keyboard shortcuts" msgstr "顯示鍵盤快捷鍵" #: data/resources/gtk/help-overlay.ui:53 msgid "Lists" msgstr "" #: data/resources/gtk/help-overlay.ui:64 #, fuzzy msgid "Import List" msgstr "匯入待辦事項" #: data/resources/gtk/help-overlay.ui:75 msgid "Details" msgstr "" #: data/resources/gtk/help-overlay.ui:79 #, fuzzy msgid "Toggle Details" msgstr "側選單開關" #: data/io.github.mrvladus.List.desktop.in.in:4 #: data/io.github.mrvladus.List.metainfo.xml.in.in:7 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:12 msgid "Todo application for those who prefer simplicity." msgstr "為簡潔而生的待辦事項軟體" #: data/io.github.mrvladus.List.metainfo.xml.in.in:13 msgid "Features:" msgstr "功能:" #: data/io.github.mrvladus.List.metainfo.xml.in.in:15 msgid "Multiple task lists support" msgstr "" #: data/io.github.mrvladus.List.metainfo.xml.in.in:16 msgid "Add, remove, edit tasks and sub-tasks" msgstr "新增、移除、編輯待辦事項和子項目" #: data/io.github.mrvladus.List.metainfo.xml.in.in:17 msgid "Mark task and sub-tasks as completed" msgstr "把待辦事項和子項目標記爲已完成" #: data/io.github.mrvladus.List.metainfo.xml.in.in:18 msgid "Add accent color for each task" msgstr "為每個待辦事項新增強調色" #: data/io.github.mrvladus.List.metainfo.xml.in.in:19 msgid "Sync tasks with Nextcloud or other CalDAV providers" msgstr "透過 Nextcloud 或其他 CalDAV 服務同步待辦事項" #: data/io.github.mrvladus.List.metainfo.xml.in.in:20 msgid "Drag and Drop support" msgstr "支援拖拉" #: data/io.github.mrvladus.List.metainfo.xml.in.in:21 #, fuzzy msgid "Import .ics files" msgstr "匯入待辦事項" #: data/io.github.mrvladus.List.metainfo.xml.in.in:41 msgid "Main Window View" msgstr "" #, fuzzy #~ msgid "Complete Button Size" #~ msgstr "已完成:" #, fuzzy #~ msgid "Right" #~ msgstr "亮色" #~ msgid "Menu" #~ msgstr "選單" #, fuzzy #~ msgid "Clear Style" #~ msgstr "移除顏色" #, fuzzy #~ msgid "Copy Text" #~ msgstr "複製" #, fuzzy #~ msgid "Complete %" #~ msgstr "已完成:" #, fuzzy #~ msgid "Add Tag" #~ msgstr "新增待辦事項" #~ msgid "Mark as Completed" #~ msgstr "標註爲完成" #~ msgid "Restore All" #~ msgstr "全部復原" #, fuzzy #~ msgid "Toggle sidebar" #~ msgstr "側選單開關" #~ msgid "Export Cancelled" #~ msgstr "匯出已取消" #~ msgid "Error" #~ msgstr "發生錯誤" #~ msgid "Import Cancelled" #~ msgstr "匯入已取消" #~ msgid "Invalid File" #~ 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 "Cancel (Escape)" #~ msgstr "取消 (ESC)" mrvladus-Errands-cbe30b3/pyproject.toml000066400000000000000000000004031464651330500203460ustar00rootroot00000000000000[tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ ".git", ".ruff_cache", ".venv", ".vscode", "_build", "venv", ".venv", ] [tool.ruff.lint] ignore = ["F821"] [tool.pyright] venvPath = "." venv = ".venv" mrvladus-Errands-cbe30b3/screenshots/000077500000000000000000000000001464651330500177755ustar00rootroot00000000000000mrvladus-Errands-cbe30b3/screenshots/main.png000066400000000000000000001771031464651330500214400ustar00rootroot00000000000000PNG  IHDRb6%sBIT|dtEXtSoftwaregnome-screenshot>.iTXtCreation TimeСб 18 мая 2024 13:18:00ߵe IDATxyxSeoN֦MwbiK[@6ADV@QD( ;:" x+\EAVAֲ ^@JiR-Mf9'3iHDDDDDDDFLQ8ijwC܅+mm]ALs$54Ulc dd˴i XBRqkx8D)Ós =WL.Q]"V\y!CfHv{H{ dddDDDDD{oiӎ PĺkE\2u/C@ Ɔ%5 v(Dω `""""P(~mfWօ1K#> c6΂fxxxRc܅0hF?w{wv0DDDDDDD>`ە:u}ԩ|?o컼ƴ4_hɱ Oˋ|M-:0DDDDDDD׮].a4uƒh$3ZxڏƆ0KXʕ+uTtyܹs3h\ '\+b}wi$Qԭ圲E]pa$Ii bOs爩lfiT*Z-"""|z""""PQ[[MttKNĈuK^ۛ3.sb^L.k&W_}5! Q%"***P]]l6QQQQ}~>""""`|2 '\qhIYJ0556̹ry͵^VB\UU_W6 UUU~?/Q+))AIIIQ?~кIB;W'>*hEqM\j'&jjjj8l6pd§~͛7Ƅ Я_? 6 zk֬ tWa2p֯_ﳿǏѣGaĴl`ݓ(8%$$)\ +_<uzghmnVdw4Unnne(D@w!(@Dm$I6m,Y  hPNldggCՆD̙Ç#??/#" U*^Z) VMf65ո-wp?nODmT0|>QuaF߾}pB(d XA>(0ͰZEܶ @TBVCBT6V3$)ppqڊV:iHSR[']|<Q?pV6V ,-[`0f<~Il2_gϞEff&~a fذa ܹ7njX~|nBDDn ł1c`ҤIcL&,X;v`0o1nܸzϣ\c|(((@dd$233ka޼yӟT*sNGDo(d25X-I$IjdV^oU cە|gw;ݷl,Ð אy_0DDDu:+?`ѢE(((下/b֭HMMEyy9,YR/P?>{=T* 8G)Spz,[ ?3J_ǎ;<>ժUm6t_ƪU4i+%%%xq3C ADD n!C`ĉ^9'/֢ܣ!f娭F\fa]>Ԃjh׿~ů]`0 ''#F1~xt+KmmmkC.:%o{$aF ;jΐ[@W45Csf>|/OAD~dٰh"<oPTTZ֢_5{1{~7h0s7[(4) 8f[o8Ur#?l6CP4!aIs+G`Zzmx"66+VqM6(qe4/x9ǻ.;hn78Y/HCX]+Qxp1&^}v̚5 ǏݝprӦM^'l6f̘@[oŰaÐUlٲk׮7|b̚5/ٵkEDjرc֭&'$$4LB逸FAnn.v;:w\ؓ'O {deey|'xꩧV?=w1ydL<-?{{AUUWIDMިqצ`hÐ$07ݠ7li*d0AnРAry `ڲЮ];رc]vE׮]q7㥗^?%Kk?9L<{nL:HOOdѣGw}w A &K.ضm4 |Kӟ޽{cǎP(آcsի~g<lvꫯBofy/ꫯFdd$lԩ|uakk(KT{lnJJP8TAKSB1 = @WDaa!֬YF6qW^yO?4V^[oկs4wҷ~>QpKKKرcw^9r G;v,nf3{l,Z;wDnn.zɓ'_70::ݻwG^^.2<._oߏ(vmP4u&!ՊxlܸHNNƔ)S0h .:z(v؁UVG׮][|fȑѣ^z%u͞=?3֯_hۭC!F뮻)))Xn`g͚e˖7JKK!C%j6lt:vՊn &Li2{!//nC]va(**^GFF^|֔QX~=$I¨Q av;f3p-`ժUذa&M䷾ry*##_=QЯ_KDFFbڴiM/::Zq>}\ҿy%#Xr%;k9-[hywiXF_~1VC222p!L>o ^x#--Um'@PW*ilFִ% oVI={w!߸q#P+vF]v!==ݻwǁ_@V+^v-RRR~ ˗/G׮]1`ܹsN:!)) {Y/lf aď?-AڐjoRw 6 VN S""Qo۶ p>DDԖ559s0m48qӧOB@AA1{VL[46Pt|8D_\ˀJe W\q%u'ȷϜ9c޽Y裏V'࣏>O?ԩSERR.\JEaʕcapW`ĉ~5Td Ñ>}[nw Z-0ǎÌ3!*aJDDzj|ի?{b޽{FDp$5?11͓7w\$''m~ Ƌqb_7:GVu¸~|8t.^ݎ/;&&&Fq| JXzU/ܹ3 oߎ }݇V Μ9e˖СCxg1k,98p P7L uZRRDZ-// OI㪫qY(DGGl6cʕHHH=܃<"" *Dj7g$Mʙ3׃~wkhk%%%2e "##sOmS111Xd +ر999ضmy\~<ڵk"/G߾}OxX/"cܹ /((@^h"Ν;#?cZn 7B Vc(**ċc޼ykj3E\a61`Gf5 ݻwˡ̱c.9.!!<-[cB$8pkυo߾~A6rHL:QQQ0p"x/ <Vjpɓq deesr@IDDDD7?F1c̛7CZZ-m£"&Ӳu^6m%ۚFXv-V+<ԕ5WVVz쉃'@FFrrrs ̙3}^'Fok׮7ߌ,7vi|[J7|_n$I&IX,M.QHDDDDmZntu|dggcr˼y0c 7ٶHM €dzw޸fl޼\s RSSqڙ9s&,X~ j3g… VqqqP]]$<߿Gi Bqތ vmXj^z%+r*??3g΄f]wr~n҂ -G[ooDD͵pBh*,,1j((Z-L&Sׯ_ɶ8,ZYmS]MɺwWps}kEY69_JKKw9&&Ct@1pYml6̘1ZƭފaÆ8q[lڵkaзo_̚5W|8bccr@1ؾ};Ah0hCDDzۗ-[QSSSqM7yYFUU׫Z- Gh4T\%5mpߔ69Y'+P &U*fϞŋK[YTb̘1AcҠAmwijA"j{ c :۷nGYYݵzv؁=z4:AdKHLLlLɓ6l%ۭV+?{%"V^b[<BbR(1A/Tp{* ?8nVlذ퓗NNNUW]#G"===])[u}~/" ^$a֭5jIII;%%%ԩuT s˹l9XV̇@DuJQQQ0^i/**6S01IXBD~Gy$hRS)Jr08;w[ndNСCw}:uBII `РA8vΝ;RÇ#%%xbdggӰ#-..a6oӧ_ ;;Fr{\dd$Μ9[b 66P]]> G45JJJо}{y3łne]~q~" :$5:_Lszt:S 43UVV6ZFnXzjyHHH@AA֬Y &@Tfn:<Ɓ}v+ 7܀|x& 7nwߍݻ;wĈ#PPPk))) 7tPYwy'QXX'Nu_6zh_SN!55q!::رc6l؀os^ - trfCDDDDa(22 ?s bcc媑LDEE OۥKhZ9ܹsA@v)))d(3gP]]|(,,Dyy~;̙3'DС(JׯE_N>:ݗZ ÇѹfNC\\G}Zqqq aZ 1^DDDDa6QTTv+Q/bu}II5 ڷo;~7tǽ>,H$7kJ n0;R OkZ![(JjhpCXCDmJW6 >u]7$I^5f}())'*?u$IB|||wa@YYF\!#l6RRRpE?~`ꒈTUUu5k߾=Nu IDAT>- (xg"99mb4qi{Ajj*QHS*A||<x@ׇS| 6EfDD[n޽{?@P >>7x#q7cEQQQ=z4ebϞ=t5jX_~%FѣGc۶mسgj5zN:᪫֭[qAq 7b|0 Z߿iii 0ؽ{7.\ApeaĈ-zmvݤ+Mpzql\+n+&kCii.=(&K&"p@1*JO-Yp!z@wc'N@bb""h \뮥ۮרv8!H nBM"6`0l\RɿQhر#C""PęЈcJlyuJVEDDOCDDDDF}]o """I(K"""p*""""""vYCDf89QP(.g&0!"  """P(}nc(60!" qov]#"""\ |Ag71A Qj(EV$A.%AZR8>1 _ bBsŋb`X """V!ĉn$IZlFJ$ (ĸ0$l6bbbRO;QR(P*P*tlfV q cS8._MDCI "L&Z-J8hZL&I8_'v".ETTt:]GDDDD!F1̜11DD!X,DDD0!""" :X,b(0!" 7afDFFgDDDDMw6MV97]QaX`0'""""QmgG5(j:]"""""P(֫ (H ^zXV0aA Qs^)qE&]#""""h4rEO bB$I&""" g Cӝ }$ODBo "]!""""R(&L1!" ,G%"""j[/<1!" 1|#&"""j/<1!"""""""1DDDDDDDD~ O """"""""?aCDDDDDDD' b|`>|xQ۠ t…fG}M6 ]^1&LJ""""""),]y-++Ê+'N\&LSG!--ͣ6V+n,[ ]v}"rVQQ;w"** C twb )))P(1^{7(? ꫯo>̙3Gޯ=n[كB+DDDDDYf x7nQ1^RVVǠ.hDdd$4 J|?22i+TNpw#;;;]!""""7b騪cDѣG:tO?OagaÆ @=0ydDQҥK?@$_~fŋk.]v7nn&ٳ0uT1}~W+>}^jBQQktzkNJwy> bbb$!//nGfff7ي+B?ѸDQDnn.= ͆l 2j֭nNl6,\}WZ? &4{X(عs'?[n1'N@^^.]k-ٌ?_~9 ЬQٴiL<?>S@6lXIAA8- %I b!6~ZL<]wƏ$<3$I>fȐ!X|9|Ai/#G!mvv66nQT*;wDQQnvjڵﬦ;v,'NRDNNjjjp}A$lذ۷o 7܀llٲEnɓ@dw ɓhnR=* Gƍ8f^C _vI;$aڵh׮C""6lӦM&0&L~z `֬Y[M 2Ç_K_y$I8r233wѣĤIбcGz1Ǚ3gPTT_~ÒBjj;B$uU'Ѯ];~W>|8RRRѯ_?L&TTTb:t(z=0x`222`6QZZ U\s5W+**j"!{FBBbbbЯ_?DGG`4!I233jKɁb#<>?0R񒄄СCMVٳ蓾zr-X`׿")) | bccѷo_( 1 , /$|P]]-*~eD`Xp!zH< ]YYY t7ǡV h߾=~7tHJJŋc̙l۷/Ν+رc1vKk4Ng3|L4ޔgϢ^\ZZ X:C۷//_ш(r 򋈈7oDQСCP0J'bĉܹ}$o!**^y\RSSo!-- ݻw͛1rH ݻW>V4 o߾رc :tjL&9Ftt4vލ;p}vtMWbF.]q󑑑N'OBV_RAa吊߹s瀺ʘg}[neCaC-S\ѣG-i,;;{Űa0l0lݺVVE=@=1`T*䠪 zW_}ugyqG ѱcGkyyyEFFFf3;;wl6#..Fr\QRRcǎu{ [KT3j h6iűqq[r[rm(--rzݩS?G\\\CTOEE222 pr,9oPUU:kDDDDmW_-NNNs=C\'O`JRev`h \H.NtpfwvC";jTlܸ1 """""߁8f9$"""""""cCDDDDDDD' bA 0!"""""""1DDDDDDDD~ O """"""""?aCDDDDDDD' bA QQ(nBt7B((>Q`CDB J%,KBDDDD>dXT*„!1DD!J.FT*Vń!1DD!BP@(JXVX@w|YOTB0aA QP(rhp…@w|… h4r &0!" bΥJIPUU.UUUA$yXdJ0LydBee%4KQDD<οJ\p6 с"ŋqEDDD@R0&0!" r v}A`ۡT*Ʉxh4b… $ &e G\\jaPRRFhoDDDDnCEX,\xZZJj~  bB"F$(J5QTl*$DDDDMV#22 ȕ0Ο'1DD!ykD$9򅈈s#qM@&0!" !G0cY CDDDq`0 ? bBkc2{g5 QprC Kxb8p&Iޮ1p@<䓈 h(|1&.I߸\C>xAqq1&O x>Ʉ~x7>Qq`\VQpb0ŋh4b_vΞ=3f=":͛(ds\洧h6iűqq[r[rm(--ynvL&XVʕ+q]wᡇTTTCAA233[L0NjpG}OUUUؽ{7Ν;͆]~CEE222z`yaBG[_4@UD6k;6;_Nnn>d3Ç6mڄѣGzVԩSQPPt̟?-:dh}Wطo̙#m?3NQQj5ڷor^CEzz A QhbáI^6f\cƌ=&&ϗØS8mFRH8t~ b"a QA=C$W111x7aJ3fo ʻ 6 /Ʈ]PZZvaܸq馛cDQҥKyfv\wuصkΝ. {G}B$$$`Ȑ!8qWImCuuuN7oǒՎm d#pq]n3ixAll,***PRR&}71yd=zW_T*b֬Yjo]s,Yǫ Ne˖@3g?C f٫} /^d54 I IRm AVT*2+bRaڵk/ͪH~|úupal6oł 2e 6o }yl0`  C.Պ-[`ذa|fb@+ ؠP@dCDDD4*kJ*@/4iYKT;VP:s t>}Oؼy3<шӧOU-gΜ$Iܹ| t\y啘8q"[og$I6mڄ={"))) ;!$I0Ͱv=jEEɈ(h B TTЩ5Pljw31Kh1#332e .\pq0={6JS[[ɓ' Ǐ/ly($ (} 7ofϞ Z3g⥗^z?)S֭un5GcX`5"QbV~z2%L8y$2332oZZ&M?~!k1'Oƻヒ3f ::C%Fl۶ /dBZZfΜ F~Q8~lvIDDDNL J @$bˆӞm~}mm˵tK***رcN:aܹA;.\ދ5k0pWQQ@wk^I͆XHE0%""" 7ZTTz[h \2ηNt_rx-D`EwA^^`РAPwcǎ.cC0(B+)(@ DQRb(<0!Z믿>pݻ7.\>sOEDM$ Vv(,ٕZXfT*K 2O0gkGƨQ-"r2#" !<1R3&"""%J (D8S""""CB ߈E,YE$A^"(R Z ZU/<1!"""""6j\[ 1]$Il0FNZR8`CDD!ak3={RBBb; n(=(4~zy۝iKIlݲѱx~kHl, v Z&""ƈSuLc, , 4 "\bA 5\[Zs-f3l6W;F->=gSN,B.]~QԘL1yQ;Pm4B%Dm""Y-TVl}JFDZ*Z.E6Z3jjLڬ(jABe#c| IDAT٧&bc58/k~٬ׇ~lƀcc."6˖{vHl{=G=ڈiO?ވذ[@ HKlo](.,@||"_? '>_|} n<:YDDDmOBfCaCDD@2aJFttL"J%J%ZcbPc2J-f?wq }{ww~Ey;rk6}ye7.VVb;K 6xɻxtPh}y.4Zvl݄̟]#CzEQļ/"+3C>/VS&X{Fc^zϸnp\(=/Ow=Pc$"""0k}8Ԙ (S1!""Ԙpظx#BGETWq ^cN }11}׮’OVk܄G0տ&K>iw/z 5&ʼFX{Jfe@T/ 5Ajcjb"g b8ł2蘘APeeP%:L'歩1a УW |==bHv Q@6jc.VV`xgΜ\[MZn!#*L~xx F2\Wܩ1U{ebf~ΨVNOA QWYQ;숌jUIWʊr$&%{""=n߂?WQO ֻ}󫭭??A .)/}qd!|ハ6د67^⯳!"""wVKn ?sQ`CDԆUWaR=Ԙظxf-fTW}RtL,"#ޓHہoucG Lx y[pdz}Yt]|mgгU1?<u;DDDfոbb\WkֹĐ+! "Di-Gsx(ZZ0V]D<>g Y @4l"l `gZbڪEQjŪV⊊+EE ".!!df2&! IdB}^y= 3;wuAQzx<&ppPTT@Tt qr t:{_;re9CpKyE͵s =n6hueld2a4l0WбZ" x|* Tx] Tf_-I""[ѮQ޷oDDDDv)1Mn8RweKp8X;5i=45ID-k6׾(ۣ"""uҩKW:uZmەScC—ygˁMЈVMdjk7 """ >sf?xt8{͙7Y ҲhDzKTOvdT@YTW.4"FD*/֘.HS2d %]NƯjЈVl6uyx܍6=q%"""ԌFcH/~5fj7-xWNN1T""Vx+]~-T20zElawQ{hIPcCV*^h(Z""""Ml5-Q]cf cO j zhH+e bxigq_q5f9 뾤 ?/nڰOW ѣüyu뮻_z%RSSg]tML8oiYYf QQQ1"HG&!JJq:ֹ<7 '$⿅Lc eVc/-9CGW_tHV&g ̾=>db$%ptڝ̌C3h0:THd;~ kr߆sGϮ?r86t1V{\DD$Y|\Nb(KKKX߷=n" Le:LR۶ǝrTZRx6"""d"22&^dd)'2Ǿ!>3eEyf̙h'"~zG\\ђG`N6S$77sla6fK qt8VGYmm$LZ;n?d̄o}{X\1ZL&g &6?l糕qm[X . ;OÐaq$++^j \n/epDIJl+we$%`1i&9/aaarD5qfƱayE:xAC׻n/m넇G`6L 7o-ga„ ~cl2nF.z_bjj؛4=z`ٳ:'Jbr[JJ))*qSTT@Qq3[nz-QղS bbFR;w%f(۵GO6|蘲{m@_10%)1dɢ}_Ffef`/-a헟zUqY3MDڵH&osHg9jlz<|G 6ҠkG6V2&<<#R"&Hœ~ݻMϞeuv܉lK.Ӈe˖W(nb,_۷3k,Ҙ?>֭#;;$M\8oÆ K۷F۷oO>&%%[n>}4}ɧM଺#EddNӁRfF-Wr~p?:v:S ra4;$>S~F̦]ZVۦ0f¤ZTa >0~>_1]c.A$<"XV.X5c e4FB&ɡC޽;o;vرz ]Z%z! O}0tЁxc裏F-1k,Əϛoٳ:th>#f̘ 8S={6QCDBFllmi׾;Ҿc*w 1-qM,lf9X߻χ'/7Crvdeer$0 .:jC%%Ł2& CRr; ٿoMrx 8y#eryٶu3.^1g9LbrrS^~?W}L||H;ADDD%ˆjJVx%a4"&Hrsshm۶q5Xpaci,ǏgĉM˧W_}5˖-$55< ":::SX*N=TL‡~EH#"غy#kVh4߆s"*:Ʋf^""=BƆ}p~lވf10<3w="F_f˦X,NF֏ukV3aR ?VHRR[ʦJ9RI%'_df>̎gΟa玲$j+ni L&Q1..^[VlaaZZM )R>羨@{ll,@0vi+((`ʕ|ws!G?uԩ}e < &Я_JW)Ю];°z"":tT$SkL, lL&omaaLկ ##F"0:_mStU IױSjEDDVz3o9SUSOاHkfXX|>nwYM7χehd2aXX GD Ntt4qqqUV2//x@" Wp8[6l^{-̜9R͇suV/_άY۷/gϮY1JDD'Uu_DDDNhf #itJIBBYYYdffi֭[IM-[eo P$fʎ;(((n۵kGt\ZZiiiL<3fMbbHi,Ut ݻw0uJSzUW UߵkWsJ||<%%%,YB>l9նmT˗/';;֭[ #&&I㔖[n1"a[iL"""""1ArgtR> SGdddd<&155nW^y_|TZիW3|JKKIMMe֬YA$."""""""upU*o/]mm=:;;{˸nnh޽;O=fra"OΝCFP|x^<EEE.("""Y]DGGc61L-Vj ^SUWئ_Th>5n$hIMM #<¸q㈋񸸸8ƍ#<$H+L@qw: i4"FDDDDDDD(#"""""""Di"JĈ4%bDDDDDDDD1""""""""MD&DHQ"FDDDDDDDCrxBJ2ج6,Vkoiϥ/""""KVn/t:&x(xz=GzlK|.i|$"ʸ]l Ӊ媱?ݿ4 %bDDZ&{o ϥ5ܣHsDH+Rj4DmKkGN&Dp83iU:fHaO̸2^fLlGҟ<ƴ1?RXXW\TȜɴ55X{i)]51'߱9x`Imrͯ{@gfpM3‹ٲi=\zTrsb'XVx+gƯ7I~㭴KPoNf݅``=$%{ ;I?OYDEGW,j{N}ۯDqq1A4HiDԥ^ԩS⋉bԩL:Iyw$̺u(..nDO?lIߦ ,Ed30L\}t }#Y/} G[3ŗOvs`ߞ]_ ̣GS_A~sfE(oͽߠ~몶gQ\\Tc[Q-kаEDDD)Su8JbccWxx8w8z-zAnn.L2[<Ųe4hP0U8pؽ{7#G$>>}G]Wi0LSs!\NDd$}8`3MDd$/?78v93܇ $!]6䡿ɡx{cO5몶gQR\Tc[AA>W?qAȉS" `hFN'?8JJJ/nݺѡCB|{SN qǣ_ܵ؉g]/ι6 <\1{wsuCΞ#˾=tQ۳{o.+f{9q }B]q¾_˷MUUGggg'xLEEE,YS9r/aÆ;ȑ#i߾={? Ӌ袋0L\UT]]|DLmIhӹsP?|>^CQQ.kb, b'ﴖK"""'+hf3& Wd!ؿʇj ^SUWئ_Th>5n$hI$Vnn.$&&~4\.<=z###>h>](**:q"""""""$ivʁx7 <֯_ ,,aÆa0*%AFɒ%Kشig}1}/Z(Me„ hk?зo&HI+..{ted6׸dvkx.ݿ4?I""جP2{kx.EDDD;%bDDZՊ~!lX[s9e IDATHPV(<<Ɍlqlֺ%!ZsHS"FDXz.""""Ҙnrz$H3`00LXVCH(S른O .R~<ETT&)aԋV$Hx(..u""""""DLv]In: zQ"DoVDDDDDN6S u"R7[w u""'/"'P ̀FTՑDN.7+"""""'iFb u"""""DLh~^/>ߏ`h4b20 ODDDDDDD1Mtrj]l6cZ鵈HKDLp\v|>qx݅1402|G02%1EnJKK52FDDDDDD$g u- LGo20*1nH M”,#R"""""""rrR"&klNJ|J+//?x\}w'y睬\2(17mŋ'x^z鄯vOϠ5z,^ݻw:fC5b|PFra8+).\.6}nfϞM_Btt4|DFF%5p@u֬̙3=֭[CDDDDDYQ"&~?OfgHߏ`v"33L&BԩS[u[ok׮O>(?0|j|Iz<@III+***b…\{"776 I7zS7'gv&_> d!pLbbBc9>/?1q{{Y<=`ঙwqsB JQź-SGԦbS.<Cn ٣dp8>|K6^z^ml޽{sС:WU|J5nձcGíJ=z4gq Zl޼<,Y@nn.{eԨQ!N1CxWu/"" _yZ9GX֫\;&ppЀjl _}PRRtL^UonOb$qg{׎KgM3?ҐG93O>7$qHˡDLULڼ1k̉&L&fvm]6SbTJTe4k]x5z|>|>_p0Ff͚YjsΥO>u]AFK6|JkUQh]O˕'^ ܪg=2YN9оn+FV}Q&bjܸ+7Ig())!t۝$$&ڎľ?4S}w}{wک ͸~λo,3~e!M$T#&*&R"\AbJ+VtΝ;IMMS{}m#i ~:7|3sa@8"-M 7pc xǹlpw~ßn䉣W79vs!c?o9z'""-Oё vri}*\g/4ڵݲ n}_t>,ImҹK@2 ?bI$L.ݙ0x(\[~{x_l&3&11Ĥ6}@+'N 2 "=A?ܠI;v_d֭dee;Ν;2O+ geΝ/CZZnV;wm6x ?L^^ ,EQQQvOtFtt4|9r3-ѠA4$e>Eo&wz%띘-ntڝ'۷mo6}?UN.z5Կf^ə믾/<uH-4Z5aY޻8v>|@{l\<>/:w-K7{ Rꨜ/ $c vQKowsxa{bԤזISjxHt)'gRR"]"** _|lV+=z}uc̝;CZZw_ 1ˣW^̞=;:^{}M>^z~( LZb1#rTz]RRºuxװoߞ;#0jhĈl޼n>}?A4Wu Ssn.LtL,?30K~u_eۯ=p$0_ޱHVe\t|.Jccxp[طgfzķIh~$a 쓏5fQ1xGx|C~FK4g8v} ~.6U6W[ҹ! |8woTuY$\Fbcccc;;vl+D3c x:M!!7)s'U5<EEErz05ͳrA~rkmﮛdIX6$/T̾vFg]`SOonŰFyߏ{F#g 8ϼ{︙BٺyϽEDXDfU^7MB/~U[f:~QbOSzEaA>^y!Vg^zJ1Lt v] 1;h1UUl1͘L-=j ^SUWئ_Th>5n$hC55`s12%EU_ޞ={h׮0"AP5 S>m00G Oq*%a*:{`u; _ ?ZeU:&.  W\OWw9zI?džukqFDDʼc\4gּZiiJ))lfcVqYLy9)]Vи ?/< )7&egg̓6鵥eԤFP>=t3l2{^U#SlOKjIOOO>kq:,`,[}p^.jaw0j \~կxYx^RwK&!իV}?~2W/l+N=\Fs ""OM#bZACrRzX\uo1<3 8g(~-7LpӔbb#dGw%HSQ"DDDp):ՌUJĜHBDĉךiiJJJXh#!!cr:, nt:02ڵ@SNg˦|ec`xgYsxǴJu S. G4g _KHܵH.nJM?q:[8Hpf߳%K| O>.0\nb+$aGM;3yU$(iDQQQt:I!+;mdZ)pp{XL>bm^R"\s rt$ɒ;w W^xGڧQ0x۹kjZO?^}{ϥ)xhdneu;ZSYf*=rɕSO8~i&Rb\۶fۯѯa|^싣S*+(羻ʒS;s6j}r1?Z8jh`)_5I$Xidfv;>HWDKMF#ᚎ$"!Ә#bp7O|߷߆)IMesm5f?^z]WJ <Lnn6Fnp""Ҽ5Ku f3m_^0UtيIS;7يIMPMR聿 IF1(V+VӉSfՊfkED$$sv16 !!N}5^R]tiX,ZTqm󬇫=j.qIhDD$4""")--!';2Mf<^nłbiz)waw4'CRP$-1Mfax^|>~hd2i Fc[rm9LhԘaۻ.;ԡH5_~Tm2Sn޵Eoʤ˯bйkDܼyo$LbR[fO9w'}6VMxGy49)s̵`'wIτ$F_kOW,d2sEDD_w~k5ƫƫ`4rMeh- FLz~v٤LW3{mҵy2IupU*o/]mm=:;;{?&z߰VB±TܹsH U>׋㡨UkDDDdg (--9={U\_cݱD̗`X<7|{dggiȹ#Fq&6֯ t̻P]&::ٌdh,%ͤZ" x|* Tx] Tf_:Q"\/"͓`M6W"FDDDDZ%bZf"XcZpKfEDDDDdDLZ*Z"""""rQ"p9If›ɼaR"(%cD9LTTT7e0Lbq\x^i & ժ0"""""rR"eODDDDDDDJSDDDDDDDD1""""""""MD&DHQ"FDDDDDDD(#"""""""Di"JĈ4%bDDDDDDDD9F~ǃc00f CFDLr8\.nwX,V+aaaMˉ:`0`2Zm:ifiNݎ=nۍ <<$1Hz)..:|rd uXL(JJJp8׶]ٌ`7fGF Ɋ',wl7Ig른CdddHADZ%aDDDD㡸ظP"̈́1Kb̀ ]CqdwgD{>݈v0""""!xp횦$DL))) $ab7:dtFa\.%%%#" r9CHr9Սt#7 SQʞ׉G :EJD.5DDDDS"v8:Ir){^VzR""ՑDDDDBKǤ&d:ӗ׋hsaժUOKK B'v3~x,X@C4… }ݻwg!JDDDDDyP"&y wU.{c+܅3;.'2cƌJLZFMvs5H5 "ߏ ~d3Θn~`A}YVFz1ATqiXK]?ǃb jn&&Oپ};fϮvZZgݺudggĴiӸ *7tP6nΝ;III[nO>p_~O?w 6K/o>1bӧOo{W|1 tЁ4fA|m# +1;N}N,K =z+3f̠cǎ57tЁxg}ƣ>)Bjj*_"%%_~ٳgpBf3/7ofل`5k7x##G$''G+GJbbb())/Ç:,̌tV}N]qQzyxdc v{)۶n&P:{)aa$mjKߧGS޳wd~%W[4=%bblM0z]^>>J^Fx=~x&Nx̹4iR`ꫯfٲe㏁DLLL SNSO`ʔ)|={ ީS'C9aMNN6ER G愅&Q[qJd`44jGDDDD'%bb ތ K:p8[6l^{-̜9S3χ뭶hdܹlݺ˗3k,ٳĔPZZJRR~M6ѥKP%~-$:v1~onf~R:V:x-_>;u&ArssHJnGB[z=tLYa6[U)ۯDSpրxl^OKK3ѵ[1v& S箤5.+-snIS[DDD9Q"&*&ܱ 7xwljJ;v젠n!o׮]9rNo_ ζm#]vFZZ'Ofƌdggظ\K8֮]Kaa!F:0dȐP%on:u @ά[Hof#3>j &ﶸ(S IDATT^%x9f#c&L"2*m[6rS0lZN.nlٴ13++gLcIdbGҭ[Mܜ#w|F>YINFw&{wIHL"&&}LܵJE}>\)m( #""" 5-` ='ԾX,'45Xo/U3OII K,?mƌüy |rq:lݺ0bbGO9VBB&Mkaԩ1BӓN2ԥ,Ҿ#>̌t8:3aŷ!:: l03d9O{)EnvgLXx8ٷ? rP pPGPyDd}j~a;,zV S~ާ!)QQ 2ߞz=z>ظx94".KnKK|t蘊j#6.Ĥcظ~-CTIDDD9jC+ZՊӝӉ~}ǝ3{Q]޴4{z 7+‹/Ȁ:_s-OsØ1ch׮lJBqq1WfʬYH#J?BtLl`Ebr2}T ķIS19|lqSTX~?/[G|n,V+mۦq6J?ǒMœq(9SI~p??}˗ /&.qSLlF((?q:ݽ#Y\N sm;ѽgԩrwD,.rT`YDDD%Q"&p8x^;\DLv 觸aaa {{~^*zdɒfc̙̜93oʔ)9s׾q:켳c>χW`9^{ݔW^vEbaI8tS˦ұS~{vIiiqLuF#бc'~{w1~Bhd4zy;$%>Zک gEDd|!~Y- &];OHn.6vW""""4ihOFiy}et3}_rH? /M/uN~ÙILʤmMQ1Gddf֣WtHo6~p?;v*!_f]KP2f‚|ڥtSaL*U2_~sst8{JKJ*.v)>X5n"#8w(>[IthA]l6[`Ja2NkP?]QXFXXXÁ}{hv߿Bذn 9GKٲi}ׇhddf(-)!7';pLddQQ|gΣRNuw:=$@`Qt_TąQqPFs88 ;8:#|Q!@b!% twֻJFzz>ΩSnOE &89{6mxR#ڷwI)ӭ?=I:nqqbfm*>#{!_n#Nkҁfiã P ~X,.-h֧4M+N4\s*I<طWmˉ3oNYyywJzF*bISS PPPO'}P#+1Jq4=`vn?ZR .ҟVyVy6nXѨ_H:#Ul[{Dbq-?U}¢-Җ6sEڷg[0R]jӲm͘ן5.?3DӒI-:~Tm3ޮMH*f oz밪oҪOnS6h}Bv'AP,R<g8u fDQEQr9 ҫD"rgL#ɉ fb1b1a(˼!4ev]bj0 E"ZwL0 1P[\ eY@Cz %1'Z.44PB ˶lV,u70I@6-I0lִiZwW LRsKr٬ |W@1 CeqT`h0x F0Ab&A ! L +* ͨu0E@c k0hb!꛿|t?#W1A 4*>\LӐd004$2 D0 P _=AqY /iʲlY%Ӵda2 CPBSaJ4MSm'qq4 0{r 9S3[4-d| *d\u8,˖i2zdJ1(˩P(u!D"rGXlB~BRLryٖxt5'""e쨭D֬qd\9ح)ʔQQC f1u]W*)+NHԧ>!L(rY4i~Zw4'"j^ԮGѝV,iH2 cPD3r\qԭ2c49ZԺ$!uySSHa 4wFR'j;6}"Rc21 SA8JR* ]9mknN 8ٙUάvf g+ \. L&kL]G PA(+5A0AfMO})J2zWVRaL#"'tYߥͷknNNy[ӪBt:Me a+Ä{'24P`"oOH^) @i* %bYԣ|>_4wi.w|>_~Wa-\^4_q>mh1 JÑF”l}Rr}S J0/'b9Ժk 9ȉX_aX664*rՑݵ*m}Ŀ#OO>7`7ި;OLݻwW*5pNꪫ_rԯԴg'?}{/\;_=W3ZPK3Z{ Jt=tb893}38CO=T**E=$iƍ}?ZlcD~z׻ޥd2V +Ca(5-N5 @-M;=_AՊ(i41Ua}v=u)ñzji=s};wz߬9~ӦMZzuzFo>͚5KdRahڹsD\y0, PԱj5u,CK71ז-[t+O/OڴiVZ%˲亮~ksS&?\n .__iɒ%F}o}KLF'o/Ho|6mڤO3fP<W"uSX`z#.]8Zo̪1vhfVyXr {9:tH˖-Ӵi$Ik׮}{_aI{ZlYX,˗륗^*;餓=~+֝wީH$2~cj?ϟ/[~kݭE0P *b4s&fE_ؑl<#t''c=:ܚ5k /hz'ALPP%KǑ{UV)Lg?٨% CHC~a-[LM "*؜4՛cңC;GիOhҗTҢN:I?ҢsJ͛'IڼyVZ%QuVo=̙~g>˗u1e2{d2FZlV\Yn5/fy^yN+4e۶ѨbX0y{4*b09ZvH$2I b֯_/ux>ϝ}ٺu駗% ]puV>|X7|Z[[ws 7ܠݻwt=yw4T*={hQ>G}yhڳgi!TYiN뒄fJ3OIuIOdIҫ^ϝs9RJ>3_+BTJ7pÈuSO]Q @ ۷Or]WHD---={,XEiѢEZ`fϞE"N۷OBo0ծ}N{1+Jϗ~vdGGѮ<4]]]}_]9=9} b,KU#PϺhѢZw*JU@e2A8F(ius{hޚbL,S4Zݕ`4 :::މFV[[ZZs`utt0L uUISS PPм5J.i]up'yJRK/]qgD4x,WTcdkk P*Rgg̙S~A8J&JrJ.鴫mme1SYQM_МU-y[ C`HRD"c鯭M\N|^TJdu&;C=nM/?x֮][nAČ&ٶl6+պ$'heY G0. 'uttT=o~K۶mS:q.H]tQ1R]v.bmoYhTww[l?q} hThT\NBAyl$89f`r%ǣRR.mܸQW^ygyFӦMJjZ9眣nM}L|;uw[nVL zCRjt}C/[㺮o//7Q_,}e{W_s=W>1_纮x֮].Hw} U&ŋ%Iwq2~JRy?0ި yRRjtrz饗t)q_Wե}{Yos9]C"Pwۥ@椓N;v(}(.{t:SO=uį/K=JRڵkr\'Zi^ .W\׽uk21/j 0,i}?nU15jkk#<2dSZ">٬.rׇ>!͙3G zH\sM>O}Si&ŶٽvRۥsŻn}{ݻ}~ܹjjj~{=W_WJ$zgQ0rzԻD{}Uԧ>իW}}A `XѨ;x)]:X[N'xw;?;wW|Aٶ.L7裏}߿__cMGяcuww$͛7Fkkv=貚`[帮;szF$q(ɨu\QZ:-۶u-;нޫoYix."I~EQ}k_Ӿ}֦Cg*y-^XW_}oo9S^n:?^x}k_{}-^X[lwܡK/DP". ǿ=ە̊}oKKVm}c=Bn .}VA yR N`Gxx \S&ҙ+gv555U͒t:E">##?A3 C_W@2۲C"-Ӳd?gs)t(LʶmYUG`@=pg$_>+UU/d_T-D`h`JvwwWRsڵko|C+VP< '~5 a&-L*N+ϫSmmmUiS*`jLVTFMa(Jkuuu)J0;dEq^[n<$]Td$% ͜9SJRrjiitZr]Wa]Db A `T̙Nyutt[DBXLHDeI|ߗrd2r]WFF% A `ќ9sJJ亮R$Q2db^4B\.l6|>/$4Mٶh4xiΜ9Jk׮?^xA ,5\-[rJZZZ=* ZvJq}/xaj߾}UVպ; Xc4CEG{vɱ,͙1]{ރ]2MSi0hdTTQmSP^yFu]rnv=u-q]{尩GwX~,XJw?y|ڻw淾-ݻW7tnݻWvۨ &Ǻ뮻1y0:G\+b,Se+kCyk;tiCG,[e>Ò1UT9dPg.u˯亮~_?xIu]uk^577kݺu:$I\r~]%IozӛtwK2nW/\_tW`rKy{9w}dYV@ Iay4bn e+k_GJ3Z<]-MN; P7mӡ+˴!i2M@$FDSE%fI\_wy{}-[/iz饗ǢE%KAˢEڵKAxu)Ɍ`rm['x6lؠl6i 3 C FWӴdoyz݊E֬dSLQǒmrA0\^*_J紿G|^v$X4[ c%慡TihUkB lEǑ `P徦&I-ܢq7jСC2 Cmmm @;vmۄ05QQcVĘL,3 SeÔQd0LG0aoc#"0D亮Z!ic.W\xM$ t73f͚jmm駟>6m֥^nMZr:;;u>C0͛7arƄab $*Vf(3 iq$<bq+7\T {ۘxK O|#t<~n:9nIu饗l@eL^ ʒfo@O$\b GeKJN{C 3gV+=_z\ڶmDzбtuu}9~K}y=+Tf˲,V@=*O =Օ>J6yT*> #dH2z ]F8%IIGd8I)I$}ػ NvXǕ7[='wrCڥ21 ȑ#*ՑP_.t.T!]nF}x04eL0cCc#hT)wӨ˜܅.Fǡ1R0bISS PPT25y@apJq? f%Iir9ڟTcڢv!*(@3jZQW00q$۶fp\-<,R<g8ا?nxT=]]E~Z z8ڻg!yX,._Шbtwwպ &PKK눎Ouw+|!Rob57h֧~uqkBMӦ'6~=чԓ6WVͦu:];w+\֧8IVV<ѤAؠ?2O@1pQ$)=U[[{bf ɤ'd5M&IZ|m-:~6?r[QKtIETO+>۫t:~w$)ϩiڀ~ u}{5}f-:^[Q 8H$j֜_a(eրcM"d,%l$ht[.|~u_ƓY`jD"Z}o~=_R @:$If=t$iZz0 s }{vqMX) C͚=G;;w.IR+UU/d_T-D`h! 1 `X0Y/`̥0 P4.A 4P}@Öbb*=#RCAŊ~d/W!ɐaHahH d0A 4!Ha* |ϗ{ >c3z+_LӔeٲlKi0$0eF/, &T P-dR( %`In(@)/!EGe4 U2aH"sT|^hSܯu.3ŔC H4*SFEu a $>!L(r51ŽZ=iASSh*~A246S}#W.U[hGA$xj Y0 +R46KG܃ T j6"j Q򹂂 XRbyEu#K s=~@% 2@땇z Ng+}nA3XM{Шf1nA!iD1PgJjP qߐ_aX6.bA Ա0{ZL]hh-#sCиb0 zj).K+Ze1 Hy0, P^j*H~M OjH1P?(P2)3To5L 0 TP v49 h UX`z#.A 1ɄZLTK@LmϨ煴{r.$;n):QӼ_ѤD0y{4ul]* eJhj_:}j 0j}9һ#z]PA/s@[RZpL%ƭd1Q9LJ[s!L~o?jɊ~&?[Bۚ~b:m1i]U a*lk2rUoLb#뾃0S6PM]cXһjJ`\=}jǮZ`w51a;kʜwC>թ];g6?B^6c0<?yesY=3i׺khT%=ܡ˜ۉϊ*i:S7pSPA%'|݇Ҟtܼ<ԟo1}Ƙ ji þg:K߽㻒C-'wD~V}R AE `Xz^HܘVr-z.Ir"zz`ғѾ#}vi7g^U jgמ]BIڹg$ChLx;$I;v~1%gl+9eLP/BXUʡKlINm- У[~3=剪Tςy dƀ\V /$*wTh 'CÒ?b_[ҶowX?xAKGii*/JTp;ZCAz2N/4Gg˲V RO~uO2>D3Wpa=} c|ҪO-SߔeYJd3}_M&utUiSɦ"bxӥX4X46cI53a%ضL˒i-SP2m۲,|1ذq5R|I^PRo;Vʛ*Wžp}RIa㖼*R{L5͏U=sf8Zţ$hx^}> ?ŚNd5dTm;0}C`kN[쿔^zR}S_I0Zչ%!&q"c5ZsښZw,8ofX༙00yF$1'έz/ĜꯖL& MweF1) 3L?1hkD;89cǵ༙TaF-1'e>Ntpc]zL CUP%=J) /K츥tGMbj~E2P1I.N/U&A ! 1P7~Nz@2_!|T` 4:[F4a;\3aHbA !n2,eBhpЗeX iX1P 0mպC ɲmf:E0dLRA2Ój!c*ȓiZ2 rGu^{l T$h_!U4}"Gi0\~bRC"rt D(,ӐeGAP4FA!YvDyA ԱbE%4uui6Zw !6]uiEGi0 2׊˔eيGڗ?Fk(˲lYL KjXv;6CRX2M[Bي:Tȩ'kn4@dP{)FX,..0i4~kD1P C F:4-*~zv:9qe ,0l!PYy,dUp]ّb[ S&^jGu*譈1Ygl˖x:PH|a qӔ ÔeZ"bf,Ӕ!IfaHbA L1a2$+a( 1HdF|Se cjT0e!2 S밣p&쵌 P~x/aL/@bUL`2@aHa& GQK2dG?p2>10W@$aOeL^ ʒfo@1#1U1*/pZTL,G10Tb۶BVĨ_#xQI BF+!T/@iYَMUL")Y r:5WV2 `,1w,Q˗\OXq 4M9|>%٭#meZ )Esjf۶,#TTZwUUNʶ׀bR] )4YeYrGaሢF@D9S#x?10ETblV<WQ4ֺ{hUQ<m}%q4Ľx\U=,kOceYqYUKӕc+KUѨsH+"iRhD䅆Ɲ@iH]U4-hYCVbJ1Aʿض-{>L2AﵛȎ5+K꽾#|O10Eb4HS$r aɡo$!/10 Ɣ0 A"R<0/0 aL}~S 09Z?' /nInfǨ10EU0Dxb`:`Pu zA ԁ a WeA Lq_ޥ%Kd&R0 cA LQC0u]A jG dLT$eY}+bTYRyB ; cA Ljrf]8șFqNʪB Ph(u aA Lb3n˷Bg}"tÓA L_A3a Sg]º2GSHyQP|Sb`pWb`1pWb&A `J_|Ny?}g d׺++˩/dqiʶm9QGXLX]#iSGޠ~_P!_Б##4i L%12p $Ɏ؊%F#,˒$/d幞;Mg2U'2~_]k{UyNu?zy4{]+U'?׽?:t)'O\YsgIn~Fza=o1IR6TdGlMooӬҬh,Za$ɲ,EcQ54kٚ&;b/f5}/zo.tiي\??~{ono5矫fIR{>^|^ A @LV;:PJLkҬOćx"Ysg+1I *I6Q-[qZ\Cw~GWm *I7oF [puP$iZKRmnUZÇ:ܪs (oϚ;KxLLVW6Ւ_9k=k"}\ <[˕1݇a ^eGŗ}EA 4tyNTZ3tX<];^/]jXfϛ03Ʃw`?u]O}ȆZw SA 4t$)YJJmQ |^T[:t/}{]}4uɒ\d;Ĥ:Ԅ le],}\f $@7BHH =NqSĉlYm3HM}=eΜs{3Úyk>׾]dͭ:S^zG GoP1}_WY^ye}_HYcjSHTxBϞļ 54ⳓ\G snΛН71i5z߇Է~HsЎm; nC)%q:hVR {@m{Իyܬ7=N璤+:_ߪu5бk+SQ͊=ʽi3RSSVֶu<007ùTAEu]9D";9=<8Q56enЈZ:/y@| wߨĄy 5~5 Xjnnm۲,KlЄu~$I#I[Oel+~2+cc_v>E u*IWj;u-JԽbi: Gg$oQ$7"IZֳDm`hԩD"9JŖj;u-JUZyજާ/~sϾw}ze%!j 1PRc-˚ko P->:`:舃7=]C"Px1_h˦-^ޭrxZIұkcb^ 1PRsMLW,sOᄄDCVT '+*jl@0PԶ鲿 }_8yjЧo {b"Xcs$idhmL]\Kiҫ{nc8՟A@(U֧4! 1PW,Au=Jjlj,Jg`|dޫx,6r֩jik-5*zGԻWmؓײ󞿳O-o{` Л/8{{ @u`j A Թ6ٯ1֖97<41H],[zM'kr=O{wUcSeU<:C^paz{uͿׅ^ܯA_'[fw.P"/z05&@}j_!IY5gPC#}EZw:3{ ӔeY\)˞gk`.bH$W70 utvh!6[ME7SCSFN=ZgZ{sQLLOzus]կ~ ]x%jjirg׻C񰂡/Աk?wxAZ}__N#y_Rp{J -^ׂھuǑeYRѸ?utvsߤ@0ظoy[Ms/o{8M㶏?II\׶ص4MmQ.՞ VCAwv#av]ϟ,Kay6*_&ٱu:{Rm}},K\OϮZ)U+tV<]A+V5ouP|T&ټiZ!IZֳL{nӏ?[wsYD"1DOK/ւN=x=չES=)IZڳL;Lտ#ݻy۾}};Ҝa$ijhݷޥ~^c3~FFԻyN8$+ 3sijjii眮:xF%IhLuV|.:ӵ|\Os; a*A -Hw6b,["uO:ٸ%ډjhWSKN8;- SOԂ :#kdhDx\=XCA546 ׷M[XL{%I;Qh$CĤ˻']Ӳ,sѹ:C҆u 7?=={ ~v:C}K^|E?KS[G~gkikQk{ki\ܥi;h$ͯ]}EcIZZh"~m^Tr@zTʦ6iw./!JDH۲i~}/;v)'u]y'rN.;BX輷U@ KW,U߶^TiYV.oʃVi|t<=L.ijZbnVmٴ%ĤV8*e2MSƬ VD5]\#x[zRzm&h"v6/]amܰQGw̞J  Ibڱm}[ّDunRN-Z CҮ]ZԽH4hhjwsV:9K{ǟVmZ"9)pZw#ZtLs4jm[ÃCZtq#Nڷ/i.ݳk>aMzap"-\H=L6jl$5657{t-42*uIҶ׶*hb }>:x{Q޵[z 4uQGT_yqؓ>QMMzgALrB=nWt ȨFFܓjXsQ6m|Uccc86Ƶ_pDO[/,久 bz兗FubFibM7)<6.'P~Y-prKtG{ȬAE @X-)5Ioe=3ؓӱkG;, VcƪD#)˶'46:`(Î>|RXg6<ܤ?zo-YjӶmutu知I1'ѺoMMMZq@F2But.GktdD]]PM>-m-:5zgOkɲ%X,mmӏ=x,zi*I1Gjwn=uʲsP)f7nlg33em;y``oTAEu]9D";iioF ʣ=x:KͲm[e\|$iD#)uIrmeQqerΧh!CJ DbJ DbJ ALPx? 1P,.wǐBu ucH!: e| Pm+ 1P'cJ̲m557 #:aZZZ G8 +wjS @ !ʄI%BP"1%BP"L ȍ3T+wG0S9@d`j1P-u-1H8,Iϗ^3c,x=#Z\h,NBBX:4 EcQoJZe=#Zs]yD"9'RzlQ"OW55Mq%|rXfwrBSxW5fjǑs$hqCU bVyawĝe ʊ jIJI$8 5_uI$z^ u jȾaI<9@ (q]Ó$A@M26ߴ=Y"yST%&ާ^@ -byRx (u[hTHTX\DBδLl[~O`@@|$#u 0gcS'JuWD\hL ;[[L x8{I Z)JIjkixXCãFcPv5%~@1Y/`2Cu/RФ{5[JAX,aZZ::[$M1Xh*A `F K0m-sn9]jU(ظјl۞S%LVEUFYM ̫=&W+W,^.|11IZ'S5j`Ϡmgvu] D{~Rw%u~CϿI᨞i>G*wP'$*OȶM[ƆG'F fV,?WuA 4=jjj,jg_ܬm)Xz2z}vy7iI҇=z%Ws Oo*%A(H8hheU82 慍i[NWɲ,ibӡ*boK]lַ_#I 6o.Iz* \s^[ Z(535[(kG-Y|3u}ճ[t!(H;B?^jaW/ޮ>m5wݍ=ʓt)u7-[HDB_>h,3N>^* 'EIovYZs}?w\x.~˙szM'+-Y3gyi~?KӯnCr2 Px"!IپyFԵfCԁ>%]NΎƷսK?V}~oA˺aWGzz-$}StU`Pɯm{sGo}Y ?5'?|"# CʵA{tꞜJ߽L+Y1Y/ J,ktN]k~~/=o~~K>sշ͓>uuvZtן$stZd>KdQ6$)׿Su-^Ovú_}ho.ս>>7AP@GzOAE &5ҋt;/~sgo ca֖qσzzËӶFc޾~9C7i l!}AEK{%7mަK}t񒤓O8yQ61)q8U80f۷mKgzN_F]7[l‘?7zwiNǿ M/p亮\Ǖi[<2, '~#}[/g?3O=}bٶNLD\5O*6˲Ե]~r={4 _Օy^ظIC#/Oܵ[{ SϽ9"yB\v!~BwF>%NA'7I9ԗ+>|GV+D 0G #21N]k{e]nׯ}O6nY$I zMz z#:ުѱn. IuIÞ.8tF^zU{<}}۶tť\?+qsnqSE]zԷs 4x}`r-Q=x<@ABFF4>Q[K\c|<\4'wS_n~vj}Izؠstk{ϠpA|˻O\߿ޏ3O\z{?ѿ|jiiҹoZ+M5#IW^6t:[K/a$izѧ=p]Of.|.{[J?7sݞ1v>3c_Ox~jڶn=HI[庮Q"Ȉ9x\/9I<ȘNg;w)OhAGBEi3el<{Z2Qy2>5ih\;\GG?I C>(i2 S2$#,577˶mY^0Q|~IF$9Y$7kVeW>/Ǿ|"04 P$CãEo;fW^ײE0TO8FrrP0C\e a& ؠјRG{kQݳwHDB_M Eisulۮ7uvwA}ըT1iomQ_FeZxj1::k~>sշC-T8>u.h븳ٳw(tf,-] ?#;H?@!XC(cFTca *HH!LC(8Ͻʏ 0+ /ޡaE13Q54 } NhLt1Y}ZԵ@cS<𨆧ygj& 0gM jjlP$U8U,W<븒$2m>rw( @,Trw^A @@0nSw #(ޗyF5̘o0 2@2 P{r HF11uwPU!˲4ye@} I}ј='W떹c49SĐBLۖeZɊÜ%A y&m1!۰PP≸^(hZ4<ٞWTa(jq=q\OmɲLR EU1!ᚒi$im[NhBs])`H4eY,V0h2Md2 CJ1:DU0 Y2h!Eațn1 C)!YZ וeZrmGIDC0=c y 3Pim/2B,CU"0 Y%ǘ~nOLyreoh\ϕ\ojPr"b?aN|%fr}0dyVzekBU0 Y%7J$ӔIʐ%9D9 R!LrcIaNI?@Ŋ,bjA Tj۶G bh 'oDq3aC*aW> a$[%#""VlF%ܓ<ӓ!`tt2@jkޥɱ0+2fHz\P>#@:!-f$5ǶmٞPW.BlϒmCjA TdeKBL%{>CU"4e۶B4(2>iQ(mۓ% 7iţI{=ϓeY B F,y-V@Oư+˓,+9AoIz djA TT968T5(H(;ϒhyr G2)LY%+nsm[e孆!1PeR1ʲ,IJkb۶q+u PQ'>d𒪄|GRbJdQcRߖdBaIp\Q;bJe0+dP`A T9xՃLJ DbJ DbJ DbJ Dj1P5TAL%c`JUT{P5bJ D)/j3(GS5/i%("H%11 dsleʑSL1>}S1\u<%9SL2|M|O:{\Irb0f4'/+t\1f e d]SB\۩_?~w0O}kN1gL+|ڦuq?|313k;cK&~RMwy<GfhppP===&JzQrenƾpww~gd(>0 6|aժU7LT¸S|^پZ )TX\/d }R%N۱/~l6gllw޳f͚%e}&{JUi'&{;I+(efy?uO8/ {y^5U@]ֲe HwmsGY¸YLKʚ&{xW%TTj)˜|f!q?5B4Z4] y<5n"k"!Ha7+dqr-71x3f& !FfnFewN/41EN>0ZVH+ɞ5"&EYK!מI:|1V+V kdh䪾QP+0ɾ= c[8׵?G2/M+bzF־#deYcf1hȨ*T9TB7O(\*KE7Lڞ Lr33gOkeVc|6Ӆnɵ2R&于>XwV"XÓr ;n7p%e 5ʬI+0ٕ5?Wd\Iv9)ofhsj*j*yh s×|Cn\a&߾|Ngއ6UrqB|0Sԋ;3o fB-;^hSh sѕ2H(VUf(+h)SA@?]oBU bϟZe.atM'4U3U02fS>5zcr;v `^!GQAMM0dBLuܛ&`xy?'Hd*dx~F/GGfT3 @=$Ι.ɷDTVE5 2QХ{\!j`6t)d&aTEALc c/tr+tӝ[fRag\U(/FՅ0`.Cz|!t~dl6aT̤Cɕ;P(|+7פܯ)4b-7>L%lcfzT>VL`XaLMwR^LC|NJU3M% zRM @iR95¨̫&eKQ CilaL7jPi|MK a6N' .J !{"BJk.45¨bkԛb+P**Q L)Fx@=)vRBUAPb_riQIC*2Q⩋&B 6G`R!0Vk@5Ϡ*BUiP>Wk@(U8R5!