brackets/admin-translations
A Laravel admin package for managing application translations from the dashboard. Browse, add, edit, and organize language strings without editing files directly, making multilingual content easier to maintain and keep in sync.
brackets/admin-translations is the translation-management add-on for brackets/admin-ui — it provides an admin screen for browsing and editing translation strings (typically across lang/ files and/or a translations table) instead of editing PHP arrays by hand. Because it is a companion package to admin-ui, treat it as an extension, not a standalone tool.
Prerequisites to check first:
^4.5 explicitly rather than letting an older lock resolve. Anything above Laravel 10 (11+) is still unverified: check composer.json constraints, and remember admin-ui has its own Laravel matrix that must agree with this package's.admin-ui is already installed and its auth/ACL is working. This package registers admin routes through the same middleware stack; if your admin panel isn't reachable, the translations screen won't be either.Minimal install steps (typical for Brackets packages):
composer require brackets/admin-translations:^4.5
php artisan admin-translations:install # or admin:install, depending on package conventions
Then publish migrations (if the package stores translations in DB) and run them, publish the admin config/views, and check the routes show up under your admin prefix (e.g. /admin/translations).
First use case: log in as an admin, open the Translations section, and verify you can see existing groups (e.g. auth, pagination, validation or your app's custom groups). Edit one string, save, and confirm the front-end reflects it. That end-to-end loop is the whole value proposition — if it works, you've replaced a whole class of "developer edits a PHP file and deploys" workflows with a content-editor-friendly UI.
Where to look first in the repo: the src/ service provider (route registration and middleware), the migrations (to see the translations schema — group/key/locale/value columns are the usual shape), and the controllers/models that back the screen. Those tell you exactly what is being read and written.
Because the package is a thin admin surface over translation storage, most day-to-day work is about where the strings live and who owns them.
1. Editor-driven, developer-seeded workflow. Developers seed baseline keys (via migrations, seeders, or importing existing lang/*.php files), then non-technical editors use the admin screen for copy changes. Keep keys stable; let only values be edited in the UI. This is the sweet spot for the package.
2. Group-scoped editing. Translations are conventionally organized by "group" (file name) and "key". Encourage a convention up front — e.g. app.* for product copy, auth.* for framework strings — so the admin list stays navigable as it grows. Unstructured growth is the number-one way these screens become unusable.
3. Database-backed translations with a loader. If the package persists to DB, you'll almost always pair it with a loader (spatie/laravel-translation-loader is the common choice) so __('group.key') resolves from the table at runtime rather than from files. Verify which loader the package assumes — this is the single most important integration decision.
4. Admin panel integration. Register the translations resource inside your admin-ui navigation/menu config so it appears alongside your other admin modules. Respect the same ACL/permissions as other admin sections — translation editing is a privileged action, especially if it can alter user-facing authentication strings.
5. Import/export around deployments. A practical pattern: developers keep lang/ files in Git as the source of truth for keys, and use the admin UI for values in staging. Before a release, export DB translations back to files (or to a seeder) so production doesn't depend on production-only data edits. Always review diffs — editor changes should be code-reviewed like any other content.
6. Multi-locale rollout. Add locales one at a time. Populate a new locale by copying an existing set (a "duplicate group to locale" pattern, often via a small artisan command you write) then let translators work through the missing-value list in the UI.
Compatibility: better, but still bounded. v4.5.0 brings Laravel 10 support, which meaningfully widens the usable window — the Laravel-9-and-below ceiling is gone. But read the release honestly: it is a single PR from a first-time contributor adding a version constraint, with no functional changes, no test-matrix announcement, and no statement of support for Laravel 11+. Treat "supports Laravel 10" as installable on Laravel 10, verify your actual admin-ui version against it, and pin ^4.5. If you're on Laravel 11+, still run composer why-not brackets/admin-translations before planning around it, and budget a fork.
Momentum, not maintenance guarantees. The L10 bump is a good sign that the package isn't fully abandoned, but the release cadence remains low and the maintenance surface is small. Keep the version pinned, keep your customisations in a thin override layer, and avoid depending on it for anything you couldn't replace in an afternoon.
It is not standalone. It is glue for admin-ui. If you're not already committed to the Brackets admin stack, this package is the wrong entry point — either adopt the whole stack or use a translation UI that doesn't assume it.
Cache invalidation is the classic trap. If translations are cached (via the loader, Laravel's translation cache, or your own), edits in the UI can appear to "not save." Wire the save action to clear the relevant cache, and document that editors must refresh. When something looks broken, check the cache before the database.
Schema assumptions matter. If translations are stored in a table, check the uniqueness constraint on (locale, group, key) and the column sizes for value. Long marketing copy overflows VARCHAR(255) more often than you'd expect — use TEXT where appropriate.
Escaping and placeholders. Editor-entered strings may contain :attribute, :count, {name} etc. The UI usually won't validate these. Add a linting/validation step (or a review checklist) so placeholders aren't silently dropped — a missing placeholder is a runtime ErrorException in production, not a visible formatting hiccup.
HTML in translations. If the app renders translation strings with {!! !!}, admin-editable values become an XSS surface. Restrict who can edit translations and/or escape consistently — this is a real security concern once non-developers can author user-facing strings.
Upgrading to v4.5.0. No breaking changes are listed and the diff is constraint-only, so the practical upgrade path is: bump the constraint, run composer update brackets/admin-translations, then re-run your install/publish steps only if the package's providers or config changed upstream (verify with git diff on the published config rather than republishing blindly). Re-run php artisan optimize:clear and smoke-test the translations screen after the bump.
Debugging the screen. If the translations page 404s or is blank:
php artisan about / config/app.php providers).admin-ui's route prefix and middleware — the translations routes hang off it.php artisan optimize:clear).Extension points to expect: the translation model (add scopes/observers), the admin controller (override for custom validation or import/export actions), and the view/resources for the list and edit forms. Forking is realistic here given the low maintenance surface — keep your customizations in a thin override layer so upstream (should it update again) stays mergeable.
When not to use it: if only developers edit translations, skip the package entirely — keep lang/ in Git and use a diff-based review. This package pays off specifically when non-developers need to change copy without a deploy. Judge adoption against that bar, not against "it's a translation package."
How can I help you explore Laravel packages today?