pax_global_header00006660000000000000000000000064150560660310014514gustar00rootroot0000000000000052 comment=40c637fcc1a2464fa4017a94d97ad9c81754d0eb cron-descriptor-2.0.6/000077500000000000000000000000001505606603100146365ustar00rootroot00000000000000cron-descriptor-2.0.6/.github/000077500000000000000000000000001505606603100161765ustar00rootroot00000000000000cron-descriptor-2.0.6/.github/dependabot.yml000066400000000000000000000011031505606603100210210ustar00rootroot00000000000000# Keep GitHub Actions up to date with GitHub's Dependabot... # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem version: 2 updates: - package-ecosystem: github-actions directory: / groups: github-actions: patterns: - "*" # Group all Actions updates into a single larger pull request schedule: interval: weekly cron-descriptor-2.0.6/.github/workflows/000077500000000000000000000000001505606603100202335ustar00rootroot00000000000000cron-descriptor-2.0.6/.github/workflows/python-test.yml000066400000000000000000000011651505606603100232570ustar00rootroot00000000000000name: Python tests on: - push - pull_request jobs: build: runs-on: ubuntu-24.04 strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} allow-prereleases: true - name: Install dependencies run: | python -m pip install --upgrade pip pip install mock ruff setuptools mypy pytest polib types-polib - name: Test run: ./code-check.sh cron-descriptor-2.0.6/.gitignore000066400000000000000000000021661505606603100166330ustar00rootroot00000000000000### Python template # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *,cover .hypothesis/ # Translations #*.mo *.pot # Django stuff: *.log local_settings.py # Flask instance folder instance/ # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # IPython Notebook .ipynb_checkpoints # pyenv .python-version # celery beat schedule file celerybeat-schedule # dotenv .env # virtualenv venv/ ENV/ .venv # Spyder project settings .spyderproject # Rope project settings .ropeproject .idea .DS_Store .vimrc *.swp # Created by .ignore support plugin (hsz.mobi) cron-descriptor-2.0.6/.gitlab-ci.yml000066400000000000000000000057721505606603100173050ustar00rootroot00000000000000stages: - test - package - packagetest - deploy test:debian: stage: test script: - apt update --yes - apt install ca-certificates python3-venv --yes - python3 -m venv venv - ./venv/bin/pip install mock ruff setuptools mypy pytest polib types-polib - ./venv/bin/ruff check . - ./venv/bin/mypy . - ./venv/bin/pytest . tags: - debian test:archlinux: stage: test script: - pacman -Syu python-pip --noconfirm - python -m venv venv - ./venv/bin/pip install mock ruff setuptools mypy pytest polib types-polib - ./venv/bin/ruff check . - ./venv/bin/mypy . - ./venv/bin/pytest . tags: - archlinux package:debian: stage: package script: - apt update --yes - apt install python3-stdeb dh-python --yes - rm -rf "./deb_dist" - export DEB_BUILD_OPTIONS=nocheck - python3 setup.py --command-packages=stdeb.command bdist_deb tags: - debian artifacts: paths: - deb_dist/*.deb expire_in: 1d package:archlinux: stage: package script: - pacman -Syu sudo fakeroot systemd binutils python-setuptools base-devel python-build python-installer --noconfirm - useradd -m -G users -s /bin/bash package - chown -R package:users archlinux - cd archlinux - sudo -H -u package makepkg -f tags: - archlinux artifacts: paths: - archlinux/python-cron-descriptor* expire_in: 1d packagetest:debian: stage: packagetest script: - apt update --yes - cd deb_dist - apt install ./*.deb --yes tags: - debian dependencies: - package:debian packagetest:archlinux: stage: packagetest script: - pacman -Sy - cd archlinux - pacman -U python-cron-descriptor*.pkg.tar.zst --noconfirm tags: - archlinux dependencies: - package:archlinux repoupdate: stage: deploy before_script: # SSH - 'which ssh-agent || ( apt update --yes && apt install openssh-client --yes )' - apt update --yes - apt install twine python3-setuptools python3-wheel python3-build python3-venv --yes - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - mkdir -p ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' script: - ssh www-data@repository 'rm -rf /var/www/repository.salamek.cz/www/arch/pub/any/python-cron-descriptor*.pkg.tar.zst' - ssh www-data@repository 'rm -rf /var/www/repository.salamek.cz/cache/deb/pub/all/python3-cron-descriptor*.deb' - scp archlinux/python-cron-descriptor*.pkg.tar.zst www-data@repository:/var/www/repository.salamek.cz/www/arch/pub/any - scp deb_dist/*.deb www-data@repository:/var/www/repository.salamek.cz/cache/deb/pub/all - ssh www-data@repository '/var/www/repository.salamek.cz/deb-pub-update.sh' - ssh www-data@repository '/var/www/repository.salamek.cz/arch-pub-update.sh' # PyPi update - python3 -m build - twine upload dist/* dependencies: - package:archlinux - package:debian tags: - debian only: - tags cron-descriptor-2.0.6/.version.yml000066400000000000000000000006751505606603100171340ustar00rootroot00000000000000GIT: AUTO_COMMIT: true AUTO_TAG: true AUTO_PUSH: true # false=disabled, true=enabled, 'remote_name'=enabled and push to remote_name COMMIT_MESSAGE: 'New version {version}' CHANGELOG: REGEXPS: 'python': __version__\s*=\s*(\'|\")(?P\d+)\.(?P\d+)\.(?P\d+)(\'|\") 'PKGBUILD': pkgver\s*=\s*(?P.*) VERSION_FILES: 'cron_descriptor/__init__.py': 'python' 'archlinux/PKGBUILD': 'PKGBUILD'cron-descriptor-2.0.6/LICENSE000066400000000000000000000020701505606603100156420ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Adam Schubert 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. cron-descriptor-2.0.6/MANIFEST.in000066400000000000000000000000751505606603100163760ustar00rootroot00000000000000include LICENSE include README.md recursive-include locale * cron-descriptor-2.0.6/README.md000066400000000000000000000151351505606603100161220ustar00rootroot00000000000000# Cron Descriptor [![Python tests](https://github.com/Salamek/cron-descriptor/actions/workflows/python-test.yml/badge.svg)](https://github.com/Salamek/cron-descriptor/actions/workflows/python-test.yml) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/salamek) A Python library that converts cron expressions into human readable strings. Ported to Python from https://github.com/bradyholt/cron-expression-descriptor. **Author**: Adam Schubert (https://www.salamek.cz) **Original Author & Credit**: Brady Holt (http://www.geekytidbits.com) **License**: [MIT](http://opensource.org/licenses/MIT) ## Features * Supports all cron expression special characters including * / , - ? L W, # * Supports 5, 6 (w/ seconds or year), or 7 (w/ seconds and year) part cron expressions * Provides casing options (Sentence, Title, Lower, etc.) * Localization with support for ~31 languages * Supports Python 3.9 - 3.13 ## Installation Using PIP ```bash pip install cron-descriptor ``` ## Usage example ### Simple ```python from cron_descriptor import get_description, ExpressionDescriptor print(get_description("* 2 3 * *")) #OR print(str(ExpressionDescriptor("* 2 3 * *"))) ``` ### Advanced ```python # Consult Options.py/CasingTypeEnum.py/DescriptionTypeEnum.py for more info from cron_descriptor import Options, CasingTypeEnum, DescriptionTypeEnum, ExpressionDescriptor descriptor = ExpressionDescriptor( expression = "*/10 * * * *", casing_type = CasingTypeEnum.Sentence, use_24hour_time_format = True ) # GetDescription uses DescriptionTypeEnum.FULL by default: print(descriptor.get_description()) print(f"{descriptor = }") # Or passing Options class as second argument: options = Options() options.casing_type = CasingTypeEnum.Sentence options.use_24hour_time_format = True descriptor = ExpressionDescriptor("*/10 * * * *", options) print(descriptor.get_description(DescriptionTypeEnum.FULL)) ``` ## Languages Available | Language | Locale Code | Contributor | |---------------------|-------------|---------------------------------------------------------| | English | en | [Brady Holt](https://github.com/bradyholt) | | Chinese Simplified | zh_CN | [Star Peng](https://github.com/starpeng) | | Chinese Traditional | zh_TW | [Ricky Chiang](https://github.com/metavige) | | Czech | cs_CZ | [Adam Schubert](https://github.com/salamek) | | Danish | da_DK | [Rasmus Melchior Jacobsen](https://github.com/rmja) | | Dutch | nl_NL | [TotalMace](https://github.com/TotalMace) | | Finnish | fi_FI | [Mikael Rosenberg](https://github.com/MR77FI) | | French | fr_FR | [Arnaud TAMAILLON](https://github.com/Greybird) | | German | de_DE | [Michael Schuler](https://github.com/mschuler) | | Hebrew | he_IL | [Ariel Deil](https://github.com/arieldeil) | | Hungarian | hu_HU | [Varga Miklós](https://github.com/Micky2149) | | Italian | it_IT | [rinaldihno](https://github.com/rinaldihno) | | Japanese | ja_JP | [Tho Nguyen](https://github.com/tho-asterist) | | Korean | ko_KR | [KyuJoo Han](https://github.com/hanqyu) | | Norwegian | nb_NO | [Siarhei Khalipski](https://github.com/KhalipskiSiarhei)| | Persian | fa_IR | [A. Bahrami](https://github.com/alirezakoo) | | Polish | pl_PL | [foka](https://github.com/foka) | | Portuguese | pt_PT | [Renato Lima](https://github.com/natenho) | | Portuguese (Brazil) | pt_BR | [Renato Lima](https://github.com/natenho) | | Romanian | ro_RO | [Illegitimis](https://github.com/illegitimis) | | Russian | ru_RU | [LbISS](https://github.com/LbISS) | | Slovenian | sl_SI | [Jani Bevk](https://github.com/jenzy) | | Spanish | es_ES | [Ivan Santos](https://github.com/ivansg) | | Spanish (Mexico) | es_MX | [Ion Mincu](https://github.com/ionmincu) | | Swedish | sv_SE | [Åke Engelbrektson](https://github.com/eson57) | | Vietnamese | vi_VN | [Nguyen Duc Son](https://github.com/ali33) | | Turkish | tr_TR | [Mustafa SADEDİL](https://github.com/sadedil) | | Tamil | ta_IN | [Sankar Hari](https://github.com/sankarhari) | | Ukrainian | uk_UA | [Taras](https://github.com/tbudurovych) | | Greek | el_GR | [hardra1n](https://github.com/Hardra1n) | | Kazakh | kk_KZ | [hardra1n](https://github.com/Hardra1n) | ## Original Source - .NET - [https://github.com/bradyholt/cron-expression-descriptor](https://github.com/bradyholt/cron-expression-descriptor) ## Ports - Java - [https://github.com/RedHogs/cron-parser](https://github.com/RedHogs/cron-parser) - Ruby - [https://github.com/alpinweis/cronex](https://github.com/alpinweis/cronex) - Golang - [https://github.com/jsuar/go-cron-descriptor](https://github.com/jsuar/go-cron-descriptor) ## Running Unit Tests ```bash python setup.py test ``` ## Translating cron-descriptor is using [Gettext](https://www.gnu.org/software/gettext/) for translations. > To create new translation or edit existing one, i suggest using [Poedit](https://poedit.net/). You can copy/rename and translate any file from `locale` directory: ```bash cp ./cron_descriptor/locale/de_DE.po ./cron_descriptor/locale/YOUR_LOCALE_CODE.po poedit ./cron_descriptor/locale/YOUR_LOCALE_CODE.po ``` or you can generate new untranslated *.po file from sources by running in `cron_descriptor` directory: ```bash cd cron_descriptor xgettext *.py -o locale/YOUR_LOCALE_CODE.po ``` Generating *.mo file from *.po file. In root directory run command: ```bash msgfmt -o cron_descriptor/locale/YOUR_LOCALE_CODE.mo cron_descriptor/locale/YOUR_LOCALE_CODE.po ``` ## Developing All suggestions and PR's are welcomed Just clone this repository and register pre-commit hook by running: ```bash ln -s ../../code-check.sh .git/hooks/pre-commit ``` Then install dev requirements: ```bash pip install .[dev,test] ``` cron-descriptor-2.0.6/archlinux/000077500000000000000000000000001505606603100166335ustar00rootroot00000000000000cron-descriptor-2.0.6/archlinux/PKGBUILD000066400000000000000000000014271505606603100177630ustar00rootroot00000000000000pkgname=python-cron-descriptor pkgver=2.0.6 pkgdesc="A Python library that converts cron expressions into human readable strings." pkgrel=1 arch=('any') license=('MIT') url='https://github.com/Salamek/cron-descriptor' makedepends=(python-build python-installer python-wheel python-setuptools) depends=( 'python' ) prepare() { mkdir -p "${srcdir}/${pkgname}" cp -R "${srcdir}/../../cron_descriptor" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../tests" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../pyproject.toml" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../README.md" "${srcdir}/${pkgname}" } build() { cd "${srcdir}/${pkgname}" python -m build --wheel --no-isolation } package() { cd "${srcdir}/${pkgname}" python -m installer --destdir="$pkgdir" dist/*.whl }cron-descriptor-2.0.6/code-check.sh000077500000000000000000000000611505606603100171570ustar00rootroot00000000000000#!/bin/bash set -e ruff check . mypy . pytest . cron-descriptor-2.0.6/cron_descriptor/000077500000000000000000000000001505606603100200355ustar00rootroot00000000000000cron-descriptor-2.0.6/cron_descriptor/CasingTypeEnum.py000066400000000000000000000024321505606603100233030ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. """Enum to define the casing types for the Cron Expression description """ import enum @enum.unique class CasingTypeEnum(enum.IntEnum): Title = 1 Sentence = 2 LowerCase = 3 cron-descriptor-2.0.6/cron_descriptor/DescriptionTypeEnum.py000066400000000000000000000025241505606603100243640ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. import enum @enum.unique class DescriptionTypeEnum(enum.IntEnum): """DescriptionTypeEnum """ FULL = 1 TIMEOFDAY = 2 SECONDS = 3 MINUTES = 4 HOURS = 5 DAYOFWEEK = 6 MONTH = 7 DAYOFMONTH = 8 YEAR = 9 cron-descriptor-2.0.6/cron_descriptor/Exception.py000066400000000000000000000036131505606603100223500ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. class MissingFieldException(Exception): """Deprecated, use MissingFieldError """ def __init__(self, message: str) -> None: """Initialize MissingFieldException Args: message: Message of exception """ super().__init__(f"Field '{message}' not found.") class FormatException(Exception): """Deprecated use FormatError """ class WrongArgumentException(Exception): """Deprecated, use WrongArgumentError """ class MissingFieldError(MissingFieldException): """Exception for cases when something is missing """ class FormatError(FormatException): """Exception for cases when something has wrong format """ class WrongArgumentError(WrongArgumentException): """Exception for cases when wrong argument is passed """ cron-descriptor-2.0.6/cron_descriptor/ExpressionDescriptor.py000066400000000000000000000636731505606603100246240ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from __future__ import annotations import calendar import datetime import re from typing import Callable, TypedDict from typing_extensions import Unpack from .CasingTypeEnum import CasingTypeEnum from .DescriptionTypeEnum import DescriptionTypeEnum from .Exception import FormatError, WrongArgumentError from .ExpressionParser import ExpressionParser from .GetText import GetText from .Options import Options from .StringBuilder import StringBuilder class OptionsKwargs(TypedDict, total=False): use_24hour_time_format: bool locale_code: str casing_type: CasingTypeEnum verbose: bool day_of_week_start_index_zero: bool locale_location: str | None class ExpressionDescriptor: """Converts a Cron Expression into a human readable string """ _special_characters = ("/", "-", ",", "*") _expression = "" _options: Options _expression_parts: list[str] def __init__(self, expression: str, options: Options | None=None, **kwargs: Unpack[OptionsKwargs]) -> None: """Initializes a new instance of the ExpressionDescriptor Args: expression: The cron expression string options: Options to control the output description Raises: WrongArgumentException: if kwarg is unknown """ if options is None: options = Options() self._expression = expression self._options = options self._expression_parts = [] # if kwargs in _options, overwrite it, if not raise exception for kwarg, value in kwargs.items(): if hasattr(self._options, kwarg): setattr(self._options, kwarg, value) else: msg = f"Unknown {kwarg} configuration argument" raise WrongArgumentError(msg) # Initializes localization self.get_text = GetText(options.locale_code, options.locale_location) # Parse expression parser = ExpressionParser(self._expression, self._options) self._expression_parts = parser.parse() def translate(self, message: str) -> str: return self.get_text.trans.gettext(message) def get_description(self, description_type: DescriptionTypeEnum = DescriptionTypeEnum.FULL) -> str: """Generates a humanreadable string for the Cron Expression Args: description_type: Which part(s) of the expression to describe Returns: The cron expression description Raises: Exception: """ choices = { DescriptionTypeEnum.FULL: self.get_full_description, DescriptionTypeEnum.TIMEOFDAY: self.get_time_of_day_description, DescriptionTypeEnum.HOURS: self.get_hours_description, DescriptionTypeEnum.MINUTES: self.get_minutes_description, DescriptionTypeEnum.SECONDS: self.get_seconds_description, DescriptionTypeEnum.DAYOFMONTH: self.get_day_of_month_description, DescriptionTypeEnum.MONTH: self.get_month_description, DescriptionTypeEnum.DAYOFWEEK: self.get_day_of_week_description, DescriptionTypeEnum.YEAR: self.get_year_description, } return choices.get(description_type, self.get_seconds_description)() def get_full_description(self) -> str: """Generates the FULL description Returns: The FULL description Raises: FormatException: if formatting fails """ try: time_segment = self.get_time_of_day_description() day_of_month_desc = self.get_day_of_month_description() month_desc = self.get_month_description() day_of_week_desc = self.get_day_of_week_description() year_desc = self.get_year_description() description = f"{time_segment}{day_of_month_desc}{day_of_week_desc}{month_desc}{year_desc}" description = self.transform_verbosity(description, use_verbose_format=self._options.verbose) description = ExpressionDescriptor.transform_case(description, self._options.casing_type) except Exception as e: description = self.translate( "An error occurred when generating the expression description. Check the cron expression syntax.", ) raise FormatError(description) from e return description def get_time_of_day_description(self) -> str: """Generates a description for only the TIMEOFDAY portion of the expression Returns: The TIMEOFDAY description """ seconds_expression = self._expression_parts[0] minute_expression = self._expression_parts[1] hour_expression = self._expression_parts[2] description = StringBuilder() # handle special cases first if any(exp in minute_expression for exp in self._special_characters) is False and \ any(exp in hour_expression for exp in self._special_characters) is False and \ any(exp in seconds_expression for exp in self._special_characters) is False: # specific time of day (i.e. 10 14) description.append(self.translate("At ")) description.append( self.format_time( hour_expression, minute_expression, seconds_expression)) elif seconds_expression == "" and "-" in minute_expression and \ "," not in minute_expression and \ any(exp in hour_expression for exp in self._special_characters) is False: # minute range in single hour (i.e. 0-10 11) minute_parts = minute_expression.split("-") description.append(self.translate("Every minute between {0} and {1}").format( self.format_time(hour_expression, minute_parts[0]), self.format_time(hour_expression, minute_parts[1]))) elif seconds_expression == "" and "," in hour_expression and "-" not in hour_expression and \ any(exp in minute_expression for exp in self._special_characters) is False: # hours list with single minute (o.e. 30 6,14,16) hour_parts = hour_expression.split(",") description.append(self.translate("At")) for i, hour_part in enumerate(hour_parts): description.append(" ") description.append(self.format_time(hour_part, minute_expression)) if i < (len(hour_parts) - 2): description.append(",") if i == len(hour_parts) - 2: description.append(self.translate(" and")) else: # default time description seconds_description = self.get_seconds_description() minutes_description = self.get_minutes_description() hours_description = self.get_hours_description() description.append(seconds_description) if description and minutes_description: description.append(", ") description.append(minutes_description) if description and hours_description: description.append(", ") description.append(hours_description) return str(description) def get_seconds_description(self) -> str: """Generates a description for only the SECONDS portion of the expression Returns: The SECONDS description """ def get_description_format(s: str) -> str: if s == "0": return "" try: if int(s) < 20: return self.translate("at {0} seconds past the minute") return self.translate("at {0} seconds past the minute [grThen20]") or self.translate("at {0} seconds past the minute") except ValueError: return self.translate("at {0} seconds past the minute") return self.get_segment_description( self._expression_parts[0], self.translate("every second"), lambda s: s, lambda s: self.translate("every {0} seconds").format(s), lambda _: self.translate("seconds {0} through {1} past the minute"), get_description_format, lambda _: self.translate(", second {0} through second {1}") or self.translate(", {0} through {1}"), ) def get_minutes_description(self) -> str: """Generates a description for only the MINUTE portion of the expression Returns: The MINUTE description """ seconds_expression = self._expression_parts[0] def get_description_format(s: str) -> str: if s == "0" and seconds_expression == "": return "" try: if int(s) < 20: return self.translate("at {0} minutes past the hour") return self.translate("at {0} minutes past the hour [grThen20]") or self.translate("at {0} minutes past the hour") except ValueError: return self.translate("at {0} minutes past the hour") return self.get_segment_description( self._expression_parts[1], self.translate("every minute"), lambda s: s, lambda s: self.translate("every {0} minutes").format(s), lambda _: self.translate("minutes {0} through {1} past the hour"), get_description_format, lambda _: self.translate(", minute {0} through minute {1}") or self.translate(", {0} through {1}"), ) def get_hours_description(self) -> str: """Generates a description for only the HOUR portion of the expression Returns: The HOUR description """ expression = self._expression_parts[2] return self.get_segment_description( expression, self.translate("every hour"), lambda s: self.format_time(s, "0"), lambda s: self.translate("every {0} hours").format(s), lambda _: self.translate("between {0} and {1}"), lambda _: self.translate("at {0}"), lambda _: self.translate(", hour {0} through hour {1}") or self.translate(", {0} through {1}"), ) def get_day_of_week_description(self) -> str: """Generates a description for only the DAYOFWEEK portion of the expression Returns: The DAYOFWEEK description """ if self._expression_parts[5] == "*": # DOW is specified as * so we will not generate a description and defer to DOM part. # Otherwise, we could get a contradiction like "on day 1 of the month, every day" # or a dupe description like "every day, every day". return "" def get_day_name(s: str) -> str: exp = s if "#" in s: exp, _ = s.split("#", 2) elif "L" in s: exp = exp.replace("L", "") return ExpressionDescriptor.number_to_day(int(exp)) def get_format(s: str) -> str: if "#" in s: day_of_week_of_month = s[s.find("#") + 1:] try: day_of_week_of_month_number = int(day_of_week_of_month) choices = { 1: self.translate("first"), 2: self.translate("second"), 3: self.translate("third"), 4: self.translate("fourth"), 5: self.translate("fifth"), } day_of_week_of_month_description = choices.get(day_of_week_of_month_number, "") except ValueError: day_of_week_of_month_description = "" formatted = "{}{}{}".format(self.translate(", on the "), day_of_week_of_month_description, self.translate(" {0} of the month")) elif "L" in s: formatted = self.translate(", on the last {0} of the month") else: formatted = self.translate(", only on {0}") return formatted return self.get_segment_description( self._expression_parts[5], self.translate(", every day"), lambda s: get_day_name(s), lambda s: self.translate(", every {0} days of the week").format(s), lambda _: self.translate(", {0} through {1}"), lambda s: get_format(s), lambda _: self.translate(", {0} through {1}"), ) def get_month_description(self) -> str: """Generates a description for only the MONTH portion of the expression Returns: The MONTH description """ return self.get_segment_description( self._expression_parts[4], "", lambda s: datetime.date(datetime.datetime.now(tz=datetime.timezone.utc).date().year, int(s), 1).strftime("%B"), lambda s: self.translate(", every {0} months").format(s), lambda _: self.translate(", month {0} through month {1}") or self.translate(", {0} through {1}"), lambda _: self.translate(", only in {0}"), lambda _: self.translate(", month {0} through month {1}") or self.translate(", {0} through {1}"), ) def get_day_of_month_description(self) -> str: """Generates a description for only the DAYOFMONTH portion of the expression Returns: The DAYOFMONTH description """ expression = self._expression_parts[3] if expression == "L": description = self.translate(", on the last day of the month") elif expression in ("LW", "WL"): description = self.translate(", on the last weekday of the month") else: regex = re.compile(r"(\d{1,2}W)|(W\d{1,2})") m = regex.match(expression) if m: # if matches day_number = int(m.group().replace("W", "")) day_string = self.translate("first weekday") if day_number == 1 else self.translate("weekday nearest day {0}").format(day_number) description = self.translate(", on the {0} of the month").format(day_string) elif expression == "*" and self._expression_parts[5] != "*": # DOW is specified, but DOM is *, so do not generate DOM description. # Otherwise, we could get a contradiction like "every day, on Tuesday" description = "" else: # Handle "last day offset"(i.e.L - 5: "5 days before the last day of the month") regex = re.compile(r"L-(\d{1,2})") m = regex.match(expression) if m: # if matches off_set_days = m.group(1) description = self.translate(", {0} days before the last day of the month").format(off_set_days) else: description = self.get_segment_description( expression, self.translate(", every day"), lambda s: s, lambda s: self.translate(", every day") if s == "1" else self.translate(", every {0} days"), lambda _: self.translate(", between day {0} and {1} of the month"), lambda _: self.translate(", on day {0} of the month"), lambda _: self.translate(", {0} through {1}"), ) return description def get_year_description(self) -> str: """Generates a description for only the YEAR portion of the expression Returns: The YEAR description """ def format_year(s: str) -> str: regex = re.compile(r"^\d+$") if regex.match(s): year_int = int(s) if year_int < 1900: return str(year_int) return datetime.date(year_int, 1, 1).strftime("%Y") return s return self.get_segment_description( self._expression_parts[6], "", lambda s: format_year(s), lambda s: self.translate(", every {0} years").format(s), lambda _: self.translate(", year {0} through year {1}") or self.translate(", {0} through {1}"), lambda _: self.translate(", only in {0}"), lambda _: self.translate(", year {0} through year {1}") or self.translate(", {0} through {1}"), ) def get_segment_description( self, expression: str, all_description: str, get_single_item_description: Callable[[str], str], get_interval_description_format: Callable[[str], str], get_between_description_format: Callable[[str], str], get_description_format: Callable[[str], str], get_range_format: Callable[[str], str], ) -> str: """Returns segment description Args: expression: Segment to descript all_description: * get_single_item_description: 1 get_interval_description_format: 1/2 get_between_description_format: 1-2 get_description_format: format get_single_item_description get_range_format: function that formats range expressions depending on cron parts Returns: segment description """ if not expression: return "" if expression == "*": return all_description if not any(ext in expression for ext in ["/", "-", ","]): return get_description_format(expression).format(get_single_item_description(expression)) if "/" in expression: segments = expression.split("/") description = get_interval_description_format(segments[1]).format(segments[1]) # interval contains 'between' piece (i.e. 2-59/3 ) if "-" in segments[0]: between_segment_description = self.generate_between_segment_description( segments[0], get_between_description_format, get_single_item_description, ) if not between_segment_description.startswith(", "): description += ", " description += between_segment_description elif not any(ext in segments[0] for ext in ["*", ","]): range_item_description = get_description_format(segments[0]).format( get_single_item_description(segments[0]), ) range_item_description = range_item_description.replace(", ", "") description += self.translate(", starting {0}").format(range_item_description) return description if "," in expression: segments = expression.split(",") description_content = "" for i, segment in enumerate(segments): if i > 0 and len(segments) > 2: description_content += "," if i < len(segments) - 1: description_content += " " if i > 0 and len(segments) > 1 and (i == len(segments) - 1 or len(segments) == 2): description_content += self.translate(" and ") if "-" in segment: between_segment_description = self.generate_between_segment_description( segment, get_range_format, get_single_item_description, ) between_segment_description = between_segment_description.replace(", ", "") description_content += between_segment_description else: description_content += get_single_item_description(segment) return get_description_format(expression).format(description_content) if "-" in expression: return self.generate_between_segment_description( expression, get_between_description_format, get_single_item_description, ) return "?" def generate_between_segment_description( self, between_expression: str, get_between_description_format: Callable[[str], str], get_single_item_description: Callable[[str], str], ) -> str: """Generates the between segment description :param between_expression: :param get_between_description_format: :param get_single_item_description: :return: The between segment description """ description = "" between_segments = between_expression.split("-") between_segment_1_description = get_single_item_description(between_segments[0]) between_segment_2_description = get_single_item_description(between_segments[1]) between_segment_2_description = between_segment_2_description.replace(":00", ":59") between_description_format = get_between_description_format(between_expression) description += between_description_format.format(between_segment_1_description, between_segment_2_description) return description def format_time( self, hour_expression: str, minute_expression: str, second_expression: str | None=None, ) -> str: """Given time parts, will construct a formatted time description Args: hour_expression: Hours part minute_expression: Minutes part second_expression: Seconds part Returns: Formatted time description """ hour = int(hour_expression) period = "" if self._options.use_24hour_time_format is False: period = self.translate("PM") if (hour >= 12) else self.translate("AM") if period: # add preceding space period = " " + period if hour > 12: hour -= 12 if hour == 0: hour = 12 minute = str(int(minute_expression)) # Removes leading zero if any second = "" if second_expression is not None and second_expression: second = "{}{}".format(":", str(int(second_expression)).zfill(2)) return f"{str(hour).zfill(2)}:{minute.zfill(2)}{second}{period}" def transform_verbosity(self, description: str, *, use_verbose_format: bool = False) -> str: """Transforms the verbosity of the expression description by stripping verbosity from original description Args: description: The description to transform use_verbose_format: If True, will leave description as it, if False, will strip verbose parts Returns: The transformed description with proper verbosity """ if not use_verbose_format: description = description.replace(self.translate(", every minute"), "") description = description.replace(self.translate(", every hour"), "") description = description.replace(self.translate(", every day"), "") description = re.sub(r", ?$", "", description) return description @staticmethod def transform_case(description: str, case_type: CasingTypeEnum) -> str: """Transforms the case of the expression description, based on options Args: description: The description to transform case_type: The casing type that controls the output casing Returns: The transformed description with proper casing """ if case_type == CasingTypeEnum.Sentence: description = f"{description[0].upper()}{description[1:]}" elif case_type == CasingTypeEnum.Title: description = description.title() else: description = description.lower() return description @staticmethod def number_to_day(day_number: int) -> str: """Returns localized day name by its CRON number Args: day_number: Number of a day Returns: Day corresponding to day_number Raises: IndexError: When day_number is not found """ try: return [ calendar.day_name[6], calendar.day_name[0], calendar.day_name[1], calendar.day_name[2], calendar.day_name[3], calendar.day_name[4], calendar.day_name[5], ][day_number] except IndexError as e: msg = f"Day {day_number} is out of range!" raise IndexError(msg) from e def __str__(self) -> str: return self.get_description() def __repr__(self) -> str: return self.get_description() def get_description(expression: str, options: Options | None=None) -> str: """Generates a human readable string for the Cron Expression Args: expression: The cron expression string options: Options to control the output description Returns: The cron expression description """ descriptor = ExpressionDescriptor(expression, options) return descriptor.get_description(DescriptionTypeEnum.FULL) cron-descriptor-2.0.6/cron_descriptor/ExpressionParser.py000066400000000000000000000221611505606603100237250ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. import re from typing import ClassVar from .Exception import FormatError, MissingFieldError from .Options import Options class ExpressionParser: _expression = "" _options: Options _cron_days: ClassVar[dict[int, str]] = { 0: "SUN", 1: "MON", 2: "TUE", 3: "WED", 4: "THU", 5: "FRI", 6: "SAT", } _cron_months: ClassVar[dict[int, str]] = { 1: "JAN", 2: "FEB", 3: "MAR", 4: "APR", 5: "MAY", 6: "JUN", 7: "JUL", 8: "AUG", 9: "SEP", 10: "OCT", 11: "NOV", 12: "DEC", } def __init__(self, expression: str, options: Options) -> None: """Initializes a new instance of the ExpressionParser class Args: expression: The cron expression string options: Parsing options """ self._expression = expression self._options = options def parse(self) -> list[str]: """Parses the cron expression string Returns: A 7 part string array, one part for each component of the cron expression (seconds, minutes, etc.) Raises: MissingFieldException: if _expression is empty or None FormatException: if _expression has wrong format """ # Initialize all elements of parsed array to empty strings parsed = ["", "", "", "", "", "", ""] if not self._expression: msg = "ExpressionDescriptor.expression" raise MissingFieldError(msg) expression_parts_temp = self._expression.split() expression_parts_temp_length = len(expression_parts_temp) if expression_parts_temp_length < 5: msg = f"Error: Expression only has {expression_parts_temp_length} parts. At least 5 part are required." raise FormatError(msg) if expression_parts_temp_length == 5: # 5 part cron so shift array past seconds element for i, expression_part_temp in enumerate(expression_parts_temp): parsed[i + 1] = expression_part_temp elif expression_parts_temp_length == 6: # We will detect if this 6 part expression has a year specified and if so we will shift the parts and treat the # first part as a minute part rather than a second part. # Ways we detect: # 1. Last part is a literal year (i.e. 2020) # 2. 3rd or 5th part is specified as "?" (DOM or DOW) year_regex = re.compile(r"\d{4}$") is_year_with_no_seconds_part = bool(year_regex.search(expression_parts_temp[5])) or "?" in [expression_parts_temp[4], expression_parts_temp[2]] for i, expression_part_temp in enumerate(expression_parts_temp): if is_year_with_no_seconds_part: # Shift parts over by one parsed[i + 1] = expression_part_temp else: parsed[i] = expression_part_temp elif expression_parts_temp_length == 7: parsed = expression_parts_temp else: msg = f"Error: Expression has too many parts ({expression_parts_temp_length}). Expression must not have more than 7 parts." raise FormatError(msg) self.normalize_expression(parsed) return parsed def normalize_expression(self, expression_parts: list[str]) -> None: """Converts cron expression components into consistent, predictable formats. Args: expression_parts: A 7 part string array, one part for each component of the cron expression Returns: None """ # convert ? to * only for DOM and DOW expression_parts[3] = expression_parts[3].replace("?", "*") expression_parts[5] = expression_parts[5].replace("?", "*") # convert 0/, 1/ to */ if expression_parts[0].startswith("0/"): expression_parts[0] = expression_parts[0].replace("0/", "*/") # seconds if expression_parts[1].startswith("0/"): expression_parts[1] = expression_parts[1].replace("0/", "*/") # minutes if expression_parts[2].startswith("0/"): expression_parts[2] = expression_parts[2].replace("0/", "*/") # hours if expression_parts[3].startswith("1/"): expression_parts[3] = expression_parts[3].replace("1/", "*/") # DOM if expression_parts[4].startswith("1/"): expression_parts[4] = expression_parts[4].replace("1/", "*/") # Month if expression_parts[5].startswith("1/"): expression_parts[5] = expression_parts[5].replace("1/", "*/") # DOW if expression_parts[6].startswith("1/"): expression_parts[6] = expression_parts[6].replace("1/", "*/") # Years # Adjust DOW based on dayOfWeekStartIndexZero option def digit_replace(match: re.Match[str]) -> str: match_value = match.group() dow_digits = re.sub(r"\D", "", match_value) dow_digits_adjusted = dow_digits if self._options.day_of_week_start_index_zero: if dow_digits == "7": dow_digits_adjusted = "0" else: dow_digits_adjusted = str(int(dow_digits) - 1) return match_value.replace(dow_digits, dow_digits_adjusted) expression_parts[5] = re.sub(r"(^\d)|([^#/\s]\d)", digit_replace, expression_parts[5]) # Convert DOM '?' to '*' if expression_parts[3] == "?": expression_parts[3] = "*" # convert SUN-SAT format to 0-6 format for day_number in self._cron_days: expression_parts[5] = expression_parts[5].upper().replace(self._cron_days[day_number], str(day_number)) # convert JAN-DEC format to 1-12 format for month_number in self._cron_months: expression_parts[4] = expression_parts[4].upper().replace( self._cron_months[month_number], str(month_number)) # convert 0 second to (empty) if expression_parts[0] == "0": expression_parts[0] = "" # If time interval is specified for seconds or minutes and next time part is single item, make it a "self-range" so # the expression can be interpreted as an interval 'between' range. # For example: # 0-20/3 9 * * * => 0-20/3 9-9 * * * (9 => 9-9) # */5 3 * * * => */5 3-3 * * * (3 => 3-3) star_and_slash = ["*", "/"] has_part_zero_star_and_slash = any(ext in expression_parts[0] for ext in star_and_slash) has_part_one_star_and_slash = any(ext in expression_parts[1] for ext in star_and_slash) has_part_two_special_chars = any(ext in expression_parts[2] for ext in ["*", "-", ",", "/"]) if not has_part_two_special_chars and (has_part_zero_star_and_slash or has_part_one_star_and_slash): expression_parts[2] += f"-{expression_parts[2]}" # Loop through all parts and apply global normalization length = len(expression_parts) for i in range(length): # convert all '*/1' to '*' if expression_parts[i] == "*/1": expression_parts[i] = "*" """ Convert Month,DOW,Year step values with a starting value (i.e. not '*') to between expressions. This allows us to reuse the between expression handling for step values. For Example: - month part '3/2' will be converted to '3-12/2' (every 2 months between March and December) - DOW part '3/2' will be converted to '3-6/2' (every 2 days between Tuesday and Saturday) """ if "/" in expression_parts[i] and not any(exp in expression_parts[i] for exp in ["*", "-", ","]): choices = { 4: "12", 5: "6", 6: "9999", } step_range_through = choices.get(i) if step_range_through is not None: parts = expression_parts[i].split("/") expression_parts[i] = f"{parts[0]}-{step_range_through}/{parts[1]}" cron-descriptor-2.0.6/cron_descriptor/ExpressionValidator.py000066400000000000000000000674501505606603100244300ustar00rootroot00000000000000from __future__ import annotations import re from typing import ClassVar from cron_descriptor import FormatError class ExpressionValidator: _cron_days: ClassVar[dict[int, str]] = { 0: "SUN", 1: "MON", 2: "TUE", 3: "WED", 4: "THU", 5: "FRI", 6: "SAT", } _cron_months: ClassVar[dict[int, str]] = { 1: "JAN", 2: "FEB", 3: "MAR", 4: "APR", 5: "MAY", 6: "JUN", 7: "JUL", 8: "AUG", 9: "SEP", 10: "OCT", 11: "NOV", 12: "DEC", } def validate(self, expression: str) -> None: """Parses the cron expression string Returns: A 7 part string array, one part for each component of the cron expression (seconds, minutes, etc.) Raises: MissingFieldException: if _expression is empty or None FormatException: if _expression has wrong format """ # Initialize all elements of parsed array to empty strings parsed = ["", "", "", "", "", "", ""] expression_parts_temp = expression.split() expression_parts_temp_length = len(expression_parts_temp) if expression_parts_temp_length < 5: msg = f"Error: Expression only has {expression_parts_temp_length} parts. At least 5 part are required." raise FormatError(msg) if expression_parts_temp_length == 5: # 5 part cron so shift array past seconds element for i, expression_part_temp in enumerate(expression_parts_temp): parsed[i + 1] = expression_part_temp elif expression_parts_temp_length == 6: # We will detect if this 6 part expression has a year specified and if so we will shift the parts and treat the # first part as a minute part rather than a second part. # Ways we detect: # 1. Last part is a literal year (i.e. 2020) # 2. 3rd or 5th part is specified as "?" (DOM or DOW) year_regex = re.compile(r"\d{4}$") is_year_with_no_seconds_part = bool(year_regex.search(expression_parts_temp[5])) or "?" in [ expression_parts_temp[4], expression_parts_temp[2]] for i, expression_part_temp in enumerate(expression_parts_temp): if is_year_with_no_seconds_part: # Shift parts over by one parsed[i + 1] = expression_part_temp else: parsed[i] = expression_part_temp elif expression_parts_temp_length == 7: parsed = expression_parts_temp else: msg = f"Error: Expression has too many parts ({expression_parts_temp_length}). Expression must not have more than 7 parts." raise FormatError(msg) self._validate_expression(parsed, expression_parts_temp_length) def _validate_expression(self, expression_parts: list[str], expr_length: int) -> None: """Validation for each expression fields Args: expression_parts: expression list expr_length: length of the list """ """ Apply different index for varying length of the expression parts as it is mutated by parse(). Does not validate the case for having both DOW,DOM value because it is already causing exception. """ if expr_length == 5: self.second_minute(expression_parts[1], "Second and Minute") self.hour(expression_parts[2], "Hour") self.dayofmonth(expression_parts[3], "DayOfMonth") self.month(expression_parts[4], "Month") self.dayofweek(expression_parts[5], "DayOfWeek") elif expr_length == 6: year_regex = re.compile(r"\d{4}$") if year_regex.search(expression_parts[6]) is None: if expression_parts[0]: self.second_minute(expression_parts[0], "Second and Minute") self.second_minute(expression_parts[1], "Second and Minute") self.hour(expression_parts[2], "Hour") self.dayofmonth(expression_parts[3], "DayOfMonth") self.month(expression_parts[4], "Month") self.dayofweek(expression_parts[5], "DayOfWeek") else: self.second_minute(expression_parts[1], "Second and Minute") self.hour(expression_parts[2], "Hour") self.dayofmonth(expression_parts[3], "DayOfMonth") self.month(expression_parts[4], "Month") self.dayofweek(expression_parts[5], "DayOfWeek") self.year(expression_parts[6], "Year") else: if expression_parts[0]: self.second_minute(expression_parts[0], "Second and Minute") self.second_minute(expression_parts[1], "Second and Minute") self.hour(expression_parts[2], "Hour") self.dayofmonth(expression_parts[3], "DayOfMonth") self.month(expression_parts[4], "Month") self.dayofweek(expression_parts[5], "DayOfWeek") if expression_parts[6]: self.year(expression_parts[6], "Year") def second_minute(self, expr: str, prefix: str) -> None: """ sec/min expressions (n : Number, s: String) * nn (1~59) nn-nn nn/nn nn-nn/nn */nn nn,nn,nn (Maximum 24 elements) """ mi, mx = (0, 59) if re.match(r"\d{1,2}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.search(r"[-*,/]", expr): if expr == "*": pass elif re.match(r"\d{1,2}-\d{1,2}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}-\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\*/\d{1,2}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"^(\d{1,2}|\d{1,2}-\d{1,2})(,\d{1,2}|,\d{1,2}-\d{1,2})+$", expr): limit = 60 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) for n in expr_ls: if "-" in n: parts = n.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) else: self.check_range(expr=n, mi=mi, mx=mx, prefix=prefix) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def hour(self, expr: str, prefix: str) -> None: """ hour expressions (n : Number, s: String) * nn (1~23) nn-nn nn/nn nn-nn/nn */nn nn,nn,nn (Maximum 24 elements) """ mi, mx = (0, 23) if re.match(r"\d{1,2}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.search(r"[-*,/]", expr): if expr == "*": pass elif re.match(r"\d{1,2}-\d{1,2}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}-\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\*/\d{1,2}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"^(\d{1,2}|\d{1,2}-\d{1,2})(,\d{1,2}|,\d{1,2}-\d{1,2})+$", expr): limit = 24 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) for n in expr_ls: if "-" in n: parts = n.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) else: self.check_range(expr=n, mi=mi, mx=mx, prefix=prefix) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def dayofmonth(self, expr: str, prefix: str) -> None: """ DAYOfMonth expressions (n : Number, s: String) * ? nn (1~31) nn-nn nn/nn nn-nn/nn */nn nn,nn,nn (Maximum 31 elements) L-nn LW nW """ mi, mx = (1, 31) if re.match(r"\d{1,2}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.search(r"[-*,/?]", expr): if expr in ("*", "?"): pass elif re.match(r"\d{1,2}-\d{1,2}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}-\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"\*/\d{1,2}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"^\d{1,2}(,\d{1,2})+$", expr): limit = 31 expr_ls = expr.split(",") if len(expr_ls) > 31: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) for dayofmonth in expr_ls: self.check_range(expr=dayofmonth, mi=mi, mx=mx, prefix=prefix) elif re.match(r"^([Ll])-(\d{1,2})$", expr): parts = expr.split("-") self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) else: msg = f"Illegal Expression Format '{expr}'" raise FormatError(msg) elif re.match(r"^([Ll])([Ww])?$", expr) or re.match(r"^([Ww])([Ll])?$", expr): pass elif re.match(r"^(\d{1,2})([wW])$", expr): self.check_range(expr=expr[:-1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"^([wW])(\d{1,2})$", expr): self.check_range(expr=expr[1:], mi=mi, mx=mx, prefix=prefix) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def month(self, expr: str, prefix: str) -> None: """ month expressions (n : Number, s: String) * nn (1~12) sss (JAN~DEC) nn-nn sss-sss nn/nn nn-nn/nn */nn nn,nn,nn,nn-nn,sss-sss (Maximum 12 elements) """ mi, mx = (1, 12) if re.match(r"\d{1,2}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.match(r"\D{3}$", expr): matched_month = [m for m in self._cron_months.values() if expr == m] if len(matched_month) == 0: msg = f"Invalid Month value '{expr}'" raise FormatError(msg) elif re.search(r"[-*,/]", expr): if expr == "*": pass elif re.match(r"\d{1,2}-\d{1,2}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\D{3}-\D{3}$", expr): parts = expr.split("-") cron_months = {v: k for (k, v) in self._cron_months.items()} st_not_exist = parts[0] not in cron_months ed_not_exist = parts[1] not in cron_months if st_not_exist or ed_not_exist: msg = f"Invalid Month value '{expr}'" raise FormatError(msg) self.compare_range(st=cron_months[parts[0]], ed=cron_months[parts[1]], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"\d{1,2}-\d{1,2}/\d{1,2}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=12, prefix=prefix) elif re.match(r"\*/\d{1,2}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=0, mx=12, prefix=prefix) elif re.match(r"^\d{1,2}(,\d{1,2})+$", expr): limit = 12 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) for month in expr_ls: self.check_range(expr=month, mi=mi, mx=mx, prefix=prefix) elif re.match(r"^((\d{1,2}|\D{3})|(\D{3}-\D{3})|(\d{1,2}-\d{1,2}))((,\d{1,2})+" r"|(,\D{3})*|(,\d{1,2}-\d{1,2})*|(,\D{3}-\D{3})*)*$", expr): """ 1st Capture group : digit{1~2}|nondigit{3}|nondigit{3}-nondigit{3}|digit{3}-digit{3} 2nd Capture group : same with 1st capture group but repeated. """ limit = 12 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) cron_months = {v: k for (k, v) in self._cron_months.items()} for month in expr_ls: if "-" in month: parts = month.split("-") if len(parts[0]) == 3: self.check_range(expr=cron_months[parts[0].upper()], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=cron_months[parts[1].upper()], mi=mi, mx=mx, prefix=prefix) else: self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) else: cron_month = cron_months[month.upper()] if len(month) == 3 else month self.check_range(expr=cron_month, mi=mi, mx=mx, prefix=prefix) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def dayofweek(self, expr: str, prefix: str) -> None: """ DAYOfWeek expressions (n : Number, s: String) * ? n (0~7) - 0 and 7 used interchangeable as Sunday sss (SUN~SAT) n/n n-n/n */n n-n sss-sss n|sss,n|sss,n|sss,n-n,sss-sss (maximum 7 elements) nL n#n """ mi, mx = (0, 7) if expr in ("*", "?"): pass elif re.match(r"\d{1}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.match(r"\D{3}$", expr): cron_days = {v: k for (k, v) in self._cron_days.items()} if expr.upper() in cron_days: pass else: msg = f"Invalid value '{expr}'" raise FormatError(msg) elif re.match(r"\d{1}/\d{1}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"\d{1}-\d{1}/\d{1}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"[*]/\d{1}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=0, mx=mx, prefix=prefix) elif re.match(r"\d{1}-\d{1}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\D{3}-\D{3}$", expr): parts = expr.split("-") cron_days = {v: k for (k, v) in self._cron_days.items()} try: st_day = cron_days[parts[0].upper()] ed_day = cron_days[parts[1].upper()] except KeyError as e: msg = f"({prefix}) Invalid value '{expr}'" raise FormatError(msg) from e self.compare_range(st=st_day, ed=ed_day, mi=mi, mx=mx, prefix=prefix, type_="dow") elif re.match(r"^((\d{1}|\D{3})|(\D{3}-\D{3})|(\d{1}-\d{1}))" r"((,\d{1})+|(,\D{3})*|(,\d{1}-\d{1})*|(,\D{3}-\D{3})*)*$", expr): limit = 7 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) cron_days = {v: k for (k, v) in self._cron_days.items()} for day in expr_ls: if "-" in day: parts = day.split("-") if len(parts[0]) == 3: self.check_range(expr=cron_days[parts[0].upper()], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=cron_days[parts[1].upper()], mi=mi, mx=mx, prefix=prefix) else: self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) else: # syncronize by add 1 to cron_days index cron_day = cron_days[day.upper()] + 1 if len(day) == 3 else day self.check_range(expr=cron_day, mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{1}([lL])$", expr): parts = expr.upper().split("L") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d#\d$", expr): parts = expr.split("#") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=5, prefix=prefix, type_="dow") elif re.match(r"\D{3}#\d$", expr): parts = expr.split("#") cron_days = {v: k for (k, v) in self._cron_days.items()} try: st_day = cron_days[parts[0].upper()] except KeyError as e: msg = f"({prefix}) Invalid value '{expr}'" raise FormatError(msg) from e self.check_range(expr=parts[1], mi=mi, mx=5, prefix=prefix, type_="dow") else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def year(self, expr: str, prefix: str) -> None: """ Year - valid expression (n : Number) * nnnn(1970~2099) - 4 digits number nnnn-nnnn(1970~2099) nnnn/nnn(0~129) */nnn(0~129) nnnn,nnnn,nnnn(1970~2099) - maximum 86 elements """ mi, mx = (1970, 2099) if re.match(r"\d{4}$", expr): self.check_range(expr=expr, mi=mi, mx=mx, prefix=prefix) elif re.search(r"[-*,/]", expr): if expr == "*": pass elif re.match(r"\d{4}-\d{4}$", expr): parts = expr.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) elif re.match(r"\d{4}/\d{1,3}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=129, prefix=prefix) elif re.match(r"\d{4}-\d{4}/\d{1,3}$", expr): parts = expr.split("/") fst_parts = parts[0].split("-") self.check_range(expr=fst_parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=fst_parts[0], ed=fst_parts[1], mi=mi, mx=mx, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=129, prefix=prefix) elif re.match(r"\*/\d{1,3}$", expr): parts = expr.split("/") self.check_range(type_="interval", expr=parts[1], mi=0, mx=129, prefix=prefix) elif re.match(r"\d{1}/\d{1,3}$", expr): parts = expr.split("/") self.check_range(expr=parts[0], mi=0, mx=129, prefix=prefix) self.check_range(type_="interval", expr=parts[1], mi=0, mx=129, prefix=prefix) elif re.match(r"^(\d{4}|\d{4}-\d{4})(,\d{4}|,\d{4}-\d{4})+$", expr): limit = 84 expr_ls = expr.split(",") if len(expr_ls) > limit: msg = f"({prefix}) Exceeded maximum number({limit}) of specified value. '{len(expr_ls)}' is provided" raise FormatError(msg) for year in expr_ls: if "-" in year: parts = year.split("-") self.check_range(expr=parts[0], mi=mi, mx=mx, prefix=prefix) self.check_range(expr=parts[1], mi=mi, mx=mx, prefix=prefix) self.compare_range(st=parts[0], ed=parts[1], mi=mi, mx=mx, prefix=prefix) else: self.check_range(expr=year, mi=mi, mx=mx, prefix=prefix) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) else: msg = f"({prefix}) Illegal Expression Format '{expr}'" raise FormatError(msg) def check_range(self, prefix: str, mi: int, mx: int, expr: str | int, type_: str| None=None) -> None: """ check if expression value within range of specified limit """ if int(expr) < mi or mx < int(expr): if type_ is None: msg = f"{prefix} values must be between {mi} and {mx} but '{expr}' is provided" elif type_ == "interval": msg = f"({prefix}) Accepted increment value range is {mi}~{mx} but '{expr}' is provided" elif type_ == "dow": msg = f"({prefix}) Accepted week value is {mi}~{mx} but '{expr}' is provided" else: msg = "" raise FormatError(msg) def compare_range(self, prefix: str, st: str | int, ed: str | int, mi:int, mx: int, type_: str | None=None) -> None: """ check 2 expression values size does not allow {st} value to be greater than {ed} value """ st_int = int(st) ed_int = int(ed) if st_int > ed_int: if type_ is None: msg = f"({prefix}) Invalid range '{st}-{ed}'. Accepted range is {mi}-{mx}" elif type_ == "dow": msg = f"({prefix}) Invalid range '{self._cron_days[st_int]}-{self._cron_days[ed_int]}'. Accepted range is {mi}-{mx}" else: msg = "" raise FormatError(msg) cron-descriptor-2.0.6/cron_descriptor/GetText.py000066400000000000000000000050271505606603100217770ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from __future__ import annotations import gettext import logging from pathlib import Path logger = logging.getLogger(__name__) class FallBackNull(gettext.NullTranslations): def gettext(self, _message: str) -> str: # If we get here, that means that original translator failed, we will return empty string return "" class GetText: """Handles language translations """ def __init__(self, locale_code: str, locale_location: str | None = None) -> None: """Initialize GetText :param locale_code selected locale """ try: self.trans = self.load_locale(locale_code, locale_location) except OSError: logger.debug("Failed to find locale %s", locale_code) logger.debug("Attempting to load en_US as fallback") self.trans = self.load_locale("en_US") # Add fallback that does not return original string, this is hack to add # support for _("") or _("") self.trans.add_fallback(FallBackNull()) def load_locale(self, locale_code: str, locale_location: str | None=None) -> gettext.GNUTranslations: dir_path = Path(locale_location) if locale_location else Path(__file__).resolve().parent.joinpath("locale") filename = dir_path.joinpath(f"{locale_code}.mo") with filename.open("rb") as f: trans = gettext.GNUTranslations(f) logger.debug("%s Loaded", filename) return trans cron-descriptor-2.0.6/cron_descriptor/Options.py000066400000000000000000000065001505606603100220430ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from __future__ import annotations import locale import warnings from .CasingTypeEnum import CasingTypeEnum class Options: """ Options for parsing and describing a Cron Expression """ locale_code: str casing_type: CasingTypeEnum verbose: bool day_of_week_start_index_zero: bool use_24hour_time_format: bool locale_location: str | None _twelve_hour_locales = ( "en_US", # United States "en_CA", # Canada (English) "fr_CA", # Canada (French) "en_AU", # Australia "en_NZ", # New Zealand "en_IE", # Ireland "en_PH", # Philippines "es_MX", # Mexico "en_PK", # Pakistan "en_IN", # India "ar_SA", # Saudi Arabia "bn_BD", # Bangladesh "es_HN", # Honduras "es_SV", # El Salvador "es_NI", # Nicaragua "ar_JO", # Jordan "ar_EG", # Egypt "es_CO", # Colombia ) def __init__(self, casing_type: CasingTypeEnum = CasingTypeEnum.Sentence, *, verbose: bool = False, day_of_week_start_index_zero: bool = True, use_24hour_time_format: bool | None = None, locale_code: str | None = None, locale_location: str | None = None, ) -> None: self.casing_type = casing_type self.verbose = verbose self.day_of_week_start_index_zero = day_of_week_start_index_zero self.locale_location = locale_location if not locale_code: # Autodetect code, _encoding = locale.getlocale() if not code: warnings.warn( "No system locale set. Falling back to 'en_US'. " "Set LANG/LC_ALL or pass locale_code to override.", stacklevel=2, ) code = "en_US" self.locale_code = code else: self.locale_code = locale_code if use_24hour_time_format is None: # Autodetect self.use_24hour_time_format = self.locale_code not in self._twelve_hour_locales else: self.use_24hour_time_format = use_24hour_time_format cron-descriptor-2.0.6/cron_descriptor/StringBuilder.py000066400000000000000000000032121505606603100231620ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. class StringBuilder: string: list[str] """ Builds string parts together acting like Java/.NET StringBuilder """ def __init__(self) -> None: self.string = [] def append(self, string: str) -> None: """Appends non empty string Args: string: String to append Returns: None """ if string: self.string.append(string) def __str__(self) -> str: return "".join(self.string) def __len__(self) -> int: return len(self.string) cron-descriptor-2.0.6/cron_descriptor/__init__.py000066400000000000000000000033361505606603100221530ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from .CasingTypeEnum import CasingTypeEnum from .DescriptionTypeEnum import DescriptionTypeEnum from .Exception import FormatError, FormatException, MissingFieldError, MissingFieldException, WrongArgumentError, WrongArgumentException from .ExpressionDescriptor import ExpressionDescriptor, get_description from .Options import Options __version__ = "2.0.6" __all__ = [ "CasingTypeEnum", "DescriptionTypeEnum", "ExpressionDescriptor", "FormatError", "FormatException", "MissingFieldError", "MissingFieldException", "Options", "WrongArgumentError", "WrongArgumentException", "get_description", ] cron-descriptor-2.0.6/cron_descriptor/__main__.py000066400000000000000000000016461505606603100221360ustar00rootroot00000000000000import argparse from cron_descriptor import CasingTypeEnum, ExpressionDescriptor, Options parser = argparse.ArgumentParser(prog="cron_descriptor") parser.add_argument("expression") parser.add_argument("-c", "--casing", choices=[v for v in vars(CasingTypeEnum) if not v.startswith("_")], default="Sentence") parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("-W", "--one-indexed-week", action="store_true") parser.add_argument("-H", "--use-24-hour-time-format", action="store_true") args = parser.parse_args() options = Options() options.casing_type = getattr(CasingTypeEnum, args.casing) options.verbose = args.verbose options.day_of_week_start_index_zero = not args.one_indexed_week options.use_24hour_time_format = args.use_24_hour_time_format descriptor = ExpressionDescriptor(args.expression, options) print(str(descriptor)) cron-descriptor-2.0.6/cron_descriptor/locale/000077500000000000000000000000001505606603100212745ustar00rootroot00000000000000cron-descriptor-2.0.6/cron_descriptor/locale/cs_CZ.mo000066400000000000000000000055341505606603100226410ustar00rootroot00000000000000,|;&  &5Fcv "  ' 5C_U   4 ? LYi{ %'' HK O] |  $ %? e  M    - 3 A _ n }            4 < & ", *!%  (+#$' ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-06-29 23:06+0200 Last-Translator: Adam Schubert Language-Team: Language: cs_CZ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.0.1 a a {0} měsíce, mezi {0} a {1} dnem měsíce, každý den, každou hodinu, každou minutu, každých {0} dnů, každých {0} dnů v týdnu, každý {0} měsíc, každý {0} rok, v {0} den v měsíci, na , v poslední den měsíce, v poslední všední den v měsíci, v poslední {0} měsíce, v {0} měsíce, pouze v {0}, pouze v {0}, {0} do {1}Nastala chyba při generování popisu výrazu. Zkontrolujte syntaxi výrazu.VeVe Každou minutu mezi {0} a {1}v {0}v minutě {0}v {0} sekund uplynulou minutumezi {0} a {1}každou hodinukaždou minutukaždou sekundukaždých {0} hodinkaždých {0} minutkaždých {0} sekundpátýprvníprvní víkendový denčtvrtý{0} až {1} minutdruhý{0} až {1} sekundtřetínejbližší všední den k {0}cron-descriptor-2.0.6/cron_descriptor/locale/cs_CZ.po000066400000000000000000000116351505606603100226430ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2022-06-29 23:06+0200\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0.1\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "Nastala chyba při generování popisu výrazu. Zkontrolujte syntaxi výrazu." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Ve " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Každou minutu mezi {0} a {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Ve" #: ExpressionDescriptor.py:175 msgid " and" msgstr " a" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "každou sekundu" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "každých {0} sekund" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "{0} až {1} sekund" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "v {0} sekund uplynulou minutu" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "každou minutu" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "každých {0} minut" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "{0} až {1} minut" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "v minutě {0}" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "každou hodinu" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "každých {0} hodin" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "mezi {0} a {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "v {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "první" #: ExpressionDescriptor.py:243 msgid "second" msgstr "druhý" #: ExpressionDescriptor.py:245 msgid "third" msgstr "třetí" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "čtvrtý" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "pátý" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", na " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} měsíce" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", v poslední {0} měsíce" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", pouze v {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", každý den" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", každých {0} dnů v týdnu" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} do {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", každý {0} měsíc" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", pouze v {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", v poslední den měsíce" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", v poslední všední den v měsíci" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "první víkendový den" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "nejbližší všední den k {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", v {0} měsíce" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", každých {0} dnů" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", mezi {0} a {1} dnem měsíce" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", v {0} den v měsíci" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", každý {0} rok" #: ExpressionDescriptor.py:385 msgid " and " msgstr " a " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", každou minutu" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", každou hodinu" cron-descriptor-2.0.6/cron_descriptor/locale/da_DK.mo000066400000000000000000000055701505606603100226020ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP" ; F R`p # / H T ` j )z  K    * 1 N l ~        + $ -* X _ and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: da_DK MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit og og {0} i måneden, mellem dag {0} og {1} i måneden, hver dag, hver time, hvert minut, hver {0}. dag, hver {0}. ugedag, hver {0}. måned, hvert {0}. år, på dag {0} i måneden, på den , på den sidste dag i måneden, på den sidste hverdag i måneden, på den sidste {0} i måneden, på den {0} i måneden, kun i {0}, kun i {0}, kun {0}, startende {0}, {0} dage før den sidste dag i måneden, {0} til og med {1}Der skete en fejl ved genereringen af beskrivelsen. Kontroller cron reglen.klkl hvert minut mellem {0} og {1}kl {0}{0} minutter efter timeskift{0} sekunder efter minutskiftmellem {0} og {1}hver timehvert minuthvert sekundhver {0}. timehvert {0}. minuthvert {0}. sekundfemteførsteførste hverdagfjerdeminutterne fra {0} til og med {1} hver timeandensekunderne fra {0} til og med {1} hvert minuttredjehverdag nærmest dag {0}cron-descriptor-2.0.6/cron_descriptor/locale/da_DK.po000066400000000000000000000076201505606603100226030ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \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" #. EveryMinute msgid "every minute" msgstr "hvert minut" #. EveryHour msgid "every hour" msgstr "hver time" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Der skete en fejl ved genereringen af beskrivelsen. Kontroller cron reglen." #. AtSpace msgid "At " msgstr "kl " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "hvert minut mellem {0} og {1}" #. At msgid "At" msgstr "kl" #. SpaceAnd msgid " and" msgstr " og" #. EverySecond msgid "every second" msgstr "hvert sekund" #. EveryX0Seconds msgid "every {0} seconds" msgstr "hvert {0}. sekund" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "sekunderne fra {0} til og med {1} hvert minut" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "{0} sekunder efter minutskift" #. EveryX0Minutes msgid "every {0} minutes" msgstr "hvert {0}. minut" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "minutterne fra {0} til og med {1} hver time" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "{0} minutter efter timeskift" #. EveryX0Hours msgid "every {0} hours" msgstr "hver {0}. time" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "mellem {0} og {1}" #. AtX0 msgid "at {0}" msgstr "kl {0}" #. ComaEveryDay msgid ", every day" msgstr ", hver dag" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", hver {0}. ugedag" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} til og med {1}" #. First msgid "first" msgstr "første" #. Second msgid "second" msgstr "anden" #. Third msgid "third" msgstr "tredje" #. Fourth msgid "fourth" msgstr "fjerde" #. Fifth msgid "fifth" msgstr "femte" #. ComaOnThe msgid ", on the " msgstr ", på den " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} i måneden" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", på den sidste {0} i måneden" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", kun {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", hver {0}. måned" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", kun i {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", på den sidste dag i måneden" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", på den sidste hverdag i måneden" #. FirstWeekday msgid "first weekday" msgstr "første hverdag" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "hverdag nærmest dag {0}" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", på den {0} i måneden" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", hver {0}. dag" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", mellem dag {0} og {1} i måneden" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", på dag {0} i måneden" #. SpaceAndSpace msgid " and " msgstr " og " #. ComaEveryMinute msgid ", every minute" msgstr ", hvert minut" #. ComaEveryHour msgid ", every hour" msgstr ", hver time" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", hvert {0}. år" #. CommaStartingX0 msgid ", starting {0}" msgstr ", startende {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} dage før den sidste dag i måneden" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", kun i {0}" cron-descriptor-2.0.6/cron_descriptor/locale/de_DE.mo000066400000000000000000000052151505606603100225740ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4%   ->V\x   _P S W x          + 3 G O d l and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: de_DE und und {0} des Monats, zwischen Tag {0} und {1} des Monats, jeden Tag, jede Stunde, jede Minute, alle {0} Tage, every {0} days of the week, alle {0} Monate, alle {0} Jahre, am {0} Tag des Monats, am , am letzten Tag des Monats, am letzten Werktag des Monats, am letzten {0} des Monats, am {0} des Monats, nur im {0}, nur am {0}, {0} bis {1}An error occured when generating the expression description. Check the cron expression syntax.UmUm Jede Minute zwischen {0} und {1}um {0}bei Minute {0}bei Sekunde {0}zwischen {0} und {1}jede Stundejede MinuteJede Sekundealle {0} Stundenalle {0} Minutenalle {0} Sekundenfünftenerstenersten WerktagviertenMinuten {0} bis {1}zweitenSekunden {0} bis {1}drittenWerktag am nächsten zum {0} Tagcron-descriptor-2.0.6/cron_descriptor/locale/de_DE.po000066400000000000000000000116231505606603100225770ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de_DE\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "An error occured when generating the expression description. Check the cron" " expression syntax." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Um " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Jede Minute zwischen {0} und {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Um" #: ExpressionDescriptor.py:175 msgid " and" msgstr " und" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "Jede Sekunde" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "alle {0} Sekunden" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "Sekunden {0} bis {1}" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "bei Sekunde {0}" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "jede Minute" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "alle {0} Minuten" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "Minuten {0} bis {1}" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "bei Minute {0}" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "jede Stunde" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "alle {0} Stunden" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "zwischen {0} und {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "um {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "ersten" #: ExpressionDescriptor.py:243 msgid "second" msgstr "zweiten" #: ExpressionDescriptor.py:245 msgid "third" msgstr "dritten" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "vierten" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "fünften" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", am " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} des Monats" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", am letzten {0} des Monats" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", nur am {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", jeden Tag" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", every {0} days of the week" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} bis {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", alle {0} Monate" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", nur im {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", am letzten Tag des Monats" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", am letzten Werktag des Monats" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "ersten Werktag" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "Werktag am nächsten zum {0} Tag" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", am {0} des Monats" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", alle {0} Tage" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", zwischen Tag {0} und {1} des Monats" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", am {0} Tag des Monats" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", alle {0} Jahre" #: ExpressionDescriptor.py:385 msgid " and " msgstr " und " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", jede Minute" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", jede Stunde" cron-descriptor-2.0.6/cron_descriptor/locale/el_GR.mo000066400000000000000000000071151505606603100226250ustar00rootroot000000000000001,,-28&J q } "/Rq   +_eh l    .@F LZ%a'P%-6-Ky5 ! '= e 6n G /  : N b v W    /  . >7 v   !   % , ; &F m 0~  @ > and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: el_GR MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit και και {0} του μήνα, μεταξύ {0} και {1} του μήνα, κάθε μέρα, κάθε ώρα, κάθε λεπτό, κάθε {0} ημέρες, κάθε {0} ημέρες της εβδομάδας, κάθε {0} μήνες, κάθε {0} χρόνια, την {0} ημέρα του μήνα, την, την τελευταία ημέρα του μήνα, την τελευταία εργάσιμη ημέρα του μήνα, την τελευταία {0} του μήνα, την {0} του μήνα, μόνο το {0}, μόνο το {0}, μόνο το {0}, ξεκινώντας {0}, {0} ημέρες πριν από την τελευταία ημέρα του μήνα, {0} έως {1}π.μΈνα σφάλμα συνέβη κατά τη δημιουργία της περιγραφής έκφρασης. Ελέγξτε τη σύνταξη της έκφρασης cron.ΣτιςΣτις Κάθε λεπτό μεταξύ {0} και {1}μμστις {0}στις {0} λεπτά μετά την ώραστις {0} δευτερόλεπτα μετά το λεπτόμεταξύ {0} και {1}κάθε ώρακάθε λεπτόκάθε δευτερόλεπτοκάθε {0} ώρεςκάθε {0} λεπτάκάθε {0} δευτερόλεπταπέμπτοςπρώταπρώτη εργάσιμη ημέρατέταρτοςλεπτά {0} έως {1} μετά την ώραδεύτεροςδευτερόλεπτα {0} έως {1} μετά το λεπτότρίτοςεργάσιμη ημέρα κοντά στην ημέρα {0}cron-descriptor-2.0.6/cron_descriptor/locale/el_GR.po000066400000000000000000000112041505606603100226220ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: el_GR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "κάθε λεπτό" #. EveryHour msgid "every hour" msgstr "κάθε ώρα" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Ένα σφάλμα συνέβη κατά τη δημιουργία της περιγραφής έκφρασης. Ελέγξτε τη " "σύνταξη της έκφρασης cron." #. AtSpace msgid "At " msgstr "Στις " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "Κάθε λεπτό μεταξύ {0} και {1}" #. At msgid "At" msgstr "Στις" #. SpaceAnd msgid " and" msgstr " και" #. EverySecond msgid "every second" msgstr "κάθε δευτερόλεπτο" #. EveryX0Seconds msgid "every {0} seconds" msgstr "κάθε {0} δευτερόλεπτα" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "δευτερόλεπτα {0} έως {1} μετά το λεπτό" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "στις {0} δευτερόλεπτα μετά το λεπτό" #. EveryX0Minutes msgid "every {0} minutes" msgstr "κάθε {0} λεπτά" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "λεπτά {0} έως {1} μετά την ώρα" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "στις {0} λεπτά μετά την ώρα" #. EveryX0Hours msgid "every {0} hours" msgstr "κάθε {0} ώρες" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "μεταξύ {0} και {1}" #. AtX0 msgid "at {0}" msgstr "στις {0}" #. ComaEveryDay msgid ", every day" msgstr ", κάθε μέρα" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", κάθε {0} ημέρες της εβδομάδας" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} έως {1}" #. First msgid "first" msgstr "πρώτα" #. Second msgid "second" msgstr "δεύτερος" #. Third msgid "third" msgstr "τρίτος" #. Fourth msgid "fourth" msgstr "τέταρτος" #. Fifth msgid "fifth" msgstr "πέμπτος" #. ComaOnThe msgid ", on the " msgstr ", την" #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} του μήνα" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", την τελευταία {0} του μήνα" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", μόνο το {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", κάθε {0} μήνες" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", μόνο το {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", την τελευταία ημέρα του μήνα" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", την τελευταία εργάσιμη ημέρα του μήνα" #. FirstWeekday msgid "first weekday" msgstr "πρώτη εργάσιμη ημέρα" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "εργάσιμη ημέρα κοντά στην ημέρα {0}" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", την {0} του μήνα" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", κάθε {0} ημέρες" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", μεταξύ {0} και {1} του μήνα" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", την {0} ημέρα του μήνα" #. SpaceAndSpace msgid " and " msgstr " και " #. ComaEveryMinute msgid ", every minute" msgstr ", κάθε λεπτό" #. ComaEveryHour msgid ", every hour" msgstr ", κάθε ώρα" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", κάθε {0} χρόνια" #. CommaStartingX0 msgid ", starting {0}" msgstr ", ξεκινώντας {0}" #. AMPeriod msgid "AM" msgstr "π.μ" #. PMPeriod msgid "PM" msgstr "μμ" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} ημέρες πριν από την τελευταία ημέρα του μήνα" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", μόνο το {0}" cron-descriptor-2.0.6/cron_descriptor/locale/en_US.mo000066400000000000000000000072071505606603100226500ustar00rootroot000000000000007I&  .K^p " 0O i w+_qt x')1 E P ]jz %'  '1 Y ^ d &v       * < N h r "     * +< h z _}      , I h       %:'Aio+0#2/1 , ' 67*53"-(4$ ! ).&% and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, hour {0} through hour {1}, minute {0} through minute {1}, month {0} through month {1}, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, second {0} through second {1}, starting {0}, year {0} through year {1}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} minutes past the hour [grThen20]at {0} seconds past the minuteat {0} seconds past the minute [grThen20]between {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-06-30 14:21+0200 Last-Translator: Adam Schubert Language-Team: Language: cs_CZ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.0.1 and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, {0} through {1}, {0} through {1}, {0} through {1}, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}, starting {0}, {0} through {1}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} minutes past the hourat {0} seconds past the minuteat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}cron-descriptor-2.0.6/cron_descriptor/locale/en_US.po000066400000000000000000000140721505606603100226510ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2022-06-30 14:21+0200\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0.1\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "" "An error occured when generating the expression description. Check the cron " "expression syntax." #: ExpressionDescriptor.py:151 msgid "At " msgstr "At " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Every minute between {0} and {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "At" #: ExpressionDescriptor.py:175 msgid " and" msgstr " and" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "every second" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "every {0} seconds" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "seconds {0} through {1} past the minute" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "at {0} seconds past the minute" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "every minute" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "every {0} minutes" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "minutes {0} through {1} past the hour" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "at {0} minutes past the hour" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "every hour" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "every {0} hours" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "between {0} and {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "at {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "first" #: ExpressionDescriptor.py:243 msgid "second" msgstr "second" #: ExpressionDescriptor.py:245 msgid "third" msgstr "third" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "fourth" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "fifth" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", on the " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} of the month" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", on the last {0} of the month" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", only on {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", every day" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", every {0} days of the week" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} through {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", every {0} months" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", only in {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", on the last day of the month" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", on the last weekday of the month" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "first weekday" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "weekday nearest day {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", on the {0} of the month" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", every {0} days" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", between day {0} and {1} of the month" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", on day {0} of the month" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", every {0} years" #: ExpressionDescriptor.py:385 msgid " and " msgstr " and " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", every minute" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", every hour" #: ExpressionDescriptor.py:564 msgid "AM" msgstr "AM" #: ExpressionDescriptor.py:564 msgid "PM" msgstr "PM" #: ExpressionDescriptor.py:483 msgid ", starting {0}" msgstr ", starting {0}" #: ExpressionDescriptor.py:390 msgid ", {0} days before the last day of the month" msgstr ", {0} days before the last day of the month" #: ExpressionDescriptor.py:231 msgid "at {0} seconds past the minute [grThen20]" msgstr "at {0} seconds past the minute" #: ExpressionDescriptor.py:242 msgid ", second {0} through second {1}" msgstr ", {0} through {1}" #: ExpressionDescriptor.py:262 msgid "at {0} minutes past the hour [grThen20]" msgstr "at {0} minutes past the hour" #: ExpressionDescriptor.py:273 msgid ", minute {0} through minute {1}" msgstr ", {0} through {1}" #: ExpressionDescriptor.py:291 msgid ", hour {0} through hour {1}" msgstr ", {0} through {1}" #: ExpressionDescriptor.py:363 ExpressionDescriptor.py:365 msgid ", month {0} through month {1}" msgstr ", {0} through {1}" #: ExpressionDescriptor.py:432 ExpressionDescriptor.py:434 msgid ", year {0} through year {1}" msgstr ", {0} through {1}" cron-descriptor-2.0.6/cron_descriptor/locale/es_ES.mo000066400000000000000000000060071505606603100226320ustar00rootroot00000000000000-=& % 1>M^{ "% ? M[j_|  (G [ f s %')/0Gx{ #     ' = F )c       u p v #}      ! 0 A S Z b { $  )  & "!, +- &% $'#(   )* and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, starting {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net PO-Revision-Date: 2023-01-25 10:00+0100 Last-Translator: Dario M. García Carretero Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: es_ES y y {0} del mes, entre los días {0} y {1} del mes, cada día, cada hora, cada minuto, cada {0} días, cada {0} días de la semana, cada {0} meses, cada {0} años, el día {0} del mes, en el , en el último día del mes, en el último día de la semana del mes, en el último {0} del mes, en el {0} del mes, sólo en {0}, sólo el {0}, empezando {0}, de {0} a {1}Ocurrió un error mientras se generaba la descripción de la expresión. Revise la sintaxis de la expresión de cron.A lasA las cada minuto entre las {0} y las {1}a las {0}a los {0} minutos de la horaa los {0} segundos del minutoentre las {0} y las {1}cada horacada minutocada segundocada {0} horascada {0} minutoscada {0} segundosquintoprimeroprimer día de la semanacuartodel minuto {0} al {1} pasada la horasegundoEn los segundos {0} al {1} de cada minutotercerdía de la semana más próximo al {0}cron-descriptor-2.0.6/cron_descriptor/locale/es_ES.po000066400000000000000000000121711505606603100226340ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2023-01-25 10:00+0100\n" "Last-Translator: Dario M. García Carretero \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_ES\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Ocurrió un error mientras se generaba la descripción de la expresión. Revise" " la sintaxis de la expresión de cron." #: ExpressionDescriptor.py:151 msgid "At " msgstr "A las " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "cada minuto entre las {0} y las {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "A las" #: ExpressionDescriptor.py:175 msgid " and" msgstr " y" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "cada segundo" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "cada {0} segundos" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "En los segundos {0} al {1} de cada minuto" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "a los {0} segundos del minuto" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "cada minuto" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "cada {0} minutos" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "del minuto {0} al {1} pasada la hora" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "a los {0} minutos de la hora" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "cada hora" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "cada {0} horas" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "entre las {0} y las {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "a las {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "primero" #: ExpressionDescriptor.py:243 msgid "second" msgstr "segundo" #: ExpressionDescriptor.py:245 msgid "third" msgstr "tercer" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "cuarto" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "quinto" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", en el " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} del mes" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", en el último {0} del mes" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", sólo el {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", cada día" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", cada {0} días de la semana" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", de {0} a {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", cada {0} meses" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", sólo en {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", en el último día del mes" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", en el último día de la semana del mes" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "primer día de la semana" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "día de la semana más próximo al {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", en el {0} del mes" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", cada {0} días" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", entre los días {0} y {1} del mes" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", el día {0} del mes" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", cada {0} años" #: ExpressionDescriptor.py:385 msgid " and " msgstr " y " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", cada minuto" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", cada hora" #: ExpressionDescriptor.py:489 #, python-brace-format msgid ", starting {0}" msgstr ", empezando {0}"cron-descriptor-2.0.6/cron_descriptor/locale/es_MX.mo000066400000000000000000000057711505606603100226560ustar00rootroot000000000000001,,-28&J q } "/Rq   +_eh l    .@F LZ%a'P%( ,$9^p  9 R c q   *   k M S &Z   ! "      0 B I Q d )k  *  ( and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: es_MX MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit y y {0} del mes, entre el {0} y el {1} día del mes, todos los días, cada una hora, cada un minuto, cada {0} días, cada {0} días de la semana, cada {0} meses, cada {0} años, el día {0} del mes, el , el último día del mes, el último día hábil del mes, el último {0} del mes, el {0} del mes, solo en {0}, solo en {0}, solo el {0}, a partir de {0}, {0} días antes del último día del mes, {0} hasta {1}A. M.Error al momento de generar la descripción de la expresión. Verifique la sintaxis de la expresión Cron.A lasA las Cada un minuto entre las {0} y las {1}P. M.a {0}a {0} minutos después de la horaa {0} segundos después del minutoentre {0} y {1}cada una horacada un minutocada un segundocada {0} horascada {0} minutoscada {0} segundosquintoprimeroprimer día hábilcuartominutos {0} hasta {1} después de la horasegundosegundos {0} hasta {1} después del minutoterceroel día más próximo al día hábil {0}cron-descriptor-2.0.6/cron_descriptor/locale/es_MX.po000066400000000000000000000100601505606603100226440ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: es_MX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "cada un minuto" #. EveryHour msgid "every hour" msgstr "cada una hora" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Error al momento de generar la descripción de la expresión. Verifique la " "sintaxis de la expresión Cron." #. AtSpace msgid "At " msgstr "A las " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "Cada un minuto entre las {0} y las {1}" #. At msgid "At" msgstr "A las" #. SpaceAnd msgid " and" msgstr " y" #. EverySecond msgid "every second" msgstr "cada un segundo" #. EveryX0Seconds msgid "every {0} seconds" msgstr "cada {0} segundos" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "segundos {0} hasta {1} después del minuto" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "a {0} segundos después del minuto" #. EveryX0Minutes msgid "every {0} minutes" msgstr "cada {0} minutos" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "minutos {0} hasta {1} después de la hora" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "a {0} minutos después de la hora" #. EveryX0Hours msgid "every {0} hours" msgstr "cada {0} horas" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "entre {0} y {1}" #. AtX0 msgid "at {0}" msgstr "a {0}" #. ComaEveryDay msgid ", every day" msgstr ", todos los días" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", cada {0} días de la semana" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} hasta {1}" #. First msgid "first" msgstr "primero" #. Second msgid "second" msgstr "segundo" #. Third msgid "third" msgstr "tercero" #. Fourth msgid "fourth" msgstr "cuarto" #. Fifth msgid "fifth" msgstr "quinto" #. ComaOnThe msgid ", on the " msgstr ", el " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} del mes" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", el último {0} del mes" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", solo el {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", cada {0} meses" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", solo en {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", el último día del mes" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", el último día hábil del mes" #. FirstWeekday msgid "first weekday" msgstr "primer día hábil" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "el día más próximo al día hábil {0}" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", el {0} del mes" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", cada {0} días" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", entre el {0} y el {1} día del mes" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", el día {0} del mes" #. SpaceAndSpace msgid " and " msgstr " y " #. ComaEveryMinute msgid ", every minute" msgstr ", cada un minuto" #. ComaEveryHour msgid ", every hour" msgstr ", cada una hora" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", cada {0} años" #. CommaStartingX0 msgid ", starting {0}" msgstr ", a partir de {0}" #. AMPeriod msgid "AM" msgstr "A. M." #. PMPeriod msgid "PM" msgstr "P. M." #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} días antes del último día del mes" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", solo en {0}" cron-descriptor-2.0.6/cron_descriptor/locale/fa_IR.mo000066400000000000000000000062031505606603100226120ustar00rootroot00000000000000-=& % 1>M^{ "% ? M[j_|  (G [ f s %')/!Gim r'~  . H Q )o       w!   !  - . , > L \ l ~    +  - M *X "!, +- &% $'#(   )* and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, starting {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: Report-Msgid-Bugs-To: PO-Revision-Date: 2021-01-10 02:54+0330 Last-Translator: M. Yas. Davoodeh Language-Team: Language: fa_IR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.0.1 و و {0} ماه، بین روز {0} و {1} از ماه، هر روز، هر ساعت، هر دقیقه، هر {0} روز، هر {0} روز هفته، هر {0} ماه، هر {0} سال، در روز {0} ماه، در ، در آخرین {0} ماه، در آخرین روز هفته ماه، در آخرین {0} ماه، در {0} ماه، فقط در {0}، فقط در {0}، در حال شروع {0}، از {0} تا {1}خطایی هنگام تولید اصطلاحات بوجود آمده است. نحو کرون را بررسی کنید.دردر هر دقیقه بین {0} و {1}در {0}در {0} دقیقه از ساعت گذشتهدر {0} ثانیه از دقیقه گذشتهبین {0} و {1}هر ساعتهر دقیقههر ثانیههر {0} ساعتهر {0} دقیقههر {0} ثانیهپنجمیناولیناولین روز هفتهچهارمین{0} دقیقه از {1} ساعت گذشتهدومینثانیه {0} از {1} دقیقه گذشتهسومینروز هفته نزدیک به روز {0}cron-descriptor-2.0.6/cron_descriptor/locale/fa_IR.po000066400000000000000000000124541505606603100226220ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-10 02:15+0330\n" "PO-Revision-Date: 2021-01-10 02:54+0330\n" "Language: fa_IR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: M. Yas. Davoodeh \n" "Language-Team: \n" "X-Generator: Poedit 2.4.1\n" #: ExpressionDescriptor.py:145 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "خطایی هنگام تولید اصطلاحات بوجود آمده است. نحو کرون را بررسی کنید." #: ExpressionDescriptor.py:169 msgid "At " msgstr "در " #: ExpressionDescriptor.py:180 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "هر دقیقه بین {0} و {1}" #: ExpressionDescriptor.py:186 msgid "At" msgstr "در" #: ExpressionDescriptor.py:196 msgid " and" msgstr " و" #: ExpressionDescriptor.py:226 msgid "every second" msgstr "هر ثانیه" #: ExpressionDescriptor.py:228 #, python-brace-format msgid "every {0} seconds" msgstr "هر {0} ثانیه" #: ExpressionDescriptor.py:229 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "ثانیه {0} از {1} دقیقه گذشته" #: ExpressionDescriptor.py:230 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "در {0} ثانیه از دقیقه گذشته" #: ExpressionDescriptor.py:243 msgid "every minute" msgstr "هر دقیقه" #: ExpressionDescriptor.py:245 #, python-brace-format msgid "every {0} minutes" msgstr "هر {0} دقیقه" #: ExpressionDescriptor.py:246 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "{0} دقیقه از {1} ساعت گذشته" #: ExpressionDescriptor.py:247 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "در {0} دقیقه از ساعت گذشته" #: ExpressionDescriptor.py:260 msgid "every hour" msgstr "هر ساعت" #: ExpressionDescriptor.py:262 #, python-brace-format msgid "every {0} hours" msgstr "هر {0} ساعت" #: ExpressionDescriptor.py:263 #, python-brace-format msgid "between {0} and {1}" msgstr "بین {0} و {1}" #: ExpressionDescriptor.py:264 #, python-brace-format msgid "at {0}" msgstr "در {0}" #: ExpressionDescriptor.py:295 msgid "first" msgstr "اولین" #: ExpressionDescriptor.py:296 msgid "second" msgstr "دومین" #: ExpressionDescriptor.py:297 msgid "third" msgstr "سومین" #: ExpressionDescriptor.py:298 msgid "fourth" msgstr "چهارمین" #: ExpressionDescriptor.py:299 msgid "fifth" msgstr "پنجمین" #: ExpressionDescriptor.py:305 msgid ", on the " msgstr "، در " #: ExpressionDescriptor.py:306 #, python-brace-format msgid " {0} of the month" msgstr " {0} ماه" #: ExpressionDescriptor.py:308 #, python-brace-format msgid ", on the last {0} of the month" msgstr "، در آخرین {0} ماه" #: ExpressionDescriptor.py:310 #, python-brace-format msgid ", only on {0}" msgstr "، فقط در {0}" #: ExpressionDescriptor.py:316 ExpressionDescriptor.py:366 #: ExpressionDescriptor.py:368 ExpressionDescriptor.py:554 msgid ", every day" msgstr "، هر روز" #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", every {0} days of the week" msgstr "، هر {0} روز هفته" #: ExpressionDescriptor.py:319 ExpressionDescriptor.py:335 #: ExpressionDescriptor.py:398 ExpressionDescriptor.py:467 #, python-brace-format msgid ", {0} through {1}" msgstr "، از {0} تا {1}" #: ExpressionDescriptor.py:334 #, python-brace-format msgid ", every {0} months" msgstr "، هر {0} ماه" #: ExpressionDescriptor.py:336 ExpressionDescriptor.py:399 #, python-brace-format msgid ", only in {0}" msgstr "، فقط در {0}" #: ExpressionDescriptor.py:350 msgid ", on the last day of the month" msgstr "، در آخرین {0} ماه" #: ExpressionDescriptor.py:352 msgid ", on the last weekday of the month" msgstr "، در آخرین روز هفته ماه" #: ExpressionDescriptor.py:359 msgid "first weekday" msgstr "اولین روز هفته" #: ExpressionDescriptor.py:359 #, python-brace-format msgid "weekday nearest day {0}" msgstr "روز هفته نزدیک به روز {0}" #: ExpressionDescriptor.py:361 #, python-brace-format msgid ", on the {0} of the month" msgstr "، در {0} ماه" #: ExpressionDescriptor.py:368 #, python-brace-format msgid ", every {0} days" msgstr "، هر {0} روز" #: ExpressionDescriptor.py:369 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr "، بین روز {0} و {1} از ماه" #: ExpressionDescriptor.py:370 #, python-brace-format msgid ", on day {0} of the month" msgstr "، در روز {0} ماه" #: ExpressionDescriptor.py:397 #, python-brace-format msgid ", every {0} years" msgstr "، هر {0} سال" #: ExpressionDescriptor.py:449 #, python-brace-format msgid ", starting {0}" msgstr "، در حال شروع {0}" #: ExpressionDescriptor.py:462 msgid " and " msgstr " و " #: ExpressionDescriptor.py:552 msgid ", every minute" msgstr "، هر دقیقه" #: ExpressionDescriptor.py:553 msgid ", every hour" msgstr "، هر ساعت" cron-descriptor-2.0.6/cron_descriptor/locale/fi_FI.mo000066400000000000000000000056101505606603100226070ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP)C R_o"( + E U ` k v 4 6   ! & . @ W k v       ) ' ,. [ %b and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: fi_FI MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit ja ja {0} kuukaudessa, kuukauden päivien {0} ja {1} välillä, joka päivä, joka tunti, joka minuutti, joka {0}. päivä, joka {0}. viikonpäivä, joka {0}. kuukausi, joka {0}. vuosi, kuukauden {0} päivä, , kuukauden viimeisenä päivänä, kuukauden viimeisenä viikonpäivänä, kuukauden viimeinen {0}, kuukauden {0}, vain {0}, vain {0}, vain {0}, alkaen {0}, {0} päivää ennen kuukauden viimeistä päivää, {0} - {1}Virhe kuvauksen generoinnissa. Tarkista cron-syntaksi.KloKlo joka minuutti {0} - {1} välilläklo {0}{0} minuuttia yli{0} sekunnnin jälkeen{0} - {1} välilläjoka tuntijoka minuuttijoka sekuntijoka {0}. tuntijoka {0}. minuuttijoka {0}. sekuntiviidesensimmäinenensimmäinen viikonpäiväneljäsjoka tunti minuuttien {0} - {1} välillätoinenjoka minuutti sekunttien {0} - {1} välilläkolmasviikonpäivä lähintä {0} päivääcron-descriptor-2.0.6/cron_descriptor/locale/fi_FI.po000066400000000000000000000076351505606603100226230ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: fi_FI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "joka minuutti" #. EveryHour msgid "every hour" msgstr "joka tunti" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "Virhe kuvauksen generoinnissa. Tarkista cron-syntaksi." #. AtSpace msgid "At " msgstr "Klo " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "joka minuutti {0} - {1} välillä" #. At msgid "At" msgstr "Klo" #. SpaceAnd msgid " and" msgstr " ja" #. EverySecond msgid "every second" msgstr "joka sekunti" #. EveryX0Seconds msgid "every {0} seconds" msgstr "joka {0}. sekunti" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "joka minuutti sekunttien {0} - {1} välillä" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "{0} sekunnnin jälkeen" #. EveryX0Minutes msgid "every {0} minutes" msgstr "joka {0}. minuutti" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "joka tunti minuuttien {0} - {1} välillä" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "{0} minuuttia yli" #. EveryX0Hours msgid "every {0} hours" msgstr "joka {0}. tunti" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "{0} - {1} välillä" #. AtX0 msgid "at {0}" msgstr "klo {0}" #. ComaEveryDay msgid ", every day" msgstr ", joka päivä" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", joka {0}. viikonpäivä" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} - {1}" #. First msgid "first" msgstr "ensimmäinen" #. Second msgid "second" msgstr "toinen" #. Third msgid "third" msgstr "kolmas" #. Fourth msgid "fourth" msgstr "neljäs" #. Fifth msgid "fifth" msgstr "viides" #. ComaOnThe msgid ", on the " msgstr ", " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} kuukaudessa" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", kuukauden viimeinen {0}" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", vain {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", joka {0}. kuukausi" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", vain {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", kuukauden viimeisenä päivänä" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", kuukauden viimeisenä viikonpäivänä" #. FirstWeekday msgid "first weekday" msgstr "ensimmäinen viikonpäivä" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "viikonpäivä lähintä {0} päivää" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", kuukauden {0}" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", joka {0}. päivä" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", kuukauden päivien {0} ja {1} välillä" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", kuukauden {0} päivä" #. SpaceAndSpace msgid " and " msgstr " ja " #. ComaEveryMinute msgid ", every minute" msgstr ", joka minuutti" #. ComaEveryHour msgid ", every hour" msgstr ", joka tunti" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", joka {0}. vuosi" #. CommaStartingX0 msgid ", starting {0}" msgstr ", alkaen {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} päivää ennen kuukauden viimeistä päivää" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", vain {0}" cron-descriptor-2.0.6/cron_descriptor/locale/fr_FR.mo000066400000000000000000000054311505606603100226320ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4 3FW]"w`] ` #d        % < T _ g } +  . # and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: fr_FR et et {0} du mois, du {0} au {1} du mois, tous les jours, toutes les heures, toutes les minutes, tous les {0} jours, every {0} days of the week, tous les {0} mois, tous les {0} ans, le {0} du mois, le , le dernier jour du mois, le dernier jour ouvrable du mois, le dernier {0} du mois, le {0} du mois, uniquement en {0}, uniquement le {0}, de {0} à {1}Une erreur est survenue en générant la description de l'expression cron. Vérifiez sa syntaxe.ÀÀ Toutes les minutes entre {0} et {1}à {0}{0} minutes après l'heure{0} secondes après la minutede {0} à {1}toutes les heurestoutes les minutestoutes les secondestoutes les {0} heurestoutes les {0} minutestoutes les {0} secondescinquièmepremierpremier jour ouvrablequatrièmeles minutes entre {0} et {1} après l'heuresecondles secondes entre {0} et {1} après la minutetroisièmejour ouvrable le plus proche du {0}cron-descriptor-2.0.6/cron_descriptor/locale/fr_FR.po000066400000000000000000000120371505606603100226350ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_FR\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Une erreur est survenue en générant la description de l'expression cron. " "Vérifiez sa syntaxe." #: ExpressionDescriptor.py:151 msgid "At " msgstr "À " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Toutes les minutes entre {0} et {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "À" #: ExpressionDescriptor.py:175 msgid " and" msgstr " et" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "toutes les secondes" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "toutes les {0} secondes" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "les secondes entre {0} et {1} après la minute" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "{0} secondes après la minute" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "toutes les minutes" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "toutes les {0} minutes" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "les minutes entre {0} et {1} après l'heure" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "{0} minutes après l'heure" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "toutes les heures" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "toutes les {0} heures" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "de {0} à {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "à {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "premier" #: ExpressionDescriptor.py:243 msgid "second" msgstr "second" #: ExpressionDescriptor.py:245 msgid "third" msgstr "troisième" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "quatrième" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "cinquième" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", le " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} du mois" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", le dernier {0} du mois" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", uniquement le {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", tous les jours" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", every {0} days of the week" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", de {0} à {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", tous les {0} mois" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", uniquement en {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", le dernier jour du mois" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", le dernier jour ouvrable du mois" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "premier jour ouvrable" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "jour ouvrable le plus proche du {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", le {0} du mois" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", tous les {0} jours" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", du {0} au {1} du mois" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", le {0} du mois" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", tous les {0} ans" #: ExpressionDescriptor.py:385 msgid " and " msgstr " et " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", toutes les minutes" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", toutes les heures" cron-descriptor-2.0.6/cron_descriptor/locale/he_IL.mo000066400000000000000000000061471505606603100226210ustar00rootroot000000000000001,,-28&J q } "/Rq   +_eh l    .@F LZ%a'P%-6*K v  # # ") /L +|   8 > M _P      " $ % 7 C O ] o   +  - 8 #C and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: he_IL MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit וגם וגם {0} של החודש, בין יום {0} ו-{1} של החודש, כל יום, כל שעה, כל דקה, כל {0} ימים, כל {0} ימים של השבוע, כל {0} חודשים, כל {0} שנים, ביום {0} של החודש, ב-, ביום האחרון בחודש, ביום העבודה האחרון בחודש, ביום {0} האחרון של החודש, ביום {0} של החודש, רק ב-{0}, רק ב-{0}, רק ב-{0}, מתחיל ב-{0}, {0} ימים לפני היום האחרון בחודש, {0} עד {1}AMAn error occured when generating the expression description. Check the cron expression syntax.בב כל דקה בי {0} ו-{1}PMב {0}{0} דקות מתחילת השעה{0} שניות מתחילת הדקהבין {0} ו-{1}כל שעהכל דקהכל שניהכל {0} שעותכל {0} דקותכל {0} שניותחמישיראשוןיום הראשון בשבוערביעידקות {0} עד {1} מתחילת השעהשניהשניות {0} עד {1} מתחילת הדקהשלישייום בשבוע הקרוב ל-{0}cron-descriptor-2.0.6/cron_descriptor/locale/he_IL.po000066400000000000000000000102361505606603100226160ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: he_IL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "כל דקה" #. EveryHour msgid "every hour" msgstr "כל שעה" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "An error occured when generating the expression description. Check the cron" " expression syntax." #. AtSpace msgid "At " msgstr "ב " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "כל דקה בי {0} ו-{1}" #. At msgid "At" msgstr "ב" #. SpaceAnd msgid " and" msgstr " וגם" #. EverySecond msgid "every second" msgstr "כל שניה" #. EveryX0Seconds msgid "every {0} seconds" msgstr "כל {0} שניות" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "שניות {0} עד {1} מתחילת הדקה" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "{0} שניות מתחילת הדקה" #. EveryX0Minutes msgid "every {0} minutes" msgstr "כל {0} דקות" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "דקות {0} עד {1} מתחילת השעה" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "{0} דקות מתחילת השעה" #. EveryX0Hours msgid "every {0} hours" msgstr "כל {0} שעות" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "בין {0} ו-{1}" #. AtX0 msgid "at {0}" msgstr "ב {0}" #. ComaEveryDay msgid ", every day" msgstr ", כל יום" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", כל {0} ימים של השבוע" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} עד {1}" #. First msgid "first" msgstr "ראשון" #. Second msgid "second" msgstr "שניה" #. Third msgid "third" msgstr "שלישי" #. Fourth msgid "fourth" msgstr "רביעי" #. Fifth msgid "fifth" msgstr "חמישי" #. ComaOnThe msgid ", on the " msgstr ", ב-" #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} של החודש" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", ביום {0} האחרון של החודש" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", רק ב-{0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", כל {0} חודשים" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", רק ב-{0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", ביום האחרון בחודש" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", ביום העבודה האחרון בחודש" #. FirstWeekday msgid "first weekday" msgstr "יום הראשון בשבוע" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "יום בשבוע הקרוב ל-{0}" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", ביום {0} של החודש" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", כל {0} ימים" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", בין יום {0} ו-{1} של החודש" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", ביום {0} של החודש" #. SpaceAndSpace msgid " and " msgstr " וגם " #. ComaEveryMinute msgid ", every minute" msgstr ", כל דקה" #. ComaEveryHour msgid ", every hour" msgstr ", כל שעה" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", כל {0} שנים" #. CommaStartingX0 msgid ", starting {0}" msgstr ", מתחיל ב-{0}" #. AMPeriod msgid "AM" msgstr "AM" #. PMPeriod msgid "PM" msgstr "PM" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} ימים לפני היום האחרון בחודש" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", רק ב-{0}" cron-descriptor-2.0.6/cron_descriptor/locale/hu_HU.mo000066400000000000000000000056551505606603100226540ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_ Efip    %3%:`'gP & B O ]k}  1 @ K V a *o  i # 5 8 < #Z ~        ! !* L 'U } & and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}AMAn error occured when generating the expression description. Check the cron expression syntax.Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: hu_HU MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit és és {0} a hónapban, {0} és {1} nap között a hónapban, minden nap, minden óra, minden perc, minden {0}. nap, a hét {0}. napján, minden {0}. hónapban, minden {0}. évben, a hónap {0}. napján, a/az , a hónap utolsó napja, a hónap utolsó hétköznapja, a hónap utolsó {0}, a hónap {0}, csak {0}, csak {0}, csak {0}, kezdés {0}, {0} nappal a hónap utolsó napja előtt, {0}-{1}DEHiba történt a kifejezés leírásának létrehozásakor. Ellenőrizze a cron kifejezés szintaxisát.minden percben {0} és {1} közöttDU{0}{0} perccel egész óra után{0} másodperccel egész perc után{0} és {1} közöttminden óraminden percminden másodpercminden {0}. órábanminden {0}. percbenminden {0}. másodpercbenötödikelsőelső hétköznapnegyedik{0}-{1} perccel egész óra utánmásodik{0}-{1} másodperccel egész perc utánharmadiklegközelebbi hétköznap {0}. napjáncron-descriptor-2.0.6/cron_descriptor/locale/hu_HU.po000066400000000000000000000077171505606603100226600ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: hu_HU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "minden perc" #. EveryHour msgid "every hour" msgstr "minden óra" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Hiba történt a kifejezés leírásának létrehozásakor. Ellenőrizze a cron " "kifejezés szintaxisát." #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "minden percben {0} és {1} között" #. SpaceAnd msgid " and" msgstr " és " #. EverySecond msgid "every second" msgstr "minden másodperc" #. EveryX0Seconds msgid "every {0} seconds" msgstr "minden {0}. másodpercben" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "{0}-{1} másodperccel egész perc után" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "{0} másodperccel egész perc után" #. EveryX0Minutes msgid "every {0} minutes" msgstr "minden {0}. percben" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "{0}-{1} perccel egész óra után" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "{0} perccel egész óra után" #. EveryX0Hours msgid "every {0} hours" msgstr "minden {0}. órában" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "{0} és {1} között" #. AtX0 msgid "at {0}" msgstr "{0}" #. ComaEveryDay msgid ", every day" msgstr ", minden nap" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", a hét {0}. napján" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0}-{1}" #. First msgid "first" msgstr "első" #. Second msgid "second" msgstr "második" #. Third msgid "third" msgstr "harmadik" #. Fourth msgid "fourth" msgstr "negyedik" #. Fifth msgid "fifth" msgstr "ötödik" #. ComaOnThe msgid ", on the " msgstr ", a/az " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} a hónapban" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", a hónap utolsó {0}" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", csak {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", minden {0}. hónapban" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", csak {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", a hónap utolsó napja" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", a hónap utolsó hétköznapja" #. FirstWeekday msgid "first weekday" msgstr "első hétköznap" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "legközelebbi hétköznap {0}. napján" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", a hónap {0}" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", minden {0}. nap" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", {0} és {1} nap között a hónapban" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", a hónap {0}. napján" #. SpaceAndSpace msgid " and " msgstr " és " #. ComaEveryMinute msgid ", every minute" msgstr ", minden perc" #. ComaEveryHour msgid ", every hour" msgstr ", minden óra" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", minden {0}. évben" #. CommaStartingX0 msgid ", starting {0}" msgstr ", kezdés {0}" #. AMPeriod msgid "AM" msgstr "DE" #. PMPeriod msgid "PM" msgstr "DU" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} nappal a hónap utolsó napja előtt" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", csak {0}" cron-descriptor-2.0.6/cron_descriptor/locale/it_IT.mo000066400000000000000000000053371505606603100226510ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4 "   !(8QW r   za f l       % 6 = C ` g  "  ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: it_IT e e {0} del mese, tra il giorno {0} e {1} del mese, ogni giorno, ogni ora, ogni minuto, ogni {0} giorni, ogni {0} giorni della settimana, ogni {0} mesi, ogni {0} anni, il giorno {0} del mese, il , l'ultimo giorno del mese, nell'ultima settimana del mese, l'ultimo {0} del mese, il {0} del mese, solo in {0}, solo il {0}, {0} al {1}È verificato un errore durante la generazione la descrizione espressione. Controllare la sintassi delle espressioni cron.AlleAlle Ogni minuto tra le {0} e le {1}alle {0}al {0} minuto passata l'oraal {0} secondo passato il minutotra le {0} e le {1}ogni oraogni minutoogni secondoogni {0} oreogni {0} minutiogni {0} secondiquintoprimoprimo giorno della settimanaquartominuti {0} al {1} dopo l'orasecondosecondi {0} al {1} oltre il minutoterzogiorno della settimana più vicino al {0}cron-descriptor-2.0.6/cron_descriptor/locale/it_IT.po000066400000000000000000000117451505606603100226540ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it_IT\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "È verificato un errore durante la generazione la descrizione espressione. " "Controllare la sintassi delle espressioni cron." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Alle " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Ogni minuto tra le {0} e le {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Alle" #: ExpressionDescriptor.py:175 msgid " and" msgstr " e" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "ogni secondo" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "ogni {0} secondi" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "secondi {0} al {1} oltre il minuto" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "al {0} secondo passato il minuto" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "ogni minuto" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "ogni {0} minuti" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "minuti {0} al {1} dopo l'ora" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "al {0} minuto passata l'ora" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "ogni ora" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "ogni {0} ore" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "tra le {0} e le {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "alle {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "primo" #: ExpressionDescriptor.py:243 msgid "second" msgstr "secondo" #: ExpressionDescriptor.py:245 msgid "third" msgstr "terzo" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "quarto" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "quinto" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", il " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} del mese" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", l'ultimo {0} del mese" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", solo il {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", ogni giorno" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", ogni {0} giorni della settimana" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} al {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", ogni {0} mesi" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", solo in {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", l'ultimo giorno del mese" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", nell'ultima settimana del mese" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "primo giorno della settimana" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "giorno della settimana più vicino al {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", il {0} del mese" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", ogni {0} giorni" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", tra il giorno {0} e {1} del mese" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", il giorno {0} del mese" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", ogni {0} anni" #: ExpressionDescriptor.py:385 msgid " and " msgstr " e " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", ogni minuto" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", ogni ora" cron-descriptor-2.0.6/cron_descriptor/locale/ja_JP.mo000066400000000000000000000057371505606603100226300ustar00rootroot00000000000000-=& % 1>M^{ "% ? M[j_|  (G [ f s %')/'Gotz%    # 8 C Y u      q ` v          & 4 B K T d "m  "   "!, +- &% $'#(   )* and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, starting {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: ja_JP と と 月のうち {0}、月の {0} 日から {1} 日の間、毎日、毎時、毎分、{0} 日ごと、週のうち {0} 日ごと、{0} か月ごと、{0} 年ごと、月の {0} 日目、次に 、次の最終日に、月の最後の平日に、月の最後の {0} に、月の {0} に、{0} でのみ、{0} にのみ、{0} に開始、{0} から {1} まで式の記述を生成する際にエラーが発生しました。Cron 式の構文を確認してください。次において実施次において実施 {0} から {1} まで毎分次において実施 {0}毎時 {0} 分過ぎ毎分 {0} 秒過ぎ{0} と {1} の間毎時毎分毎秒{0} 時間ごと{0} 分ごと{0} 秒ごと5 番目1 番目最初の平日4 番目毎時 {0} 分から {1} 分まで2 番目毎分 {0} 秒から {1} 秒まで3 番目{0} 日の直近の平日cron-descriptor-2.0.6/cron_descriptor/locale/ja_JP.po000066400000000000000000000122041505606603100226160ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja_JP\n" #: ExpressionDescriptor.py:145 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "式の記述を生成する際にエラーが発生しました。Cron 式の構文を確認してください。" #: ExpressionDescriptor.py:169 msgid "At " msgstr "次において実施 " #: ExpressionDescriptor.py:180 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "{0} から {1} まで毎分" #: ExpressionDescriptor.py:186 msgid "At" msgstr "次において実施" #: ExpressionDescriptor.py:196 msgid " and" msgstr " と" #: ExpressionDescriptor.py:226 msgid "every second" msgstr "毎秒" #: ExpressionDescriptor.py:228 #, python-brace-format msgid "every {0} seconds" msgstr "{0} 秒ごと" #: ExpressionDescriptor.py:229 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "毎分 {0} 秒から {1} 秒まで" #: ExpressionDescriptor.py:230 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "毎分 {0} 秒過ぎ" #: ExpressionDescriptor.py:243 msgid "every minute" msgstr "毎分" #: ExpressionDescriptor.py:245 #, python-brace-format msgid "every {0} minutes" msgstr "{0} 分ごと" #: ExpressionDescriptor.py:246 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "毎時 {0} 分から {1} 分まで" #: ExpressionDescriptor.py:247 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "毎時 {0} 分過ぎ" #: ExpressionDescriptor.py:260 msgid "every hour" msgstr "毎時" #: ExpressionDescriptor.py:262 #, python-brace-format msgid "every {0} hours" msgstr "{0} 時間ごと" #: ExpressionDescriptor.py:263 #, python-brace-format msgid "between {0} and {1}" msgstr "{0} と {1} の間" #: ExpressionDescriptor.py:264 #, python-brace-format msgid "at {0}" msgstr "次において実施 {0}" #: ExpressionDescriptor.py:295 msgid "first" msgstr "1 番目" #: ExpressionDescriptor.py:296 msgid "second" msgstr "2 番目" #: ExpressionDescriptor.py:297 msgid "third" msgstr "3 番目" #: ExpressionDescriptor.py:298 msgid "fourth" msgstr "4 番目" #: ExpressionDescriptor.py:299 msgid "fifth" msgstr "5 番目" #: ExpressionDescriptor.py:305 msgid ", on the " msgstr "、次に " #: ExpressionDescriptor.py:306 #, python-brace-format msgid " {0} of the month" msgstr "月のうち {0}" #: ExpressionDescriptor.py:308 #, python-brace-format msgid ", on the last {0} of the month" msgstr "、月の最後の {0} に" #: ExpressionDescriptor.py:310 #, python-brace-format msgid ", only on {0}" msgstr "、{0} にのみ" #: ExpressionDescriptor.py:316 ExpressionDescriptor.py:366 #: ExpressionDescriptor.py:368 ExpressionDescriptor.py:554 msgid ", every day" msgstr "、毎日" #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", every {0} days of the week" msgstr "、週のうち {0} 日ごと" #: ExpressionDescriptor.py:319 ExpressionDescriptor.py:335 #: ExpressionDescriptor.py:398 ExpressionDescriptor.py:467 #, python-brace-format msgid ", {0} through {1}" msgstr "、{0} から {1} まで" #: ExpressionDescriptor.py:334 #, python-brace-format msgid ", every {0} months" msgstr "、{0} か月ごと" #: ExpressionDescriptor.py:336 ExpressionDescriptor.py:399 #, python-brace-format msgid ", only in {0}" msgstr "、{0} でのみ" #: ExpressionDescriptor.py:350 msgid ", on the last day of the month" msgstr "、次の最終日に" #: ExpressionDescriptor.py:352 msgid ", on the last weekday of the month" msgstr "、月の最後の平日に" #: ExpressionDescriptor.py:359 msgid "first weekday" msgstr "最初の平日" #: ExpressionDescriptor.py:359 #, python-brace-format msgid "weekday nearest day {0}" msgstr "{0} 日の直近の平日" #: ExpressionDescriptor.py:361 #, python-brace-format msgid ", on the {0} of the month" msgstr "、月の {0} に" #: ExpressionDescriptor.py:368 #, python-brace-format msgid ", every {0} days" msgstr "、{0} 日ごと" #: ExpressionDescriptor.py:369 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr "、月の {0} 日から {1} 日の間" #: ExpressionDescriptor.py:370 #, python-brace-format msgid ", on day {0} of the month" msgstr "、月の {0} 日目" #: ExpressionDescriptor.py:397 #, python-brace-format msgid ", every {0} years" msgstr "、{0} 年ごと" #: ExpressionDescriptor.py:449 #, python-brace-format msgid ", starting {0}" msgstr "、{0} に開始" #: ExpressionDescriptor.py:462 msgid " and " msgstr " と " #: ExpressionDescriptor.py:552 msgid ", every minute" msgstr "、毎分" #: ExpressionDescriptor.py:553 msgid ", every hour" msgstr "、毎時" cron-descriptor-2.0.6/cron_descriptor/locale/kk_KZ.mo000066400000000000000000000065361505606603100226540ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP   5T"j"  " - F I %j &   + . 8 7 # *2 P] ! " 5 O i   "   8 0 = and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: kk_KZ MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit және және {0} ай, арасында {0} және {1}-күндіз ай, әрбір күні, әрбір сағат сайын, әрбір минут сайын, әрбір {0} күн, әрбір {0} күн апта, әрбір {0} ай сайын, әрбір {0} жыл сайын, {0}-ші күні ай, , айдың соңғы күні, соңғы жұмыс күні ай, әрбір айдың соңғы {0}, {0}-айдың, тек {0}, тек {0}, тек {0}, бастап {0}, {0} күн айдың соңғы күні, {0}-{1}Өрнек сипаттамасын жасау кезінде қате пайда болды. Cron өрнек синтаксисін тексеріңіз.СағатСағат Әрбір минут арасында {0} және {1}сағат {0}{0} минуттан кейін сағат{0} секундтан кейін басталғаннан кейін минутарасында {0} және {1}әрбір сағат сайынәрбір минут сайынәрбір секунд сайынәрбір {0} сағатәрбір {0} минутәрбір {0} секундбесіншібіріншібірінші жұмыс күнітөртіншіминут {0}-{1}екіншісекунд {0} жөніндегі {1} минутынаүшіншіжақында {0}-ші күніcron-descriptor-2.0.6/cron_descriptor/locale/kk_KZ.po000066400000000000000000000105711505606603100226510ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: kk_KZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "әрбір минут сайын" #. EveryHour msgid "every hour" msgstr "әрбір сағат сайын" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Өрнек сипаттамасын жасау кезінде қате пайда болды. Cron өрнек синтаксисін " "тексеріңіз." #. AtSpace msgid "At " msgstr "Сағат " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "Әрбір минут арасында {0} және {1}" #. At msgid "At" msgstr "Сағат" #. SpaceAnd msgid " and" msgstr " және" #. EverySecond msgid "every second" msgstr "әрбір секунд сайын" #. EveryX0Seconds msgid "every {0} seconds" msgstr "әрбір {0} секунд" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "секунд {0} жөніндегі {1} минутына" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "{0} секундтан кейін басталғаннан кейін минут" #. EveryX0Minutes msgid "every {0} minutes" msgstr "әрбір {0} минут" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "минут {0}-{1}" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "{0} минуттан кейін сағат" #. EveryX0Hours msgid "every {0} hours" msgstr "әрбір {0} сағат" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "арасында {0} және {1}" #. AtX0 msgid "at {0}" msgstr "сағат {0}" #. ComaEveryDay msgid ", every day" msgstr ", әрбір күні" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", әрбір {0} күн апта" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0}-{1}" #. First msgid "first" msgstr "бірінші" #. Second msgid "second" msgstr "екінші" #. Third msgid "third" msgstr "үшінші" #. Fourth msgid "fourth" msgstr "төртінші" #. Fifth msgid "fifth" msgstr "бесінші" #. ComaOnThe msgid ", on the " msgstr ", " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} ай" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", әрбір айдың соңғы {0}" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", тек {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", әрбір {0} ай сайын" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", тек {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", айдың соңғы күні" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", соңғы жұмыс күні ай" #. FirstWeekday msgid "first weekday" msgstr "бірінші жұмыс күні" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "жақында {0}-ші күні" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", {0}-айдың" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", әрбір {0} күн" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", арасында {0} және {1}-күндіз ай" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", {0}-ші күні ай" #. SpaceAndSpace msgid " and " msgstr " және " #. ComaEveryMinute msgid ", every minute" msgstr ", әрбір минут сайын" #. ComaEveryHour msgid ", every hour" msgstr ", әрбір сағат сайын" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", әрбір {0} жыл сайын" #. CommaStartingX0 msgid ", starting {0}" msgstr ", бастап {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} күн айдың соңғы күні" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", тек {0}" cron-descriptor-2.0.6/cron_descriptor/locale/ko_KR.mo000066400000000000000000000054531505606603100226450ustar00rootroot00000000000000*l;&  &CVh "  #_5    %2BTfl r%'A ; FRWpy # ; I O X ob    " 6 C P ] q         % $* ( #  &)!"% ' and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net PO-Revision-Date: 2020-11-13 02:37+0900 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: zh_CN X-Generator: Poedit 2.4.2 그리고 그리고 {0}, {0}부터 {1}일까지, 매일, 매시간마다, 매분마다, {0}일마다, 매주 {0}일마다, {0}개월마다, {0}년마다, 매월 {0}일, , 매월 마지막날, 매월 마지막 평일, 매월 마지막 {0} , 매월 {0} , {0}, {0}에, {0}~{1}크론표현식을 생성하는 도중 에러가 발생했습니다. 크론표현식 문법을 확인하세요.{0}부터 {1}까지 매분마다{0}매시간 {0}분에매분마다 {0}초에{0}부터 {1}까지매시마다매분마다매초마다매 {0}시간마다매 {0}분마다매 {0}초마다다섯째첫째첫번째 평일넷째매시간 {0}~{1}분 동안둘째매분마다 {0}~{1}초 동안셋째평일 가장 가까운 {0}번째 날cron-descriptor-2.0.6/cron_descriptor/locale/ko_KR.po000066400000000000000000000116301505606603100226420ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2020-11-13 02:37+0900\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "X-Generator: Poedit 2.4.2\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the " "cron expression syntax." msgstr "" "크론표현식을 생성하는 도중 에러가 발생했습니다. 크론표현식 문법을 확인하세요." #: ExpressionDescriptor.py:151 msgid "At " msgstr "" #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "{0}부터 {1}까지 매분마다" #: ExpressionDescriptor.py:165 msgid "At" msgstr "" #: ExpressionDescriptor.py:175 msgid " and" msgstr " 그리고" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "매초마다" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "매 {0}초마다" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "매분마다 {0}~{1}초 동안" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "매분마다 {0}초에" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "매분마다" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "매 {0}분마다" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "매시간 {0}~{1}분 동안" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "매시간 {0}분에" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "매시마다" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "매 {0}시간마다" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "{0}부터 {1}까지" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "{0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "첫째" #: ExpressionDescriptor.py:243 msgid "second" msgstr "둘째" #: ExpressionDescriptor.py:245 msgid "third" msgstr "셋째" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "넷째" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "다섯째" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0}" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", 매월 마지막 {0} " #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", {0}에" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", 매일" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", 매주 {0}일마다" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0}~{1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", {0}개월마다" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", 매월 마지막날" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", 매월 마지막 평일" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "첫번째 평일" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "평일 가장 가까운 {0}번째 날" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", 매월 {0} " #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", {0}일마다" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", {0}부터 {1}일까지" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", 매월 {0}일" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", {0}년마다" #: ExpressionDescriptor.py:385 msgid " and " msgstr " 그리고 " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", 매분마다" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", 매시간마다" cron-descriptor-2.0.6/cron_descriptor/locale/nb_NO.mo000066400000000000000000000053061505606603100226300ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4#   - G R#s J M Q V u }      & . = ,C p /w   and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: nb_NO og og {0} av måneden, mellom dag {0} og {1} av måneden, hver dag, hver time, hvert minutt, hver {0} dag, hver {0} ukedag, hver {0} måned], hvert {0} år, på dag {0} av måneden, på den , på den siste dagen i måneden, på den siste ukedagen i måneden, på den siste {0} av måneden, på den {0} av måneden, bare i {0}, bare på {0}, {0} til og med {1}En feil intraff ved generering av uttrykksbeskrivelse. Sjekk cron syntaks.PåPå Hvert minutt mellom {0} og {1}på {0}på {0} minutter etter timenpå {0} sekunder etter minuttetmellom {0} og {1}hver timehvert minutthvert sekundhver {0} timehvert {0} minutthvert {0} sekundfemteførsteførste ukedagfjedeminuttene fra {0} til og med {1} etter timensekundsekundene fra {0} til og med {1} etter minuttettredjeukedag nærmest dag {0}cron-descriptor-2.0.6/cron_descriptor/locale/nb_NO.po000066400000000000000000000117111505606603100226300ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb_NO\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "En feil intraff ved generering av uttrykksbeskrivelse. Sjekk cron syntaks." #: ExpressionDescriptor.py:151 msgid "At " msgstr "På " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Hvert minutt mellom {0} og {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "På" #: ExpressionDescriptor.py:175 msgid " and" msgstr " og" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "hvert sekund" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "hvert {0} sekund" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "sekundene fra {0} til og med {1} etter minuttet" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "på {0} sekunder etter minuttet" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "hvert minutt" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "hvert {0} minutt" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "minuttene fra {0} til og med {1} etter timen" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "på {0} minutter etter timen" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "hver time" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "hver {0} time" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "mellom {0} og {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "på {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "første" #: ExpressionDescriptor.py:243 msgid "second" msgstr "sekund" #: ExpressionDescriptor.py:245 msgid "third" msgstr "tredje" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "fjede" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "femte" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", på den " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} av måneden" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", på den siste {0} av måneden" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", bare på {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", hver dag" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", hver {0} ukedag" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} til og med {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", hver {0} måned]" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", bare i {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", på den siste dagen i måneden" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", på den siste ukedagen i måneden" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "første ukedag" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "ukedag nærmest dag {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", på den {0} av måneden" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", hver {0} dag" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", mellom dag {0} og {1} av måneden" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", på dag {0} av måneden" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", hvert {0} år" #: ExpressionDescriptor.py:385 msgid " and " msgstr " og " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", hvert minutt" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", hver time" cron-descriptor-2.0.6/cron_descriptor/locale/nl_NL.mo000066400000000000000000000055651505606603100226460ustar00rootroot00000000000000,|;&  &5Fcv "  ' 5C_U   4 ? LYi{ %'' HLQ$c    $A f    S " % ) G N h          * !1 S Y & ", *!%  (+#$' ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: nl_NL en en {0} van de maand, tussen dag {0} en {1} van de maand, elke dag, elk uur, elke minuut, elke {0} dagen, elke {0} dagen van de week, elke {0} maanden, elke {0} jaren, op dag {0} van de maand, op de , op de laatste dag van de maand, op de laatste werkdag van de maand, op de laatste {0} van de maand, op de {0} van de maand, alleen in {0}, alleen op {0}, {0} t/m {1}Er is een fout opgetreden bij het vertalen van de gegevens. Controleer de gegevens.OmOm Elke minuut tussen {0} en {1}op {0}op {0} minuten na het uurop {0} seconden na de minuuttussen {0} en {1}elk uurelke minuutelke secondeelke {0} uurelke {0} minutenelke {0} secondenvijfdeeersteeerste werkdagvierdeminuut {0} t/m {1} na het uurtweedeseconden {0} t/m {1} na de minuutderdewerkdag dichtst bij dag {0}cron-descriptor-2.0.6/cron_descriptor/locale/nl_NL.po000066400000000000000000000116701505606603100226430ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl_NL\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Er is een fout opgetreden bij het vertalen van de gegevens. Controleer de " "gegevens." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Om " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Elke minuut tussen {0} en {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Om" #: ExpressionDescriptor.py:175 msgid " and" msgstr " en" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "elke seconde" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "elke {0} seconden" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "seconden {0} t/m {1} na de minuut" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "op {0} seconden na de minuut" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "elke minuut" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "elke {0} minuten" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "minuut {0} t/m {1} na het uur" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "op {0} minuten na het uur" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "elk uur" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "elke {0} uur" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "tussen {0} en {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "op {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "eerste" #: ExpressionDescriptor.py:243 msgid "second" msgstr "tweede" #: ExpressionDescriptor.py:245 msgid "third" msgstr "derde" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "vierde" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "vijfde" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", op de " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} van de maand" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", op de laatste {0} van de maand" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", alleen op {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", elke dag" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", elke {0} dagen van de week" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} t/m {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", elke {0} maanden" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", alleen in {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", op de laatste dag van de maand" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", op de laatste werkdag van de maand" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "eerste werkdag" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "werkdag dichtst bij dag {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", op de {0} van de maand" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", elke {0} dagen" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", tussen dag {0} en {1} van de maand" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", op dag {0} van de maand" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", elke {0} jaren" #: ExpressionDescriptor.py:385 msgid " and " msgstr " en " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", elke minuut" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", elk uur" cron-descriptor-2.0.6/cron_descriptor/locale/pl_PL.mo000066400000000000000000000054421505606603100226440ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP& < H V cp "  ( 4 @ L ([  a      ( 8 F R ] i w         ' and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: pl_PL MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit i i {0} miesiąca, od {0}-ego do {1}-ego dnia miesiąca, co dzień, co godzinę, co minutę, co {0} dni, co {0} dni tygodnia, co {0} miesięcy, co {0} lat, {0}-ego dnia miesiąca, , ostatni dzień miesiąca, ostatni dzień roboczy miesiąca, ostatni {0} miesiąca, {0} miesiąca, tylko {0}, tylko {0}, tylko {0}, startowy {0}, {0} dni przed ostatnim dniem miesiąca, od {0} do {1}Wystąpił błąd podczas generowania opisu wyrażenia cron. Sprawdź składnię wyrażenia cron.OO Co minutę od {0} do {1}o {0}w {0} minuciew {0} sekundzieod {0} do {1}co godzinęco minutęco sekundęco {0} godzinco {0} minutco {0} sekundpiątypierwszypierwszy dzień roboczyczwartyminuty od {0} do {1}drugisekundy od {0} do {1}trzecidzień roboczy najbliższy {0}-ego dniacron-descriptor-2.0.6/cron_descriptor/locale/pl_PL.po000066400000000000000000000074751505606603100226570ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "co minutę" #. EveryHour msgid "every hour" msgstr "co godzinę" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Wystąpił błąd podczas generowania opisu wyrażenia cron. Sprawdź składnię " "wyrażenia cron." #. AtSpace msgid "At " msgstr "O " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "Co minutę od {0} do {1}" #. At msgid "At" msgstr "O" #. SpaceAnd msgid " and" msgstr " i" #. EverySecond msgid "every second" msgstr "co sekundę" #. EveryX0Seconds msgid "every {0} seconds" msgstr "co {0} sekund" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "sekundy od {0} do {1}" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "w {0} sekundzie" #. EveryX0Minutes msgid "every {0} minutes" msgstr "co {0} minut" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "minuty od {0} do {1}" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "w {0} minucie" #. EveryX0Hours msgid "every {0} hours" msgstr "co {0} godzin" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "od {0} do {1}" #. AtX0 msgid "at {0}" msgstr "o {0}" #. ComaEveryDay msgid ", every day" msgstr ", co dzień" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", co {0} dni tygodnia" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", od {0} do {1}" #. First msgid "first" msgstr "pierwszy" #. Second msgid "second" msgstr "drugi" #. Third msgid "third" msgstr "trzeci" #. Fourth msgid "fourth" msgstr "czwarty" #. Fifth msgid "fifth" msgstr "piąty" #. ComaOnThe msgid ", on the " msgstr ", " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} miesiąca" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", ostatni {0} miesiąca" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", tylko {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", co {0} miesięcy" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", tylko {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", ostatni dzień miesiąca" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", ostatni dzień roboczy miesiąca" #. FirstWeekday msgid "first weekday" msgstr "pierwszy dzień roboczy" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "dzień roboczy najbliższy {0}-ego dnia" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", {0} miesiąca" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", co {0} dni" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", od {0}-ego do {1}-ego dnia miesiąca" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", {0}-ego dnia miesiąca" #. SpaceAndSpace msgid " and " msgstr " i " #. ComaEveryMinute msgid ", every minute" msgstr ", co minutę" #. ComaEveryHour msgid ", every hour" msgstr ", co godzinę" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", co {0} lat" #. CommaStartingX0 msgid ", starting {0}" msgstr ", startowy {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} dni przed ostatnim dniem miesiąca" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", tylko {0}" cron-descriptor-2.0.6/cron_descriptor/locale/pt_PT.mo000066400000000000000000000052521505606603100226630ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4 !  '9NT"m:& * / M U m          #' K &S z & and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: pt_PT e e {0} do mês, entre os dias {0} e {1} do mês, a cada dia, a cada hora, a cada minuto, a cada {0} dias, a cada {0} dias de semana, a cada {0} meses, a cada {0} anos, no dia {0} do mês, na , no último dia do mês, no último dia da semana do mês, na última {0} do mês, no {0} do mês, somente em {0}, somente de {0}, de {0} a {1}Ocorreu um erro ao gerar a descrição da expressão Cron.àsàs a cada minuto entre {0} e {1}Às {0}aos {0} minutos da horaaos {0} segundos do minutoentre {0} e {1}a cada horaa cada minutoa cada segundoa cada {0} horasa cada {0} minutosa cada {0} segundosquintaprimeiraprimeiro dia da semanaquartado minuto {0} até {1} de cada horasegundaNo segundo {0} até {1} de cada minutoterceiradia da semana mais próximo do dia {0}cron-descriptor-2.0.6/cron_descriptor/locale/pt_PT.po000066400000000000000000000116521505606603100226670ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "Ocorreu um erro ao gerar a descrição da expressão Cron." #: ExpressionDescriptor.py:151 msgid "At " msgstr "às " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "a cada minuto entre {0} e {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "às" #: ExpressionDescriptor.py:175 msgid " and" msgstr " e" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "a cada segundo" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "a cada {0} segundos" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "No segundo {0} até {1} de cada minuto" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "aos {0} segundos do minuto" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "a cada minuto" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "a cada {0} minutos" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "do minuto {0} até {1} de cada hora" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "aos {0} minutos da hora" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "a cada hora" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "a cada {0} horas" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "entre {0} e {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "Às {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "primeira" #: ExpressionDescriptor.py:243 msgid "second" msgstr "segunda" #: ExpressionDescriptor.py:245 msgid "third" msgstr "terceira" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "quarta" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "quinta" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", na " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} do mês" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", na última {0} do mês" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", somente de {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", a cada dia" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", a cada {0} dias de semana" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", de {0} a {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", a cada {0} meses" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", somente em {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", no último dia do mês" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", no último dia da semana do mês" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "primeiro dia da semana" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "dia da semana mais próximo do dia {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", no {0} do mês" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", a cada {0} dias" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", entre os dias {0} e {1} do mês" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", no dia {0} do mês" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", a cada {0} anos" #: ExpressionDescriptor.py:385 msgid " and " msgstr " e " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", a cada minuto" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", a cada hora" cron-descriptor-2.0.6/cron_descriptor/locale/ro_RO.mo000066400000000000000000000057031505606603100226560ustar00rootroot000000000000000"(&: a mz "Ba {  +_RU Yz}    -3 9G%Nt'{P %*Pat'  #' K d v   (  4 " % $) N \ c u          " ; C _ "f  1 and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}PMat {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: ro_RO MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit și și {0} a lunii, între zilele {0} și {1} ale lunii, în fiecare zi, în fiecare oră, în fiecare minut, la fiecare {0} zile, la fiecare a {0}-a zi a săptămânii, la fiecare {0} luni, o dată la {0} ani, în ziua {0} a lunii, în , în ultima zi a lunii, în ultima zi lucrătoare a lunii, în ultima {0} a lunii, în {0} a lunii, doar în {0}, doar în {0}, doar {0}, începând {0}, {0} zile înainte de ultima zi a lunii, de {0} până {1}Eroare la generarea descrierii. Verificați sintaxa.LaLa În fiecare minut între {0} și {1}după amiazăla {0}la și {0} minutela și {0} secundeîntre {0} și {1}în fiecare orăîn fiecare minutîn fiecare secundăla fiecare {0} orela fiecare {0} minutela fiecare {0} secundea cinceaprimaprima zi a săptămâniia patraîntre minutele {0} și {1}a douaîntre secunda {0} și secunda {1}a treiacea mai apropiată zi a săptămânii de ziua {0}cron-descriptor-2.0.6/cron_descriptor/locale/ro_RO.po000066400000000000000000000077461505606603100226720ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: ro_RO\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "în fiecare minut" #. EveryHour msgid "every hour" msgstr "în fiecare oră" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "Eroare la generarea descrierii. Verificați sintaxa." #. AtSpace msgid "At " msgstr "La " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "În fiecare minut între {0} și {1}" #. At msgid "At" msgstr "La" #. SpaceAnd msgid " and" msgstr " și" #. EverySecond msgid "every second" msgstr "în fiecare secundă" #. EveryX0Seconds msgid "every {0} seconds" msgstr "la fiecare {0} secunde" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "între secunda {0} și secunda {1}" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "la și {0} secunde" #. EveryX0Minutes msgid "every {0} minutes" msgstr "la fiecare {0} minute" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "între minutele {0} și {1}" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "la și {0} minute" #. EveryX0Hours msgid "every {0} hours" msgstr "la fiecare {0} ore" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "între {0} și {1}" #. AtX0 msgid "at {0}" msgstr "la {0}" #. ComaEveryDay msgid ", every day" msgstr ", în fiecare zi" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", la fiecare a {0}-a zi a săptămânii" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", de {0} până {1}" #. First msgid "first" msgstr "prima" #. Second msgid "second" msgstr "a doua" #. Third msgid "third" msgstr "a treia" #. Fourth msgid "fourth" msgstr "a patra" #. Fifth msgid "fifth" msgstr "a cincea" #. ComaOnThe msgid ", on the " msgstr ", în " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} a lunii" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", în ultima {0} a lunii" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", doar {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", la fiecare {0} luni" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", doar în {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", în ultima zi a lunii" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", în ultima zi lucrătoare a lunii" #. FirstWeekday msgid "first weekday" msgstr "prima zi a săptămânii" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "cea mai apropiată zi a săptămânii de ziua {0}" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", în {0} a lunii" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", la fiecare {0} zile" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", între zilele {0} și {1} ale lunii" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", în ziua {0} a lunii" #. SpaceAndSpace msgid " and " msgstr " și " #. ComaEveryMinute msgid ", every minute" msgstr ", în fiecare minut" #. ComaEveryHour msgid ", every hour" msgstr ", în fiecare oră" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", o dată la {0} ani" #. CommaStartingX0 msgid ", starting {0}" msgstr ", începând {0}" #. PMPeriod msgid "PM" msgstr "după amiază" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} zile înainte de ultima zi a lunii" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", doar în {0}" cron-descriptor-2.0.6/cron_descriptor/locale/ru_RU.mo000066400000000000000000000060541505606603100226720ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4)(0!Y{ -:(% N d z  J M )Q {         : X c "p    / and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: ru_RU и и {0} месяца, с {0} по {1} число месяца, каждый день, каждый час, каждую минуту, каждые {0} дней, каждые {0} дней недели, каждые {0} месяцев, каждые {0} лет, в {0} число месяца, в , в последний день месяца, в последний будний день месяца, в последний {0} месяца, в {0} месяца, только в {0}, только в {0}, {0} по {1}Произошла ошибка во время генерации описания выражения. Проверьте синтаксис крон-выражения.ВВ Каждую минуту с {0} по {1}в {0}в {0} минутв {0} секундс {0} по {1}каждый часкаждую минутукаждую секундукаждые {0} часовкаждые {0} минуткаждые {0} секундпятыйпервыйпервый будний деньчетвертыйминуты с {0} по {1}второйсекунды с {0} по {1}третийближайший будний день к {0}cron-descriptor-2.0.6/cron_descriptor/locale/ru_RU.po000066400000000000000000000124621505606603100226750ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_RU\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Произошла ошибка во время генерации описания выражения. Проверьте синтаксис " "крон-выражения." #: ExpressionDescriptor.py:151 msgid "At " msgstr "В " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Каждую минуту с {0} по {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "В" #: ExpressionDescriptor.py:175 msgid " and" msgstr " и" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "каждую секунду" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "каждые {0} секунд" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "секунды с {0} по {1}" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "в {0} секунд" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "каждую минуту" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "каждые {0} минут" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "минуты с {0} по {1}" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "в {0} минут" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "каждый час" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "каждые {0} часов" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "с {0} по {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "в {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "первый" #: ExpressionDescriptor.py:243 msgid "second" msgstr "второй" #: ExpressionDescriptor.py:245 msgid "third" msgstr "третий" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "четвертый" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "пятый" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", в " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} месяца" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", в последний {0} месяца" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", только в {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", каждый день" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", каждые {0} дней недели" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} по {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", каждые {0} месяцев" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", только в {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", в последний день месяца" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", в последний будний день месяца" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "первый будний день" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "ближайший будний день к {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", в {0} месяца" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", каждые {0} дней" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", с {0} по {1} число месяца" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", в {0} число месяца" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", каждые {0} лет" #: ExpressionDescriptor.py:385 msgid " and " msgstr " и " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", каждую минуту" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", каждый час" cron-descriptor-2.0.6/cron_descriptor/locale/sk_SK.mo000066400000000000000000000055071505606603100226520ustar00rootroot00000000000000,|;&  &5Fcv "  ' 5C_U   4 ? LYi{ %'' HK O!\~ ! ' "@ c z J      . E U d t            !% & ", *!%  (+#$' ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: PO-Revision-Date: 2023-01-25 15:44+0100 Last-Translator: Erik Telepovský Language-Team: Language: sk_SK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.2.2 a a {0} mesiaca, medzi {0}. a {1}. dňom mesiaca, každý deň, každú hodinu, každú minútu, každých {0} dní, každých {0} dní v týždni, každý {0} mesiac, každý {0}. rok, {0}. deň mesiaca, na , posledný deň mesiaca, posledný pracovný deň mesiaca, posledú {0} mesiaca, {0} mesiaca, iba {0}, iba {0}, {0} do {1}Nastala chyba pri generovaní popisu výrazu. Skontrolujte syntax výrazu.OO Každú minútu medzi {0} a {1}o {0}o {0}. minúte{0} sekúnd po minútemedzi {0} a {1}každú hodinukaždú minútukaždú sekúndukaždých {0} hodinkaždých {0} minútkaždých {0} sekúndpiatyprvýprvý víkendový deňštvrtý{0} až {1} minútdruhý{0} až {1} sekúndtretínajbližší pracovný deň k {0}cron-descriptor-2.0.6/cron_descriptor/locale/sk_SK.po000066400000000000000000000116101505606603100226450ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2023 # This file is distributed under the same license as the cron_descriptor package. # Erik Telepovský , 2023. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-25 15:08+0200\n" "PO-Revision-Date: 2023-01-25 15:44+0100\n" "Last-Translator: Erik Telepovský \n" "Language-Team: \n" "Language: sk_SK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.2.2\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "Nastala chyba pri generovaní popisu výrazu. Skontrolujte syntax výrazu." #: ExpressionDescriptor.py:151 msgid "At " msgstr "O " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Každú minútu medzi {0} a {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "O" #: ExpressionDescriptor.py:175 msgid " and" msgstr " a" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "každú sekúndu" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "každých {0} sekúnd" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "{0} až {1} sekúnd" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "{0} sekúnd po minúte" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "každú minútu" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "každých {0} minút" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "{0} až {1} minút" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "o {0}. minúte" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "každú hodinu" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "každých {0} hodin" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "medzi {0} a {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "o {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "prvý" #: ExpressionDescriptor.py:243 msgid "second" msgstr "druhý" #: ExpressionDescriptor.py:245 msgid "third" msgstr "tretí" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "štvrtý" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "piaty" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", na " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} mesiaca" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", posledú {0} mesiaca" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", iba {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", každý deň" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", každých {0} dní v týždni" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} do {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", každý {0} mesiac" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", iba {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", posledný deň mesiaca" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", posledný pracovný deň mesiaca" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "prvý víkendový deň" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "najbližší pracovný deň k {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", {0} mesiaca" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", každých {0} dní" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", medzi {0}. a {1}. dňom mesiaca" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", {0}. deň mesiaca" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", každý {0}. rok" #: ExpressionDescriptor.py:385 msgid " and " msgstr " a " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", každú minútu" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", každú hodinu" cron-descriptor-2.0.6/cron_descriptor/locale/sl_SI.mo000066400000000000000000000053741505606603100226530ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP  5 @L[l  ( 5 B R o R        ( 2 ? M [ l ~        " and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: sl_SI MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit in in {0} v mesecu, od {0}. do {1}. dne v mesecu, vsak dan, vsako uro, vsako minuto, vsakih {0} dni, vsakih {0} dni v tednu, vsakih {0} mesecev, vsakih {0} let, {0}. dan v mesecu, , zadnji dan v mesecu, zadnji delovni dan v mesecu, zadnji {0} v mesecu, {0} v mesecu, samo v {0}, samo v {0}, samo v {0}, začenši {0}, {0} dni pred koncem meseca, od {0} do {1}Pri generiranju opisa izraza je prišlo do napake. Preverite sintakso izraza cron.ObOb Vsako minuto od {0} do {1}ob {0}ob {0}. minutiob {0}. sekundiod {0} do {1}vsako urovsako minutovsako sekundovsakih {0} urvsakih {0} minutvsakih {0} sekundpetiprviprvi delovni dančetrtiminute od {0} do {1}drugisekunde od {0} do {1}tretjidelovni dan, najbližji {0}. dnevucron-descriptor-2.0.6/cron_descriptor/locale/sl_SI.po000066400000000000000000000074271505606603100226570ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "vsako minuto" #. EveryHour msgid "every hour" msgstr "vsako uro" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "Pri generiranju opisa izraza je prišlo do napake. Preverite sintakso izraza " "cron." #. AtSpace msgid "At " msgstr "Ob " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "Vsako minuto od {0} do {1}" #. At msgid "At" msgstr "Ob" #. SpaceAnd msgid " and" msgstr " in" #. EverySecond msgid "every second" msgstr "vsako sekundo" #. EveryX0Seconds msgid "every {0} seconds" msgstr "vsakih {0} sekund" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "sekunde od {0} do {1}" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "ob {0}. sekundi" #. EveryX0Minutes msgid "every {0} minutes" msgstr "vsakih {0} minut" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "minute od {0} do {1}" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "ob {0}. minuti" #. EveryX0Hours msgid "every {0} hours" msgstr "vsakih {0} ur" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "od {0} do {1}" #. AtX0 msgid "at {0}" msgstr "ob {0}" #. ComaEveryDay msgid ", every day" msgstr ", vsak dan" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", vsakih {0} dni v tednu" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", od {0} do {1}" #. First msgid "first" msgstr "prvi" #. Second msgid "second" msgstr "drugi" #. Third msgid "third" msgstr "tretji" #. Fourth msgid "fourth" msgstr "četrti" #. Fifth msgid "fifth" msgstr "peti" #. ComaOnThe msgid ", on the " msgstr ", " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr " {0} v mesecu" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", zadnji {0} v mesecu" #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", samo v {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", vsakih {0} mesecev" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", samo v {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", zadnji dan v mesecu" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", zadnji delovni dan v mesecu" #. FirstWeekday msgid "first weekday" msgstr "prvi delovni dan" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "delovni dan, najbližji {0}. dnevu" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", {0} v mesecu" #. ComaEveryX0Days msgid ", every {0} days" msgstr ", vsakih {0} dni" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", od {0}. do {1}. dne v mesecu" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", {0}. dan v mesecu" #. SpaceAndSpace msgid " and " msgstr " in " #. ComaEveryMinute msgid ", every minute" msgstr ", vsako minuto" #. ComaEveryHour msgid ", every hour" msgstr ", vsako uro" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", vsakih {0} let" #. CommaStartingX0 msgid ", starting {0}" msgstr ", začenši {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} dni pred koncem meseca" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", samo v {0}" cron-descriptor-2.0.6/cron_descriptor/locale/sv_SE.mo000066400000000000000000000061511505606603100226530ustar00rootroot00000000000000,|;&  &5Fcv "  ' 5C_U   4 ? LYi{ %' # 5 A O ] m    %  0 K Z i _      - L _ k w        1  3 H O & ", *!%  (+#$' ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: cron-descriptor Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-02-14 18:02+0100 Last-Translator: Åke Engelbrektson Language-Team: SvenskaSpråkfiler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: sv_SE X-Generator: Poedit 1.8.7 Plural-Forms: nplurals=2; plural=(n != 1); och och {0}:a i månaden, mellan dag {0} och {1} i månaden, varje dag, varje timma, varje minut, var {0}:e dag, var {0}:e veckodag, var {0}:e månad], var {0}:e år, på dag {0} i månaden, på den , på den sista dagen i månaden, på den sista veckodagen i månaden, på den sista {0} i månaden, på den {0}:a i månaden, endast i {0}, bara på {0}, {0} till och med {1}Ett fel inträffade vid generering av uttryckets beskrivning. Kontrollera crons uttryckssyntax.VidVid Varje minut mellan {0} och {1}vid {0}vid {0} minuter över timmanvid {0} sekunder över minutenmellan {0} och {1}Varje timmavarje minutvarje sekundvar {0}:e timmavar {0}:e minutvar {0}:e sekundfemteförstaförsta veckodagfjärdeminuterna från {0} till och med {1} över timmanandrasekunderna från {0} till och med {1} över minutentredjeveckodag närmast dag {0}cron-descriptor-2.0.6/cron_descriptor/locale/sv_SE.po000066400000000000000000000111721505606603100226550ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: cron-descriptor\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-02-12 07:33+0100\n" "Last-Translator: Åke Engelbrektson \n" "Language-Team: SvenskaSpråkfiler \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv_SE\n" "X-Generator: Poedit 1.5.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "" "Ett fel inträffade vid generering av uttryckets beskrivning. Kontrollera " "crons uttryckssyntax." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Vid " #: ExpressionDescriptor.py:160 msgid "Every minute between {0} and {1}" msgstr "Varje minut mellan {0} och {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Vid" #: ExpressionDescriptor.py:175 msgid " and" msgstr " och" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "varje sekund" #: ExpressionDescriptor.py:201 msgid "every {0} seconds" msgstr "var {0}:e sekund" #: ExpressionDescriptor.py:201 msgid "seconds {0} through {1} past the minute" msgstr "sekunderna från {0} till och med {1} över minuten" #: ExpressionDescriptor.py:201 msgid "at {0} seconds past the minute" msgstr "vid {0} sekunder över minuten" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "varje minut" #: ExpressionDescriptor.py:209 msgid "every {0} minutes" msgstr "var {0}:e minut" #: ExpressionDescriptor.py:209 msgid "minutes {0} through {1} past the hour" msgstr "minuterna från {0} till och med {1} över timman" #: ExpressionDescriptor.py:209 msgid "at {0} minutes past the hour" msgstr "vid {0} minuter över timman" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "Varje timma" #: ExpressionDescriptor.py:218 msgid "every {0} hours" msgstr "var {0}:e timma" #: ExpressionDescriptor.py:218 msgid "between {0} and {1}" msgstr "mellan {0} och {1}" #: ExpressionDescriptor.py:218 msgid "at {0}" msgstr "vid {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "första" #: ExpressionDescriptor.py:243 msgid "second" msgstr "andra" #: ExpressionDescriptor.py:245 msgid "third" msgstr "tredje" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "fjärde" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "femte" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", på den " #: ExpressionDescriptor.py:252 msgid " {0} of the month" msgstr " {0}:a i månaden" #: ExpressionDescriptor.py:254 msgid ", on the last {0} of the month" msgstr ", på den sista {0} i månaden" #: ExpressionDescriptor.py:256 msgid ", only on {0}" msgstr ", bara på {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", varje dag" #: ExpressionDescriptor.py:260 msgid ", every {0} days of the week" msgstr ", var {0}:e veckodag" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 msgid ", {0} through {1}" msgstr ", {0} till och med {1}" #: ExpressionDescriptor.py:272 msgid ", every {0} months" msgstr ", var {0}:e månad]" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 msgid ", only in {0}" msgstr ", endast i {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", på den sista dagen i månaden" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", på den sista veckodagen i månaden" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "första veckodag" #: ExpressionDescriptor.py:297 msgid "weekday nearest day {0}" msgstr "veckodag närmast dag {0}" #: ExpressionDescriptor.py:299 msgid ", on the {0} of the month" msgstr ", på den {0}:a i månaden" #: ExpressionDescriptor.py:303 msgid ", every {0} days" msgstr ", var {0}:e dag" #: ExpressionDescriptor.py:304 msgid ", between day {0} and {1} of the month" msgstr ", mellan dag {0} och {1} i månaden" #: ExpressionDescriptor.py:304 msgid ", on day {0} of the month" msgstr ", på dag {0} i månaden" #: ExpressionDescriptor.py:316 msgid ", every {0} years" msgstr ", var {0}:e år" #: ExpressionDescriptor.py:385 msgid " and " msgstr " och " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", varje minut" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", varje timma" cron-descriptor-2.0.6/cron_descriptor/locale/ta_IN.mo000066400000000000000000000111111505606603100226160ustar00rootroot00000000000000,|;&  &5Fcv "  ' 5C_U   4 ? LYi{ %'  AW os : 6W C _ F2 Iy 4  @ JU A 1 % +: #f 2   _ 7WQQ-8)4b.8JGJ&ej_F& ", *!%  (+#$' ) and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: PO-Revision-Date: 2022-01-23 23:54+0530 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: ta_IN Last-Translator: Sankar Hari Language-Team: X-Generator: Poedit 3.0 மற்றும் மற்றும் மாதத்தின் {0}, மாதத்தின் {0} மற்றும் {1} நாட்களுக்கு இடையில், தினமும், ஒவ்வொரு மணி நேரமும், ஒவ்வொரு நிமிடமும், ஒவ்வொரு {0} நாட்களுக்கும், வாரத்தின் ஒவ்வொரு {0} நாட்களுக்கும், ஒவ்வொரு {0} மாதங்களுக்கும், ஒவ்வொரு {0} வருடங்களுக்கும், மாதத்தின் {0} நாளில், அதன் மேல், மாதத்தின் கடைசி நாளில், மாதத்தின் கடைசி வார நாளில், மாதத்தின் கடைசி {0} அன்று, மாதத்தின் {0} அன்று, {0} இல் மட்டும், {0} அன்று மட்டும், {0} முதல் {1} வரைவெளிப்பாடு விளக்கத்தை உருவாக்கும் போது பிழை ஏற்பட்டது. க்ரான் வெளிப்பாட்டை சரிபார்க்கவும்.வெளிப்பாடு தொடரியல்.மணிக்குVe ஒவ்வொரு நிமிடமும் {0} மற்றும் {1} இடையே{0} மணிக்குமணிநேரத்தை கடந்த {0} நிமிடங்களில்நிமிடத்தை கடந்த {0} வினாடிகளில்{0} மற்றும் {1} இடையேஒவ்வொரு மணி நேரமும்ஒவ்வொரு நிமிடமும்ஒவ்வொரு நொடியும்ஒவ்வொரு {0} மணிநேரமும்ஒவ்வொரு {0} நிமிடங்களுக்கும்ஒவ்வொரு {0} வினாடிகளுக்கும்ஐந்தாவதுமுதலில்முதல் வார நாள்நான்காவதுமணிநேரத்தை கடந்த {0} முதல் {1} நிமிடங்கள்இரண்டாவதுநிமிடத்தை கடந்த {0} முதல் {1} வினாடிகள்மூன்றாவதுவார நாள் அருகிலுள்ள நாள் {0}cron-descriptor-2.0.6/cron_descriptor/locale/ta_IN.po000066400000000000000000000151711505606603100226330ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Sankar Hari , 2022. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-23 02:00+0100\n" "PO-Revision-Date: 2022-01-23 23:54+0530\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ta_IN\n" "Last-Translator: Sankar Hari \n" "Language-Team: \n" "X-Generator: Poedit 3.0\n" #: ExpressionDescriptor.py:130 msgid "An error occured when generating the expression description. Check the cron expression syntax." msgstr "வெளிப்பாடு விளக்கத்தை உருவாக்கும் போது பிழை ஏற்பட்டது. க்ரான் வெளிப்பாட்டை சரிபார்க்கவும்.வெளிப்பாடு தொடரியல்." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Ve " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "ஒவ்வொரு நிமிடமும் {0} மற்றும் {1} இடையே" #: ExpressionDescriptor.py:165 msgid "At" msgstr "மணிக்கு" #: ExpressionDescriptor.py:175 msgid " and" msgstr "மற்றும்" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "ஒவ்வொரு நொடியும்" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "ஒவ்வொரு {0} வினாடிகளுக்கும்" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "நிமிடத்தை கடந்த {0} முதல் {1} வினாடிகள்" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "நிமிடத்தை கடந்த {0} வினாடிகளில்" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "ஒவ்வொரு நிமிடமும்" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "ஒவ்வொரு {0} நிமிடங்களுக்கும்" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "மணிநேரத்தை கடந்த {0} முதல் {1} நிமிடங்கள்" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "மணிநேரத்தை கடந்த {0} நிமிடங்களில்" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "ஒவ்வொரு மணி நேரமும்" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "ஒவ்வொரு {0} மணிநேரமும்" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "{0} மற்றும் {1} இடையே" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "{0} மணிக்கு" #: ExpressionDescriptor.py:241 msgid "first" msgstr "முதலில்" #: ExpressionDescriptor.py:243 msgid "second" msgstr "இரண்டாவது" #: ExpressionDescriptor.py:245 msgid "third" msgstr "மூன்றாவது" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "நான்காவது" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "ஐந்தாவது" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", அதன் மேல்" #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " மாதத்தின் {0}" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", மாதத்தின் கடைசி {0} அன்று" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", {0} அன்று மட்டும்" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 ExpressionDescriptor.py:435 msgid ", every day" msgstr ", தினமும்" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", வாரத்தின் ஒவ்வொரு {0} நாட்களுக்கும்" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} முதல் {1} வரை" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", ஒவ்வொரு {0} மாதங்களுக்கும்" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", {0} இல் மட்டும்" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", மாதத்தின் கடைசி நாளில்" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", மாதத்தின் கடைசி வார நாளில்" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "முதல் வார நாள்" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "வார நாள் அருகிலுள்ள நாள் {0}" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", மாதத்தின் {0} அன்று" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", ஒவ்வொரு {0} நாட்களுக்கும்" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", மாதத்தின் {0} மற்றும் {1} நாட்களுக்கு இடையில்" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", மாதத்தின் {0} நாளில்" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", ஒவ்வொரு {0} வருடங்களுக்கும்" #: ExpressionDescriptor.py:385 msgid " and " msgstr " மற்றும் " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", ஒவ்வொரு நிமிடமும்" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", ஒவ்வொரு மணி நேரமும்" cron-descriptor-2.0.6/cron_descriptor/locale/tr_TR.mo000066400000000000000000000053101505606603100226620ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4 $    *>GZq X, 1 &7 ^ g          + )7 a +h ( and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: tr_TR ve ve {0} günü, ayın {0}. ve {1}. günleri arası, her gün, her saat, her dakika, {0} günde bir, ayın her {0} günü, {0} ayda bir, {0} yılda bir, ayın {0}. günü, ayın , ayın son günü, ayın son iş günü, ayın son {0} günü, ayın {0}, sadece {0} için, sadece {0} günü, {0} ile {1} arasındaİfade açıklamasını oluştururken bir hata oluştu. Cron ifadesini gözden geçirin.SaatSaat Saat {0} ve {1} arasındaki her dakikasaat {0}saatlerin {0}. dakikasındadakikaların {0}. saniyesinde{0} ile {1} arasındaher saather dakikaher saniyeher {0} saatteher {0} dakikada birher {0} saniyede birbeşinciilkilk iş günüdördüncüsaatlerin {0}. ve {1}. dakikaları arasıikincidakikaların {0}. ve {1}. saniyeleri arasıüçüncü{0}. günü sonrasındaki ilk iş günücron-descriptor-2.0.6/cron_descriptor/locale/tr_TR.po000066400000000000000000000117161505606603100226740ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "İfade açıklamasını oluştururken bir hata oluştu. Cron ifadesini gözden " "geçirin." #: ExpressionDescriptor.py:151 msgid "At " msgstr "Saat " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Saat {0} ve {1} arasındaki her dakika" #: ExpressionDescriptor.py:165 msgid "At" msgstr "Saat" #: ExpressionDescriptor.py:175 msgid " and" msgstr " ve" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "her saniye" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "her {0} saniyede bir" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "dakikaların {0}. ve {1}. saniyeleri arası" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "dakikaların {0}. saniyesinde" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "her dakika" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "her {0} dakikada bir" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "saatlerin {0}. ve {1}. dakikaları arası" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "saatlerin {0}. dakikasında" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "her saat" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "her {0} saatte" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "{0} ile {1} arasında" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "saat {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "ilk" #: ExpressionDescriptor.py:243 msgid "second" msgstr "ikinci" #: ExpressionDescriptor.py:245 msgid "third" msgstr "üçüncü" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "dördüncü" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "beşinci" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", ayın " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} günü" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", ayın son {0} günü" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", sadece {0} günü" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", her gün" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", ayın her {0} günü" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} ile {1} arasında" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", {0} ayda bir" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", sadece {0} için" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", ayın son günü" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", ayın son iş günü" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "ilk iş günü" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "{0}. günü sonrasındaki ilk iş günü" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", ayın {0}" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", {0} günde bir" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", ayın {0}. ve {1}. günleri arası" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", ayın {0}. günü" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", {0} yılda bir" #: ExpressionDescriptor.py:385 msgid " and " msgstr " ve " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", her dakika" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", her saat" cron-descriptor-2.0.6/cron_descriptor/locale/uk_UA.mo000066400000000000000000000057531505606603100226470ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4- $%Jh +/& , B X n }   &$ K R h ~        ' 4 N a  1 and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: uk_UA та та {0} місяця, між {0} та {1} днями місяця, щоденно, щогодини, щохвилини, кожен {0} день, кожен {0} день тижня, кожен {0} місяць, кожні {0} роки, на {0} день місяця, в , в останній день місяця, в останній будень місяця, в останній {0} місяця, в {0} місяця, тільки в {0}, тільки в {0}, {0} по {1}ВІдбулася помилка підчас генерації опису. Перевірта правильність написання cron виразу.ОО Щохвилини між {0} та {1}о {0}о {0} хвилиніо {0} секундіміж {0} та {1}щогодинищохвилиниЩосекундикожні {0} годинкожні {0} хвилинкожні {0} секундп'ятийпершийперший буденьчетвертийз {0} по {1} хвилинудругийз {0} по {1} секундутретійбудень найближчий до {0} дняcron-descriptor-2.0.6/cron_descriptor/locale/uk_UA.po000066400000000000000000000123611505606603100226430ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk_UA\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "" "ВІдбулася помилка підчас генерації опису. Перевірта правильність написання " "cron виразу." #: ExpressionDescriptor.py:151 msgid "At " msgstr "О " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Щохвилини між {0} та {1}" #: ExpressionDescriptor.py:165 msgid "At" msgstr "О" #: ExpressionDescriptor.py:175 msgid " and" msgstr " та" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "Щосекунди" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "кожні {0} секунд" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "з {0} по {1} секунду" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "о {0} секунді" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "щохвилини" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "кожні {0} хвилин" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "з {0} по {1} хвилину" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "о {0} хвилині" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "щогодини" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "кожні {0} годин" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "між {0} та {1}" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "о {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "перший" #: ExpressionDescriptor.py:243 msgid "second" msgstr "другий" #: ExpressionDescriptor.py:245 msgid "third" msgstr "третій" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "четвертий" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "п'ятий" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", в " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr " {0} місяця" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", в останній {0} місяця" #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", тільки в {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", щоденно" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", кожен {0} день тижня" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} по {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", кожен {0} місяць" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", тільки в {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", в останній день місяця" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", в останній будень місяця" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "перший будень" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "будень найближчий до {0} дня" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", в {0} місяця" #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", кожен {0} день" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", між {0} та {1} днями місяця" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", на {0} день місяця" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", кожні {0} роки" #: ExpressionDescriptor.py:385 msgid " and " msgstr " та " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", щохвилини" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", щогодини" cron-descriptor-2.0.6/cron_descriptor/locale/vi_VN.mo000066400000000000000000000060631505606603100226570ustar00rootroot00000000000000-=& % 1>M^{ "% ? M[j_|  (G [ f s %')/"Gjov'     #/ S [ !| $      c,          ' 3 C S c n { + +  " "!, +- &% $'#(   )* and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, starting {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: hi@bxdoan.com PO-Revision-Date: 2023-05-19 01:40+0700 Last-Translator: Doan Bui Language-Team: Language: vi_VN MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 3.3.1 và và {0} của tháng, giữa {0} và {1} của mỗi tháng, mỗi ngày, mỗi giờ, mỗi phút, mỗi {0} ngày, mỗi ngày {0} của tuần, mỗi {0} tháng, mỗi {0} năm, vào ngày {0} của mỗi tháng, vào , vào ngày cuối của tháng, vào tuần cuối của tháng, vào {0} cuối cùng của tháng, vào {0} của tháng, chỉ vào {0}, chỉ trên {0}, bắt đầu lúc {0}, từ {0} đến {1}Đã xảy ra lỗi khi tạo mô tả biểu thức. Hãy kiểm tra cú pháp biểu thức cron.TạiTại Mỗi phút giữa {0} và {1}lúc {0}từ phút {0} mỗi giờtại giây {0} mỗi phútgiữa {0} và {1}mỗi giờmỗi phútmỗi giâymỗi {0} giờmỗi {0} phútmỗi {0} giâythứ nămđầu tiênngày đầu tiên của tuầnthứ tưtừ phút {0} đến phút {1} mỗi giờthứ haitừ giây {0} đến giây {1} mỗi phútthứ bangày trong tuần gần ngày {0}cron-descriptor-2.0.6/cron_descriptor/locale/vi_VN.po000066400000000000000000000123121505606603100226540ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Doan Bui , 2023. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: hi@bxdoan.com\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2023-05-19 01:40+0700\n" "Last-Translator: Doan Bui \n" "Language-Team: \n" "Language: vi_VN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.3.1\n" #: ExpressionDescriptor.py:145 msgid "" "An error occured when generating the expression description. Check the cron " "expression syntax." msgstr "Đã xảy ra lỗi khi tạo mô tả biểu thức. Hãy kiểm tra cú pháp biểu thức cron." #: ExpressionDescriptor.py:169 msgid "At " msgstr "Tại " #: ExpressionDescriptor.py:180 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "Mỗi phút giữa {0} và {1}" #: ExpressionDescriptor.py:186 msgid "At" msgstr "Tại" #: ExpressionDescriptor.py:196 msgid " and" msgstr " và" #: ExpressionDescriptor.py:226 msgid "every second" msgstr "mỗi giây" #: ExpressionDescriptor.py:228 #, python-brace-format msgid "every {0} seconds" msgstr "mỗi {0} giây" #: ExpressionDescriptor.py:229 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "từ giây {0} đến giây {1} mỗi phút" #: ExpressionDescriptor.py:230 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "tại giây {0} mỗi phút" #: ExpressionDescriptor.py:243 msgid "every minute" msgstr "mỗi phút" #: ExpressionDescriptor.py:245 #, python-brace-format msgid "every {0} minutes" msgstr "mỗi {0} phút" #: ExpressionDescriptor.py:246 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "từ phút {0} đến phút {1} mỗi giờ" #: ExpressionDescriptor.py:247 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "từ phút {0} mỗi giờ" #: ExpressionDescriptor.py:260 msgid "every hour" msgstr "mỗi giờ" #: ExpressionDescriptor.py:262 #, python-brace-format msgid "every {0} hours" msgstr "mỗi {0} giờ" #: ExpressionDescriptor.py:263 #, python-brace-format msgid "between {0} and {1}" msgstr "giữa {0} và {1}" #: ExpressionDescriptor.py:264 #, python-brace-format msgid "at {0}" msgstr "lúc {0}" #: ExpressionDescriptor.py:295 msgid "first" msgstr "đầu tiên" #: ExpressionDescriptor.py:296 msgid "second" msgstr "thứ hai" #: ExpressionDescriptor.py:297 msgid "third" msgstr "thứ ba" #: ExpressionDescriptor.py:298 msgid "fourth" msgstr "thứ tư" #: ExpressionDescriptor.py:299 msgid "fifth" msgstr "thứ năm" #: ExpressionDescriptor.py:305 msgid ", on the " msgstr ", vào " #: ExpressionDescriptor.py:306 #, python-brace-format msgid " {0} of the month" msgstr " {0} của tháng" #: ExpressionDescriptor.py:308 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", vào {0} cuối cùng của tháng" #: ExpressionDescriptor.py:310 #, python-brace-format msgid ", only on {0}" msgstr ", chỉ trên {0}" #: ExpressionDescriptor.py:316 ExpressionDescriptor.py:366 #: ExpressionDescriptor.py:368 ExpressionDescriptor.py:554 msgid ", every day" msgstr ", mỗi ngày" #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", every {0} days of the week" msgstr ", mỗi ngày {0} của tuần" #: ExpressionDescriptor.py:319 ExpressionDescriptor.py:335 #: ExpressionDescriptor.py:398 ExpressionDescriptor.py:467 #, python-brace-format msgid ", {0} through {1}" msgstr ", từ {0} đến {1}" #: ExpressionDescriptor.py:334 #, python-brace-format msgid ", every {0} months" msgstr ", mỗi {0} tháng" #: ExpressionDescriptor.py:336 ExpressionDescriptor.py:399 #, python-brace-format msgid ", only in {0}" msgstr ", chỉ vào {0}" #: ExpressionDescriptor.py:350 msgid ", on the last day of the month" msgstr ", vào ngày cuối của tháng" #: ExpressionDescriptor.py:352 msgid ", on the last weekday of the month" msgstr ", vào tuần cuối của tháng" #: ExpressionDescriptor.py:359 msgid "first weekday" msgstr "ngày đầu tiên của tuần" #: ExpressionDescriptor.py:359 #, python-brace-format msgid "weekday nearest day {0}" msgstr "ngày trong tuần gần ngày {0}" #: ExpressionDescriptor.py:361 #, python-brace-format msgid ", on the {0} of the month" msgstr ", vào {0} của tháng" #: ExpressionDescriptor.py:368 #, python-brace-format msgid ", every {0} days" msgstr ", mỗi {0} ngày" #: ExpressionDescriptor.py:369 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", giữa {0} và {1} của mỗi tháng" #: ExpressionDescriptor.py:370 #, python-brace-format msgid ", on day {0} of the month" msgstr ", vào ngày {0} của mỗi tháng" #: ExpressionDescriptor.py:397 #, python-brace-format msgid ", every {0} years" msgstr ", mỗi {0} năm" #: ExpressionDescriptor.py:449 #, python-brace-format msgid ", starting {0}" msgstr ", bắt đầu lúc {0}" #: ExpressionDescriptor.py:462 msgid " and " msgstr " và " #: ExpressionDescriptor.py:552 msgid ", every minute" msgstr ", mỗi phút" #: ExpressionDescriptor.py:553 msgid ", every hour" msgstr ", mỗi giờ" cron-descriptor-2.0.6/cron_descriptor/locale/zh_CN.mo000066400000000000000000000051631505606603100226370ustar00rootroot00000000000000,|& ! -:IZw "! ; IW_i 4 H S `m} %'P4 $     "6=Us   I  " ? G _ w     " $ . N X and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only on {0}, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayforthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2016-01-19 02:00+0100 PO-Revision-Date: 2016-01-19 02:00+0100 Last-Translator: Adam Schubert Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Language: zh_CN 和 和 {0} 每月, 在每月的 {0} 和 {1} 号之间, 每天, 每小时, 每分钟, 每 {0} 天, 每周的每 {0} 天, 每 {0} 月, 每 {0} 年, 每月的 {0} 号, 在 , 每月的最后一天, 每月的最后一个平日, 每月的最后一个 {0} , 每月的 {0} , 仅在 {0}, 仅在 {0}, {0} 到 {1}生成表达式描述时发生了错误,请检查cron表达式语法。在在 在 {0} 和 {1} 之间的每分钟在 {0}在每小时的 {0} 分在每分钟的 {0} 秒在 {0} 和 {1} 之间每小时每分钟每秒每 {0} 小时每 {0} 分钟每 {0} 秒第五个第一个第一个平日第四个在每小时的 {0} 到 {1} 分钟第二个在每分钟的 {0} 到 {1} 秒第三个最接近 {0} 号的平日cron-descriptor-2.0.6/cron_descriptor/locale/zh_CN.po000066400000000000000000000115631505606603100226430ustar00rootroot00000000000000# Translation of cron_descriptor # Copyright (C) 2016 # This file is distributed under the same license as the cron_descriptor package. # Adam Schubert , 2016. # msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2016-01-19 02:00+0100\n" "PO-Revision-Date: 2016-01-19 02:00+0100\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" #: ExpressionDescriptor.py:130 msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "生成表达式描述时发生了错误,请检查cron表达式语法。" #: ExpressionDescriptor.py:151 msgid "At " msgstr "在 " #: ExpressionDescriptor.py:160 #, python-brace-format msgid "Every minute between {0} and {1}" msgstr "在 {0} 和 {1} 之间的每分钟" #: ExpressionDescriptor.py:165 msgid "At" msgstr "在" #: ExpressionDescriptor.py:175 msgid " and" msgstr " 和" #: ExpressionDescriptor.py:201 msgid "every second" msgstr "每秒" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "every {0} seconds" msgstr "每 {0} 秒" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "seconds {0} through {1} past the minute" msgstr "在每分钟的 {0} 到 {1} 秒" #: ExpressionDescriptor.py:201 #, python-brace-format msgid "at {0} seconds past the minute" msgstr "在每分钟的 {0} 秒" #: ExpressionDescriptor.py:209 msgid "every minute" msgstr "每分钟" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "every {0} minutes" msgstr "每 {0} 分钟" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "minutes {0} through {1} past the hour" msgstr "在每小时的 {0} 到 {1} 分钟" #: ExpressionDescriptor.py:209 #, python-brace-format msgid "at {0} minutes past the hour" msgstr "在每小时的 {0} 分" #: ExpressionDescriptor.py:218 msgid "every hour" msgstr "每小时" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "every {0} hours" msgstr "每 {0} 小时" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "between {0} and {1}" msgstr "在 {0} 和 {1} 之间" #: ExpressionDescriptor.py:218 #, python-brace-format msgid "at {0}" msgstr "在 {0}" #: ExpressionDescriptor.py:241 msgid "first" msgstr "第一个" #: ExpressionDescriptor.py:243 msgid "second" msgstr "第二个" #: ExpressionDescriptor.py:245 msgid "third" msgstr "第三个" #: ExpressionDescriptor.py:247 msgid "fourth" msgstr "第四个" #: ExpressionDescriptor.py:249 msgid "fifth" msgstr "第五个" #: ExpressionDescriptor.py:251 msgid ", on the " msgstr ", 在 " #: ExpressionDescriptor.py:252 #, python-brace-format msgid " {0} of the month" msgstr "{0} 每月" #: ExpressionDescriptor.py:254 #, python-brace-format msgid ", on the last {0} of the month" msgstr ", 每月的最后一个 {0} " #: ExpressionDescriptor.py:256 #, python-brace-format msgid ", only on {0}" msgstr ", 仅在 {0}" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:303 #: ExpressionDescriptor.py:435 msgid ", every day" msgstr ", 每天" #: ExpressionDescriptor.py:260 #, python-brace-format msgid ", every {0} days of the week" msgstr ", 每周的每 {0} 天" #: ExpressionDescriptor.py:260 ExpressionDescriptor.py:274 #: ExpressionDescriptor.py:318 #, python-brace-format msgid ", {0} through {1}" msgstr ", {0} 到 {1}" #: ExpressionDescriptor.py:272 #, python-brace-format msgid ", every {0} months" msgstr ", 每 {0} 月" #: ExpressionDescriptor.py:275 ExpressionDescriptor.py:319 #, python-brace-format msgid ", only in {0}" msgstr ", 仅在 {0}" #: ExpressionDescriptor.py:288 msgid ", on the last day of the month" msgstr ", 每月的最后一天" #: ExpressionDescriptor.py:290 msgid ", on the last weekday of the month" msgstr ", 每月的最后一个平日" #: ExpressionDescriptor.py:297 msgid "first weekday" msgstr "第一个平日" #: ExpressionDescriptor.py:297 #, python-brace-format msgid "weekday nearest day {0}" msgstr "最接近 {0} 号的平日" #: ExpressionDescriptor.py:299 #, python-brace-format msgid ", on the {0} of the month" msgstr ", 每月的 {0} " #: ExpressionDescriptor.py:303 #, python-brace-format msgid ", every {0} days" msgstr ", 每 {0} 天" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", between day {0} and {1} of the month" msgstr ", 在每月的 {0} 和 {1} 号之间" #: ExpressionDescriptor.py:304 #, python-brace-format msgid ", on day {0} of the month" msgstr ", 每月的 {0} 号" #: ExpressionDescriptor.py:316 #, python-brace-format msgid ", every {0} years" msgstr ", 每 {0} 年" #: ExpressionDescriptor.py:385 msgid " and " msgstr " 和 " #: ExpressionDescriptor.py:433 msgid ", every minute" msgstr ", 每分钟" #: ExpressionDescriptor.py:434 msgid ", every hour" msgstr ", 每小时" cron-descriptor-2.0.6/cron_descriptor/locale/zh_TW.mo000066400000000000000000000054721505606603100226740ustar00rootroot00000000000000/   &* Q ]jy "2Q k y +_BE Ijq     &4%;a'hP $: C O [i    ( 5 B *O z Q   "   & > U _ i p   "    and and {0} of the month, between day {0} and {1} of the month, every day, every hour, every minute, every {0} days, every {0} days of the week, every {0} months, every {0} years, on day {0} of the month, on the , on the last day of the month, on the last weekday of the month, on the last {0} of the month, on the {0} of the month, only in {0}, only in {0}, only on {0}, starting {0}, {0} days before the last day of the month, {0} through {1}An error occured when generating the expression description. Check the cron expression syntax.AtAt Every minute between {0} and {1}at {0}at {0} minutes past the hourat {0} seconds past the minutebetween {0} and {1}every hourevery minuteevery secondevery {0} hoursevery {0} minutesevery {0} secondsfifthfirstfirst weekdayfourthminutes {0} through {1} past the hoursecondseconds {0} through {1} past the minutethirdweekday nearest day {0}Project-Id-Version: 1.0 Report-Msgid-Bugs-To: adam.schubert@sg1-game.net POT-Creation-Date: 2025-08-25 19:23+0000 PO-Revision-Date: 2025-08-25 19:23+0000 Last-Translator: Adam Schubert Language-Team: Language: zh_TW MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 和 和 {0} 每月, 在每月的 {0} 和 {1} 號之間, 每天, 每小時, 每分鐘, 每 {0} 天, 每週的每 {0} 天, 每 {0} 月, 每 {0} 年, 每月的 {0} 號, 在 , 每月的最後一天, 每月的最後一個平日, 每月的最後一個 {0} , 每月的 {0} , 僅在 {0}, 僅在 {0}, 僅在 {0}, 開始 {0}, {0} 這個月的最後一天的前幾天, {0} 到 {1}產生正規表達式描述時發生了錯誤,請檢查 cron 表達式語法。在在 在 {0} 和 {1} 之間的每分鐘在 {0}在每小時的 {0} 分在每分鐘的 {0} 秒在 {0} 和 {1} 之間每小時每分鐘每秒每 {0} 小時每 {0} 分鐘每 {0} 秒第五個第一個第一個平日第四個在每小時的 {0} 到 {1} 分鐘第二個在每分鐘的 {0} 到 {1} 秒第三個最接近 {0} 號的平日cron-descriptor-2.0.6/cron_descriptor/locale/zh_TW.po000066400000000000000000000075171505606603100227010ustar00rootroot00000000000000# msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: adam.schubert@sg1-game.net\n" "POT-Creation-Date: 2025-08-25 19:23+0000\n" "PO-Revision-Date: 2025-08-25 19:23+0000\n" "Last-Translator: Adam Schubert \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #. EveryMinute msgid "every minute" msgstr "每分鐘" #. EveryHour msgid "every hour" msgstr "每小時" #. AnErrorOccurredWhenGeneratingTheExpressionD msgid "" "An error occured when generating the expression description. Check the cron" " expression syntax." msgstr "產生正規表達式描述時發生了錯誤,請檢查 cron 表達式語法。" #. AtSpace msgid "At " msgstr "在 " #. EveryMinuteBetweenX0AndX1 msgid "Every minute between {0} and {1}" msgstr "在 {0} 和 {1} 之間的每分鐘" #. At msgid "At" msgstr "在" #. SpaceAnd msgid " and" msgstr " 和" #. EverySecond msgid "every second" msgstr "每秒" #. EveryX0Seconds msgid "every {0} seconds" msgstr "每 {0} 秒" #. SecondsX0ThroughX1PastTheMinute msgid "seconds {0} through {1} past the minute" msgstr "在每分鐘的 {0} 到 {1} 秒" #. AtX0SecondsPastTheMinute msgid "at {0} seconds past the minute" msgstr "在每分鐘的 {0} 秒" #. EveryX0Minutes msgid "every {0} minutes" msgstr "每 {0} 分鐘" #. MinutesX0ThroughX1PastTheHour msgid "minutes {0} through {1} past the hour" msgstr "在每小時的 {0} 到 {1} 分鐘" #. AtX0MinutesPastTheHour msgid "at {0} minutes past the hour" msgstr "在每小時的 {0} 分" #. EveryX0Hours msgid "every {0} hours" msgstr "每 {0} 小時" #. BetweenX0AndX1 msgid "between {0} and {1}" msgstr "在 {0} 和 {1} 之間" #. AtX0 msgid "at {0}" msgstr "在 {0}" #. ComaEveryDay msgid ", every day" msgstr ", 每天" #. ComaEveryX0DaysOfTheWeek msgid ", every {0} days of the week" msgstr ", 每週的每 {0} 天" #. ComaX0ThroughX1 msgid ", {0} through {1}" msgstr ", {0} 到 {1}" #. First msgid "first" msgstr "第一個" #. Second msgid "second" msgstr "第二個" #. Third msgid "third" msgstr "第三個" #. Fourth msgid "fourth" msgstr "第四個" #. Fifth msgid "fifth" msgstr "第五個" #. ComaOnThe msgid ", on the " msgstr ", 在 " #. SpaceX0OfTheMonth msgid " {0} of the month" msgstr "{0} 每月" #. ComaOnTheLastX0OfTheMonth msgid ", on the last {0} of the month" msgstr ", 每月的最後一個 {0} " #. ComaOnlyOnX0 msgid ", only on {0}" msgstr ", 僅在 {0}" #. ComaEveryX0Months msgid ", every {0} months" msgstr ", 每 {0} 月" #. ComaOnlyInX0 msgid ", only in {0}" msgstr ", 僅在 {0}" #. ComaOnTheLastDayOfTheMonth msgid ", on the last day of the month" msgstr ", 每月的最後一天" #. ComaOnTheLastWeekdayOfTheMonth msgid ", on the last weekday of the month" msgstr ", 每月的最後一個平日" #. FirstWeekday msgid "first weekday" msgstr "第一個平日" #. WeekdayNearestDayX0 msgid "weekday nearest day {0}" msgstr "最接近 {0} 號的平日" #. ComaOnTheX0OfTheMonth msgid ", on the {0} of the month" msgstr ", 每月的 {0} " #. ComaEveryX0Days msgid ", every {0} days" msgstr ", 每 {0} 天" #. ComaBetweenDayX0AndX1OfTheMonth msgid ", between day {0} and {1} of the month" msgstr ", 在每月的 {0} 和 {1} 號之間" #. ComaOnDayX0OfTheMonth msgid ", on day {0} of the month" msgstr ", 每月的 {0} 號" #. SpaceAndSpace msgid " and " msgstr " 和 " #. ComaEveryMinute msgid ", every minute" msgstr ", 每分鐘" #. ComaEveryHour msgid ", every hour" msgstr ", 每小時" #. ComaEveryX0Years msgid ", every {0} years" msgstr ", 每 {0} 年" #. CommaStartingX0 msgid ", starting {0}" msgstr ", 開始 {0}" #. CommaDaysBeforeTheLastDayOfTheMonth msgid ", {0} days before the last day of the month" msgstr ", {0} 這個月的最後一天的前幾天" #. ComaOnlyInYearX0 msgid ", only in {0}" msgstr ", 僅在 {0}" cron-descriptor-2.0.6/examples/000077500000000000000000000000001505606603100164545ustar00rootroot00000000000000cron-descriptor-2.0.6/examples/crontabReader.py000066400000000000000000000055601505606603100216070ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from __future__ import annotations # /// script # requires-python = ">=3.11" # dependencies = [ # "cron-descriptor", # ] # /// import re from pathlib import Path try: from cron_descriptor import ExpressionDescriptor, Options except ImportError: print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") print('\033[1mFailed to import cron_descriptor, maybe ? "pip install cron-descriptor ?"\033[0m') print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") raise class CrontabReader: """Simple example reading /etc/contab""" rex = re.compile(r"^(\S{1,3}\s+\S{1,3}\s+\S{1,3}\s+\S{1,3}\s+\S{1,3}).+$") def __init__(self, cronfile: Path) -> None: """Initialize CrontabReader Args: cronfile: Path to cronfile Returns: None """ options = Options() options.day_of_week_start_index_zero = False options.use_24hour_time_format = True with cronfile.open("r", encoding="utf-8") as f: for line in f.readlines(): if parsed_line := self.parse_cron_line(line): print(f"{parsed_line} -> {ExpressionDescriptor(parsed_line, options)}") def parse_cron_line(self, line: str) -> str | None: """Parses crontab line and returns only starting time string Args: line: crontab line Returns: Time part of cron line or None """ if (stripped := line.strip()) and not stripped.startswith("#"): rexres = self.rex.search(stripped) if rexres: return " ".join(rexres.group(1).split()) return None if __name__ == "__main__": CrontabReader(Path("/etc/crontab")) cron-descriptor-2.0.6/pyproject.toml000066400000000000000000000052661505606603100175630ustar00rootroot00000000000000[build-system] requires = ["setuptools"] build-backend = 'setuptools.build_meta' [project] name = "cron_descriptor" license = "MIT" dynamic = ["version"] requires-python = ">= 3.9" description = "A Python library that converts cron expressions into human readable strings." classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Environment :: Console", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development", ] dependencies = [ "typing_extensions" ] [project.optional-dependencies] dev = [ "ruff", "mypy", "polib" ] test = ["pytest"] [project.readme] file = "README.md" content-type = "text/markdown" [[project.authors]] name = "Adam Schubert" email = "adam.schubert@sg1-game.net" [project.urls] Homepage = "https://github.com/Salamek/cron-descriptor" [tool.setuptools.dynamic] version = {attr = "cron_descriptor.__version__"} [tool.setuptools.packages.find] where = ["."] exclude = ["tests*", "examples*"] [tool.setuptools.package-data] "cron_descriptor" = ["locale/*.mo"] [tool.ruff] line-length = 200 target-version = "py39" [tool.ruff.lint] select = ["ALL"] ignore = ["N999", "D"] # Invalid module name GetText instead of get_text, comments [tool.ruff.lint.mccabe] max-complexity = 20 [tool.ruff.lint.pylint] allow-magic-value-types = ["int", "str"] max-args = 8 max-branches = 16 max-returns = 10 [tool.ruff.lint.per-file-ignores] "cron_descriptor/__main__.py" = ["T201"] # print in code "tests/*" = ["S101"] # Use of assert detected "tests/test_import.py" = ["PLC0415"] # Top level import "examples/crontabReader.py" = ["T201", "INP001"] # print in code, not a package "tools/resx2po.py" = ["S314", "INP001"] # xml parse untrusted and not a package "tools/compilepos.py" = ["INP001"] # xml parse untrusted and not a package "cron_descriptor/ExpressionValidator.py" = ["PLR0915", "PLR0912"] # too many statements/branches "cron_descriptor/Exception.py" = ["N818"] # Deprecated incorrect exception names [tool.mypy] files = ["cron_descriptor", "tests"] python_version = 3.9 ignore_missing_imports = true strict = true [tool.pytest.ini_options] # Tell pytest where to look for tests testpaths = [ "tests", ] # Pattern to match test files python_files = [ "test_*.py", ] cron-descriptor-2.0.6/setup.py000066400000000000000000000022611505606603100163510ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from setuptools import setup # Metadata will be read from pyproject.toml setup() cron-descriptor-2.0.6/stdeb.cfg000066400000000000000000000000521505606603100164150ustar00rootroot00000000000000[DEFAULT] Package: python-cron-descriptor cron-descriptor-2.0.6/tests/000077500000000000000000000000001505606603100160005ustar00rootroot00000000000000cron-descriptor-2.0.6/tests/__init__.py000066400000000000000000000022721505606603100201140ustar00rootroot00000000000000# Copyright (C) 2016 Adam Schubert # # 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. __author__ = "Adam Schubert " __date__ = "$2016-01-17 14:51:02$" cron-descriptor-2.0.6/tests/conftest.py000066400000000000000000000002071505606603100201760ustar00rootroot00000000000000import pytest from cron_descriptor import Options @pytest.fixture def options() -> Options: return Options(locale_code="en_US") cron-descriptor-2.0.6/tests/test_api.py000066400000000000000000000037571505606603100201760ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from cron_descriptor import DescriptionTypeEnum, ExpressionDescriptor, Options """ Testing that API of ExpressionDescriptor is working as specified in DOCs """ def test_full(options: Options) -> None: options.use_24hour_time_format = True ceh = ExpressionDescriptor("* * * * *", options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "Every minute" def test_default(options: Options) -> None: assert ExpressionDescriptor("* * * * *", options).get_description() == "Every minute" def test_to_str(options: Options) -> None: assert str(ExpressionDescriptor("* * * * *", options)) == "Every minute" def test_to_repr(options: Options) -> None: assert isinstance(ExpressionDescriptor("* * * * *", options), ExpressionDescriptor) def test_to_kargs(options: Options) -> None: assert str(ExpressionDescriptor("17 17 * * *", options, use_24hour_time_format=True)) == "At 17:17" cron-descriptor-2.0.6/tests/test_casing.py000066400000000000000000000036201505606603100206560ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from cron_descriptor import CasingTypeEnum, DescriptionTypeEnum, ExpressionDescriptor, Options """ Tests casing transformation """ def test_sentence_casing(options: Options) -> None: options.casing_type = CasingTypeEnum.Sentence ceh = ExpressionDescriptor("* * * * *", options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "Every minute" def test_title_casing(options: Options) -> None: options.casing_type = CasingTypeEnum.Title ceh = ExpressionDescriptor("* * * * *", options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "Every Minute" def test_lower_casing(options: Options) -> None: options.casing_type = CasingTypeEnum.LowerCase ceh = ExpressionDescriptor("* * * * *", options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "every minute" cron-descriptor-2.0.6/tests/test_exceptions.py000066400000000000000000000034321505606603100215740ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. import pytest from cron_descriptor import DescriptionTypeEnum, ExpressionDescriptor, FormatError, MissingFieldError, Options """ Tests that Exceptions are/not properly raised """ def test_empty_cron_expression_exception(options: Options) -> None: with pytest.raises(MissingFieldError): ExpressionDescriptor("", options) def test_invalid_cron_expression_exception(options: Options) -> None: with pytest.raises(FormatError): ExpressionDescriptor("INVALID", options) def test_invalid_syntax_exception(options: Options) -> None: ceh = ExpressionDescriptor("* $ * * *", options) with pytest.raises(FormatError): ceh.get_description(DescriptionTypeEnum.FULL) cron-descriptor-2.0.6/tests/test_formats.py000066400000000000000000000406041505606603100210700ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from cron_descriptor import Options, get_description """ Tests formatted cron expressions """ def test_every_minute(options: Options) -> None: assert get_description("* * * * *", options) == "Every minute" def test_every1_minute(options: Options) -> None: assert get_description("*/1 * * * *", options) == "Every minute" assert get_description("0 0/1 * * * ?", options) == "Every minute" def test_every_hour(options: Options) -> None: assert get_description("0 0 * * * ?", options) == "Every hour" assert get_description("0 0 0/1 * * ?", options) == "Every hour" def test_time_of_day_certain_days_of_week(options: Options) -> None: assert get_description("0 23 ? * MON-FRI", options) == "At 11:00 PM, Monday through Friday" def test_every_second(options: Options) -> None: assert get_description("* * * * * *", options) == "Every second" def test_every45_seconds(options: Options) -> None: assert get_description("*/45 * * * * *", options) == "Every 45 seconds" def test_every5_minutes(options: Options) -> None: assert get_description("*/5 * * * *", options) == "Every 5 minutes" assert get_description("0 0/10 * * * ?", options) == "Every 10 minutes" def test_every5_minutes_on_the_second(options: Options) -> None: assert get_description("0 */5 * * * *", options) == "Every 5 minutes" def test_weekdays_at_time(options: Options) -> None: assert get_description("30 11 * * 1-5", options) == "At 11:30 AM, Monday through Friday" def test_daily_at_time(options: Options) -> None: assert get_description("30 11 * * *", options) == "At 11:30 AM" def test_minute_span(options: Options) -> None: assert get_description("0-10 11 * * *", options) == "Every minute between 11:00 AM and 11:10 AM" def test_one_month_only(options: Options) -> None: assert get_description("* * * 3 *", options) == "Every minute, only in March" def test_two_months_only(options: Options) -> None: assert get_description("* * * 3,6 *", options) == "Every minute, only in March and June" def test_two_times_each_afternoon(options: Options) -> None: assert get_description("30 14,16 * * *", options) == "At 02:30 PM and 04:30 PM" def test_three_times_daily(options: Options) -> None: assert get_description("30 6,14,16 * * *", options) == "At 06:30 AM, 02:30 PM and 04:30 PM" def test_once_a_week(options: Options) -> None: assert get_description("46 9 * * 1", options) == "At 09:46 AM, only on Monday" def test_day_of_month(options: Options) -> None: assert get_description("23 12 15 * *", options) == "At 12:23 PM, on day 15 of the month" def test_month_name(options: Options) -> None: assert get_description("23 12 * JAN *", options) == "At 12:23 PM, only in January" def test_lowercase_month_name(options: Options) -> None: assert get_description("23 12 * jan *", options) == "At 12:23 PM, only in January" def test_day_of_month_with_question_mark(options: Options) -> None: assert get_description("23 12 ? JAN *", options) == "At 12:23 PM, only in January" def test_month_name_range2(options: Options) -> None: assert get_description("23 12 * JAN-FEB *", options) == "At 12:23 PM, January through February" def test_month_name_range3(options: Options) -> None: assert get_description("23 12 * JAN-MAR *", options) == "At 12:23 PM, January through March" def test_day_of_week_name(options: Options) -> None: assert get_description("23 12 * * SUN", options) == "At 12:23 PM, only on Sunday" def test_day_of_week_name_lowercase(options: Options) -> None: assert get_description("23 12 * * sun", options) == "At 12:23 PM, only on Sunday" def test_day_of_week_range(options: Options) -> None: assert get_description("*/5 15 * * MON-FRI", options) == "Every 5 minutes, between 03:00 PM and 03:59 PM, Monday through Friday" def test_day_of_week_range_lowercase(options: Options) -> None: assert get_description("*/5 15 * * MoN-fri", options) == "Every 5 minutes, between 03:00 PM and 03:59 PM, Monday through Friday" def test_day_of_week_once_in_month(options: Options) -> None: assert get_description("* * * * MON#3", options) == "Every minute, on the third Monday of the month" def test_last_day_of_the_week_of_the_month(options: Options) -> None: assert get_description("* * * * 4L", options) == "Every minute, on the last Thursday of the month" def test_last_day_of_the_month(options: Options) -> None: assert get_description( "*/5 * L JAN *", options, ) == "Every 5 minutes, on the last day of the month, only in January" def test_last_day_offset(options: Options) -> None: assert get_description( "0 0 0 L-5 * ?", options, ) == "At 12:00 AM, 5 days before the last day of the month" def test_last_weekday_of_the_month(options: Options) -> None: assert get_description("* * LW * *", options) == "Every minute, on the last weekday of the month" def test_last_weekday_of_the_month2(options: Options) -> None: assert get_description("* * WL * *", options) == "Every minute, on the last weekday of the month" def test_first_weekday_of_the_month(options: Options) -> None: assert get_description("* * 1W * *", options) == "Every minute, on the first weekday of the month" def test_thirteenth_weekday_of_the_month(options: Options) -> None: assert get_description("* * 13W * *", options) == "Every minute, on the weekday nearest day 13 of the month" def test_first_weekday_of_the_month2(options: Options) -> None: assert get_description("* * W1 * *", options) == "Every minute, on the first weekday of the month" def test_particular_weekday_of_the_month(options: Options) -> None: assert get_description("* * 5W * *", options) == "Every minute, on the weekday nearest day 5 of the month" def test_particular_weekday_of_the_month2(options: Options) -> None: assert get_description("* * W5 * *", options) == "Every minute, on the weekday nearest day 5 of the month" def test_time_of_day_with_seconds(options: Options) -> None: assert get_description("30 02 14 * * *", options) == "At 02:02:30 PM" def test_second_intervals(options: Options) -> None: assert get_description("5-10 * * * * *", options) == "Seconds 5 through 10 past the minute" def test_multi_part_second(options: Options) -> None: assert get_description("15,45 * * * * *", options) == "At 15 and 45 seconds past the minute" def test_second_minutes_hours_intervals(options: Options) -> None: assert get_description("5-10 30-35 10-12 * * *", options) == ( "Seconds 5 through 10 past the minute, " "minutes 30 through 35 past the hour, " "between 10:00 AM and 12:59 PM") def test_every5_minutes_at30_seconds(options: Options) -> None: assert get_description("30 */5 * * * *", options) == "At 30 seconds past the minute, every 5 minutes" def test_minutes_past_the_hour_range(options: Options) -> None: assert get_description("0 30 10-13 ? * WED,FRI", options) == ( "At 30 minutes past the hour, " "between 10:00 AM and 01:59 PM, " "only on Wednesday and Friday") def test_seconds_past_the_minute_interval(options: Options) -> None: assert get_description("10 0/5 * * * ?", options) == "At 10 seconds past the minute, every 5 minutes" def test_between_with_interval(options: Options) -> None: assert get_description("2-59/3 1,9,22 11-26 1-6 ?", options) == ("Every 3 minutes, minutes 2 through 59 past the hour, " "at 01:00 AM, 09:00 AM, and 10:00 PM, between day 11 and 26 of the month, " "January through June") def test_recurring_first_of_month(options: Options) -> None: assert get_description("0 0 6 1/1 * ?", options) == "At 06:00 AM" def test_minutes_past_the_hour(options: Options) -> None: assert get_description("0 5 0/1 * * ?", options) == "At 5 minutes past the hour" def test_one_year_only_with_seconds(options: Options) -> None: assert get_description("* * * * * * 2013", options) == "Every second, only in 2013" def test_one_year_only_without_seconds(options: Options) -> None: assert get_description("* * * * * 2013", options) == "Every minute, only in 2013" def test_two_years_only(options: Options) -> None: assert get_description("* * * * * 2013,2014", options) == "Every minute, only in 2013 and 2014" def test_year_range2(options: Options) -> None: assert get_description( "23 12 * JAN-FEB * 2013-2014", options, ) == "At 12:23 PM, January through February, 2013 through 2014" def test_year_range3(options: Options) -> None: assert get_description( "23 12 * JAN-MAR * 2013-2015", options, ) == "At 12:23 PM, January through March, 2013 through 2015" def test_hour_range(options: Options) -> None: assert get_description("0 0/30 8-9 5,20 * ?", options) == ("Every 30 minutes, between 08:00 AM and 09:59 AM, " "on day 5 and 20 of the month") def test_day_of_week_modifier(options: Options) -> None: assert get_description("23 12 * * SUN#2", options) == "At 12:23 PM, on the second Sunday of the month" def test_day_of_week_modifier_with_sunday_start_one(options: Options) -> None: options.day_of_week_start_index_zero = False assert get_description("23 12 * * 1#2", options) == "At 12:23 PM, on the second Sunday of the month" def test_hour_range_with_every_portion(options: Options) -> None: assert get_description("0 25 7-19/8 ? * *", options) == ( "At 25 minutes past the hour, every 8 hours, " "between 07:00 AM and 07:59 PM") def test_hour_range_with_trailing_zero_with_every_portion(options: Options) -> None: assert get_description("0 25 7-20/13 ? * *", options) == ( "At 25 minutes past the hour, every 13 hours, " "between 07:00 AM and 08:59 PM") def test_every3_day(options: Options) -> None: assert get_description("0 0 8 1/3 * ? *", options) == "At 08:00 AM, every 3 days" def tests_every3_day_of_the_week(options: Options) -> None: assert get_description("0 15 10 ? * */3", options) == "At 10:15 AM, every 3 days of the week" def test_every_7_day_of_the_week(options: Options) -> None: assert get_description("0 * * * */7", options) == "Every hour, every 7 days of the week" def test_every_2_day_of_the_week_in_range(options: Options) -> None: assert get_description("* * * ? * 1-5/2", options) == "Every second, every 2 days of the week, Monday through Friday" def test_every_2_day_of_the_week_in_range_with_sunday_start_one(options: Options) -> None: options.day_of_week_start_index_zero = False assert get_description("* * * ? * 2-6/2", options) == "Every second, every 2 days of the week, Monday through Friday" def test_multi_with_day_of_week_start_index_zero_false(options: Options) -> None: options.day_of_week_start_index_zero = False assert get_description("* * * ? * 1,2,3", options) == "Every second, only on Sunday, Monday, and Tuesday" def test_every3_month(options: Options) -> None: assert get_description("0 5 7 2 1/3 ? *", options) == "At 07:05 AM, on day 2 of the month, every 3 months" def test_every2_years(options: Options) -> None: assert get_description( "0 15 6 1 1 ? 1/2", options, ) == "At 06:15 AM, on day 1 of the month, only in January, every 2 years" def test_multi_part_range_minutes(options: Options) -> None: assert get_description("2,4-5 1 * * *", options) == "At 2 and 4 through 5 minutes past the hour, at 01:00 AM" def test_multi_part_range_minutes_2(options: Options) -> None: assert get_description( "2,26-28 18 * * *", options, ) == "At 2 and 26 through 28 minutes past the hour, at 06:00 PM" def test_trailing_space_does_not_cause_a_wrong_description(options: Options) -> None: assert get_description("0 7 * * * ", options) == "At 07:00 AM" def test_multi_part_day_of_the_week(options: Options) -> None: assert get_description("0 00 10 ? * MON-THU,SUN *", options) == "At 10:00 AM, only on Monday through Thursday and Sunday" def test_day_of_week_with_day_of_month(options: Options) -> None: assert get_description("0 0 0 1,2,3 * WED,FRI", options) == "At 12:00 AM, on day 1, 2, and 3 of the month, only on Wednesday and Friday" def test_seconds_interval_with_step_value(options: Options) -> None: assert get_description("5/30 * * * * ?", options) == "Every 30 seconds, starting at 5 seconds past the minute" def test_minutes_interval_with_step_value(options: Options) -> None: assert get_description("0 5/30 * * * ?", options) == "Every 30 minutes, starting at 5 minutes past the hour" def test_hours_interval_with_step_value(options: Options) -> None: assert get_description("* * 5/8 * * ?", options) == "Every second, every 8 hours, starting at 05:00 AM" def test_day_of_month_interval_with_step_value(options: Options) -> None: assert get_description("0 5 7 2/3 * ? *", options) == "At 07:05 AM, every 3 days, starting on day 2 of the month" def test_month_interval_with_step_value(options: Options) -> None: assert get_description("0 5 7 ? 3/2 ? *", options) == "At 07:05 AM, every 2 months, March through December" def test_day_of_week_interval_with_step_value(options: Options) -> None: assert get_description("0 5 7 ? * 2/3 *", options) == "At 07:05 AM, every 3 days of the week, Tuesday through Saturday" def test_year_interval_with_step_value(options: Options) -> None: assert get_description("0 5 7 ? * ? 2016/4", options) == "At 07:05 AM, every 4 years, 2016 through 9999" def test_minutes_combined_with_multiple_hour_ranges(options: Options) -> None: assert get_description("1 1,3-4 * * *", options) == "At 1 minutes past the hour, at 01:00 AM and 03:00 AM through 04:59 AM" def test_minute_range_conbined_with_second_range(options: Options) -> None: assert get_description("12-50 0-10 6 * * * 2022", options) == "Seconds 12 through 50 past the minute, minutes 0 through 10 past the hour, at 06:00 AM, only in 2022" def test_seconds_expression_combined_with_hours_list_and_single_minute(options: Options) -> None: assert get_description("5 30 6,14,16 5 * *", options) == "At 5 seconds past the minute, at 30 minutes past the hour, at 06:00 AM, 02:00 PM, and 04:00 PM, on day 5 of the month" def test_minute_range_with_interval(options: Options) -> None: assert get_description("0-20/3 9 * * *", options) == "Every 3 minutes, minutes 0 through 20 past the hour, between 09:00 AM and 09:59 AM" def minutes_zero_1(options: Options) -> None: assert get_description("* 0 */4 * * *", options) == "Every second, at 0 minutes past the hour, every 4 hours" def minutes_zero_2(options: Options) -> None: assert get_description("*/10 0 * * * *", options) == "Every 10 seconds, at 0 minutes past the hour" def minutes_zero_3(options: Options) -> None: assert get_description("* 0 0 * * *", options) == "Every second, at 0 minutes past the hour, between 12:00 AM and 12:59 AM" def minutes_zero_4(options: Options) -> None: assert get_description("* 0 * * *", options) == "Every minute, between 12:00 AM and 12:59 AM" def minutes_zero_5(options: Options) -> None: assert get_description("* 0 * * * *",options) == "Every second, at 0 minutes past the hour" def sunday_7(options: Options) -> None: assert get_description("0 0 9 ? * 7", options) == "At 09:00 AM, only on Sunday" def every_year(options: Options) -> None: assert get_description("0/10 * ? * MON-FRI *", options) == "Every 10 minutes, Monday through Friday" def tuesday_9(options: Options) -> None: assert get_description("0 9 * * 2", options) == "At 09:00 AM, only on Tuesday" cron-descriptor-2.0.6/tests/test_import.py000066400000000000000000000036751505606603100207360ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from cron_descriptor.Options import Options def test_inline_import(options: Options) -> None: from cron_descriptor import DescriptionTypeEnum, ExpressionDescriptor, Options new_options = Options( locale_code=options.locale_code, use_24hour_time_format=True, ) ceh = ExpressionDescriptor("* * * * *", new_options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "Every minute" def test_full_import(options: Options) -> None: from cron_descriptor.DescriptionTypeEnum import DescriptionTypeEnum from cron_descriptor.ExpressionDescriptor import ExpressionDescriptor new_options = Options( locale_code=options.locale_code, use_24hour_time_format=True, ) ceh = ExpressionDescriptor("* * * * *", new_options) assert ceh.get_description(DescriptionTypeEnum.FULL) == "Every minute" cron-descriptor-2.0.6/tests/test_locale.py000066400000000000000000000042451505606603100206550ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. import logging import shutil import tempfile from pathlib import Path from unittest.mock import patch from cron_descriptor import ExpressionDescriptor, Options def test_locale_de() -> None: options = Options(locale_code="de_DE") assert ExpressionDescriptor("* * * * *", options).get_description() == "Jede Minute" def test_locale_de_custom_location() -> None: logger = logging.getLogger("cron_descriptor.GetText") with patch.object(logger, "debug") as mock_logger: # Copy existing .mo file to temp directory: temp_dir = Path(tempfile.gettempdir()) temp_path = temp_dir.joinpath( "de_DE.mo") source_path_file = Path(__file__).resolve().parent.joinpath("../cron_descriptor/locale/de_DE.mo") shutil.copyfile(source_path_file.absolute(), temp_path) options = Options( locale_code="de_DE", locale_location=str(temp_dir.absolute()), ) assert ExpressionDescriptor("* * * * *", options).get_description() == "Jede Minute" mock_logger.assert_called_once_with("%s Loaded", temp_path) cron-descriptor-2.0.6/tests/test_validator.py000066400000000000000000000034201505606603100213750ustar00rootroot00000000000000 from cron_descriptor.ExpressionValidator import ExpressionValidator """ Tests validator """ valid = [ "57,59 * * 1 * 1", "1,2,3-15 * * 1 * 1", "1-2,2,3-15 * * 1 * 1", "* 1,59 * 1 * 1", "* 1,2,3-15 * 1 * 1", "* 1-2,2,3-15 * 1 * 1", "* * 1 ? * *", "* 1-12 ? * *", "* 1/12 ? * *", "* 1-5/12 ? * *", "* 1,23 ? * *", "* 1,2,7-23 ? * *", "* 1-2,2,7-23 ? * *", "* * ? * *", "* * 1 * *", "* * 31 * *", "* * 1-2/31 * *", "* * 1,20 * *", "* * LW * *", "* * 1W * *", "* * 31W * *", "* * ? 1 *", "* * ? 12 *", "* * ? JAN *", "* * ? 1-12 *", "* * ? JAN-DEC *", "* * ? 1/12 *", "* * ? 1-5/12 *", "* * ? 1,2,3 *", "* * ? 1,Feb,3 *", "* * ? 1,5,6-12 *", "* * ? 1-2,5,6-12 *", "* * ? JAN-FEB,5,6-12 *", "* * ? * 0", "* * ? * 6", "* * ? * SUN", "* * ? * 0/6", "* * ? * 0-1/6", "* * ? * 0-1", "* * ? * MON-wed", "* * ? * MON-wed,sun,4", "* * ? * MON,3", "* * ? * 2L", "* * ? * 6L", "* * ? * 0#3", "* * ? * * 1970", "* * ? * * 2099", "* * ? * * 1970-2099", "* * ? * * 1970/129", "* * * ? * * 1970-2001/129", "* * * ? * * 1970,1971,2099", "* * * ? * * 1970-1971,1972,2000-2002", "* * * * * 2013", ] invalid = [ "0-59 * * 1 * 1", # invalid DOW range "1-2/59 * * 1 * 1", # invalid step "* * /31 * *", # stray slash "* * l-31 * *", # lowercase 'l' "* * lw * *", # lowercase 'lw' "* * ? * /6", # stray slash "* * ? * * /129", # stray slash "* /12 ? * *", # stray slash "* * W21 * * 0/2", # W before number ] def test_validator_expression() -> None: for expression in valid: ExpressionValidator().validate(expression) cron-descriptor-2.0.6/tests/test_verbosity.py000066400000000000000000000032751505606603100214460ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. from cron_descriptor import Options, get_description """ Tests verbosity """ def test_simple_expression(options: Options) -> None: options.verbose = True assert get_description("30 4 1 * *", options) == "At 04:30 AM, on day 1 of the month" def test_every_minute_simple_expression(options: Options) -> None: options.verbose = True assert get_description("* * * * *", options) == "Every minute, every hour, every day" def test_single_day_of_the_week(options: Options) -> None: options.verbose = True assert get_description("0 9 * * 2", options) == "At 09:00 AM, only on Tuesday" cron-descriptor-2.0.6/tools/000077500000000000000000000000001505606603100157765ustar00rootroot00000000000000cron-descriptor-2.0.6/tools/compilepos.py000066400000000000000000000005161505606603100205240ustar00rootroot00000000000000import logging import pathlib import polib log = logging.getLogger(__name__) base_dir = pathlib.Path("../cron_descriptor/locale") for po_file in base_dir.rglob("*.po"): mo_file = po_file.with_suffix(".mo") log.info("Compiling %s → %s", po_file, mo_file) po = polib.pofile(po_file) po.save_as_mofile(str(mo_file)) cron-descriptor-2.0.6/tools/resx2po.py000066400000000000000000000115251505606603100177560ustar00rootroot00000000000000# The MIT License (MIT) # # Copyright (c) 2016 Adam Schubert # # 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. import datetime import xml.etree.ElementTree as ET from logging import getLogger from pathlib import Path import polib log = getLogger(__name__) class Resx2Po: def __init__(self, en_resx: Path, translation_resx: Path, code: str, output_po: Path) -> None: if not en_resx.is_file(): msg = f"EN Resx {en_resx.absolute()} not found" raise FileNotFoundError(msg) if not translation_resx.is_file(): msg = f"Translation {code} {translation_resx.absolute()} Resx bound not found" raise FileNotFoundError(msg) self.en_resx = self.resx2dict(en_resx) self.translation_resx = self.resx2dict(translation_resx) self.code = code self.output_po = output_po self.generate() def resx2dict(self, resx: Path) -> dict[str, str]: tree = ET.parse(resx) root = tree.getroot() translation_table = {} for first in root.findall("./data"): found_value = first.find("./value") if found_value is not None and found_value.text: translation_table[first.attrib["name"]] = found_value.text return translation_table def generate(self) -> None: po = polib.POFile() now = datetime.datetime.now(datetime.timezone.utc) po.metadata = { "Project-Id-Version": "1.0", "Report-Msgid-Bugs-To": "adam.schubert@sg1-game.net", "POT-Creation-Date": now.strftime("%Y-%m-%d %H:%M%z"), "PO-Revision-Date": now.strftime("%Y-%m-%d %H:%M%z"), "Last-Translator": "Adam Schubert ", "Language-Team": "", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=utf-8", "Content-Transfer-Encoding": "8bit", "Language": self.code, } for message_en_id, message_en in self.en_resx.items(): if message_en_id in self.translation_resx: entry = polib.POEntry( msgid=message_en, msgstr=self.translation_resx[message_en_id], comment=message_en_id, ) po.append(entry) else: log.warning("%s not found in %s resx", message_en_id, self.code) po.save(str(self.output_po.absolute())) code_list = { "cs": "cs_CZ", # Czech "da": "da_DK", # Danish "de": "de_DE", # German "el": "el_GR", # Greek "es": "es_ES", # Spanish (Spain) "es-MX": "es_MX", # Spanish (Mexico) "fa": "fa_IR", # Persian (Iran) "fi": "fi_FI", # Finnish "fr": "fr_FR", # French (France) "he-IL": "he_IL", # Hebrew (Israel) "hu": "hu_HU", # Hungarian "it": "it_IT", # Italian "ja": "ja_JP", # Japanese "kk": "kk_KZ", # Kazakh "ko": "ko_KR", # Korean "nb": "nb_NO", # Norwegian Bokmål "nl": "nl_NL", # Dutch (Netherlands) "pl": "pl_PL", # Polish "pt": "pt_PT", # Portuguese (Portugal) "ro": "ro_RO", # Romanian "ru": "ru_RU", # Russian "sl": "sl_SI", # Slovenian "sv": "sv_SE", # Swedish "tr": "tr_TR", # Turkish "uk": "uk_UA", # Ukrainian "vi": "vi_VN", # Vietnamese "zh-Hans": "zh_CN", # Simplified Chinese (China) "zh-Hant": "zh_TW", # Traditional Chinese (Taiwan) } output_dir = Path("./locale") input_dir = Path("./source") for from_code, to_code in code_list.items(): output_file = output_dir.joinpath(f"{to_code}.po") Resx2Po( input_dir.joinpath("Resources.resx"), input_dir.joinpath(f"Resources.{from_code}.resx"), to_code, output_file, )