laravel-lang/publisher
Laravel Lang Publisher lets you publish and manage Laravel Lang translation files in your app. Install as a dev dependency and use it to keep localization resources organized and up to date with the Laravel Lang ecosystem.
Install via Composer (dev dependency):
composer require --dev laravel-lang/publisher
Publish default translations (core Laravel strings):
php artisan lang:publish
resources/lang/ (e.g., en/auth.php, es/validation.php).Verify structure:
tree resources/lang -L 2
Expected output:
resources/lang/
├── en/
│ ├── auth.php
│ ├── validation.php
│ └── ...
└── [other_locales]/
php artisan lang:publish
resources/lang/en/auth.php (e.g., change "Login" to "Sign In").echo trans('auth.login'); // Outputs "Sign In"
Publish upstream updates (e.g., Laravel 13 auth strings):
php artisan lang:update
laravel-lang/locales into resources/lang/.Add a new locale (e.g., French):
php artisan lang:publish fr
fr to resources/lang/fr/.Remove unused locales:
php artisan lang:remove de
resources/lang/de/ and updates config.trans(), __(), and Lang::get()..env overrides (e.g., LANG_PUBLISHER_DEFAULT_LOCALE=es).// config/lang-publisher.php
'locales' => [
'en' => 'English',
'fr' => 'Français',
'custom' => [
'path' => 'vendor/custom-translations',
'name' => 'Custom',
],
],
// app/Providers/AppServiceProvider.php
use LaravelLang\Publisher\Events\LangPublished;
public function boot()
{
LangPublished::listen(function ($event) {
// Run custom logic after publish/update
Log::info("Translations updated for {$event->locale}");
});
}
- name: Update translations
run: php artisan lang:update --force
php artisan lang:update --dry-run # Check changes before applying
File Overwrites:
lang:publish overwrites existing files by default. Use --force to skip confirmation.resources/lang/ before running:
cp -r resources/lang/ resources/lang.bak/
Locale Conflicts:
resources/lang/ contains files not in laravel-lang/locales, they’re ignored during updates.lang:publish --all to include all files.Subkey Merging:
auth.failed) may lose local overrides if upstream keys are added.lang:update --preserve to retain all subkeys.Lumen Support:
lang_path() definition in bootstrap/app.php:
$app->withFacades();
if (! function_exists('lang_path')) {
function lang_path() { return __DIR__.'/../resources/lang'; }
}
Dry Runs:
php artisan lang:update --dry-run -v
Log Output: Enable verbose mode to trace file operations:
php artisan lang:publish -v
.env Overrides:
LANG_PUBLISHER_DEFAULT_LOCALE=es
LANG_PUBLISHER_SMART_PUNCTUATION=true # French/Italian rules
Project Name Check:
config/app.php lacks a name key. Fix:
'name' => env('APP_NAME', 'Laravel'),
Custom Publishers:
Extend LaravelLang\Publisher\Publisher to support non-Laravel-Lang sources:
class CustomPublisher extends Publisher
{
protected function getSourcePath(): string
{
return base_path('vendor/custom-translations');
}
}
Event Listeners:
LangPublished: Triggered after publish/update.LangRemoved: Triggered after locale deletion.Command Overrides: Publish a custom command:
php artisan vendor:publish --tag="lang-publisher-commands"
app/Console/Commands/LangPublishCommand.php.// config/lang-publisher.php
'exclude' => [
'resources/lang/large-file.json',
],
parallel -j 4 'php artisan lang:update {}' ::: en es fr de
How can I help you explore Laravel packages today?