nitotm/efficient-language-detector
Fast, accurate language detection in pure PHP (mbstring required). No dependencies. Supports 60 languages and multiple database sizes/modes (array/string/bytes/disk) to balance speed vs memory, with performance comparable to C++ detectors.
Strengths:
4.4s for 20MB Tatoeba dataset vs. 3.5s for CLD2) while maintaining 98.7%+ accuracy—ideal for high-throughput systems (e.g., real-time content moderation, multilingual APIs).disk mode uses ~0.5MB RAM for extralarge databases, making it viable for edge deployments (e.g., serverless, IoT) or resource-constrained environments.franc at 58), with ISO 639-1/2T/BCP47 output flexibility for compliance (e.g., GDPR, accessibility).mb extension), simplifying Docker/Kubernetes deployments and CI/CD pipelines.Weaknesses:
array mode (fastest) requires OPcache tuning (e.g., opcache.memory_consumption=256M for extralarge), adding operational overhead.disk mode has ~20s load time for extralarge (vs. 0.0003s cached string mode), requiring pre-warming strategies in stateless environments.fasttext for ambiguous inputs).Laravel Compatibility:
LanguageDetector in a Laravel Service Provider with configurable modes/sizes via .env (e.g., ELD_MODE=string, ELD_SIZE=large).disk mode.Accept-Language headers, content negotiation).php artisan eld:detect --file=uploads.csv).Database Integration:
created, updated events to auto-detect language for multilingual models (e.g., Post, Comment).WHERE language = 'es').OPcache Configuration:
opcache in array mode may cause PHP worker crashes (e.g., Allowed memory size exhausted).string mode in shared hosting.Language Subset Performance:
langSubset() calls in array mode may regenerate databases, increasing latency.php artisan eld:build-subset --languages=en,es).UTF-8 Validation:
enableTextCleanup(true) removes useful metadata).mb_detect_encoding() or use a fallback detector (e.g., google/cloud-language).Scaling:
disk mode’s file I/O (e.g., 10K requests/sec).string mode with OPcache for stateless scaling or Redis caching for frequent queries.Deployment Strategy:
array mode (higher memory) or use disk mode with pre-warming?Fallback Mechanism:
isReliable() === false), should we integrate a secondary detector (e.g., google/cloud-language)?Cost vs. Performance:
array mode, or should we standardize on string mode?Monitoring:
fasttext)?Compliance:
Laravel Ecosystem:
LanguageDetector as a singleton with configurable parameters:
$this->app->singleton(LanguageDetector::class, function ($app) {
$mode = config('eld.mode', EldMode::MODE_STRING);
$size = config('eld.size', EldDataFile::LARGE);
return new LanguageDetector($size, null, $mode);
});
.env:
ELD_MODE=string
ELD_SIZE=large
ELD_CLEANUP=false
ELD_SCHEME=ISO639_1
Cache::remember('eld:'.$textHash, ...)).Microservices:
POST /detect with text payload).disk mode’s low memory usage.Serverless:
disk mode with provisioned concurrency to mitigate cold starts.string mode cached.Phase 1: Proof of Concept (PoC)
google/cloud-language).Phase 2: Core Integration
LanguageDetector globally.Phase 3: Optimization
eld:preload Artisan command).array vs. string mode for high-traffic endpoints.en, es).Phase 4: Scaling
eld:detect-jobs).disk mode under load.mb extension needed (enabled by default in Laravel Valet/Sail).EldDataFile).| Step | Task | Dependencies | Owner |
|---|---|---|---|
| 1 | Add nitotm/efficient-language-detector to composer.json |
- | Backend |
| 2 | Configure .env and Service Provider |
Step 1 | Backend |
| 3 | Implement eld:detect Artisan command |
Step 2 | Backend |
| 4 | Integrate into Eloquent models (e.g., Post) |
Step 3 | Backend |
| 5 | Add middleware for request language detection | Step 4 | Backend |
| 6 | Benchmark and optimize OPcache settings | Step 5 | DevOps |
| 7 | Deploy with pre-warmed databases | Step 6 | DevOps |
| 8 | Monitor accuracy via custom metrics | Step 7 | Data Team |
How can I help you explore Laravel packages today?