Php多语言日期:如何?

Php多语言日期:如何?,php,datetime,translation,Php,Datetime,Translation,注:这不是一个复制品。我读过了 很抱歉,我首先要解释一下我的框架是如何工作的,这样您才能准确地理解我的问题所在: 下面是我的Php代码的工作原理(大致原理)。让我们以想要查看URLhttp://myweb.com/valid.php: 在文件valid.php中,代码包含正确的类定义,然后创建一个对象并调用显示页面的函数display() 在文件valid.php中,当创建对象时,它分析主机,主机中有语言(http://us.myweb.com/,http://cn.myweb.com/,ht

注:这不是一个复制品。我读过了

很抱歉,我首先要解释一下我的框架是如何工作的,这样您才能准确地理解我的问题所在:

下面是我的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文件,其中的是翻译。这是一个
    翻译
    对象,简称
    $t
  • 从现在起,每当我需要翻译,我都会做一些事情,比如
    $t->get('my_string')
让我们以两种语言文件为例:

  • 两种语言文件:
    cache.us.php
    cache.fr.php
  • cache.us.php
    中,您有这样一行代码:
    $thankforthefish=“thankforthefish”
  • cache.fr.php
    中有这样一行:
    $谢谢你的鱼=“Merci pour le poisson”
  • 我构建我的页面,包括正确的语言文件,然后调用
    $t->get('Thank_for the_fish')
    ,并将其翻译
现在我的问题是日期格式。 对于短日期格式,这不是问题:

  • cache.us.php
    $short\u date\u format=“m/d/Y,H:i”
  • cache.fr.php
    $short\u date\u format=“d/m/YáH:i”
但对于长日期格式,我只是在学习法语,我从以下内容开始:

  • cache.fr.php
    $long\u date\u format=“%s,%d%s%d”
  • 然后是所有的日子:
    $sunday=“dimanche”
    $monday=“lundi”
    等等
  • 然后在我的翻译代码中:
类似这样的内容(仔细阅读代码中的注释,我的问题就在其中!):

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


有什么想法吗?

我是这样做的:除了切换并分别处理每种语言之外,似乎没有其他可能:


以下是我缓存中的内容:

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

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

一个简单的解决方案,请查看,也许它对您有帮助

你应该把工作日的名字分开,翻译成长日期字符串。比如2006年9月1日的
$french_monday';
如果是这样,你会怎么处理英语?阿拉伯语?普通话?对不起,我有点匆忙,所以我可能跳过了一些重要的部分,但是有没有理由不使用PHP
intl
扩展?该类似乎完全符合您的需要。非常感谢您的建议可能是一个有效的选项,我可以请您写一个详细的答案,以便我可以检查它是否有效,以帮助社区吗?非常感谢!非常感谢,我已经安装了此扩展,我将修改我的多语言类以使用此功能强大的工具。
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;
}