将月份转换为另一种语言


Converting months to another language

我有一个由数据库(oracle)以如下格式返回的日期01-MAY-11:并将月份从英语转换为法语(MAY转换为Mai),我这样做了:

        $date=str_replace("JAN","Janvier",$date);
        $date=str_replace("FEB","Février",$date);
        $date=str_replace("MAR","Mars",$date);
        $date=str_replace("APR","Avril",$date);
        $date=str_replace("MAY","Mai",$date);
        $date=str_replace("JUN","Juin",$date);
        $date=str_replace("JUL","Juillet",$date);
        $date=str_replace("AUG","Août",$date);
        $date=str_replace("SEPT","Septembre",$date);
        $date=str_replace("OCT","Octobre",$date);
        $date=str_replace("NOV","Novembre",$date);
        $date=str_replace("DEC","Décembre",$date);

但是我觉得它很难看,所以有没有更简洁的方法来做到这一点。

谢谢

使用

<?php
setlocale(LC_TIME, 'fr_FR');
echo strftime("%d %b %Y", strtotime($date)); //use your dates timestamp
?>

我将使用数组来存储月份的翻译:

$mc = array("jan"=>"Janvier","feb"=>"Février", ....); //(and so on)
$new_date = explode('-',$date);
$new_date[1] = $mc[strtolower($new_date[1])];
$new_date = implode('-',$new_date);

当然,你需要检查它的日期,并确保月份总是第二个

您必须使用setlocale设置本地设置以获取所需语言的日期月份和日期

这里有一个基本的例子:

// here's a current list of locales you can find on systems for french 
$locales = array('fr_FR.utf8','fr_FR.UTF8','fr_FR.utf-8','fr_FR.UTF-8','fr_FR','fr');
setlocale(LC_TIME,$locales);
//now you can call your localized date function

如果您不想更改应用程序其余部分的区域设置,您可以跟踪当前设置的区域设置,并在调用日期后恢复它,如下所示:

// keep track of locals setting:
$loc = setlocale(LC_TIME,0);
$tmpLoc = setlocale(LC_TIME,$locales);
//your date call here and then restore locale setting
setlocale(LC_TIME,$loc);

虽然语言环境解决方案是最好的,但也可以通过TO_CHARNLS_DATE_LANGUAGE选项直接从Oracle输出:

SELECT TO_CHAR(sysdate, 'DD-MONTH-YYYY', 'NLS_DATE_LANGUAGE=French') FROM DUAL;

OO Style:

<?php
class FrDate extends DateTime 
{
    public function month($format) 
    {
        $english = array('Jan','Febr','Mar','Apr','May','Jun','Jul','Aug','Sept','Oct','Nov','Dec');
        $french = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
        return str_replace($english, $french, parent::format($format));
    }
}
$date = new FrDate('26 Dec 2011');
echo $date->month('M'); //Output: Décembre
?>

一旦你建立了一个查找数组,涉及两种语言,只需使用strtr()应用string tr翻译。

代码(演示):

$enToFr = [
    "JAN" => "Janvier",
    "FEB" => "Février",
    "MAR" => "Mars",
    "APR" => "Avril",
    "MAY" => "Mai",
    "JUN" => "Juin",
    "JUL" => "Juillet",
    "AUG" => "Août",
    "SEPT" => "Septembre",
    "OCT" => "Octobre",
    "NOV" => "Novembre",
    "DEC" => "Décembre"
];
$date = '01-MAY-11';
echo strtr($date, $enToFr);
// 01-Mai-11

如果你知道你需要在项目的多个地方使用它,你可以将它声明为一个常量(因为它在逻辑上不会改变),以享受全局作用域/访问。

因为它是一个单一的本机函数,所以我不建议使用不同的函数名来制作包装器/helper函数来执行相同的过程。