php - languages - laravel multi language database
La validaciĆ³n de Laravel atribuye "buenos nombres" (8)
Bueno, es una pregunta bastante antigua, pero debo señalar que el problema de que el lenguaje aparezca en la URL se puede resolver de la siguiente manera:
- Cambiando el idioma y el idioma de retorno en
config/app.php
; - o configurando / App :: setLocale ($ lang)
Si es necesario continuar durante la sesión, actualmente uso el "AppServiceProvider" para hacer esto, pero creo que un middleware podría ser un mejor enfoque si es necesario cambiar el idioma por URL, entonces, me gusta esto en mi proveedor:
if(!Session::has(''locale''))
{
$locale = MyLocaleService::whatLocaleShouldIUse();
Session::put(''locale'', $locale);
}
/App::setLocale(Session::get(''locale''));
De esta manera manejo la sesión y no se pega a mi url.
Para aclarar, actualmente estoy usando Laravel 5.1+ pero no debería ser un comportamiento diferente de 4.x;
Estoy tratando de usar los atributos de validación en "language> {language}> validation.php", para reemplazar el: nombre de atributo (nombre de entrada) por un nombre apropiado para leer (ejemplo: first_name> First name). Parece muy simple de usar, pero el validador no muestra los "buenos nombres".
Tengo esto:
''attributes'' => array(
''first_name'' => ''voornaam''
, ''first name'' => ''voornaam''
, ''firstname'' => ''voornaam''
);
Para mostrar los errores:
@if($errors->has())
<ul>
@foreach ($errors->all() as $error)
<li class="help-inline errorColor">{{ $error }}</li>
@endforeach
</ul>
@endif
Y la validación en el controlador:
$validation = Validator::make($input, $rules, $messages);
La matriz $ messages:
$messages = array(
''required'' => '':attribute is verplicht.''
, ''email'' => '':attribute is geen geldig e-mail adres.''
, ''min'' => '':attribute moet minimaal :min karakters bevatten.''
, ''numeric'' => '':attribute mag alleen cijfers bevatten.''
, ''url'' => '':attribute moet een valide url zijn.''
, ''unique'' => '':attribute moet uniek zijn.''
, ''max'' => '':attribute mag maximaal :max zijn.''
, ''mimes'' => '':attribute moet een :mimes bestand zijn.''
, ''numeric'' => '':attribute is geen geldig getal.''
, ''size'' => '':attribute is te groot of bevat te veel karakters.''
);
¿Puede alguien decirme qué estoy haciendo mal? Quiero que el nombre de atributo: sea reemplazado por el "buen nombre" en la matriz de atributos (lenguaje).
¡Gracias!
EDITAR:
Noté que el problema es que nunca configuré un idioma predeterminado para mis proyectos de Laravel. Cuando configuro el idioma en ''NL'', el código anterior funciona. Pero, cuando configuro mi idioma, el idioma aparecerá en la url. Y prefiero que no.
Entonces, mi siguiente pregunta: ¿es posible eliminar el idioma de la url o configurar el idioma predeterminado para que no aparezca allí?
Desde Laravel 5.2 podrías ...
public function validForm(/Illuminate/Http/Request $request)
{
$rules = [
''first_name'' => ''max:130''
];
$niceNames = [
''first_name'' => ''First Name''
];
$this->validate($request, $rules, [], $niceNames);
// correct validation
El atributo: solo puede usar el nombre del atributo (first_name en su caso), no los nombres agradables.
Pero puede definir mensajes personalizados para cada atributo + validación mediante mensajes definitivos como este:
$messages = array(
''first_name_required'' => ''Please supply your first name'',
''last_name_required'' => ''Please supply your last name'',
''email_required'' => ''We need to know your e-mail address!'',
''email_email'' => ''Invalid e-mail address!'',
);
En la matriz de "atributos", la clave es el nombre de la entrada y el valor es la cadena que desea mostrar en el mensaje.
Un ejemplo si tiene una entrada como esta
<input id="first-name" name="first-name" type="text" value="">
La matriz (en el archivo validation.php) debe ser
''attributes'' => array(
''first-name'' => ''Voornaam''),
Intenté lo mismo y funciona genial. Espero que esto ayude.
EDITAR
También me doy cuenta de que no pasa un parámetro a $errors->has()
así que tal vez ese es el problema.
Para arreglar esta comprobación en el controlador, si tiene un código como este
return Redirect::route(''page'')->withErrors(array(''register'' => $validator));
luego debes pasar al método has()
la tecla "registrar" (o lo que sea que estés usando) como esta
@if($errors->has(''register'')
.... //code here
@endif
Otra forma de mostrar los mensajes de error es la siguiente que prefiero (utilizo Twitter Bootstrap para el diseño, pero por supuesto puede cambiarlos con su propio diseño)
@if (isset($errors) and count($errors->all()) > 0)
<div class="alert alert-error">
<h4 class="alert-heading">Problem!</h4>
<ul>
@foreach ($errors->all(''<li>:message</li>'') as $message)
{{ $message }}
@endforeach
</ul>
</div>
La respuesta correcta a este problema en particular sería ir a su carpeta app / lang y editar el archivo validation.php en la parte inferior del archivo, hay una matriz llamada atributos :
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
''attributes'' => array(
''username'' => ''The name of the user'',
''image_id'' => ''The related image'' // if it''s a relation
),
Así que creo que esta matriz se creó para personalizar específicamente estos nombres de atributos.
Sí, los atributos de "buen nombre" como los llamaste fueron un "problema" real hace unos meses. Esperemos que esta característica esté ahora implemented y sea muy simple de usar.
Para simplificar dividiré las dos opciones para abordar este problema:
Global Probablemente el más extendido. Este enfoque está muy bien explicado here pero básicamente necesitas editar el archivo de validación application / language / XX / validation.php donde XX es el lenguaje que usarás para la validación.
En la parte inferior verá una matriz de atributos; esa será su matriz de atributos de "buen nombre". Siguiendo tu ejemplo, el resultado final será algo como esto.
''attributes'' => array(''first_name'' => ''First Name'')
Localmente De esto es de lo que Taylor Otwell estaba hablando cuando dice:
Puede llamar a setAttributeNames en una instancia de Validator ahora.
Eso es perfectamente válido y si revisas el código fuente verás
public function setAttributeNames(array $attributes) { $this->customAttributes = $attributes; return $this; }
Entonces, para usar de esta manera, vea el siguiente ejemplo directo:
$niceNames = array( ''first_name'' => ''First Name'' ); $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Recursos
Hay un repositorio realmente increíble en Github que tiene muchos paquetes de idiomas listos para funcionar. Definitivamente deberías echarle un vistazo.
Espero que esto ayude.
Una respuesta tardía, pero puede ayudar a alguien
En Laravel 4.1, la manera más fácil de hacerlo es ir a la carpeta lang -> su idioma (por defecto en) -> validation.php
y luego, por ejemplo, cuando tienes en tu modelo
`''group_id'' => ''Integer|required'',
''adult_id'' => ''Integer|required'',`
Y no quiero como un error, please enter a group id
Puede crear mensajes de validación "agradables" al agregar validation.php a la matriz personalizada, por lo que en nuestro ejemplo, la matriz personalizada se vería así.
` ''custom'' => array(
''adult_id'' => array(
''required'' => ''Please choose some parents!'',
),
''group_id'' => array(
''required'' => ''Please choose a group or choose temp!'',
),
),`
Esto también funciona con aplicaciones en varios idiomas, solo necesita editar (crear) el archivo de validación del idioma correcto.
El idioma predeterminado se almacena en el archivo de configuración de la aplicación / config / app.php, y es inglés por defecto. Esto se puede cambiar en cualquier momento usando el método App :: setLocale.
Puede encontrar más información sobre errores e idiomas aquí validation y localization
Uso mis archivos de idioma personalizados como entrada para los "nombres bonitos" como este:
$validator = Validator::make(Input::all(), $rules);
$customLanguageFile = strtolower(class_basename(get_class($this)));
// translate attributes
if(Lang::has($customLanguageFile)) {
$validator->setAttributeNames($customLanguageFile);
}