phpmyadmin/twig-i18n-extension
Twig extension that adds i18n helpers for phpMyAdmin and other Twig-based apps. Provides translation-related functions/filters to integrate localization into templates with minimal setup and overhead.
Installation
composer require phpmyadmin/twig-i18n-extension
Add the extension to your Twig environment in config/app.php:
'twig' => [
'extensions' => [
\phpmyadmin\Twig\I18nExtension::class,
],
],
Basic Usage
Register a translation domain in your config/app.php:
'i18n' => [
'domains' => [
'app' => resource_path('lang'),
],
],
Load translations in a Twig template:
{% trans from 'app' %}Hello, {name}!{% endtrans %}
Pass variables via PHP:
return view('welcome', ['name' => 'John']);
First Use Case Localize a simple greeting in a Laravel Blade template:
<h1>{{ 'Welcome'|trans({'name': user.name}, 'app') }}</h1>
Domain-Based Isolation
app, admin, api) to organize translations by feature/module.{% trans from 'admin' %}Dashboard{% endtrans %}
Dynamic Fallbacks
// config/app.php
'i18n' => [
'fallbacks' => ['app', 'admin', 'default'],
],
{{ 'Button'|trans({}, 'app') }} {# Falls back to 'admin' then 'default' #}
Pluralization & Context
{% trans choice from 'app' %}
{0} No items|{1} One item|{% plural %} {{ count }} items
{% endtrans %}
return view('items', ['count' => 5]);
Interpolation
{% trans from 'app' %}User {username} logged in at {time}.{% endtrans %}
return view('dashboard', [
'username' => 'john_doe',
'time' => now()->format('H:i'),
]);
Locale Switching
public function handle($request, Closure $next) {
app()->setLocale($request->header('Accept-Language') ?? 'en');
return $next($request);
}
{{ 'Language'|trans({}, 'app') }}: {{ app.locale }}
Translation Loading
Loader:
use phpmyadmin\Twig\I18nExtension\Loader\FilesystemLoader;
$loader = new FilesystemLoader(resource_path('lang'));
$loader->addPath(resource_path('lang/db'), 'db');
Blade Compatibility
@trans directive in Blade:
@trans('app', 'Welcome, {name}!', ['name' => $user->name])
Testing
$this->app->singleton(\Illuminate\Translation\Translator::class, function () {
$translator = new Translator($this->app['config']['app.locale'], $this->app['loader']);
$translator->addNamespace('app', __DIR__.'/stubs/lang');
return $translator;
});
Namespace Conflicts
app/en/validation.php for domain app).config/app.php under 'i18n.domains' maps correctly to your resources/lang structure.Caching Issues
php artisan config:clear
php artisan view:clear
Pluralization Rules
Pluralizer class.Performance with Large Domains
Missing Translations
resources/lang/{locale}/{domain}.php.'twig' => [
'debug' => env('APP_DEBUG', false),
],
Syntax Errors in Twig
{% trans %} tags may silently fail. Use {{ 'key'|trans }} for errors.try-catch for graceful fallbacks:
{% set translated = 'key'|trans({'domain': 'app'}, {'fallback': 'Default'}) %}
Locale Fallbacks
en, it won’t fallback to another locale by default.config/app.php:
'locale' => 'en',
'fallback_locales' => ['en', 'fr', 'es'],
Custom Loaders
phpmyadmin\Twig\I18nExtension\Loader\LoaderInterface for database/API-based translations:
class DatabaseLoader implements LoaderInterface {
public function load($domain, $locale) {
return Cache::remember("translations.{$domain}.{$locale}", 3600, function () {
return DB::table('translations')->where([
'domain' => $domain,
'locale' => $locale,
])->pluck('content', 'key');
});
}
}
Filters & Tests
$twig->addFilter(new \Twig\TwigFilter('customTrans', function ($key, $params, $domain) {
return app('translator')->get($domain, $key, $params);
}));
Override Pluralization
$extension = new \phpmyadmin\Twig\I18nExtension\I18nExtension($loader, new CustomPluralizer());
Integration with Laravel Mix
mix.js('resources/js/app.js', 'public/js')
.then(() => {
require('fs').writeFileSync(
'resources/lang/en/compiled.php',
`<?php return ${JSON.stringify(require('./en.json'))};`
);
});
How can I help you explore Laravel packages today?