v1.0.0
15 Sep 2026First release.
Added
translations:lintwith six checks — missing, unused, placeholder, plural, empty and same — returning reason codes with a file and line, and exiting non-zero so it fails a build.- A plural check that nothing else makes: the number of
|forms a locale requires, taken from Laravel's ownMessageSelector::getPluralIndex, so an Arabic string with two forms where six are needed is caught before it reaches production. Explicit ranges are left alone. - A placeholder check that catches
:namepresent in the source and missing from the translation — which renders a page without the name while every test passes. - A scanner that reads
__,trans,trans_choice,@lang,@choice,Lang::getand$t()across PHP, Blade, JavaScript, TypeScript and Vue, with the file and line of every use, and that reports dynamic keys rather than guessing at them. translations:sync, which adds missing keys and never touches a value that exists.translations:exportandtranslations:importover a CSV with a byte-order mark, one column per locale, where a blank cell means "not yet" and never "erase it".- Nested arrays that survive the round trip in both directions, through one flattener with a test.
- Files written with sorted keys and real indentation, so two translators do not conflict on every line.
- Console-only registration: nothing from this package runs in a web request.