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/
…), а язык по умолчанию (если не найден) – английский 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 */ }
… И я сказал, что арабский, потому что мне это понадобится рано или поздно, то же самое для китайского мандарина. Все мои другие проблемы перевода решены, но этот!
Есть идеи?
Для задач интернационализации я настоятельно рекомендую использовать расширение 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