2012-06-06 15 views
43

La función setlocale() no establece el idioma deseado (alemán).PHP setlocale no tiene efecto


El objetivo es dar salida a los nombres de los meses.

Este es mi código de prueba con los ensayos hasta ahora:

<?php 

date_default_timezone_set('Europe/Berlin'); 
setlocale(LC_ALL, 'de_DE.utf8'); 
// Or 
setlocale(LC_ALL, '[email protected]'); 
// 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 Linux.
+0

¿Has probado otras versiones de la configuración regional alemana, por ejemplo 'setlocale (LC_ALL, 'de_DE @ euro', 'de_DE', 'de', 'ge');'? –

+0

Debe verificar si el cambio de idioma fue exitoso al examinar el valor de retorno de 'setLocale' – velop

Respuesta

8

Esta solución podría ayudar si usted no tiene acceso shell al servidor.

Si tiene acceso de shell, entonces Benjamin Seiller's answer es el mejor!

Como no tengo otras posibilidades (shell), he encontrado una solución solo con PHP usando IntlDateFormatter class.

<?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; 
65

Es bastante probable que la configuración regional alemana no esté instalada en el servidor donde está ejecutando la secuencia de comandos. ¿Tiene acceso de shell al servidor? A continuación, intente

locale -a 

para ver qué lugares están instalados. También eche un vistazo aquí Is it feasible to rely on setlocale, and rely on locales being installed?

+1

Thx para la respuesta rápida, es poco probable que no tenga acceso al shell. su enlace me ayudó: –

+1

Lo siento y me alegra oír eso. ¿Te importaría marcar mi respuesta como "respuesta"? :) –

+2

Si no tiene acceso de shell, también puede probar en PHP: 'server ('locale -a');' para encontrar los nombres de las configuraciones regionales instaladas en su servidor. –

3

prueba este:

date_default_timezone_set('Europe/Berlin'); 
$loc=setlocale(LC_ALL, '[email protected]', 'de_DE', 'deu_deu'); 
echo strftime('%B'); 
22

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 el terminal si el idioma que desea utilizar no aparece cuando se ejecuta el comando sudo locale -a, entonces usted tendrá que instalarlo ejecutando el siguiente comando:

sudo /usr/share/locales/install-language-pack de_DE 

(sudo aquí es opcional si su el usuario tiene permisos de root)

Luego, si comprueba dos veces con sudo locale -a, debería ver .

Si desea instalar paquete de idioma francés carrera

sudo /usr/share/locales/install-language-pack fr_FR 

Después se le permite configurar el idioma de éstos en PHP utilizando setlocale(...) exactamente igual que lo hizo.


Nota: Si se encuentra en un proyecto no UTF-8 que necesita para generar otros formatos de paquetes instalados. Aquí es cómo proceder en ubuntu (este trabajo en debian también):

editar /var/lib/locales/supported.d/cs y añadir las siguientes líneas

fr_FR.iso88591 ISO-8859-1 
    fr_CA.iso88591 ISI-8859-1 

y ejecutar

sudo dpkg-reconfigure locales 

A continuación, mediante la ejecución de nuevo sudo locale -a debería ver tanto es_ES.iso88591 y es_ES.iso88591 en la lista y que se puede utilizar en php llamando setlocale(LC_ALL, 'fr_FR.iso88591');

+1

Después de 'install-language-pack fr_FR' necesitaba usar la solución @ sephoy08:' setlocale (LC_ALL, 'fr_FR @ euro', 'fr_FR', 'fra_fra'); 'y funciona bien. gracias – Meloman

5

PHP manual page for 'setlocale' sais:

Nota: El valor de retorno de setlocale() depende del sistema que se está ejecutando PHP . Devuelve exactamente lo que devuelve la función setlocale del sistema .

Si usted tiene acceso a la raíz (debian) aquí está la solución:

edición

/etc/locale.gen 

Puede añadir/eliminar qué entornos locales tiene que utilizar. Después de guardar el archivo ejecutado:

locale-gen 

y usted debe estar bien. En mi servidor tuve que reiniciar Apache para ver los cambios.

7

Para los que vienen aquí en busca de la fecha() no localizar mes y día de la semana nombres:

== Atención de pago ==

date() solo puede devolver los nombres de mes/día en inglés y no podrá darle traducciones para otros langu siglos.

+0

finalmente encontré lo que vine a encontrar aquí. Gracias ... intenté todas las sugestiones y ningún efecto :(Es un poco molesto que la fecha sea así –

-1

Gracias a Rico Neitzel por la pista. En lugar de intentar formatear la fecha php, use strftime. Para ver las 3 primeras letras del nombre del mes en su idioma (Ex Dez en lugar de Dism por Dezembro y no diciembre.), Siga las instrucciones de la configuración regional de Instalación de arriba, y luego:

fecha de comando: Fecha ('d M Y ') // imposible 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); 
} 
} 
-1

Si su son en una máquina de Red Hat puede ejecutar:

localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8 

continuación, reinicie y nuestro servidor Apache

Cuestiones relacionadas