2011-02-12 12 views
8

Estoy tratando de crear una traducción condicional de la función interna de PHP(). ¿Es posible de alguna manera redefinir las variables internas, p. - fecha ('M'), fecha ('y'), etc., así que los diferentes cuerdas se introducen en el resto de la función de PHP sobre la base de esta prueba:Traduciendo PHP date() para Sitio multilingüe

if (ICL_LANGUAGE_CODE == 'fr') { } 

El siguiente es un ejemplo de trabajo de la código que estoy usando para un módulo de fechas. Como $date se define con muchas variables contenidas en esta definición, es importante volver a definir condicionalmente las variables dentro de PHP date() primero para evitar tener que redefinir la variable 100 veces o más dentro de cada clave.

if($start <= $end): 
    if($start == $end): 
     //Month Day, Year 
     $date = date('F', $start).' '.date('j',$start).', '.date('Y', $start); 
    else: 
     if($start_year == $end_year): 
      if($start_month == $end_month): 

       //Month Day - Day, Year 
       $date = date('F', $start).' '.date('j',$start).' - '.date('j', $end).', '.date('Y', $start); 
      else: 
       //Month Day - Month Day, Year 
       $date = date('F', $start).' '.date('j',$start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $start); 
      endif; 
     else: 
      //Month Day, Year - Month Day, Year 
      $date = date('F', $start).' '.date('j',$start).', '.date('Y', $start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $end); 
     endif; 
    endif; 
endif; 

Respuesta

21

Siempre que necesite para manipular sellos de fecha/hora según la configuración regional, se debe utilizar strftime:

switch ($lang) { 
    case 'en': 
     setlocale(LC_TIME, 'en_CA.UTF-8'); 
     echo strftime("%B %e, %G"); 
     break; 
    case 'fr': 
     setlocale(LC_TIME, 'fr_CA.UTF-8'); 
     echo strftime("%e %B %G"); 
     break; 
} 

Resultados:

February 11, 2011 // en 
11 février 2011 // fr 

Por supuesto, es necesario tener los locales instalados en su sistema. En Ubuntu por ejemplo:

bash-4.1$ sudo locale-gen fr_CA.UTF-8 
+1

Esta es la mejor respuesta IMO. Usando 'date() 'se desmorona cuando intenta usarlo para cualquier cosa que no sean valores numéricos. – Mike

+0

Impresionante ... gracias. Tanto por responder la pregunta como por los detalles sobre cómo instalar una nueva configuración regional –

+0

¿Cómo puede saber el orden en el que estará el% e % B% G de acuerdo con las configuraciones regionales –

8
$date = date('F', $start).' '.date('j',$start).', '.date('Y', $start); 

Esa es una manera bastante doloroso para ir sobre. La cadena de formato en date() no tiene que ser un solo carácter. Esta línea podría reducirse a

$date = date('F j Y'); 

Y dado que, usted podría tener un simple

switch($whats_my_locale) { 
    case 'FR': 
     $format = 'date format characters for a french date'; 
     break 
    case 'EN' : 
     $format = 'format chars for english date' 
     break 
    case etc.... 
    default: 
     $format = 'default date format string here'; 
} 

$local_date_string = date($format, $start); 

y listo.

+0

Esto se ve muy bien, mi pregunta es - en el contexto de formato '$ = 'caracteres de formato de fecha ... fr';' cómo son estas variables (por ejemplo, 'm', 'd ',' M ') etc. siendo redefinido al francés? – Brian

+0

¡Y mis disculpas por ser densas! :( – Brian

+0

La página del manual 'date()' (http://php.net/date) dice que use 'setlocale()' y 'strftime()' para las fechas que no están en inglés. Pero las mismas reglas de formato de cadena básicamente se aplican allí - no tiene que ser un simple char, puede ser una cadena de caracteres de formato. –

0

Estoy seguro de que lo ha hecho, pero ¿ha considerado usar los valores numéricos?

Además, si los usa, recuerde que EE. UU. Tiene meses/día, frente al Reino Unido y otros.

+0

Eso es un pensamiento. Definitivamente espero evitar esto pero me escapó ... lo contaré como un plan de respaldo Gracias, – Brian

+0

Sí, es mejor tener una fecha completa, pero los usuarios definitivamente preferirían una numérica funcional. Diablos, incluso podrías usar una fecha de javascript aleatoria. – JakeSteam

Cuestiones relacionadas