behat/transliterator
Abandoned PHP transliteration utility (ported from Perl Text-Unidecode). Provides static methods via Behat\Transliterator\Transliterator. Dataset hasn’t been updated since 2016; consider symfony/string, ext-intl Transliterator, or iconv //TRANSLIT.
Installation:
composer require behat/transliterator
(Note: Only use this for legacy Laravel apps or temporary needs. For new projects, prefer Str::slug() or symfony/string for slugs, or PHP’s Transliterator for transliteration.)
First Use Case: Generate a transliterated string (e.g., for slugs or ASCII-compatible text):
use Behat\Transliterator\Transliterator;
$slug = Transliterator::transliterate('Café au Lait');
// Output: "Cafe au Lait"
Where to Look First:
Behat\Transliterator\Transliterator (static methods only).src/Transliterator.php).Str::slug() or symfony/string for slugs; PHP’s Transliterator for locale-aware transliteration.Slug Generation (Legacy Code):
$title = 'Hôtel & Café';
$slug = Transliterator::transliterate($title);
// Output: "Hotel Cafe" (if no additional processing)
(Note: Add Str::lower() and Str::slug() for production-ready slugs.)
Filename Sanitization:
$filename = Transliterator::transliterate('Résumé.pdf');
// Output: "Resume.pdf"
Normalization for APIs:
$normalized = Transliterator::transliterate($userInput);
// Ensure API endpoints handle ASCII-only text.
Legacy Migration:
// Before (regex)
$slug = preg_replace('/[^a-z0-9]/i', '-', strtolower($title));
// After (package)
$slug = strtolower(Transliterator::transliterate($title));
Wrapper for Abstraction: Create a service class to isolate the package for future swaps:
class TransliteratorService {
public function transliterate(string $text): string {
return Transliterator::transliterate($text);
}
}
Register in Laravel’s IoC container:
$app->singleton(TransliteratorService::class, function () {
return new TransliteratorService();
});
Integration with Laravel Validation:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'title' => 'required|string|max:255',
], [
'title.required' => 'A title is required.',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator);
}
$slug = strtolower(Transliterator::transliterate($request->title));
Combine with Laravel Helpers:
Use the package alongside Laravel’s Str helper for robust slugs:
$slug = Str::slug(Transliterator::transliterate($title));
Cache Transliterated Strings: For high-traffic apps, cache results to avoid repeated processing:
$transliterated = Cache::remember("transliterate_{$title}", now()->addHours(1), function () use ($title) {
return Transliterator::transliterate($title);
});
Locale-Aware Fallback:
If locale-specific transliteration is needed, use PHP’s Transliterator as a fallback:
if (extension_loaded('intl')) {
$transliterated = Transliterator::create('Any-Latin; Latin-ASCII')->transliterate($title);
} else {
$transliterated = Transliterator::transliterate($title);
}
Outdated Unicode Support:
ß may not always map to ss as expected in German locales.IntlTransliterator.Licensing Risks:
symfony/string (MIT-licensed).PHP Version Incompatibilities:
composer.json or migrate to alternatives.No Locale Support:
Transliterator, this package does not respect locale-specific rules (e.g., Turkish dotted ‘i’).iconv($string, 'ASCII//TRANSLIT) for simple cases.Performance for Bulk Operations:
IntlTransliterator for batch processing.Unexpected Outputs:
こんにちは → ??????).©, ®, €).var_dump(Transliterator::transliterate($testString)) to inspect mappings.PHP Warnings:
Undefined class errors, ensure the package is autoloaded (run composer dump-autoload).CI/CD Failures:
composer.json platform check:
"config": {
"platform": {
"php": "8.1"
}
}
No Runtime Configuration:
Alternative Configurations:
Custom Mappings:
class CustomTransliterator extends \Behat\Transliterator\Transliterator {
public static function transliterate($string) {
$string = parent::transliterate($string);
return str_replace('ss', 'ß', $string); // Reverse German mapping
}
}
Pre/Post-Processing:
Str helper for additional transformations:
$processed = Str::of(Transliterator::transliterate($title))
->lower()
->replaceMatches('/[^a-z0-9-]+/', '-')
->trim('-')
->toString();
Forking for Maintenance:
Service Provider Binding: Bind the transliterator to Laravel’s container for dependency injection:
$app->bind('transliterator', function () {
return new class {
public function __invoke(string $text) {
return Transliterator::transliterate($text);
}
};
});
Usage:
$transliterated = app('transliterator')($title);
Artisan Command: Create a command to test transliteration outputs:
use Illuminate\Console\Command;
class TransliterateCommand extends Command {
protected $signature = 'transliterate {text}';
protected $description = 'Transliterate a string';
public function handle() {
$this->info(Transliterator::transliterate($this->argument('text')));
}
}
Model Observers: Automatically transliterate attributes on save:
class PostObserver {
public function saving(Post $post) {
$post->slug = Str::slug(Transliterator::transliterate($post->title));
}
}
Str::slug() or `symfonyHow can I help you explore Laravel packages today?