Fácil localización i18n para Laravel, una herramienta útil para combinar con las clases de localización de Laravel.
El paquete ofrece lo siguiente:
Laravel | localización-laravel |
---|---|
4.0.x | 0.13.x |
4.1.x | 0.13.x |
4.2.x | 0.15.x |
5.0.x/5.1.x | 1.0.x |
5.2.x-5.4.x (no se requiere PHP 7) | 1.2. |
5.2.0-6.x (se requiere versión PHP >= 7) | 1.4.x |
6.x-10.x (se requiere versión PHP >= 7) | 1.8.x |
10.x-11.x (se requiere versión PHP >= 8.2) | 2.0.x |
Instale el paquete a través del compositor: composer require mcamara/laravel-localization
Para Laravel 5.4 y versiones inferiores es necesario registrar el proveedor de servicios.
Para editar la configuración predeterminada puede ejecutar:
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
Después de eso, se creará config/laravellocalization.php
.
Las opciones de configuración son:
Puede registrar el paquete middleware en el archivo app/Http/Kernel.php
:
<?php namespace App Http ;
use Illuminate Foundation Http Kernel as HttpKernel ;
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $ middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class
];
}
Si está utilizando Laravel 11, puede registrarse en el archivo bootstrap/app.php
junto withMiddleware
:
return Application:: configure (basePath: dirname ( __DIR__ ))
// Other application configurations
-> withMiddleware ( function ( Middleware $ middleware ) {
$ middleware -> alias ([
/**** OTHER MIDDLEWARE ALIASES ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class,
]);
})
Agregue lo siguiente a su archivo de rutas:
// routes/web.php
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale ()], function ()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route:: get ( ' / ' , function ()
{
return View:: make ( ' hello ' );
});
Route:: get ( ' test ' , function (){
return View:: make ( ' test ' );
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
Una vez que este grupo de rutas se agrega al archivo de rutas, un usuario puede acceder a todas las configuraciones regionales agregadas en supportedLocales
( en
y es
de forma predeterminada). Por ejemplo, el archivo de ruta anterior crea las siguientes direcciones:
// Set application language to English
http://url-to-laravel/en
http://url-to-laravel/en/test
// Set application language to Spanish
http://url-to-laravel/es
http://url-to-laravel/es/test
// Set application language to English or Spanish (depending on browsers default locales)
// if nothing found set to default locale
http://url-to-laravel
http://url-to-laravel/test
El paquete configura la configuración regional de su aplicación App::getLocale()
de acuerdo con su URL. Luego, la configuración regional se puede utilizar para las funciones de localización de Laravel.
Puede agregar middleware a su grupo de esta manera:
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : Se recomienda encarecidamente utilizar un middleware de redireccionamiento. Las URL sin configuración regional solo deben usarse para determinar la configuración regional predeterminada del navegador y para redirigir a la URL localizada. De lo contrario, cuando los robots de los motores de búsqueda rastrean, por ejemplo, http://url-to-laravel/test
pueden obtener contenido en diferentes idiomas para cada visita. Además, tener varias URL para el mismo contenido crea un problema de contenido duplicado para SEO.
2. : Se recomienda encarecidamente localizar sus enlaces, incluso si utiliza un middleware de redireccionamiento. De lo contrario, provocarás al menos una redirección cada vez que un usuario haga clic en un enlace. Además, cualquier URL de acción de un formulario de publicación debe estar localizada para evitar que sea redirigida a una solicitud de obtención.
El siguiente middleware de redirección depende de la configuración de hideDefaultLocaleInURL
y useAcceptLanguageHeader
en config/laravellocalization.php
:
Siempre que haya una configuración regional presente en la URL, este middleware la almacenará en la sesión.
Si no hay ninguna configuración regional presente en la URL, este middleware verificará lo siguiente
useAcceptLanguageHeader
está configurado en verdadero, calcule la configuración regional desde el navegador y redirija a la URL con la configuración regional.hideDefaultLocaleInURL
esté configurado en verdadero. Por ejemplo, si un usuario navega a http://url-to-laravel/test y en
es la configuración regional actual, lo redireccionará automáticamente a http://url-to-laravel/en/test.
Similar a LocaleSessionRedirect, pero almacena valor en una cookie en lugar de en una sesión.
Siempre que haya una configuración regional presente en la URL, este middleware la almacenará en la cookie.
Si no hay ninguna configuración regional presente en la URL, este middleware comprobará lo siguiente
useAcceptLanguageHeader
está configurado en verdadero, calcule la configuración regional desde el navegador y redirija a la URL con la configuración regional.hideDefaultLocaleInURL
esté configurado en verdadero. Por ejemplo, si un usuario navega a http://url-to-laravel/test y de
es la configuración regional actual, lo redireccionará automáticamente a http://url-to-laravel/de/test.
Cuando la configuración regional predeterminada está presente en la URL y hideDefaultLocaleInURL
está establecida en verdadero, el middleware redirige a la URL sin configuración regional.
Por ejemplo, si es
es la configuración regional predeterminada, entonces http://url-to-laravel/es/test sería redirigido a http://url-to-laravel/test y se establecería App::getLocale()
dedos de los es
.
Este paquete viene con un montón de ayudantes.
Las URL localizadas tienen en cuenta el enlace del modelo de ruta al generar la ruta localizada, así como las configuraciones hideDefaultLocaleInURL
y Translated Routes.
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
Obtener la URL actual en una ubicación específica:
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
Devuelve una URL limpia de cualquier localización.
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
Devuelve una ruta, localizada en la ubicación deseada. Si la clave de traducción no existe en la configuración regional proporcionada, esta función devolverá falso.
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
Ejemplo de un enlace localizado que utiliza rutas con atributos
// An array of attributes can be provided.
// Returns /en/archive/ghosts, /fr/archive/fantômes, /pt/arquivo/fantasmas, etc.
<a href="{{ LaravelLocalization:: getURLFromRouteNameTranslated ( App:: currentLocale (), ' routes.archive ' , array ( ' category ' => ' ghosts ' )) }}">Ghost Stories</a>
Devuelve todas las configuraciones regionales admitidas y sus propiedades como una matriz.
{{ LaravelLocalization:: getSupportedLocales () }}
Devuelve todas las configuraciones regionales admitidas pero en el orden especificado en el archivo de configuración. Puede utilizar esta función para imprimir configuraciones regionales en el selector de idioma.
{{ LaravelLocalization:: getLocalesOrder () }}
Devuelve una matriz con todas las claves para las configuraciones regionales admitidas.
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
Devuelve la clave de la configuración regional actual.
{{ LaravelLocalization:: getCurrentLocale () }}
Devuelve el nombre de la configuración regional actual como una cadena (inglés/español/árabe/...etc).
{{ LaravelLocalization:: getCurrentLocaleName () }}
Devuelve el nombre nativo de la configuración regional actual como una cadena (English/Español/عربى/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleNative () }}
Devuelve el nombre regional de la configuración regional actual como una cadena (en_GB/en_US/fr_FR/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
Devuelve la dirección de la configuración regional actual como una cadena (ltr/rtl).
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
Devuelve el código ISO 15924 para el script local actual como una cadena; "Latn", "Cyrl", "árabe", etc.
{{ LaravelLocalization:: getCurrentLocaleScript () }}
Registre el middleware LaravelLocalizationViewPath
para configurar la configuración regional actual como view-base-path.
Ahora puede agrupar sus vistas en carpetas basadas en idiomas, como los archivos de traducción.
resources/views/en/
, resources/views/fr
, ...
Como puede modificar las configuraciones locales admitidas incluso cambiando el nombre de sus claves, es posible usar la cadena uk
en lugar de en-GB
para proporcionar segmentos de URL de idioma personalizados. Por supuesto, es necesario evitar cualquier colisión con claves ya existentes y respetar la convención el mayor tiempo posible. Pero si está utilizando una clave personalizada de este tipo, debe almacenar su mapeo en la matriz localesMapping
. Este localesMapping
es necesario para permitir que LanguageNegotiator asigne correctamente las configuraciones regionales deseadas según el encabezado de idioma de aceptación HTTP. A continuación se muestra un ejemplo rápido de cómo asignar el encabezado de idioma de aceptación HTTP 'en-GB' al segmento de URL 'uk':
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
Después de eso, http://url-to-laravel/en-GB/a/b/c
se convierte en http://url-to-laravel/uk/a/b/c
.
LaravelLocalization:: getLocalizedURL ( ' en-GB ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
LaravelLocalization:: getLocalizedURL ( ' uk ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
Si admite varias configuraciones regionales en su proyecto, probablemente desee proporcionar a los usuarios una forma de cambiar el idioma. A continuación se muestra un ejemplo sencillo de código de plantilla Blade que puede utilizar para crear su propio selector de idioma.
< ul >
@foreach ( LaravelLocalization :: getSupportedLocales () as $localeCode => $properties )
< li >
< a rel = " alternate " hreflang = " {{ $localeCode } } " href = " {{ LaravelLocalization :: getLocalizedURL ( $localeCode , null , [], true ) } } " >
{{ $properties [ ' native ' ] } }
</ a >
</ li >
@endforeach
</ ul >
Aquí se forzará que el idioma predeterminado en getLocalizedURL() esté presente en la URL incluso hideDefaultLocaleInURL = true
.
Tenga en cuenta que se admite el enlace de modelo de ruta.
Puedes traducir tus rutas. Por ejemplo, http://url/en/about y http://url/es/acerca (acerca es about en español) o http://url/en/article/important-article y http://url/ es/articulo/important-article sería redirigido al mismo controlador/vista de la siguiente manera:
Es necesario que al menos el middleware localize
esté cargado en su middleware Route::group
(consulte las instrucciones de instalación).
Para cada idioma, agregue un routes.php
en la carpeta resources/lang/**/routes.php
. El archivo contiene una matriz con todas las rutas traducibles. Por ejemplo, así:
Tenga en cuenta: a partir de Laravel 9, la carpeta
resources/lang
ahora se encuentra en la carpeta raíz del proyecto (lang
). Si su proyecto tiene una carpetalang
en la raíz, debe agregar unroutes.php
en la carpetalang/**/routes.php
.
<?php
// resources/lang/en/routes.php
return [
" about " => " about " ,
" article " => " article/{article} " ,
];
<?php
// resources/lang/es/routes.php
return [
" about " => " acerca " ,
" article " => " articulo/{article} " ,
];
Puede agregar las rutas en routes/web.php
de esta manera:
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localize ' ]], function () {
Route:: get (LaravelLocalization:: transRoute ( ' routes.about ' ), function () {
return view ( ' about ' );
});
Route:: get (LaravelLocalization:: transRoute ( ' routes.article ' ), function ( App Article $ article ) {
return $ article ;
});
//,...
});
Una vez guardados los archivos, podrá acceder a http://url/en/about, http://url/es/acerca, http://url/en/article/important-article y http://url/es/ articulo/artículo-importante sin ningún problema.
Tal vez hayas notado en el ejemplo anterior el slug en inglés en la URL en español:
http://url/es/articulo/important-article
Es posible tener slugs traducidos, por ejemplo así:
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
Sin embargo, para poder hacer esto, cada artículo debe tener muchos slugs (uno para cada ubicación). Depende de usted cómo desea implementar esta relación. El único requisito para los parámetros de ruta traducibles es que el modelo relevante implemente la interfaz LocalizedUrlRoutable
.
Para implementar McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
, uno tiene que crear la función getLocalizedRouteKey($locale)
, que debe devolver para una configuración regional determinada el slug traducido. En el ejemplo anterior, dentro del artículo modelo, getLocalizedRouteKey('en')
debería devolver important-change
y getLocalizedRouteKey('es')
debería devolver cambio-importante
.
Para utilizar el enlace de modelo de ruta, se debe sobrescribir la función resolveRouteBinding($slug)
en el modelo. La función debe devolver el modelo que pertenece al slug $slug
traducido. Por ejemplo:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
Quizás quieras ver este vídeo que muestra cómo se pueden configurar parámetros de ruta traducibles.
Puede capturar los parámetros de la URL durante la traducción si también desea traducirlos. Para hacerlo, simplemente cree un detector de eventos para el evento routes.translation
así:
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
Asegúrese de pasar la configuración regional y los atributos como parámetros del cierre. También puede utilizar Suscriptores de eventos, consulte: http://laravel.com/docs/events#event-subscribers
Para almacenar en caché sus rutas, utilice:
php artisan route:trans:cache
... en lugar del comando route:cache
normal. ¡Usar artisan route:cache
no funcionará correctamente!
Para que la solución de almacenamiento en caché de rutas funcione, es necesario realizar un ajuste menor en la provisión de rutas de su aplicación.
antes de laravel 11
En RouteServiceProvider
de tu aplicación, usa el rasgo LoadsTranslatedCachedRoutes
:
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
después de laravel 11
En AppServiceProvider
de su aplicación, use la clase CachedTranslatedRouteLoader
en el método de registro:
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
Para más detalles ver aquí.
Esto puede suceder si no localiza su ruta de acción que está dentro de su Routes::group
. Esto puede provocar una redirección, que luego cambia la solicitud de publicación a una solicitud de obtención. Para evitarlo, simplemente utilice el asistente de localización.
Por ejemplo, si usa Auth::routes()
y los coloca en su Route::group
Entonces
<form action="/logout" method="POST">
<button>Logout</button>
</form>
no funcionará. En cambio, hay que utilizar
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
Otra forma de resolver esto es configurar el método http en 'laravellocalization.httpMethodsIgnored' para evitar procesar este tipo de solicitudes.
Si no localiza la URL de su publicación y utiliza un middleware de redireccionamiento, la solicitud de publicación se redirige como una solicitud de obtención. Si no ha definido dicha ruta de obtención, provocará esta excepción.
Para localizar la URL de su publicación, vea el ejemplo en POST no funciona.
Esto también sucede si no localizó la URL de su publicación. Si no localiza la URL de su publicación, la configuración regional predeterminada se establece durante la validación y, al regresar a back()
muestra el mensaje de validación en la configuración regional predeterminada.
Para localizar la URL de su publicación, vea el ejemplo en POST no funciona.
Durante la configuración de la prueba, aún no se conoce la ruta llamada. Esto significa que no se puede configurar ningún idioma. Cuando se realiza una solicitud durante una prueba, se genera un 404: sin el prefijo establecido, la ruta localizada no parece existir.
Para solucionar este problema, puede utilizar esta función para configurar manualmente el prefijo de idioma:
// TestCase.php
protected function refreshApplicationWithLocale ( $ locale )
{
self :: tearDown ();
putenv (LaravelLocalization:: ENV_ROUTE_KEY . ' = ' . $ locale );
self :: setUp ();
}
protected function tearDown (): void
{
putenv (LaravelLocalization:: ENV_ROUTE_KEY );
parent :: tearDown ();
}
// YourTest.php
public function testBasicTest ()
{
$ this -> refreshApplicationWithLocale ( ' en ' );
// Testing code
}
¡Pregúntale a mcamara si quieres ser uno de ellos!
Ver registro de cambios aquí -> registro de cambios
Laravel Localization es un paquete laravel de código abierto con licencia MIT.