Php многоязычная дата: howto?

Nota: это не дубликат перевода даты PHP () для многоязычного сайта . Я прочитал его!

Извините, мне сначала нужно объяснить, как работает моя инфраструктура, поэтому вы можете точно понять, где моя проблема:

Вот как работает мой PHP-код (грубые принципы). Давайте используем для примера того, кто хочет увидеть URL http://myweb.com/valid.php :

  • в файле valid.php код включает определение правильных классов, затем создайте один объект и вызовите функцию display() которая отображает страницу.
  • в файле valid.php , когда объект создан, он анализирует хост, а на хосте есть язык ( http:// us .myweb.com/ , http:// cn .myweb.com/ , http:// .myweb.com/ …), а язык по умолчанию (если не найден) – английский
  • то я загружаю файл с кешем Php, где есть переводы. Это объект translation , который я называю $t для краткости
  • и с этого момента, когда мне нужен перевод, я просто делаю такие вещи, как $t->get('my_string') .

Возьмем пример с файлом из двух языков:

  • Файлы с двумя языками: cache.us.php и cache.fr.php
  • в cache.us.php вас есть строка вроде этого: $thanks_for_the_fish = "Thanks for the fish" .
  • в cache.fr.php вас есть строка вроде этого: $thanks_for_the_fish = "Merci pour le poisson" .
  • Я $t->get('thanks_for_the_fish') свою страницу, включаю правильный файл языка, а затем звоню $t->get('thanks_for_the_fish') и переводится.

Теперь моя проблема связана с форматированием даты. С коротким форматом даты это не проблема:

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

Но с длинным форматом даты, я просто работаю на французском языке, и я начал с чего-то вроде:

  • в cache.fr.php : $long_date_format = "%s, %d %s %d" .
  • затем все дни: $sunday = "dimanche" , $monday = "lundi" и т. д.
  • то в моем коде перевода:

Что-то вроде этого (внимательно прочитайте комментарий в коде, мой вопрос в нем!):

 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 */ } 

… И я сказал, что арабский, потому что мне это понадобится рано или поздно, то же самое для китайского мандарина. Все мои другие проблемы перевода решены, но этот!

Есть идеи?

Related of "Php многоязычная дата: howto?"

Для задач интернационализации я настоятельно рекомендую использовать расширение PHP intl . Он содержит несколько классов для общих задач интернационализации, таких как форматирование даты и времени, форматирование чисел, транслитерация строк и многое другое. В частности, класс IntlDateFormatter способен форматировать (и анализировать) дату и время для любого доступного языкового стандарта.

Вот как я это сделал: кажется, что нет никакой возможности, кроме переключения и обработки каждого языка отдельно:


Вот что в моем кеше:

 $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 

… И мой код 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; } 

Простое решение для вас, проверьте это, возможно, это поможет вам https://github.com/LeonardoCaitano/MyDateTime