Fecha Php multilenguaje: ¿cómo?

Nota: esto no es un duplicado de la traducción de PHP date () para el sitio multilingüe . ¡Lo he leído!

Lo siento, primero tengo que explicar cómo funciona mi marco, para que pueda entender con precisión dónde está mi problema:

Así es como funciona mi código Php (principios básicos). Usemos como ejemplo a alguien que quiera ver la URL http://myweb.com/valid.php :

  • en el archivo valid.php el código incluye la definición correcta de clases, luego crea un objeto y llama a la display() función display() que muestra la página.
  • en el archivo valid.php , cuando se crea el objeto, analiza el host, y en el host está el idioma ( http:// us .myweb.com/ , http:// cn .myweb.com/ , http:// fr .myweb.com/ …) y el idioma predeterminado (si no se encuentra ninguno) es inglés
  • luego cargué un archivo Php en caché donde están las traducciones. Este es un objeto de translation , que estoy llamando $t para abreviar
  • y de ahora en adelante, siempre que quiera una traducción, simplemente hago cosas como $t->get('my_string') .

Tomemos un ejemplo con un archivo de 2 idiomas:

  • 2 archivos de idiomas: cache.us.php y cache.fr.php
  • en cache.us.php tienes una línea como esta: $thanks_for_the_fish = "Thanks for the fish" .
  • en cache.fr.php tiene una línea como esta: $thanks_for_the_fish = "Merci pour le poisson" .
  • Construyo mi página, $t->get('thanks_for_the_fish') archivo de idioma correcto y luego llamo $t->get('thanks_for_the_fish') y se traduce.

Ahora mi problema viene con el formato de fecha. Con formato de fecha corta no es un problema:

  • en cache.us.php : $short_date_format = "m/d/Y, H:i" .
  • en cache.fr.php : $short_date_format = "d/m/Y à H:i" .

Pero con el formato de fecha larga , estoy trabajando en francés y comencé con algo como:

  • en cache.fr.php : $long_date_format = "%s, %d %s %d" .
  • luego todos los días: $sunday = "dimanche" , $monday = "lundi" y así sucesivamente
  • luego en mi código de traducción:

Algo como esto (lea atentamente el comentario en el código, ¡mi pregunta está en él!):

 static private $_TabStrDaysOfWeek = array( 0 => 'sunday', 1 => 'monday', ..., 6 => 'saturday' ); public function translateDate($date_time) { $long_day = $this->tr->get( $this->_TabStrDaysOfWeek[ $date_time->format('w') ] ); /* here's where I'm stuck: what could be the code to be able to display: - english: Monday, 1st September 2006 Tuesday, 2nd September 2006 Wednesday, 3rd September 2006 Thursday, 4th September 2006 - french: Lundi, 1 septembre 2006 Mardi, 2 septembre 2006 Mercredi, 3 septembre 2006 Jeudi, 4 septembre 2006 - arabian!!: 1 - Don't know 2 - Don't know 3 - Don't know 4 - Don't know */ } 

… Y dije árabe porque lo necesitaré tarde o temprano, lo mismo para chino mandarín. Todos mis otros problemas de traducción están resueltos, ¡pero este!

¿Alguna idea?

Para las tareas de internacionalización, recomiendo usar la extensión PHP intl . Contiene varias clases para tareas comunes de internacionalización, como el formato de fecha / hora, formato de número, transliteración de cadenas y más. Específicamente, la clase IntlDateFormatter puede formatear (y analizar) una fecha y hora para cualquier configuración regional disponible.

Así es como lo hice: parece que no hay otra posibilidad más que hacer un cambio y manejar cada idioma por separado:


Esto es lo que hay en mi caché:

 $this->jour_dimanche = dimanche $this->jour_lundi = lundi $this->jour_mardi = mardi $this->jour_mercredi = mercredi $this->jour_jeudi = jeudi $this->jour_vendredi = vendredi $this->jour_samedi = samedi $this->mois_janvier = janvier $this->mois_fevrier = février $this->mois_mars = mars $this->mois_avril = avril $this->mois_mai = mai $this->mois_juin = juin $this->mois_juillet = juillet $this->mois_aout = août $this->mois_septembre = septembre $this->mois_octobre = octobre $this->mois_novembre = novembre $this->mois_decembre = décembre // long date format = 'day, (month number) (month) (year)' // '%s, %d %s %d' => 'Mardi, 2 juillet 2012' $this->date_format_long = %\s, j %\s Y à H:i 

… Y mi código Php:

 public function translateDate($date_time, $first_upcase=true) { switch ($this->_trad->getLang()) { /* TODO: all other languages */ case 'us': case 'ar': case 'es': case 'cn': throw new Exception("not handled yet"); break; default: /* default = french */ $day = $this->_trad->get( self::$_TabStrDaysOfWeek[ $date_time->format('w') ] ); $month = $this->_trad->get( self::$_TabStrMonths[ $date_time->format('j') ] ); $ret = sprintf( $date_time->format( $this->_trad->get('date_format_long') ), $day, $month ); if ($first_upcase) { $ret = ucfirst($ret); } break; } return $ret; } 

Una solución simple para ti, échale un vistazo quizás te ayude https://github.com/LeonardoCaitano/MyDateTime