rinvex/languages
Laravel package to manage languages and locales in your app. Provides database-backed language records, ISO codes, and helpers for storing, retrieving, and listing available languages across projects, with seamless integration into the Rinvex ecosystem.
Installation
composer require rinvex/languages
Publish the config (optional):
php artisan vendor:publish --provider="Rinvex\Languages\LanguagesServiceProvider"
First Use Case Retrieve a language by ISO code (e.g., English):
use Rinvex\Languages\Facades\Languages;
$english = Languages::get('en');
// Returns array with keys: name, native, iso639_1, iso639_2, iso639_3, etc.
Where to Look First
Rinvex\Languages\Facades\Languages (primary entry point).config/languages.php (customize default language or data source).vendor/rinvex/languages/src/Data/languages.php (raw language data).Fetching Language Data
// By ISO code (e.g., 'es' for Spanish)
$spanish = Languages::get('es');
// By native name (case-insensitive)
$french = Languages::getByNative('français');
// All languages as a collection
$allLanguages = Languages::all();
Filtering Languages
// Filter by language family (e.g., 'Indo-European')
$indoEuropean = Languages::where('family', 'Indo-European')->get();
// Filter by script (e.g., 'Latin')
$latinScript = Languages::where('script', 'Latin')->get();
Integration with Laravel
$languages = Languages::all()->pluck('name', 'iso639_1');
return view('lang-selector', compact('languages'));
public function handle($request, Closure $next) {
$userLang = Languages::get($request->header('Accept-Language'));
app()->setLocale($userLang['iso639_1']);
return $next($request);
}
Caching
Enable caching in config/languages.php:
'cache' => true, // Caches all() and get() calls
'cache_ttl' => 60, // Cache TTL in minutes
Case Sensitivity
getByNative() is case-insensitive, but get() (ISO code) is case-sensitive. Use 'en' instead of 'EN'.Data Overrides
Performance
'cache' => false) if language data changes frequently (e.g., in a multitenant app with custom languages).Missing Data
language_culture). Handle with:
$language = Languages::get('ln') ?? [];
$culture = $language['language_culture'] ?? 'default';
Languages::isValidIsoCode('xx') to check if a code exists.$language = Languages::get('xx') + ['fallback' => 'N/A'];
Custom Data Source
Override the default data in config/languages.php:
'data' => [
'custom' => [
'iso639_1' => 'xx',
'name' => 'Custom Language',
'native' => 'Custom Native',
// ... other attributes
],
],
Adding New Attributes
Extend the Language model (if needed) by publishing the package and modifying:
// app/Languages/Extensions/LanguageExtension.php
namespace App\Languages\Extensions;
use Rinvex\Languages\Models\Language;
class LanguageExtension extends Language {
public function getCustomAttribute() {
return $this->attributes['custom_key'] ?? null;
}
}
Bind the extension in AppServiceProvider:
Languages::extend(function ($app) {
return new \App\Languages\Extensions\LanguageExtension();
});
Localization Hooks Trigger events when language data is loaded:
Languages::macro('afterGet', function ($callback) {
$this->afterGetCallbacks[] = $callback;
});
// Usage:
Languages::get('en')->afterGet(function ($language) {
// Modify or log language data
});
Languages::all() to preload data for bulk operations (e.g., seeding a database).Route::get('/languages/{iso}', function ($iso) {
return Languages::get($iso);
});
$this->mock(Languages::class)->shouldReceive('get')->andReturn(['name' => 'Test']);
How can I help you explore Laravel packages today?