<?php
return [
'welcome' => 'Welcome to our application!',
'greeting' => 'Hello, :name',
'posts' => [
'created' => 'Post created successfully',
'updated' => 'Post updated successfully',
'deleted' => 'Post deleted successfully',
],
'items_count' => '{0} No items|{1} One item|[2,*] :count items',
'time_ago' => ':time ago',
];
<?php
return [
'welcome' => '¡Bienvenido a nuestra aplicación!',
'greeting' => 'Hola, :name',
'posts' => [
'created' => 'Publicación creada exitosamente',
'updated' => 'Publicación actualizada exitosamente',
'deleted' => 'Publicación eliminada exitosamente',
],
'items_count' => '{0} Sin artículos|{1} Un artículo|[2,*] :count artículos',
'time_ago' => 'hace :time',
];
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle(Request $request, Closure $next)
{
// Check URL parameter
if ($request->has('lang')) {
$locale = $request->get('lang');
session(['locale' => $locale]);
}
// Get from session or user preference
$locale = session('locale')
?? $request->user()?->locale
?? config('app.locale');
// Validate locale
if (in_array($locale, config('app.available_locales'))) {
App::setLocale($locale);
}
return $next($request);
}
}
<?php
// Simple translation
echo __('messages.welcome');
// With parameters
echo __('messages.greeting', ['name' => 'Carlos']);
// Nested keys
echo __('messages.posts.created');
// Pluralization
echo trans_choice('messages.items_count', 0); // "No items"
echo trans_choice('messages.items_count', 1); // "One item"
echo trans_choice('messages.items_count', 5); // "5 items"
// In Blade
@lang('messages.welcome')
{{ __('messages.greeting', ['name' => $user->name]) }}
// JSON translations
echo __('This is a simple string');
// Change locale
App::setLocale('es');
// Get current locale
$locale = App::getLocale();
// Carbon localization
$date = now()->locale('es')->diffForHumans(); // "hace 2 horas"
Localization enables applications to support multiple languages. Translation strings live in lang/ directories organized by locale. I use the __() helper or @lang directive for translations. The trans_choice() function handles pluralization rules. Laravel determines locale from requests, user preferences, or config. The App::setLocale() method changes language dynamically. Translation files support arrays, parameters, and pluralization. For database-driven translations, packages like laravel-translatable work well. Validation messages auto-translate via language files. Date/time localization uses Carbon with setLocale(). This architecture makes adding languages trivial—just add translation files without touching code.