laminas/laminas-i18n
Internationalization tools for Laminas applications, including locale-aware translation, formatting, and pluralization support. Helps build multilingual PHP apps with proper locale handling and integration with Laminas MVC and services.
Install the package:
composer require laminas/laminas-i18n
(Note: Laravel developers typically use laminas/laminas-translator for translation-specific needs, but laminas-i18n provides broader i18n utilities like validation and filtering.)
Basic Translation Usage:
use Laminas\Translator\Translator;
$translator = new Translator();
$translator->addTranslationFilePattern(
'phpArray',
__DIR__ . '/../language/%s/%s.php',
'default',
'en'
);
echo $translator->translate('greeting'); // Outputs: 'Hello!'
(Place translation files in resources/lang/en/default.php with keys like 'greeting' => 'Hello!'.)
First Use Case:
$translator->setLocale('es'); // Switch to Spanish
echo $translator->translate('greeting'); // Outputs: '¡Hola!'
Translation Management:
addTranslationFilePattern() for .php, .json, or .ini files.
$translator->addTranslationFilePattern(
'json',
__DIR__ . '/../language/%s/%s.json',
'default',
'en'
);
.php files:
return [
'items' => [
'one' => '1 item',
'other' => '%d items',
],
];
Use in code:
$translator->translatePlural('items', 5); // Outputs: '5 items'
Validation Integration:
EmailAddress, NotEmpty) with Laravel’s Validator facade:
use Laminas\Validator\EmailAddress;
$validator = new EmailAddress();
if (!$validator->isValid('test@example.com')) {
echo $validator->getMessages()->getFirst();
}
Middleware for Locale:
Translator to Laravel’s container and set locale via middleware:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Translator::class, function () {
$translator = new Translator();
$translator->addTranslationFilePattern(...);
return $translator;
});
}
// app/Http/Middleware/LocaleMiddleware.php
public function handle($request, Closure $next)
{
app(Translator::class)->setLocale($request->header('Accept-Language') ?? 'en');
return $next($request);
}
Filtering User Input:
Laminas\Filter for locale-aware formatting:
use Laminas\Filter\NumberFormat;
$filter = new NumberFormat(['locale' => 'de_DE']);
echo $filter->filter(1000.50); // Outputs: '1.000,50'
Service Provider Binding:
Extend Laravel’s AppServiceProvider to bind laminas-i18n components:
$this->app->bind('laminas.translator', function () {
return new Translator();
});
Blade Directives: Create a custom Blade directive for translations:
// app/Providers/BladeServiceProvider.php
Blade::directive('trans', function ($expression) {
return "<?php echo app('laminas.translator')->translate({$expression}); ?>";
});
Usage in Blade:
@trans('greeting')
Configuration:
Store translation paths in config/i18n.php:
return [
'paths' => [
resource_path('lang/{locale}/'),
],
'default_locale' => 'en',
];
Locale Handling:
setLocale() now throws an exception (fixed in v2.28.1). Validate locales:
if (empty($locale)) $locale = 'en';
Translator has a fallback locale set:
$translator->setFallbackLocale('en');
Deprecated Components:
Laminas\I18n\Translator\TranslatorInterface was moved to laminas/laminas-translator in v2.27.0. Update imports:
// Old (deprecated)
use Laminas\I18n\Translator\TranslatorInterface;
// New
use Laminas\Translator\TranslatorInterface;
PHP Version Compatibility:
Validator Quirks:
IsFloat now return standardized error messages for empty inputs (fixed in v2.24.1).Caching:
laminas-cache for performance:
use Laminas\Cache\Storage\Adapter\Filesystem;
$cache = new Filesystem();
$translator->setCache($cache);
Missing Translations:
$translator->getTranslationStorage()->hasTranslation('default', 'en', 'missing_key');
Validator Errors:
$validator = new EmailAddress();
if (!$validator->isValid($email)) {
dd($validator->getMessages()->toArray());
}
Performance:
$translator->translate($dynamicKey)).Custom Translation Sources:
Laminas\Translator\Translator\Loader\LoaderInterface for database-backed translations:
class DatabaseLoader implements LoaderInterface {
public function load($locale, $translationFile, $translationDomain) {
return DB::table('translations')->where([...])->get();
}
}
Locale-Specific Logic:
Laminas\I18n\Validator\AbstractValidator for custom rules:
class CustomValidator extends AbstractValidator {
public function isValid($value) {
return !empty($value) && strlen($value) > 3;
}
}
Filter Chains:
use Laminas\Filter\FilterChain;
use Laminas\Filter\StringToLower;
use Laminas\Filter\StripTags;
$filterChain = new FilterChain();
$filterChain->attach(new StringToLower());
$filterChain->attach(new StripTags());
echo $filterChain->filter('<TAG>Hello</TAG>');
Testing:
Translator in PHPUnit:
$mockTranslator = $this->createMock(TranslatorInterface::class);
$mockTranslator->method('translate')->willReturn('Mocked!');
$this->app->instance(TranslatorInterface::class, $mockTranslator);
How can I help you explore Laravel packages today?