spanish - PHP setlocale no tiene efecto
strftime español (9)
La función setlocale()
no establece el idioma deseado (alemán).
El objetivo es generar nombres de mes.
Este es mi código de prueba con pruebas hasta el momento:
<?php
date_default_timezone_set(''Europe/Berlin'');
setlocale(LC_ALL, ''de_DE.utf8'');
// Or
setlocale(LC_ALL, ''de_DE@euro'');
// Or
setlocale(LC_ALL, ''de_DE'');
// Or
setlocale(LC_ALL, ''de'');
// Or
setlocale(LC_ALL, ''ge'');
echo strftime(''%B'');
Salida:
junio
en lugar de
Juni
¿Alguna sugerencia?
- No tengo ssh u otro acceso de shell.
- La secuencia de comandos se ejecuta en un servidor de Linux.
PHP versión 5.6
Dependiendo del sistema operativo subyacente "de_DE"
y otros tal vez la cadena incorrecta.
En Windows, consulte estas listas:
- http://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx
- http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.90%29.aspx
Por lo general, es "DEU" o "ALEMÁN" en Win.
Ya mencionado:
En Linux, puede ver todas las configuraciones regionales con el comando de shell:
locale -a
Es bastante probable que la configuración regional alemana no esté instalada en el servidor en el que ejecuta la secuencia de comandos: ¿tiene acceso de shell al servidor? Entonces intenta
locale -a
para ver qué configuraciones regionales están instaladas También echa un vistazo aquí ¿Es factible confiar en setlocale y confiar en las configuraciones regionales que se están instalando?
Gracias a Rico Neitzel por la pista. En lugar de intentar formatear la fecha php, use strftime. Para ver las primeras 3 letras del nombre del mes en su idioma (por ejemplo, Dez en lugar de Dic a partir de Dezembro y no en diciembre), siga las instrucciones de instalación de la localidad anterior y luego:
comando de fecha: date (''d M Y'') // imposible de cambiar de inglés
setlocale( LC_ALL, "pt_BR"); // Portuguese, replace with your locale
echo strftime(''%e %b %G'');
result: "4 Dez 2016"
/**
* datelo funcion (date with locale)
* Credits: Sergio Abreu
* http://sites.sitesbr.net
* NOTE: Depend on availability of the locale in server.
*
*/
function datelo( $str, $locale=''en_US'', $time=null){
if( $time === null){ $time = time(); }
if ( preg_match("/[DlFM]/", $str)){
setlocale(LC_ALL, $locale);
$dict = array( ''d''=>''%d'', ''D''=>''%a'', ''j''=>''%e'', ''l''=>''%A'', ''N''=>''%u'', ''w''=>''%w'', ''F''=>''%B'',
''m''=>''%m'', ''M''=>''%b'', ''Y''=>''%G'', ''g''=>''%l'', ''G''=>''%k'', ''h''=>''%I'', ''H''=>''%H'', ''i''=>''%M'',
''s''=>''%S'', ''S''=>'''', ''z''=>''%j'', ''n''=>''%m'', '' ''=>'' '', ''-''=>''-'', ''/''=>''/'', '':''=>'':'', '',''=>'','');
$chars = preg_split("//", $str);
$nstr = '''';
foreach ($chars as $c){
if ($c){ //skip empties
$nc = $dict[$c];
if( $c === ''n''){ // Fixes the extra zero
$nc = preg_replace("/^0+/", '''', strftime( $nc));
}
elseif( $c === ''z''){ // Fixes the extra zero and decrease 1
$nc = preg_replace("/^0+/", '''', strftime( $nc)); // 023 turns 23
$nc = intval($nc) - 1;
}
$nstr .= $nc;
}
}
return strftime( $nstr);
}else{ // not localized
return date( $str, $time);
}
}
Para los que vienen aquí buscando la fecha () no se localizan los nombres de mes y día de la semana:
== Preste atención ==
date () solo puede devolver nombres de mes / día en inglés y no podrá darle traducciones para otros idiomas.
Prueba este:
date_default_timezone_set(''Europe/Berlin'');
$loc=setlocale(LC_ALL, ''de_DE@euro'', ''de_DE'', ''deu_deu'');
echo strftime(''%B'');
Si estás en una máquina de Red Hat , puedes ejecutar:
localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8
Luego reinicia tu servidor Apache
Tu código es correcto Probablemente solo tenga que instalar el paquete de idioma correcto en el servidor en el que está ejecutando el script.
En la terminal, si el idioma que desea utilizar no aparece en la lista cuando ejecuta el comando sudo locale -a
, deberá instalarlo ejecutando el siguiente comando:
sudo /usr/share/locales/install-language-pack de_DE
( sudo
aquí es opcional si su usuario tiene permisos de root)
Luego, si compruebas dos de_DE.utf8
con sudo locale -a
, deberías ver de_DE.utf8
.
Si desea instalar el paquete en francés, ejecute
sudo /usr/share/locales/install-language-pack fr_FR
Luego podrá establecer su idioma en PHP utilizando setlocale(...)
exactamente como lo hizo.
Nota: Si se encuentra en un proyecto que no es utf8, deberá generar otros formatos a partir de los paquetes instalados. Aquí está cómo proceder en ubuntu (este trabajo en Debian también):
edite /var/lib/locales/supported.d/cs y agregue las siguientes líneas
fr_FR.iso88591 ISO-8859-1
fr_CA.iso88591 ISI-8859-1
y correr
sudo dpkg-reconfigure locales
Luego, al volver a ejecutar sudo locale -a
, debería ver tanto fr_FR.iso88591 como fr_CA.iso88591 en la lista y puede usarlo en php llamando a setlocale(LC_ALL, ''fr_FR.iso88591'');
Página de manual de PHP para sais ''setlocale'' :
Nota: El valor de retorno de setlocale () depende del sistema que PHP está ejecutando. Devuelve exactamente lo que devuelve la función setlocale del sistema.
Si tiene acceso de administrador (debian) aquí está la solución:
editar
/etc/locale.gen
Puede agregar / eliminar las configuraciones regionales que necesita usar. Después de guardar el archivo ejecute:
locale-gen
y deberías estar bien. En mi servidor tuve que reiniciar Apache para ver los cambios.
Esta solución podría ser útil si no tiene acceso de shell al servidor.
Si tiene acceso de shell, ¡la respuesta de Benjamin Seiller es la mejor!
Como no tengo otras posibilidades (shell), he encontrado una solución solo con PHP utilizando la clase IntlDateFormatter .
<?php
// Example vars
$month = ''6''; // 1-12
$year = ''2014''; // four digit year
$fmt = new IntlDateFormatter(''de_DE'',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
''Europe/Berlin'',
IntlDateFormatter::GREGORIAN);
$lastMonth = mktime(0, 0, 0, $month -1, 1, $year);
$showLastMonth = $fmt->format($lastMonth);
echo $showLastMonth;