2012-07-02 68 views
3

注意:這不是Translating PHP date() for Multilingual Site的重複。我讀過它了!Php多語言日期:howto?

對不起,我首先要解釋一下我的框架是如何工作的,這樣你就可以理解恰恰是我的問題是:

這裏是我的PHP代碼是如何工作的(粗略的原則)。讓我們用一個例子人誰願意看到的網址http://myweb.com/valid.php

  • 文件valid.php代碼中包含正確的類定義,然後創建一個對象,並調用函數display()它顯示的頁面。
  • 文件valid.php,當創建對象,分析了主機,在主機有語言(http://us.myweb.com/http://cn.myweb.com/http://fr.myweb.com/ ...)和默認語言(如果沒有找到)是英語
  • 然後我加載一個緩存的PHP文件,其中是翻譯。這是一個translation對象,那我打電話$t
  • ,從現在起,每當我想要一個翻譯,我只是做這樣的事情$t->get('my_string')

讓我們用2種語言文件的示例:

  • 2種語言文件:cache.us.phpcache.fr.php
  • cache.us.php你有這樣一行:$thanks_for_the_fish = "Thanks for the fish"
  • in cache.fr.php你有這樣一行:$thanks_for_the_fish = "Merci pour le poisson"
  • 我構建了我的頁面,包含正確的語言文件,然後調用$t->get('thanks_for_the_fish')並將其翻譯。

現在我的問題來自日期格式。 短日期格式它不是一個問題:

  • cache.us.php$short_date_format = "m/d/Y, H:i"
  • in 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 
    */ 
} 

...而且我說阿拉伯語,因爲我遲早需要它,普通話也一樣。 我的所有其他翻譯問題都解決了,但這一個!

有什麼想法?

+0

你應該保持平日名及翻譯,並把它們在長日期字符串。例如'$ french_monday。',2006年1月1日';' – egis

+0

如果是這樣,那麼您會如何處理英文?阿拉伯?漢語普通話? –

+1

對不起,我有點匆忙,所以也許我跳過了一些重要的部分,但是有沒有理由不使用PHP的'intl'擴展名? [IntlDateFormatter](http://www.php.net/manual/en/class.intldateformatter.php)類似乎正是你所需要的。 –

回答

4

對於國際化任務,我強烈建議使用PHP intl擴展。它包含幾個用於常見國際化任務的類,如日期/時間格式化,數字格式化,字符串音譯等等。具體而言,IntlDateFormatter類 能夠爲任何可用語言環境格式化(並解析)日期時間。

+0

非常感謝,我已經安裝了這個擴展,我將修改我的多語言類來使用這個令人難以置信的強大工具。 –

0

下面是我已經做到了:它似乎沒有其他比單獨做一個開關和處理每一種語言的可能性:


這裏是什麼在我的緩存:

$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; 
}