3

注意:这不是Translating PHP date() for Multilingual Site的副本。我已经读过了!

对不起,我首先要解释一下我的框架是如何工作的,这样你就可以准确地理解我的问题出在哪里:

这是我的 PHP 代码的工作原理(粗略的原则)。让我们以一个想查看 URL 的人为例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".
  • 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"等等
  • 然后在我的翻译代码中:

像这样的东西(仔细阅读代码中的注释,我的问题就在里面!):

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

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

任何的想法?

4

3 回答 3

4

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

于 2012-07-04T18:12:33.483 回答
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;
}
于 2012-07-02T09:41:23.480 回答
0

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

于 2013-09-08T19:07:11.993 回答