laravel-l10n

La ricerca non è ancora disponibile.

Nessun risultato per “”.

↑ ↓ per spostarti · ↵ per aprire Ricerca di Algolia

// routing

Generazione degli URL

Genera URL localizzati con gli helper route() e action(), e metti in cache le route localizzate.

L'helper route()

Chiama route() con il nome della route canonica, come faresti senza il package. L'URL segue il locale corrente dell'applicazione:

routes/web.php php
Route::get('/example', Controller::class)
    ->lang(['es', 'it'])
    ->name('example');
// On a page served in Spanish, such as /es/ejemplo
route('example'); // "https://example.com/es/ejemplo"

// On a page served in the fallback locale, such as /example
route('example'); // "https://example.com/example"

Dato che le route localizzate impostano il locale dell'applicazione, i link restano nella lingua della pagina che l'utente sta leggendo, senza codice aggiuntivo nelle view:

<a href="{{ route('example') }}">Example</a>

Passa il parametro lang per generare l'URL di un locale specifico:

route('example', ['lang' => 'es']); // "https://example.com/es/ejemplo"
route('example', ['lang' => 'it']); // "https://example.com/it/example"
route('example', ['lang' => 'en']); // "https://example.com/example"

lang serve solo a scegliere la lingua: viene rimosso dai parametri, quindi non finisce mai nella query string. Combinalo con gli altri parametri della route come sempre:

route('products.show', ['product' => $product, 'lang' => 'es']);
// "https://example.com/es/productos/42"

Regole di risoluzione

Il locale dell'URL generato viene scelto così:

  1. Il parametro lang, se presente.
  2. Il locale della route stessa, quando passi il nome di una route tradotta come example.it.
  3. Altrimenti, il locale corrente dell'applicazione.

Se la route non ha una traduzione per il locale scelto, route() restituisce l'URL della route che hai indicato invece di generare un errore:

Chiamata Risultato
route('example') con locale dell'app es /es/ejemplo
route('example') con locale dell'app de /example
route('example', ['lang' => 'de']) /example
route('example.it') con locale dell'app es /it/example
route('example.it', ['lang' => 'es']) /es/ejemplo
route('example.it', ['lang' => 'de']) /it/example

Gli esempi usano la strategia predefinita prefix_except_default: con prefix, l'URL canonico è invece /en/example.

Le route senza lang() non cambiano: per loro lang è un parametro come gli altri, quindi riempie un segmento {lang} o finisce nella query string, come succederebbe senza il package.

L'helper action()

L'helper action() segue le stesse regole, con il controller al posto del nome della route:

action(Controller::class); // URL in the current locale
action(Controller::class, ['lang' => 'es']); // "https://example.com/es/ejemplo"
action([ProductController::class, 'show'], ['product' => $product, 'lang' => 'es']);

Chiavi di route localizzate mancanti

Quando un model non ha una chiave di route localizzata per un locale, route() e action() ripiegano sulla route canonica, a meno che il locale non sia richiesto esplicitamente:

// The post has no Italian slug and the application locale is "it"
route('posts.show', $post); // "https://example.com/article/hello-world"

route('posts.show', ['post' => $post, 'lang' => 'it']); // Throws MissingLocalizedRouteKeyException
route('posts.show.it', $post); // Throws MissingLocalizedRouteKeyException

MissingLocalizedRouteKeyException estende la UrlGenerationException di Laravel. Intercettala per saltare il locale, per esempio in una sitemap:

use Goodcat\L10n\Routing\Exceptions\MissingLocalizedRouteKeyException;

try {
    $url = route('posts.show', ['post' => $post, 'lang' => 'it']);
} catch (MissingLocalizedRouteKeyException) {
    // The post has no Italian slug
}

La chiave della route canonica è sempre obbligatoria: se manca, MissingLocalizedRouteKeyException viene lanciata anche per la route canonica.

Per costruire un menu delle lingue, genera l'URL della route corrente per ogni locale, passando i suoi parametri:

$route = request()->route();

route($route->getName(), [...$route->parameters(), 'lang' => 'es']);

Funziona sia dalla route canonica sia da una qualsiasi delle sue traduzioni. Nella maggior parte dei casi, i componenti selettore di lingua e link alternate lo fanno già per te.

Redirect e URL firmati

Tutto ciò che si basa sull'URL generator di Laravel viene localizzato allo stesso modo, compresi redirect e URL firmati:

return redirect()->route('example', ['lang' => 'es']);

return to_route('example'); // current locale

URL::temporarySignedRoute('example', now()->addMinutes(30), ['lang' => 'es']);
// "https://example.com/es/ejemplo?expires=...&signature=..."

Gli URL firmati mantengono una firma valida sulle route tradotte.

Cache delle route

Le route localizzate supportano la cache standard delle route di Laravel. Le route tradotte vengono salvate in cache insieme a quelle canoniche:

php artisan route:cache

Dopo aver modificato la traduzione di una route in lang/*/routes.php, svuota o ricostruisci la cache come faresti dopo aver modificato una route.

Questa pagina ti è stata utile?
Grazie per il feedback!
successivo Lingua preferita