pax_global_header00006660000000000000000000000064146624211470014521gustar00rootroot0000000000000052 comment=a79706e867c52bfe0c039195926eeab8e5faf0e7 cron-descriptor-1.4.5/000077500000000000000000000000001466242114700146455ustar00rootroot00000000000000cron-descriptor-1.4.5/.github/000077500000000000000000000000001466242114700162055ustar00rootroot00000000000000cron-descriptor-1.4.5/.github/workflows/000077500000000000000000000000001466242114700202425ustar00rootroot00000000000000cron-descriptor-1.4.5/.github/workflows/python-test.yml000066400000000000000000000011331466242114700232610ustar00rootroot00000000000000name: Python tests on: - push - pull_request jobs: build: runs-on: ubuntu-24.04 strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - 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 setuptools ruff - name: Test run: python setup.py test cron-descriptor-1.4.5/.gitignore000066400000000000000000000021661466242114700166420ustar00rootroot00000000000000### 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-1.4.5/.gitlab-ci.yml000066400000000000000000000053211466242114700173020ustar00rootroot00000000000000stages: - test - package - packagetest - deploy test:debian: stage: test script: - apt-get update -qy - apt-get install python3-setuptools ca-certificates python3-pip python3-mock -qy - python3 setup.py test tags: - debian test:archlinux: stage: test script: - pacman -Syu python-setuptools python-pip --noconfirm - python setup.py test tags: - archlinux package:debian: stage: package script: - apt-get update -qy - apt-get install -y python3-stdeb dh-python - 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 --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-get update -qy - cd deb_dist - apt install ./*.deb -qy 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-get update -y && apt-get install openssh-client -y )' - apt-get update -y - apt-get install twine python3-setuptools python3-wheel -y - 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 setup.py sdist bdist_wheel - twine upload dist/* dependencies: - package:archlinux - package:debian tags: - debian only: - tags cron-descriptor-1.4.5/.version.yml000066400000000000000000000010371466242114700171340ustar00rootroot00000000000000GIT: 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+)\' 'setup.py': version\s*=\s*\"(?P\d+)\.(?P\d+)\.(?P\d+)\" 'PKGBUILD': pkgver\s*=\s*(?P.*) VERSION_FILES: 'cron_descriptor/__init__.py': 'python' 'setup.py': 'setup.py' 'archlinux/PKGBUILD': 'PKGBUILD'cron-descriptor-1.4.5/LICENSE000066400000000000000000000020701466242114700156510ustar00rootroot00000000000000The 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-1.4.5/MANIFEST.in000066400000000000000000000000751466242114700164050ustar00rootroot00000000000000include LICENSE include README.md recursive-include locale * cron-descriptor-1.4.5/PKGBUILD000066400000000000000000000013731466242114700157750ustar00rootroot00000000000000pkgbase=python-cron-descriptor pkgname=('python-cron-descriptor' 'python2-cron-descriptor') projname=cron-descriptor pkgver=1.2.9 pkgrel=1 pkgdesc="A Python library that converts cron expressions into human readable strings." arch=('any') license=('MIT') url='https://github.com/Salamek/cron-descriptor' source=("${pkgbase}-${pkgver}.tar.gz::https://github.com/Salamek/${projname}/archive/$pkgver.tar.gz") md5sums=('74260e2519e76331950b742700cf9821') package_python-cron-descriptor() { depends=('python') cd "${srcdir}/${projname}-${pkgver}" python3 setup.py install --root=$pkgdir/ --optimize=1 } package_python2-cron-descriptor() { depends=('python2') cd "${srcdir}/${projname}-${pkgver}" python2 setup.py install --root=$pkgdir/ --optimize=1 } cron-descriptor-1.4.5/README.md000066400000000000000000000112131466242114700161220ustar00rootroot00000000000000# 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 17 languages * Supports Python 3.8 - 3.12 ## 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("{}".format(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)| |Brazilian |pt_PT|[Renato Lima](https://github.com/natenho)| |Chinese Simplified | zh_CN |[Star Peng](https://github.com/starpeng)| |Spanish |es_ES|[Ivan Santos](https://github.com/ivansg)| |Norwegian |nb_NO|[Siarhei Khalipski](https://github.com/KhalipskiSiarhei)| |Turkish |tr_TR|[Mustafa SADEDİL](https://github.com/sadedil)| |Dutch |nl_NL|[TotalMace](https://github.com/TotalMace)| |Russian |ru_RU|[LbISS](https://github.com/LbISS)| |French |fr_FR|[Arnaud TAMAILLON](https://github.com/Greybird)| |German |de_DE|[Michael Schuler](https://github.com/mschuler)| |Ukrainian |uk_UA|[Taras](https://github.com/tbudurovych)| |Italian |it_IT|[rinaldihno](https://github.com/rinaldihno)| |Czech |cs_CZ|[Adam Schubert](https://github.com/salamek)| |Swedish |sv_SE|[Åke Engelbrektson](https://github.com/eson57)| |Tamil |ta_IN|[Sankar Hari](https://github.com/sankarhari)| |Persian|fa_IR|[M. Yas. Davoodeh](https://github.com/Davoodeh)| |Korean|ko_KR|[KyuJoo Han](https://github.com/hanqyu)| |Japanese |ja_JP|[Tho Nguyen](https://github.com/tho-asterist)| ## 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 ../../pre-commit.sh .git/hooks/pre-commit ``` Then install dev requirements: ```bash pip install ruff ``` cron-descriptor-1.4.5/archlinux/000077500000000000000000000000001466242114700166425ustar00rootroot00000000000000cron-descriptor-1.4.5/archlinux/PKGBUILD000066400000000000000000000012261466242114700177670ustar00rootroot00000000000000pkgname=python-cron-descriptor pkgver=1.4.5 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-setuptools') depends=( 'python' ) prepare() { mkdir -p "${srcdir}/${pkgname}" cp -R "${srcdir}/../../cron_descriptor" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../tests" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../setup.py" "${srcdir}/${pkgname}" cp -R "${srcdir}/../../README.md" "${srcdir}/${pkgname}" } package() { cd "${srcdir}/${pkgname}" python setup.py install --root="$pkgdir/" --optimize=1 }cron-descriptor-1.4.5/code-check.sh000077500000000000000000000000231466242114700171640ustar00rootroot00000000000000#!/bin/bash ruff . cron-descriptor-1.4.5/cron_descriptor/000077500000000000000000000000001466242114700200445ustar00rootroot00000000000000cron-descriptor-1.4.5/cron_descriptor/CasingTypeEnum.py000066400000000000000000000023741466242114700233170ustar00rootroot00000000000000# 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 """ class CasingTypeEnum(object): Title = 1 Sentence = 2 LowerCase = 3 cron-descriptor-1.4.5/cron_descriptor/DescriptionTypeEnum.py000066400000000000000000000025321466242114700243720ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/Exception.py000066400000000000000000000032721466242114700223600ustar00rootroot00000000000000# 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): """ Exception for cases when something is missing """ def __init__(self, message): """Initialize MissingFieldException Args: message: Message of exception """ super(MissingFieldException, self).__init__( "Field '{}' not found.".format(message)) class FormatException(Exception): """ Exception for cases when something has wrong format """ pass class WrongArgumentException(Exception): """ Exception for cases when wrong argument is passed """ pass cron-descriptor-1.4.5/cron_descriptor/ExpressionDescriptor.py000066400000000000000000000607421466242114700246250ustar00rootroot00000000000000# 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 import datetime import calendar from .GetText import GetText from .CasingTypeEnum import CasingTypeEnum from .DescriptionTypeEnum import DescriptionTypeEnum from .ExpressionParser import ExpressionParser from .Options import Options from .StringBuilder import StringBuilder from .Exception import FormatException, WrongArgumentException class ExpressionDescriptor: """ Converts a Cron Expression into a human readable string """ _special_characters = ['/', '-', ',', '*'] _expression = '' _options = None _expression_parts = [] def __init__(self, expression, options=None, **kwargs): """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 in kwargs: if hasattr(self._options, kwarg): setattr(self._options, kwarg, kwargs[kwarg]) else: raise WrongArgumentException("Unknown {} configuration argument".format(kwarg)) # 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 _(self, message): return self.get_text.trans.gettext(message) def get_description(self, description_type=DescriptionTypeEnum.FULL): """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): """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 = "{0}{1}{2}{3}{4}".format( time_segment, day_of_month_desc, day_of_week_desc, month_desc, year_desc) description = self.transform_verbosity(description, self._options.verbose) description = ExpressionDescriptor.transform_case(description, self._options.casing_type) except Exception: description = self._( "An error occurred when generating the expression description. Check the cron expression syntax." ) raise FormatException(description) return description def get_time_of_day_description(self): """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._("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._("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._("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._(" 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): """Generates a description for only the SECONDS portion of the expression Returns: The SECONDS description """ def get_description_format(s): if s == "0": return "" try: if int(s) < 20: return self._("at {0} seconds past the minute") else: return self._("at {0} seconds past the minute [grThen20]") or self._("at {0} seconds past the minute") except ValueError: return self._("at {0} seconds past the minute") return self.get_segment_description( self._expression_parts[0], self._("every second"), lambda s: s, lambda s: self._("every {0} seconds").format(s), lambda s: self._("seconds {0} through {1} past the minute"), get_description_format, lambda s: self._(", second {0} through second {1}") or self._(", {0} through {1}") ) def get_minutes_description(self): """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): if s == "0" and seconds_expression == "": return "" try: if int(s) < 20: return self._("at {0} minutes past the hour") else: return self._("at {0} minutes past the hour [grThen20]") or self._("at {0} minutes past the hour") except ValueError: return self._("at {0} minutes past the hour") return self.get_segment_description( self._expression_parts[1], self._("every minute"), lambda s: s, lambda s: self._("every {0} minutes").format(s), lambda s: self._("minutes {0} through {1} past the hour"), get_description_format, lambda s: self._(", minute {0} through minute {1}") or self._(", {0} through {1}") ) def get_hours_description(self): """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._("every hour"), lambda s: self.format_time(s, "0"), lambda s: self._("every {0} hours").format(s), lambda s: self._("between {0} and {1}"), lambda s: self._("at {0}"), lambda s: self._(", hour {0} through hour {1}") or self._(", {0} through {1}") ) def get_day_of_week_description(self): """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): 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): 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._("first"), 2: self._("second"), 3: self._("third"), 4: self._("fourth"), 5: self._("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._(", on the "), day_of_week_of_month_description, self._(" {0} of the month")) elif "L" in s: formatted = self._(", on the last {0} of the month") else: formatted = self._(", only on {0}") return formatted return self.get_segment_description( self._expression_parts[5], self._(", every day"), lambda s: get_day_name(s), lambda s: self._(", every {0} days of the week").format(s), lambda s: self._(", {0} through {1}"), lambda s: get_format(s), lambda s: self._(", {0} through {1}") ) def get_month_description(self): """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.date.today().year, int(s), 1).strftime("%B"), lambda s: self._(", every {0} months").format(s), lambda s: self._(", month {0} through month {1}") or self._(", {0} through {1}"), lambda s: self._(", only in {0}"), lambda s: self._(", month {0} through month {1}") or self._(", {0} through {1}") ) def get_day_of_month_description(self): """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._(", on the last day of the month") elif expression == "LW" or expression == "WL": description = self._(", 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._("first weekday") if day_number == 1 else self._("weekday nearest day {0}").format(day_number) description = self._(", on the {0} of the month").format(day_string) 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._(", {0} days before the last day of the month").format(off_set_days) else: description = self.get_segment_description( expression, self._(", every day"), lambda s: s, lambda s: self._(", every day") if s == "1" else self._(", every {0} days"), lambda s: self._(", between day {0} and {1} of the month"), lambda s: self._(", on day {0} of the month"), lambda s: self._(", {0} through {1}") ) return description def get_year_description(self): """Generates a description for only the YEAR portion of the expression Returns: The YEAR description """ def format_year(s): regex = re.compile(r"^\d+$") if regex.match(s): year_int = int(s) if year_int < 1900: return year_int return datetime.date(year_int, 1, 1).strftime("%Y") else: return s return self.get_segment_description( self._expression_parts[6], '', lambda s: format_year(s), lambda s: self._(", every {0} years").format(s), lambda s: self._(", year {0} through year {1}") or self._(", {0} through {1}"), lambda s: self._(", only in {0}"), lambda s: self._(", year {0} through year {1}") or self._(", {0} through {1}") ) def get_segment_description( self, expression, all_description, get_single_item_description, get_interval_description_format, get_between_description_format, get_description_format, get_range_format ): """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 """ description = None if expression is None or expression == '': description = '' elif expression == "*": description = all_description elif any(ext in expression for ext in ['/', '-', ',']) is False: description = get_description_format(expression).format(get_single_item_description(expression)) elif "/" in expression: segments = expression.split('/') description = get_interval_description_format(segments[1]).format(get_single_item_description(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 any(ext in segments[0] for ext in ['*', ',']) is False: range_item_description = get_description_format(segments[0]).format( get_single_item_description(segments[0]) ) range_item_description = range_item_description.replace(", ", "") description += self._(", starting {0}").format(range_item_description) elif "," 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._(" 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) description = get_description_format(expression).format(description_content) elif "-" in expression: description = self.generate_between_segment_description( expression, get_between_description_format, get_single_item_description ) return description def generate_between_segment_description( self, between_expression, get_between_description_format, get_single_item_description ): """ 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, minute_expression, second_expression='' ): """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._("PM") if (hour >= 12) else self._("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 "{0}:{1}{2}{3}".format(str(hour).zfill(2), minute.zfill(2), second, period) def transform_verbosity(self, description, use_verbose_format): """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 use_verbose_format is False: description = description.replace(self._(", every minute"), '') description = description.replace(self._(", every hour"), '') description = description.replace(self._(", every day"), '') description = re.sub(r', ?$', '', description) return description @staticmethod def transform_case(description, case_type): """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 = "{}{}".format( 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): """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: raise IndexError("Day {} is out of range!".format(day_number)) def __str__(self): return self.get_description() def __repr__(self): return self.get_description() def get_description(expression, options=None): """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-1.4.5/cron_descriptor/ExpressionParser.py000066400000000000000000000223631466242114700237400ustar00rootroot00000000000000# 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 .Exception import MissingFieldException, FormatException class ExpressionParser(object): _expression = '' _options = None _cron_days = { 0: 'SUN', 1: 'MON', 2: 'TUE', 3: 'WED', 4: 'THU', 5: 'FRI', 6: 'SAT' } _cron_months = { 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, options): """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): """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 self._expression is None or len(self._expression) == 0: raise MissingFieldException("ExpressionDescriptor.expression") else: expression_parts_temp = self._expression.split() expression_parts_temp_length = len(expression_parts_temp) if expression_parts_temp_length < 5: raise FormatException( "Error: Expression only has {0} parts. At least 5 part are required.".format( expression_parts_temp_length ) ) elif 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: raise FormatException( "Error: Expression has too many parts ({0}). Expression must not have more than 7 parts.".format( expression_parts_temp_length ) ) self.normalize_expression(parsed) return parsed def normalize_expression(self, expression_parts): """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): 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] += '-{}'.format(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] = "{0}-{1}/{2}".format(parts[0], step_range_through, parts[1]) cron-descriptor-1.4.5/cron_descriptor/GetText.py000066400000000000000000000050031466242114700220000ustar00rootroot00000000000000# 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 gettext import os import logging logger = logging.getLogger(__name__) class FallBackNull(gettext.NullTranslations): def gettext(self, message): # If we get here, that means that original translator failed, we will return empty string return "" class GetText(object): """ Handles language translations """ def __init__(self, locale_code, locale_location=None): """ Initialize GetText :param locale_code selected locale """ try: self.trans = self.load_locale(locale_code, locale_location) except IOError: logger.debug('Failed to find locale {}'.format(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, locale_location=None): if locale_location is None: filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'locale', '{}.mo'.format(locale_code)) else: filename = os.path.join(locale_location, '{}.mo'.format(locale_code)) with open(filename, "rb") as f: trans = gettext.GNUTranslations(f) logger.debug('{} Loaded'.format(filename)) return trans cron-descriptor-1.4.5/cron_descriptor/Options.py000066400000000000000000000032411466242114700220510ustar00rootroot00000000000000# 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 locale from .CasingTypeEnum import CasingTypeEnum class Options(object): """ Options for parsing and describing a Cron Expression """ def __init__(self): self.casing_type = CasingTypeEnum.Sentence self.verbose = False self.day_of_week_start_index_zero = True self.use_24hour_time_format = False self.locale_location = None code, encoding = locale.getlocale() self.locale_code = code self.use_24hour_time_format = code in ["ru_RU", "uk_UA", "de_DE", "it_IT", "tr_TR", "cs_CZ", "ta_IN"] cron-descriptor-1.4.5/cron_descriptor/StringBuilder.py000066400000000000000000000031301466242114700231700ustar00rootroot00000000000000# 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(object): """ Builds string parts together acting like Java/.NET StringBuilder """ def __init__(self): self.string = [] def append(self, string): """Appends non empty string Args: string: String to append Returns: None """ if string: self.string.append(string) def __str__(self): return ''.join(self.string) def __len__(self): return len(self.string) cron-descriptor-1.4.5/cron_descriptor/__init__.py000066400000000000000000000031151466242114700221550ustar00rootroot00000000000000# 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 .Options import Options from .ExpressionDescriptor import ExpressionDescriptor, get_description from .DescriptionTypeEnum import DescriptionTypeEnum from .CasingTypeEnum import CasingTypeEnum from .Exception import MissingFieldException, FormatException, WrongArgumentException __version__ = '1.4.5' __all__ = ['Options', 'ExpressionDescriptor', 'get_description', 'DescriptionTypeEnum', 'CasingTypeEnum', 'MissingFieldException', 'FormatException', 'WrongArgumentException'] cron-descriptor-1.4.5/cron_descriptor/__main__.py000066400000000000000000000016461466242114700221450ustar00rootroot00000000000000import 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-1.4.5/cron_descriptor/locale/000077500000000000000000000000001466242114700213035ustar00rootroot00000000000000cron-descriptor-1.4.5/cron_descriptor/locale/cs_CZ.mo000066400000000000000000000055341466242114700226500ustar00rootroot00000000000000,|;&  &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-1.4.5/cron_descriptor/locale/cs_CZ.po000066400000000000000000000116351466242114700226520ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/de_DE.mo000066400000000000000000000052151466242114700226030ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/de_DE.po000066400000000000000000000116231466242114700226060ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/en_US.mo000066400000000000000000000072071466242114700226570ustar00rootroot000000000000007I&  .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-1.4.5/cron_descriptor/locale/en_US.po000066400000000000000000000140721466242114700226600ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/es_ES.mo000066400000000000000000000060071466242114700226410ustar00rootroot00000000000000-=& % 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-1.4.5/cron_descriptor/locale/es_ES.po000066400000000000000000000121711466242114700226430ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/fa_IR.mo000066400000000000000000000062031466242114700226210ustar00rootroot00000000000000-=& % 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-1.4.5/cron_descriptor/locale/fa_IR.po000066400000000000000000000124541466242114700226310ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/fr_FR.mo000066400000000000000000000054311466242114700226410ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/fr_FR.po000066400000000000000000000120371466242114700226440ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/it_IT.mo000066400000000000000000000053371466242114700226600ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/it_IT.po000066400000000000000000000117451466242114700226630ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/ja_JP.mo000066400000000000000000000057371466242114700226370ustar00rootroot00000000000000-=& % 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-1.4.5/cron_descriptor/locale/ja_JP.po000066400000000000000000000122041466242114700226250ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/ko_KR.mo000066400000000000000000000054531466242114700226540ustar00rootroot00000000000000*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-1.4.5/cron_descriptor/locale/ko_KR.po000066400000000000000000000116301466242114700226510ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/nb_NO.mo000066400000000000000000000053061466242114700226370ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/nb_NO.po000066400000000000000000000117111466242114700226370ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/nl_NL.mo000066400000000000000000000055651466242114700226550ustar00rootroot00000000000000,|;&  &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-1.4.5/cron_descriptor/locale/nl_NL.po000066400000000000000000000116701466242114700226520ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/pt_PT.mo000066400000000000000000000052521466242114700226720ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/pt_PT.po000066400000000000000000000116521466242114700226760ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/ru_RU.mo000066400000000000000000000060541466242114700227010ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/ru_RU.po000066400000000000000000000124621466242114700227040ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/sk_SK.mo000066400000000000000000000055071466242114700226610ustar00rootroot00000000000000,|;&  &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-1.4.5/cron_descriptor/locale/sk_SK.po000066400000000000000000000116101466242114700226540ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/sv_SE.mo000066400000000000000000000061511466242114700226620ustar00rootroot00000000000000,|;&  &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-1.4.5/cron_descriptor/locale/sv_SE.po000066400000000000000000000111721466242114700226640ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/ta_IN.mo000066400000000000000000000111111466242114700226250ustar00rootroot00000000000000,|;&  &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-1.4.5/cron_descriptor/locale/ta_IN.po000066400000000000000000000151711466242114700226420ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/tr_TR.mo000066400000000000000000000053101466242114700226710ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/tr_TR.po000066400000000000000000000117161466242114700227030ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/uk_UA.mo000066400000000000000000000057531466242114700226560ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/uk_UA.po000066400000000000000000000123611466242114700226520ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/vi_VN.mo000066400000000000000000000060631466242114700226660ustar00rootroot00000000000000-=& % 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-1.4.5/cron_descriptor/locale/vi_VN.po000066400000000000000000000123121466242114700226630ustar00rootroot00000000000000# 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-1.4.5/cron_descriptor/locale/zh_CN.mo000066400000000000000000000051631466242114700226460ustar00rootroot00000000000000,|& ! -: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-1.4.5/cron_descriptor/locale/zh_CN.po000066400000000000000000000115631466242114700226520ustar00rootroot00000000000000# 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-1.4.5/examples/000077500000000000000000000000001466242114700164635ustar00rootroot00000000000000cron-descriptor-1.4.5/examples/crontabReader.py000066400000000000000000000052731466242114700216170ustar00rootroot00000000000000# 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 try: from cron_descriptor import Options, ExpressionDescriptor except ImportError: print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') print('\033[1mFailed to import cron_descriptor, maybe ? "pip install cron-descriptor ?"\033[0m') print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') raise class CrontabReader(object): """ 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): """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 open(cronfile) as f: for line in f.readlines(): parsed_line = self.parse_cron_line(line) if parsed_line: print("{} -> {}".format(parsed_line, ExpressionDescriptor(parsed_line, options))) def parse_cron_line(self, line): """Parses crontab line and returns only starting time string Args: line: crontab line Returns: Time part of cron line """ stripped = line.strip() if stripped and stripped.startswith('#') is False: rexres = self.rex.search(stripped) if rexres: return ' '.join(rexres.group(1).split()) return None CrontabReader('/etc/crontab') cron-descriptor-1.4.5/pre-commit.sh000077500000000000000000000002671466242114700172650ustar00rootroot00000000000000#!/bin/bash set -e find cron_descriptor tests examples -name '*.py' -exec autopep8 --in-place --max-line-length=120 '{}' \; ./code-check.sh python setup.py test python3 setup.py test cron-descriptor-1.4.5/pyproject.toml000066400000000000000000000040571466242114700175670ustar00rootroot00000000000000[tool.ruff] select = [ "A", # flake8-builtins "ASYNC", # flake8-async "B", # flake8-bugbear "BLE", # flake8-blind-except "C4", # flake8-comprehensions "C90", # McCabe cyclomatic complexity "DTZ", # flake8-datetimez "E", # pycodestyle "EXE", # flake8-executable "F", # Pyflakes "FA", # flake8-future-annotations "FBT", # flake8-boolean-trap "FLY", # flynt "ICN", # flake8-import-conventions "INT", # flake8-gettext "ISC", # flake8-implicit-str-concat "N", # pep8-naming "PGH", # pygrep-hooks "PIE", # flake8-pie "PL", # Pylint "PT", # flake8-pytest-style "PYI", # flake8-pyi "RET", # flake8-return "RSE", # flake8-raise "RUF", # Ruff-specific rules "S", # flake8-bandit "SIM", # flake8-simplify "SLF", # flake8-self "T10", # flake8-debugger "TCH", # flake8-type-checking "TD", # flake8-todos "TID", # flake8-tidy-imports "W", # pycodestyle "YTT", # flake8-2020 # "ANN", # flake8-annotations # "ARG", # flake8-unused-arguments # "COM", # flake8-commas # "D", # pydocstyle # "DJ", # flake8-django # "EM", # flake8-errmsg # "ERA", # eradicate # "G", # flake8-logging-format # "I", # isort # "INP", # flake8-no-pep420 # "NPY", # NumPy-specific rules # "PD", # pandas-vet # "PTH", # flake8-use-pathlib # "Q", # flake8-quotes # "T20", # flake8-print # "TRY", # tryceratops # "UP", # pyupgrade ] ignore = ["N999", "PT009"] line-length = 159 target-version = "py37" [tool.ruff.mccabe] max-complexity = 20 [tool.ruff.pylint] allow-magic-value-types = ["int", "str"] max-args = 8 max-branches = 16 [tool.ruff.per-file-ignores] "cron_descriptor/Exception.py" = ["N818", "PIE790"] "cron_descriptor/ExpressionDescriptor.py" = ["B904", "BLE001", "DTZ011", "PLC1901", "RET505"] "cron_descriptor/ExpressionParser.py" = ["RET506"] "setup.py" = ["SIM115"] "tests/*" = ["PLR0402", "S101"] "tests/TestLocale.py" = ["PIE804"] "tools/resx2po.py" = ["N817", "S314"] cron-descriptor-1.4.5/setup.py000066400000000000000000000053031466242114700163600ustar00rootroot00000000000000# 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 setuptools if __name__ == "__main__": with open('README.md', encoding='utf-8') as in_file: long_description = in_file.read() setuptools.setup( name="cron_descriptor", version="1.4.5", description="A Python library that converts cron expressions " "into human readable strings.", author="Adam Schubert", author_email="adam.schubert@sg1-game.net", url="https://github.com/Salamek/cron-descriptor", long_description=long_description, long_description_content_type='text/markdown', packages=setuptools.find_packages(exclude=['tests*', ]), package_data={ 'cron_descriptor': [ 'locale/*.mo', ], }, classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development", ], extras_require={ 'dev': [ 'polib', ] }, tests_require=[ 'ruff', ], test_suite="tests" ) cron-descriptor-1.4.5/stdeb.cfg000066400000000000000000000000521466242114700164240ustar00rootroot00000000000000[DEFAULT] Package: python-cron-descriptor cron-descriptor-1.4.5/tests/000077500000000000000000000000001466242114700160075ustar00rootroot00000000000000cron-descriptor-1.4.5/tests/TestApi.py000066400000000000000000000043461466242114700177410ustar00rootroot00000000000000# 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 tests.TestCase as TestCase from cron_descriptor import DescriptionTypeEnum, ExpressionDescriptor class TestApi(TestCase.TestCase): """ Testing that API of ExpressionDescriptor is working as specified in DOCs """ def test_full(self): self.options.use_24hour_time_format = True ceh = ExpressionDescriptor("* * * * *", self.options) self.assertEqual( "Every minute", ceh.get_description(DescriptionTypeEnum.FULL)) def test_default(self): self.assertEqual( "Every minute", ExpressionDescriptor("* * * * *", self.options).get_description()) def test_to_str(self): self.assertEqual( "Every minute", str(ExpressionDescriptor("* * * * *", self.options))) def test_to_repr(self): self.assertIsInstance(ExpressionDescriptor("* * * * *", self.options), ExpressionDescriptor) def test_to_kargs(self): self.assertEqual( "At 17:17", str(ExpressionDescriptor("17 17 * * *", self.options, use_24hour_time_format=True))) cron-descriptor-1.4.5/tests/TestCase.py000066400000000000000000000027711466242114700201030ustar00rootroot00000000000000# 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 unittest from cron_descriptor import Options __author__ = "Adam Schubert " __date__ = "$2016-01-17 14:51:02$" class TestCase(unittest.TestCase): """ Test case for all tests """ def setUp(self): """Set up en_US locale """ # all tests are written in en_US self.options = Options() self.options.locale_code = 'en_US' cron-descriptor-1.4.5/tests/TestCasing.py000066400000000000000000000042101466242114700204220ustar00rootroot00000000000000# 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 tests.TestCase as TestCase from cron_descriptor import CasingTypeEnum, DescriptionTypeEnum, ExpressionDescriptor class TestCasing(TestCase.TestCase): """ Tests casing transformation """ def test_sentence_casing(self): self.options.casing_type = CasingTypeEnum.Sentence ceh = ExpressionDescriptor("* * * * *", self.options) self.assertEqual( "Every minute", ceh.get_description(DescriptionTypeEnum.FULL)) def test_title_casing(self): self.options.casing_type = CasingTypeEnum.Title ceh = ExpressionDescriptor("* * * * *", self.options) self.assertEqual( "Every Minute", ceh.get_description(DescriptionTypeEnum.FULL)) def test_lower_casing(self): self.options.casing_type = CasingTypeEnum.LowerCase ceh = ExpressionDescriptor("* * * * *", self.options) self.assertEqual( "every minute", ceh.get_description(DescriptionTypeEnum.FULL)) cron-descriptor-1.4.5/tests/TestExceptions.py000066400000000000000000000043271466242114700213500ustar00rootroot00000000000000# 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 tests.TestCase as TestCase from cron_descriptor import DescriptionTypeEnum, ExpressionDescriptor, MissingFieldException, FormatException class TestExceptions(TestCase.TestCase): """ Tests that Exceptions are/not properly raised """ def test_none_cron_expression_exception(self): with self.assertRaises(MissingFieldException): ceh = ExpressionDescriptor(None, self.options) ceh.get_description(DescriptionTypeEnum.FULL) def test_empty_cron_expression_exception(self): with self.assertRaises(MissingFieldException): ceh = ExpressionDescriptor('', self.options) ceh.get_description(DescriptionTypeEnum.FULL) def test_invalid_cron_expression_exception(self): with self.assertRaises(FormatException): ceh = ExpressionDescriptor('INVALID', self.options) ceh.get_description(DescriptionTypeEnum.FULL) def test_invalid_syntax_exception(self): ceh = ExpressionDescriptor("* $ * * *", self.options) with self.assertRaises(FormatException): ceh.get_description(DescriptionTypeEnum.FULL) cron-descriptor-1.4.5/tests/TestFormats.py000066400000000000000000000444561466242114700206510ustar00rootroot00000000000000# 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 tests.TestCase as TestCase from cron_descriptor import get_description class TestFormats(TestCase.TestCase): """ Tests formatted cron expressions """ def test_every_minute(self): self.assertEqual("Every minute", get_description("* * * * *", self.options)) def test_every1_minute(self): self.assertEqual("Every minute", get_description("*/1 * * * *", self.options)) self.assertEqual("Every minute", get_description("0 0/1 * * * ?", self.options)) def test_every_hour(self): self.assertEqual("Every hour", get_description("0 0 * * * ?", self.options)) self.assertEqual("Every hour", get_description("0 0 0/1 * * ?", self.options)) def test_time_of_day_certain_days_of_week(self): self.assertEqual( "At 11:00 PM, Monday through Friday", get_description("0 23 ? * MON-FRI", self.options)) def test_every_second(self): self.assertEqual("Every second", get_description("* * * * * *", self.options)) def test_every45_seconds(self): self.assertEqual("Every 45 seconds", get_description("*/45 * * * * *", self.options)) def test_every5_minutes(self): self.assertEqual("Every 5 minutes", get_description("*/5 * * * *", self.options)) self.assertEqual("Every 10 minutes", get_description("0 0/10 * * * ?", self.options)) def test_every5_minutes_on_the_second(self): self.assertEqual("Every 5 minutes", get_description("0 */5 * * * *", self.options)) def test_weekdays_at_time(self): self.assertEqual( "At 11:30 AM, Monday through Friday", get_description("30 11 * * 1-5", self.options)) def test_daily_at_time(self): self.assertEqual("At 11:30 AM", get_description("30 11 * * *", self.options)) def test_minute_span(self): self.assertEqual( "Every minute between 11:00 AM and 11:10 AM", get_description("0-10 11 * * *", self.options)) def test_one_month_only(self): self.assertEqual( "Every minute, only in March", get_description("* * * 3 *", self.options)) def test_two_months_only(self): self.assertEqual( "Every minute, only in March and June", get_description("* * * 3,6 *", self.options)) def test_two_times_each_afternoon(self): self.assertEqual( "At 02:30 PM and 04:30 PM", get_description("30 14,16 * * *", self.options)) def test_three_times_daily(self): self.assertEqual( "At 06:30 AM, 02:30 PM and 04:30 PM", get_description("30 6,14,16 * * *", self.options)) def test_once_a_week(self): self.assertEqual( "At 09:46 AM, only on Monday", get_description("46 9 * * 1", self.options)) def test_day_of_month(self): self.assertEqual( "At 12:23 PM, on day 15 of the month", get_description("23 12 15 * *", self.options)) def test_month_name(self): self.assertEqual( "At 12:23 PM, only in January", get_description("23 12 * JAN *", self.options)) def test_lowercase_month_name(self): self.assertEqual( "At 12:23 PM, only in January", get_description("23 12 * jan *", self.options)) def test_day_of_month_with_question_mark(self): self.assertEqual( "At 12:23 PM, only in January", get_description("23 12 ? JAN *", self.options)) def test_month_name_range2(self): self.assertEqual( "At 12:23 PM, January through February", get_description("23 12 * JAN-FEB *", self.options)) def test_month_name_range3(self): self.assertEqual( "At 12:23 PM, January through March", get_description("23 12 * JAN-MAR *", self.options)) def test_day_of_week_name(self): self.assertEqual( "At 12:23 PM, only on Sunday", get_description("23 12 * * SUN", self.options)) def test_day_of_week_name_lowercase(self): self.assertEqual( "At 12:23 PM, only on Sunday", get_description("23 12 * * sun", self.options)) def test_day_of_week_range(self): self.assertEqual( "Every 5 minutes, between 03:00 PM and 03:59 PM, Monday through Friday", get_description("*/5 15 * * MON-FRI", self.options)) def test_day_of_week_range_lowercase(self): self.assertEqual( "Every 5 minutes, between 03:00 PM and 03:59 PM, Monday through Friday", get_description("*/5 15 * * MoN-fri", self.options)) def test_day_of_week_once_in_month(self): self.assertEqual( "Every minute, on the third Monday of the month", get_description("* * * * MON#3", self.options)) def test_last_day_of_the_week_of_the_month(self): self.assertEqual( "Every minute, on the last Thursday of the month", get_description("* * * * 4L", self.options)) def test_last_day_of_the_month(self): self.assertEqual( "Every 5 minutes, on the last day of the month, only in January", get_description( "*/5 * L JAN *", self.options ) ) def test_last_day_offset(self): self.assertEqual( "At 12:00 AM, 5 days before the last day of the month", get_description( "0 0 0 L-5 * ?", self.options ) ) def test_last_weekday_of_the_month(self): self.assertEqual( "Every minute, on the last weekday of the month", get_description("* * LW * *", self.options)) def test_last_weekday_of_the_month2(self): self.assertEqual( "Every minute, on the last weekday of the month", get_description("* * WL * *", self.options)) def test_first_weekday_of_the_month(self): self.assertEqual( "Every minute, on the first weekday of the month", get_description("* * 1W * *", self.options)) def test_thirteenth_weekday_of_the_month(self): self.assertEqual( "Every minute, on the weekday nearest day 13 of the month", get_description("* * 13W * *", self.options)) def test_first_weekday_of_the_month2(self): self.assertEqual( "Every minute, on the first weekday of the month", get_description("* * W1 * *", self.options)) def test_particular_weekday_of_the_month(self): self.assertEqual( "Every minute, on the weekday nearest day 5 of the month", get_description("* * 5W * *", self.options)) def test_particular_weekday_of_the_month2(self): self.assertEqual( "Every minute, on the weekday nearest day 5 of the month", get_description("* * W5 * *", self.options)) def test_time_of_day_with_seconds(self): self.assertEqual("At 02:02:30 PM", get_description("30 02 14 * * *", self.options)) def test_second_intervals(self): self.assertEqual( "Seconds 5 through 10 past the minute", get_description("5-10 * * * * *", self.options)) def test_multi_part_second(self): self.assertEqual( "At 15 and 45 seconds past the minute", get_description("15,45 * * * * *", self.options) ) def test_second_minutes_hours_intervals(self): self.assertEqual(( "Seconds 5 through 10 past the minute, " "minutes 30 through 35 past the hour, " "between 10:00 AM and 12:59 PM"), get_description("5-10 30-35 10-12 * * *", self.options)) def test_every5_minutes_at30_seconds(self): self.assertEqual( "At 30 seconds past the minute, every 5 minutes", get_description("30 */5 * * * *", self.options)) def test_minutes_past_the_hour_range(self): self.assertEqual(( "At 30 minutes past the hour, " "between 10:00 AM and 01:59 PM, " "only on Wednesday and Friday"), get_description("0 30 10-13 ? * WED,FRI", self.options)) def test_seconds_past_the_minute_interval(self): self.assertEqual( "At 10 seconds past the minute, every 5 minutes", get_description("10 0/5 * * * ?", self.options) ) def test_between_with_interval(self): self.assertEqual( ("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"), get_description("2-59/3 1,9,22 11-26 1-6 ?", self.options)) def test_recurring_first_of_month(self): self.assertEqual("At 06:00 AM", get_description("0 0 6 1/1 * ?", self.options)) def test_minutes_past_the_hour(self): self.assertEqual( "At 5 minutes past the hour", get_description("0 5 0/1 * * ?", self.options) ) def test_one_year_only_with_seconds(self): self.assertEqual( "Every second, only in 2013", get_description("* * * * * * 2013", self.options)) def test_one_year_only_without_seconds(self): self.assertEqual( "Every minute, only in 2013", get_description("* * * * * 2013", self.options)) def test_two_years_only(self): self.assertEqual( "Every minute, only in 2013 and 2014", get_description("* * * * * 2013,2014", self.options)) def test_year_range2(self): self.assertEqual( "At 12:23 PM, January through February, 2013 through 2014", get_description( "23 12 * JAN-FEB * 2013-2014", self.options ) ) def test_year_range3(self): self.assertEqual( "At 12:23 PM, January through March, 2013 through 2015", get_description( "23 12 * JAN-MAR * 2013-2015", self.options ) ) def test_hour_range(self): self.assertEqual(( "Every 30 minutes, between 08:00 AM and 09:59 AM, " "on day 5 and 20 of the month"), get_description("0 0/30 8-9 5,20 * ?", self.options)) def test_day_of_week_modifier(self): self.assertEqual( "At 12:23 PM, on the second Sunday of the month", get_description("23 12 * * SUN#2", self.options)) def test_day_of_week_modifier_with_sunday_start_one(self): self.options.day_of_week_start_index_zero = False self.assertEqual( "At 12:23 PM, on the second Sunday of the month", get_description("23 12 * * 1#2", self.options)) def test_hour_range_with_every_portion(self): self.assertEqual(( "At 25 minutes past the hour, every 8 hours, " "between 07:00 AM and 07:59 PM"), get_description("0 25 7-19/8 ? * *", self.options)) def test_hour_range_with_trailing_zero_with_every_portion(self): self.assertEqual(( "At 25 minutes past the hour, every 13 hours, " "between 07:00 AM and 08:59 PM"), get_description("0 25 7-20/13 ? * *", self.options)) def test_every3_day(self): self.assertEqual( "At 08:00 AM, every 3 days", get_description("0 0 8 1/3 * ? *", self.options)) def tests_every3_day_of_the_week(self): self.assertEqual( "At 10:15 AM, every 3 days of the week", get_description("0 15 10 ? * */3", self.options)) def test_every_2_day_of_the_week_in_range(self): self.assertEqual( "Every second, every 2 days of the week, Monday through Friday", get_description("* * * ? * 1-5/2", self.options)) def test_every_2_day_of_the_week_in_range_with_sunday_start_one(self): self.options.day_of_week_start_index_zero = False self.assertEqual( "Every second, every 2 days of the week, Monday through Friday", get_description("* * * ? * 2-6/2", self.options)) def test_multi_with_day_of_week_start_index_zero_false(self): self.options.day_of_week_start_index_zero = False self.assertEqual( "Every second, only on Sunday, Monday, and Tuesday", get_description("* * * ? * 1,2,3", self.options) ) def test_every3_month(self): self.assertEqual( "At 07:05 AM, on day 2 of the month, every 3 months", get_description("0 5 7 2 1/3 ? *", self.options)) def test_every2_years(self): self.assertEqual( "At 06:15 AM, on day 1 of the month, only in January, every 2 years", get_description( "0 15 6 1 1 ? 1/2", self.options ) ) def test_multi_part_range_minutes(self): self.assertEqual( "At 2 and 4 through 5 minutes past the hour, at 01:00 AM", get_description("2,4-5 1 * * *", self.options)) def test_multi_part_range_minutes_2(self): self.assertEqual( "At 2 and 26 through 28 minutes past the hour, at 06:00 PM", get_description( "2,26-28 18 * * *", self.options ) ) def test_trailing_space_does_not_cause_a_wrong_description(self): self.assertEqual( "At 07:00 AM", get_description("0 7 * * * ", self.options)) def test_multi_part_day_of_the_week(self): self.assertEqual( "At 10:00 AM, only on Monday through Thursday and Sunday", get_description("0 00 10 ? * MON-THU,SUN *") ) def test_day_of_week_with_day_of_month(self): self.assertEqual( "At 12:00 AM, on day 1, 2, and 3 of the month, only on Wednesday and Friday", get_description("0 0 0 1,2,3 * WED,FRI", self.options) ) def test_seconds_interval_with_step_value(self): self.assertEqual( "Every 30 seconds, starting at 5 seconds past the minute", get_description("5/30 * * * * ?", self.options)) def test_minutes_interval_with_step_value(self): self.assertEqual( "Every 30 minutes, starting at 5 minutes past the hour", get_description("0 5/30 * * * ?", self.options)) def test_hours_interval_with_step_value(self): self.assertEqual( "Every second, every 8 hours, starting at 05:00 AM", get_description("* * 5/8 * * ?", self.options)) def test_day_of_month_interval_with_step_value(self): self.assertEqual( "At 07:05 AM, every 3 days, starting on day 2 of the month", get_description("0 5 7 2/3 * ? *", self.options)) def test_month_interval_with_step_value(self): self.assertEqual( "At 07:05 AM, every 2 months, March through December", get_description("0 5 7 ? 3/2 ? *", self.options)) def test_day_of_week_interval_with_step_value(self): self.assertEqual( "At 07:05 AM, every 3 days of the week, Tuesday through Saturday", get_description("0 5 7 ? * 2/3 *", self.options)) def test_year_interval_with_step_value(self): self.assertEqual( "At 07:05 AM, every 4 years, 2016 through 9999", get_description("0 5 7 ? * ? 2016/4", self.options)) def test_minutes_combined_with_multiple_hour_ranges(self): self.assertEqual( "At 1 minutes past the hour, at 01:00 AM and 03:00 AM through 04:59 AM", get_description("1 1,3-4 * * *", self.options)) def test_minute_range_conbined_with_second_range(self): self.assertEqual( "Seconds 12 through 50 past the minute, minutes 0 through 10 past the hour, at 06:00 AM, only in 2022", get_description("12-50 0-10 6 * * * 2022", self.options) ) def test_seconds_expression_combined_with_hours_list_and_single_minute(self): self.assertEqual( "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", get_description("5 30 6,14,16 5 * *", self.options) ) def test_minute_range_with_interval(self): self.assertEqual( "Every 3 minutes, minutes 0 through 20 past the hour, between 09:00 AM and 09:59 AM", get_description("0-20/3 9 * * *", self.options) ) def minutes_zero_1(self): self.assertEqual( "Every second, at 0 minutes past the hour, every 4 hours", get_description("* 0 */4 * * *", self.options) ) def minutes_zero_2(self): self.assertEqual( "Every 10 seconds, at 0 minutes past the hour", get_description("*/10 0 * * * *", self.options) ) def minutes_zero_3(self): self.assertEqual( "Every second, at 0 minutes past the hour, between 12:00 AM and 12:59 AM", get_description("* 0 0 * * *", self.options) ) def minutes_zero_4(self): self.assertEqual( "Every minute, between 12:00 AM and 12:59 AM", get_description("* 0 * * *", self.options) ) def minutes_zero_5(self): self.assertEqual( "Every second, at 0 minutes past the hour", get_description("* 0 * * * *", self.options) ) def sunday_7(self): self.assertEqual( "At 09:00 AM, only on Sunday", get_description("0 0 9 ? * 7", self.options) ) def every_year(self): self.assertEqual( "Every 10 minutes, Monday through Friday", get_description("0/10 * ? * MON-FRI *", self.options) ) cron-descriptor-1.4.5/tests/TestImport.py000066400000000000000000000043461466242114700205020ustar00rootroot00000000000000# 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 tests.TestCase as TestCase class TestImport(TestCase.TestCase): """ Tests that inline and separated imports are working """ def test_inline_import(self): from cron_descriptor import Options, DescriptionTypeEnum, ExpressionDescriptor options = Options() options.use_24hour_time_format = True options.locale_code = self.options.locale_code ceh = ExpressionDescriptor("* * * * *", options) self.assertEqual( "Every minute", ceh.get_description(DescriptionTypeEnum.FULL)) def test_full_import(self): from cron_descriptor.Options import Options from cron_descriptor.DescriptionTypeEnum import DescriptionTypeEnum from cron_descriptor.ExpressionDescriptor import ExpressionDescriptor options = Options() options.use_24hour_time_format = True options.locale_code = self.options.locale_code ceh = ExpressionDescriptor("* * * * *", options) self.assertEqual( 'Every minute', ceh.get_description(DescriptionTypeEnum.FULL)) cron-descriptor-1.4.5/tests/TestLocale.py000066400000000000000000000046311466242114700204240ustar00rootroot00000000000000# 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 tests.TestCase as TestCase from cron_descriptor import Options, ExpressionDescriptor from unittest.mock import patch import tempfile import shutil import os import logging class TestLocale(TestCase.TestCase): def test_locale_de(self): options = Options() options.locale_code = 'de_DE' options.use_24hour_time_format = True self.assertEqual( "Jede Minute", ExpressionDescriptor("* * * * *", options).get_description()) def test_locale_de_custom_location(self): logger = logging.getLogger('cron_descriptor.GetText') with patch.object(logger, "debug") as mock_logger: # Copy existing .mo file to temp directory: temp_dir = tempfile.gettempdir() temp_path = os.path.join(temp_dir, 'de_DE.mo') shutil.copyfile(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../cron_descriptor/locale/', 'de_DE.mo'), temp_path) options = Options() options.locale_location = temp_dir options.locale_code = 'de_DE' options.use_24hour_time_format = True self.assertEqual("Jede Minute", ExpressionDescriptor("* * * * *", options).get_description()) mock_logger.assert_called_once_with("{temp_path} Loaded".format(**{"temp_path":temp_path})) cron-descriptor-1.4.5/tests/__init__.py000066400000000000000000000030171466242114700201210ustar00rootroot00000000000000# 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 tests.TestCasing import TestCasing from tests.TestExceptions import TestExceptions from tests.TestFormats import TestFormats from tests.TestApi import TestApi from tests.TestImport import TestImport from tests.TestLocale import TestLocale __all__ = ['TestCasing', 'TestExceptions', 'TestFormats', 'TestApi', 'TestImport', 'TestLocale'] __author__ = "Adam Schubert " __date__ = "$2016-01-17 14:51:02$" cron-descriptor-1.4.5/tools/000077500000000000000000000000001466242114700160055ustar00rootroot00000000000000cron-descriptor-1.4.5/tools/resx2po.py000066400000000000000000000076761466242114700200010ustar00rootroot00000000000000# 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 pathlib import Path import polib class Resx2Po: def __init__(self, en_resx: Path, translation_resx: Path, code: str, output_po: Path): if not en_resx.is_file(): raise Exception("EN Resx {} not found".format(en_resx.absolute())) if not translation_resx.is_file(): raise Exception("Translation {} {} Resx bound not found".format(code, translation_resx.absolute())) 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): tree = ET.parse(resx) root = tree.getroot() translation_table = {} for first in root.findall('./data'): translation_table[first.attrib['name']] = first.find('./value').text return translation_table def generate(self): 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: print('WARNING: {} not found in {} resx'.format(message_en_id, self.code)) po.save(str(self.output_po.absolute())) code_list = { 'da': 'da_DK', # 'de': 'de_DE', # 'es': 'es_ES', # 'es-MX': 'es_MX', # 'fa': 'fa_IR', # 'fi': 'fi_FI', # 'fr': 'fr_FR', # 'it': 'it_IT', # 'ja': 'ja_IP', # 'ko': 'ko_KR', # 'nb': 'nb_NO', # 'nl': 'nl_NL', # 'pl': 'pl_PL', # 'pt': 'pt_PT', # 'ro': 'ro_RO', # 'ru': 'ru_RU', # 'sl': 'sl_SI', # 'sv': 'sv_SE', # 'tr': 'tr_TR', # 'uk': 'uk_UA', # 'zh-Hans': 'zh_Hans_CN', # 'zh-Hant': 'zh_Hant', } output_dir = Path('../locale') for from_code, to_code in code_list.items(): output_file = output_dir.joinpath('{}.po'.format(to_code)) Resx2Po( Path('Resources.resx'), Path('Resources.{}.resx'.format(from_code)), to_code, output_file )