diff --git a/README.md b/README.md index 8634508..8bee0a3 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ The following locales are currently supported. Feel free to PR more locales if y - `nl` — Dutch - `pt` — Portuguese - `ro` — Romanian +- `ru` — Russian - `sk` — Slovak - `vi` — Vietnamese - `zh` — Simplified Chinese diff --git a/src/CronExpression.php b/src/CronExpression.php index 9feab4e..093cac8 100644 --- a/src/CronExpression.php +++ b/src/CronExpression.php @@ -44,11 +44,11 @@ public function getFields(): array ]; } - public function langCountable(string $type, int $number): array|string + public function langCountable(string $type, int $number, string $case = 'nominative'): array|string { $array = $this->translations[$type]; - $value = $array[$number] ?? ($array['default'] ?: ''); + $value = $array[$case][$number] ?? $array[$number] ?? $array[$case]['default'] ?? $array['default'] ?? ''; return str_replace(':number', $number, $value); } @@ -61,12 +61,12 @@ public function lang(string $key, array $replacements = []) $translation = str_replace(':' . $transKey, $value, $translation); } - return $translation; + return $this->pluralize($translation); } protected function ensureLocaleExists(string $fallbackLocale = 'en'): void { - if (! is_dir($this->getTranslationDirectory())) { + if (!is_dir($this->getTranslationDirectory())) { $this->locale = $fallbackLocale; } } @@ -92,7 +92,7 @@ protected function loadTranslationFile(string $file) { $filename = sprintf('%s/%s.php', $this->getTranslationDirectory(), $file); - if (! is_file($filename)) { + if (!is_file($filename)) { throw new TranslationFileMissingException($this->locale, $file); } @@ -114,4 +114,54 @@ protected function getArrayDot(array $array, string $key) return $array; } + + + /** + * Pluralize the input string based on the counts and forms provided. + * + * @param string $inputString The input string to pluralize. + * @return string The pluralized string. + */ + public function pluralize(string $inputString): string + { + if (!preg_match_all('/(\d+)\s+{(.+?)\}/', $inputString, $matches)) { + return $inputString; + } + + [$fullMatches, $counts, $forms] = $matches; + + $conversionTable = []; + + foreach ($counts as $key => $count) { + $conversionTable['{' . $forms[$key] . '}'] = $this->declineCount((int)$count, $forms[$key]); + } + + return strtr($inputString, $conversionTable); + } + + /** + * Generates the function comment for the declineCount function. + * + * @param int $count The count parameter represents the count value. + * @param string $forms The forms parameter represents the forms string. + * @return string The function returns a string value. + */ + protected function declineCount(int $count, string $forms): string + { + $formsArray = explode('|', $forms); + + if (count($formsArray) < 3) { + $formsArray[2] = $formsArray[1]; + } + + $cases = [2, 0, 1, 1, 1, 2]; + + $count = abs((int) strip_tags($count)); + + $formIndex = ($count % 100 > 4 && $count % 100 < 20) + ? 2 + : $cases[min($count % 10, 5)]; + + return $formsArray[$formIndex]; + } } diff --git a/src/DaysOfMonthField.php b/src/DaysOfMonthField.php index 1bc114a..67c11c6 100644 --- a/src/DaysOfMonthField.php +++ b/src/DaysOfMonthField.php @@ -55,17 +55,17 @@ public function translateOnce(): ?string if ($month->hasType('Every') && $month->dropped) { return $this->lang('days_of_month.every_on_day', [ - 'day' => $this->format() + 'day' => $this->format('dative'), ]); } return $this->lang('days_of_month.once_on_day', [ - 'day' => $this->format() + 'day' => $this->format(), ]); } - public function format(): string + public function format(string $case = 'nominative'): string { - return $this->langCountable('ordinals', $this->getValue()); + return $this->langCountable('ordinals', $this->getValue(), $case); } } diff --git a/src/DaysOfWeekField.php b/src/DaysOfWeekField.php index c9d167e..02c7c1d 100644 --- a/src/DaysOfWeekField.php +++ b/src/DaysOfWeekField.php @@ -37,19 +37,19 @@ public function translateMultiple(): string */ public function translateOnce(): ?string { - if ($this->expression->day->hasType('Every') && ! $this->expression->day->dropped) { + if ($this->expression->day->hasType('Every') && !$this->expression->day->dropped) { return null; // DaysOfMonthField adapts to "Every Sunday". } return $this->lang('days_of_week.once_on_day', [ - 'day' => $this->format() + 'day' => $this->format('dative') ]); } /** * @throws CronParsingException */ - public function format(): string + public function format(string $case = 'nominative'): string { $weekday = $this->getValue() === 0 ? 7 : $this->getValue(); @@ -57,6 +57,6 @@ public function format(): string throw new CronParsingException($this->expression->raw); } - return $this->langCountable('days', $weekday); + return $this->langCountable('days', $weekday, $case); } } diff --git a/src/Field.php b/src/Field.php index 72bb039..0797585 100644 --- a/src/Field.php +++ b/src/Field.php @@ -52,9 +52,9 @@ public function getTimes(): array|string return $this->langCountable('times', $this->getCount()); } - protected function langCountable(string $key, int $value): array|string + protected function langCountable(string $key, int $value, string $case = 'nominative'): array|string { - return $this->expression->langCountable($key, $value); + return $this->expression->langCountable($key, $value, $case); } protected function lang(string $key, array $replacements = []): string diff --git a/src/HoursField.php b/src/HoursField.php index 1b04ff8..6ea5d9d 100644 --- a/src/HoursField.php +++ b/src/HoursField.php @@ -74,7 +74,7 @@ public function format(?MinutesField $minute = null): string return $minute ? "{$hour}:{$minute->format()}" : "{$hour}:00"; } - $amOrPm = $this->getValue() < 12 ? 'am' : 'pm'; + $amOrPm = $this->getValue() < 12 ? $this->lang('times.am') : $this->lang('times.pm'); $hour = $this->getValue() % 12; $hour = $hour === 0 ? 12 : $hour; diff --git a/src/MonthsField.php b/src/MonthsField.php index 7b6d557..221bd7c 100644 --- a/src/MonthsField.php +++ b/src/MonthsField.php @@ -46,24 +46,24 @@ public function translateOnce(): string if ($this->expression->day->hasType('Once')) { return $this->lang('months.once_on_day', [ 'month' => $this->format(), - 'day' => $this->expression->day->format(), + 'day' => $this->expression->day->format('dative'), ]); } return $this->lang('months.once_on_month', [ - 'month' => $this->format() + 'month' => $this->format(), ]); } /** * @throws CronParsingException */ - public function format(): string + public function format(string $case = 'nominative'): string { if ($this->getValue() < 1 || $this->getValue() > 12) { throw new CronParsingException($this->expression->raw); } - return $this->langCountable('months', $this->getValue()); + return $this->langCountable('months', $this->getValue(), $case); } } diff --git a/src/lang/ar/fields.php b/src/lang/ar/fields.php index 9bf2551..134dc87 100644 --- a/src/lang/ar/fields.php +++ b/src/lang/ar/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'كل عام', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/de/fields.php b/src/lang/de/fields.php index f82786f..bda9739 100644 --- a/src/lang/de/fields.php +++ b/src/lang/de/fields.php @@ -47,4 +47,8 @@ 'years' => [ 'every' => 'jedes Jahr', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/en/fields.php b/src/lang/en/fields.php index 28da502..0e46dad 100644 --- a/src/lang/en/fields.php +++ b/src/lang/en/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'every year', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/es/fields.php b/src/lang/es/fields.php index d4bbca4..5827ac7 100644 --- a/src/lang/es/fields.php +++ b/src/lang/es/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'cada año', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/fr/fields.php b/src/lang/fr/fields.php index a339c97..6b18ae7 100644 --- a/src/lang/fr/fields.php +++ b/src/lang/fr/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'chaque année', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/hi/fields.php b/src/lang/hi/fields.php index 19cde43..cc9cc21 100644 --- a/src/lang/hi/fields.php +++ b/src/lang/hi/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'प्रत्येक वर्ष', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/lv/fields.php b/src/lang/lv/fields.php index 2af59e3..ad6d357 100644 --- a/src/lang/lv/fields.php +++ b/src/lang/lv/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'katru gadu', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/nl/fields.php b/src/lang/nl/fields.php index 5a17ce0..dc86259 100644 --- a/src/lang/nl/fields.php +++ b/src/lang/nl/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'elk jaar', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ] ]; diff --git a/src/lang/pt/fields.php b/src/lang/pt/fields.php index d126f4e..1c3920a 100644 --- a/src/lang/pt/fields.php +++ b/src/lang/pt/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'todos os anos', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ] ]; diff --git a/src/lang/ro/fields.php b/src/lang/ro/fields.php index fc99cc7..5d04020 100644 --- a/src/lang/ro/fields.php +++ b/src/lang/ro/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'în fiecare an', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ] ]; diff --git a/src/lang/ru/days.php b/src/lang/ru/days.php new file mode 100644 index 0000000..69c2fac --- /dev/null +++ b/src/lang/ru/days.php @@ -0,0 +1,22 @@ + [ + 1 => 'в понедельник', + 2 => 'во вторник', + 3 => 'в среду', + 4 => 'в четверг', + 5 => 'в пятницу', + 6 => 'в субботу', + 7 => 'в воскресенье', + ], + 'dative' => [ + 1 => 'понедельникам', + 2 => 'вторникам', + 3 => 'средам', + 4 => 'четвергам', + 5 => 'пятницам', + 6 => 'субботам', + 7 => 'воскресеньям', + ], +]; diff --git a/src/lang/ru/fields.php b/src/lang/ru/fields.php new file mode 100644 index 0000000..5be1979 --- /dev/null +++ b/src/lang/ru/fields.php @@ -0,0 +1,52 @@ + [ + 'every' => 'каждую минуту', + 'increment' => 'каждые :increment {минута|минуты|минут}', + 'times_per_increment' => ':times каждые :increment {минута|минуты|минут}', + 'multiple' => ':times в час', + ], + 'hours' => [ + 'every' => 'каждый час', + 'once_an_hour' => 'раз в час', + 'increment' => 'каждые :increment {час|часа|часов}', + 'multiple_per_increment' => ':count {час|часа|часов} из :increment', + 'times_per_increment' => ':times каждые :increment {час|часа|часов}', + 'increment_chained' => 'каждые :increment {час|часа|часов}', + 'multiple_per_day' => ':count {час|часа|часов} в день', + 'times_per_day' => ':times в день', + 'once_at_time' => 'в :time', + ], + 'days_of_month' => [ + 'every' => 'каждый день', + 'increment' => 'каждые :increment {день|дня|дней}', + 'multiple_per_increment' => ':count {день|дня|дней} из :increment', + 'multiple_per_month' => ':count {день|дня|дней} в месяц', + 'once_on_day' => 'на :day число', + 'every_on_day' => ':day числа каждого месяца', + ], + 'months' => [ + 'every' => 'каждый месяц', + 'every_on_day' => ':day число каждого месяца', + 'increment' => 'каждые :increment {месяц|месяца|месяцев}', + 'multiple_per_increment' => ':count {месяц|месяца|месяцев} из :increment', + 'multiple_per_year' => ':count {месяц|месяца|месяцев} в год', + 'once_on_month' => 'в :month', + 'once_on_day' => 'в :month :day числа', + ], + 'days_of_week' => [ + 'every' => 'каждую неделю :weekday', + 'increment' => 'Каждые :increment дни недели', + 'multiple_per_increment' => ':count {день|дня|дней} недели из :increment', + 'multiple_days_a_week' => ':count {день|дня|дней} в неделю', + 'once_on_day' => 'по :day', + ], + 'years' => [ + 'every' => 'каждый год', + ], + 'times' => [ + 'am' => ' утра', + 'pm' => ' вечера', + ], +]; diff --git a/src/lang/ru/months.php b/src/lang/ru/months.php new file mode 100644 index 0000000..113ff8d --- /dev/null +++ b/src/lang/ru/months.php @@ -0,0 +1,32 @@ + [ + 1 => 'январе', + 2 => 'феврале', + 3 => 'марте', + 4 => 'апреле', + 5 => 'мае', + 6 => 'июне', + 7 => 'июле', + 8 => 'августе', + 9 => 'сентябре', + 10 => 'октябре', + 11 => 'ноябре', + 12 => 'декабре', + ], + 'dative' => [ + 1 => 'январям', + 2 => 'февралям', + 3 => 'мартам', + 4 => 'апрелям', + 5 => 'маям', + 6 => 'июням', + 7 => 'июлям', + 8 => 'августам', + 9 => 'сентябрям', + 10 => 'октябрям', + 11 => 'ноябрям', + 12 => 'декабрям', + ], +]; diff --git a/src/lang/ru/ordinals.php b/src/lang/ru/ordinals.php new file mode 100644 index 0000000..8a83ec6 --- /dev/null +++ b/src/lang/ru/ordinals.php @@ -0,0 +1,11 @@ + [ + 'default' => ':number-ое', + 3 => ':number-е', + ], + 'dative' => [ + 'default' => ':number-го', + ], +]; diff --git a/src/lang/ru/times.php b/src/lang/ru/times.php new file mode 100644 index 0000000..a7e29b9 --- /dev/null +++ b/src/lang/ru/times.php @@ -0,0 +1,9 @@ + ':number раз', + 1 => 'один раз', + 2 => 'два раза', + 3 => '3 раза', + 4 => '4 раза', +]; diff --git a/src/lang/sk/fields.php b/src/lang/sk/fields.php index 6aa9096..097558b 100644 --- a/src/lang/sk/fields.php +++ b/src/lang/sk/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'každý rok', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/vi/fields.php b/src/lang/vi/fields.php index b1b5692..2b8b175 100644 --- a/src/lang/vi/fields.php +++ b/src/lang/vi/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => 'hằng năm', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/zh-TW/fields.php b/src/lang/zh-TW/fields.php index 48df2c3..786724a 100644 --- a/src/lang/zh-TW/fields.php +++ b/src/lang/zh-TW/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => '每年', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/src/lang/zh/fields.php b/src/lang/zh/fields.php index 630ed47..09444ef 100644 --- a/src/lang/zh/fields.php +++ b/src/lang/zh/fields.php @@ -45,4 +45,8 @@ 'years' => [ 'every' => '每年', ], + 'times' => [ + 'am' => 'am', + 'pm' => 'pm', + ], ]; diff --git a/tests/CronTranslatorRUTest.php b/tests/CronTranslatorRUTest.php new file mode 100644 index 0000000..27a4e12 --- /dev/null +++ b/tests/CronTranslatorRUTest.php @@ -0,0 +1,134 @@ +assertCronTranslateToRu('каждую минуту', '* * * * *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям', '* * * * 0'); + $this->assertCronTranslateToRu('каждую минуту в январе', '* * * 1 *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям в январе', '* * * 1 0'); + $this->assertCronTranslateToRu('каждую минуту 1-го числа каждого месяца', '* * 1 * *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям 1-го числа каждого месяца', '* * 1 * 0'); + $this->assertCronTranslateToRu('каждую минуту в январе 1-го числа', '* * 1 1 *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям в январе 1-го числа', '* * 1 1 0'); + $this->assertCronTranslateToRu('каждую минуту в 0:00', '* 0 * * *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям в 0:00', '* 0 * * 0'); + $this->assertCronTranslateToRu('каждую минуту в январе в 0:00', '* 0 * 1 *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям в январе в 0:00', '* 0 * 1 0'); + $this->assertCronTranslateToRu('каждую минуту 1-го числа каждого месяца в 0:00', '* 0 1 * *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям 1-го числа каждого месяца в 0:00', '* 0 1 * 0'); + $this->assertCronTranslateToRu('каждую минуту в январе 1-го числа в 0:00', '* 0 1 1 *'); + $this->assertCronTranslateToRu('каждую минуту по воскресеньям в январе 1-го числа в 0:00', '* 0 1 1 0'); + $this->assertCronTranslateToRu('раз в час', '0 * * * *'); + $this->assertCronTranslateToRu('раз в час по воскресеньям', '0 * * * 0'); + $this->assertCronTranslateToRu('раз в час в январе', '0 * * 1 *'); + $this->assertCronTranslateToRu('раз в час по воскресеньям в январе', '0 * * 1 0'); + $this->assertCronTranslateToRu('раз в час 1-го числа каждого месяца', '0 * 1 * *'); + $this->assertCronTranslateToRu('раз в час по воскресеньям 1-го числа каждого месяца', '0 * 1 * 0'); + $this->assertCronTranslateToRu('раз в час в январе 1-го числа', '0 * 1 1 *'); + $this->assertCronTranslateToRu('раз в час по воскресеньям в январе 1-го числа', '0 * 1 1 0'); + $this->assertCronTranslateToRu('каждый день в 0:00', '0 0 * * *'); + $this->assertCronTranslateToRu('каждую неделю в воскресенье в 0:00', '0 0 * * 0'); + $this->assertCronTranslateToRu('каждый день в январе в 0:00', '0 0 * 1 *'); + $this->assertCronTranslateToRu('каждую неделю в воскресенье в январе в 0:00', '0 0 * 1 0'); + $this->assertCronTranslateToRu('1-ое число каждого месяца в 0:00', '0 0 1 * *'); + $this->assertCronTranslateToRu('1-ое число каждого месяца по воскресеньям в 0:00', '0 0 1 * 0'); + $this->assertCronTranslateToRu('3-е число каждого месяца по воскресеньям в 0:00', '0 0 3 * 0'); + $this->assertCronTranslateToRu('каждый год в январе 1-го числа в 0:00', '0 0 1 1 *'); + $this->assertCronTranslateToRu('по воскресеньям в январе 1-го числа в 0:00', '0 0 1 1 0'); + + // More realistic examples. + $this->assertCronTranslateToRu('каждый год в январе 1-го числа в 12:00', '0 12 1 1 *'); + $this->assertCronTranslateToRu('каждую минуту по понедельникам в 15:00', '* 15 * * 1'); + $this->assertCronTranslateToRu('каждую минуту в январе 3-го числа', '* * 3 1 *'); + $this->assertCronTranslateToRu('каждую минуту по понедельникам в апреле', '* * * 4 1'); + $this->assertCronTranslateToRu('по понедельникам в апреле 22-го числа в 15:10', '10 15 22 4 1'); + + // Paparazzi examples. + $this->assertCronTranslateToRu('каждый день в 22:00', '0 22 * * *'); + $this->assertCronTranslateToRu('каждый день в 9:00', '0 9 * * *'); + $this->assertCronTranslateToRu('каждую неделю в понедельник в 16:00', '0 16 * * 1'); + $this->assertCronTranslateToRu('каждую неделю во вторник в 16:00', '0 16 * * 2'); + $this->assertCronTranslateToRu('каждый год в январе 1-го числа в 0:00', '0 0 1 1 *'); + $this->assertCronTranslateToRu('1-ое число каждого месяца в 0:00', '0 0 1 * *'); + } + + /** @test */ + public function it_translate_expressions_with_multiple(): void + { + $this->assertCronTranslateToRu('каждую минуту 2 часа в день', '* 8,18 * * *'); + $this->assertCronTranslateToRu('каждую минуту 3 часа в день', '* 8,18,20 * * *'); + $this->assertCronTranslateToRu('каждую минуту 20 часов в день', '* 1-20 * * *'); + $this->assertCronTranslateToRu('два раза в час', '0,30 * * * *'); + $this->assertCronTranslateToRu('два раза в час 5 часов в день', '0,30 1-5 * * *'); + $this->assertCronTranslateToRu('5 раз в день', '0 1-5 * * *'); + $this->assertCronTranslateToRu('каждую минуту 5 часов в день', '* 1-5 * * *'); + $this->assertCronTranslateToRu('5 дней в месяц в 1:00', '0 1 1-5 * *'); + $this->assertCronTranslateToRu('5 дней в месяц 2 месяца в год в 1:00', '0 1 1-5 5,6 *'); + $this->assertCronTranslateToRu('2 месяца в год на 5-ое число в 1:00', '0 1 5 5,6 *'); + $this->assertCronTranslateToRu('5-ое число каждого месяца 4 дня в неделю в 1:00', '0 1 5 * 1-4'); + } + + /** @test */ + public function it_translate_expressions_with_increment(): void + { + $this->assertCronTranslateToRu('каждые 2 минуты', '*/2 * * * *'); + $this->assertCronTranslateToRu('каждые 2 минуты', '1/2 * * * *'); + $this->assertCronTranslateToRu('два раза каждые 4 минуты', '1,3/4 * * * *'); + $this->assertCronTranslateToRu('3 раза каждые 5 минут', '1-3/5 * * * *'); + $this->assertCronTranslateToRu('каждые 2 минуты в 14:00', '*/2 14 * * *'); + $this->assertCronTranslateToRu('раз в час каждые 2 дня', '0 * */2 * *'); + $this->assertCronTranslateToRu('каждую минуту каждые 2 дня', '* * */2 * *'); + $this->assertCronTranslateToRu('один раз каждые 2 часа', '0 */2 * * *'); + $this->assertCronTranslateToRu('два раза каждые 5 часов', '0 1,2/5 * * *'); + $this->assertCronTranslateToRu('5 раз каждые 8 часов', '0 1,2,3,4,5/8 * * *'); + $this->assertCronTranslateToRu('каждую минуту 2 часа из 5', '* 1,2/5 * * *'); + $this->assertCronTranslateToRu('каждый день каждые 4 месяца в 0:00', '0 0 * */4 *'); + } + + /** @test */ + public function it_adds_junctions_to_certain_combinations_of_cron_types(): void + { + $this->assertCronTranslateToRu('каждую минуту каждые 2 часа', '* */2 * * *'); + $this->assertCronTranslateToRu('каждую минуту каждые 3 часа 2-го числа каждого месяца', '* 1/3 2 * *'); + } + + /** @test */ + public function it_converts_ranges_of_one_into_once_cron_types(): void + { + $this->assertCronTranslateToRu('каждую минуту в 8:00', '* 8-8 * * *'); + $this->assertCronTranslateToRu('каждую минуту в январе', '* * * 1-1 *'); + } + + /** @test */ + public function it_handles_extended_cron_syntax(): void + { + $this->assertCronTranslateToRu('раз в час', '@hourly'); + $this->assertCronTranslateToRu('каждый день в 0:00', '@daily'); + $this->assertCronTranslateToRu('каждую неделю в воскресенье в 0:00', '@weekly'); + $this->assertCronTranslateToRu('1-ое число каждого месяца в 0:00', '@monthly'); + $this->assertCronTranslateToRu('каждый год в январе 1-го числа в 0:00', '@yearly'); + $this->assertCronTranslateToRu('каждый год в январе 1-го числа в 0:00', '@annually'); + } + + /** @test */ + public function it_can_format_the_time_in_12_and_24_hours(): void + { + $this->assertCronTranslateToRu('каждый день в 10:30 вечера', '30 22 * * *', false); + $this->assertCronTranslateToRu('каждый день в 22:30', '30 22 * * *', true); + $this->assertCronTranslateToRu('каждую минуту в 6 утра', '* 6 * * *', false); + $this->assertCronTranslateToRu('каждую минуту в 6:00', '* 6 * * *', true); + } + + public function assertCronTranslateToRu(string $expected, string $actual, bool $timeFormat24hours = true): void + { + $this->assertCronTranslateTo($expected, $actual, 'ru', $timeFormat24hours); + } +} diff --git a/tests/PluralizeTest.php b/tests/PluralizeTest.php new file mode 100644 index 0000000..2623728 --- /dev/null +++ b/tests/PluralizeTest.php @@ -0,0 +1,16 @@ +assertEquals('1 день 2 часа 5 минут', $CronExpression->pluralize('1 {день|дня|дней} 2 {час|часа|часов} 5 {минута|минуты|минут}')); + + $this->assertEquals('1 day 2 hours 5 minutes', $CronExpression->pluralize('1 {day|days} 2 {hour|hours} 5 {minute|minutes}')); + } +}