lorisleiva/cron-translator
Convert CRON expressions into human-readable schedules. Translate standard 5-field CRON strings like “*/2 * * * *” into phrases such as “Every 2 minutes”, with optional locale and 24-hour time formatting. Supports many languages (en, fr, de, es, etc.).
CronTranslator::translate()), ensuring minimal coupling.Artisan::schedule() handles cron job execution, this package enhances observability and usability by translating raw cron expressions into human-readable text. Ideal for admin panels, logs, or API responses where clarity is critical.composer require, aligning with Laravel’s dependency management. No manual file downloads or Git submodules required.use Lorisleiva\CronTranslator\CronTranslator;
$humanReadable = CronTranslator::translate('* * * * *');
App::setLocale()) to dynamically switch cron translations, reducing duplication. Example:
$locale = app()->getLocale();
$translated = CronTranslator::translate('0 12 * * *', $locale);
| Risk | Mitigation Strategy | Severity |
|---|---|---|
| Unsupported Cron Syntax | Validate cron expressions before translation using a library like cron-expression to catch malformed inputs. |
Medium |
| Locale Mismatches | Default to en (English) as fallback and log warnings for unsupported locales. Extend translations via PRs if needed. |
Low |
| Performance Overhead | Benchmark translation calls in high-throughput systems (e.g., API rate limits). The package is O(1) for most cases, but complex cron expressions (e.g., 1,2,3/5) may add slight latency. |
Low |
| PHP Version Lock | Enforce PHP 8.2+ in composer.json to align with package requirements. Use platform-check in CI to block older versions. |
Medium |
| False Positives in Parsing | Test edge cases (e.g., */0, L operator) against known cron validators. Contribute fixes upstream if gaps are found. |
Medium |
| Dependency Bloat | Audit composer.json for indirect dependencies (e.g., symfony/translation). The package itself is dependency-free, but some locales may rely on Symfony components. |
Low |
*/0 or invalid ranges) to prevent broken translations.spatie/cron-expression or custom logic.en as default).GET /jobs/{id}).[Job] "Send reports" (Every day at 8:00am)).CronTranslator::translate('* * * * *', 'fr') → "Toutes les minutes").app/Console/Kernel.php, config files, database).echo "Run daily at midnight"; with:
echo CronTranslator::translate('0 0 * * *');
human_readable_cron field to job responses.CronTranslator::translate($cron, app()->getLocale())).| Component | Compatibility | Notes |
|---|---|---|
| PHP Version | 8.2+ (required). | Drop PHP 7.4/8.1 support in composer.json. |
| Laravel Version | 8.0+ (tested implicitly). | No Laravel-specific code; works in Lumen too. |
| Cron Syntax | Standard Unix cron + extensions (*/n, 1-5, 0,30). |
Avoid L, W, or ? (unsupported). |
| Localization | 18+ built-in locales. Custom locales via PRs. | Extend via resources/lang/ if needed. |
| Time Format | 12h/24h toggle. | Use true for 24h: CronTranslator::translate('* * * * *', 'en', true). |
app/Services/CronTranslatorService) to centralize translations and handle fallbacks.namespace App\Services;
use Lorisleiva\CronTranslator\CronTranslator;
class CronTranslatorService {
public function translate(string $cron, ?string $locale = null): string {
return CronTranslator::translate($cron, $locale ?? app()->getLocale());
}
}
JobResource).public function toArray($request) {
return [
'name' => $this->name,
'cron' => $this->cron,
'human_readable_cron' => app(CronTranslatorService::class)->translate($this->cron),
];
}
How can I help you explore Laravel packages today?