Php多语言日期:howto?

时间:2012-07-02 09:06:41

标签: php datetime translation

Nota:这不是Translating PHP date() for Multilingual Site的副本。我看过了!

对不起,我首先要解释一下我的框架是如何工作的,这样你才能准确理解我的问题所在:

以下是我的Php代码的工作原理(粗略原则)。让我们使用一个想要查看网址http://myweb.com/valid.php

的人
  • 在文件valid.php中,代码包含正确的类定义,然后创建一个对象并调用显示页面的函数display()
  • 在文件valid.php中,创建对象时,它会分析主机,并在主机中有语言(http:// us {{ 1}},.myweb.com/ http:// cn.myweb.com/ http:// fr。 ..)和默认语言(如果没有找到)是英语
  • 然后我加载一个缓存的Php文件,其中是翻译。这是一个.myweb.com/对象,我简称 translation
  • 从现在开始,每当我想要翻译时,我只会做$t
  • 之类的事情

让我们以2种语言文件为例:

  • 2种语言文件:$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')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"

...我说阿拉伯语因为我迟早需要它,对普通话来说也是如此。 我所有的其他翻译问题都解决了但是这个问题!!

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

对于国际化任务,我强烈建议您使用PHP intl扩展名。它包含几个用于常见国际化任务的类,例如日期/时间格式,数字格式,字符串音译等。具体来说,IntlDateFormatter类 能够格式化(和解析)任何可用语言环境的日期时间。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

一个简单的解决方案,查看它可能对您有所帮助 https://github.com/LeonardoCaitano/MyDateTime