2012-07-02 69 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; 
}