setlocale和strftime没有翻译月份

时间:2012-09-24 13:24:21

标签: php date localization locale

我的代码:

setlocale(LC_TIME, 'ca_ES');
echo strftime("%#d %B", strtotime($ticket->date_created));

输出如下内容:

28 August

而不是我的期望:

28 Agost

我期待“Agost”,因为那是加泰罗尼亚语(通过setlocale()设置)。

setlocalestrftime应该如何运作?

仅供参考:我的本地开发机器是Windows 7,设置为locale:en-PH

7 个答案:

答案 0 :(得分:18)

Windows上的区域设置名称不同。看起来它违反了英语。

尝试全长名称(您可以尝试几个,它会选择第一个找到的):

setlocale(LC_TIME, 'ca_ES', 'Catalan_Spain', 'Catalan');

您可以查看此表格,这可能会有所帮助:http://docs.moodle.org/dev/Table_of_locales

答案 1 :(得分:4)

在Ubuntu 14.04上setlocale(LC_TIME, 'de_DE.UTF8');为我提供了获得德语月份格式/名称的技巧:)

答案 2 :(得分:2)

strftime提供日期格式的本地化版本。如果您收到意外结果,很可能您所期望的本地化版本不在您的系统上。

我没有使用Windows的经验,但在我的Debian Linux服务器上,我必须安装我想要的本地化字符串。

答案 3 :(得分:1)

On Debian 9 setlocale(LC_TIME, 'fr_FR.UTF8');为我做了一个很好的法语格式日/月显示工作。确保按以下顺序安装语言环境:

  

apt-get install locales

     

dpkg-reconfigure locales

答案 4 :(得分:1)

您需要在服务器中安装所需的语言环境。

  1. SSH进入您的服务器
  2. 检查安装了哪些语言环境:locale -a
  3. 如果您的语言环境不存在,请安装它:sudo locale-gen ca_ES
  4. 更新服务器中的语言环境:sudo update-locale
  5. 重新启动apache,以使更改生效:sudo service apache2 restart

就是这样!

答案 5 :(得分:0)

对于像我这样的所有人,由于服务器的限制,仍然无法使strftime功能...不完美但是有效。

$months[1] = "gennaio";
$months[2] = "febbraio";
$months[3] = "marzo";
$months[4] = "aprile";
$months[5] = "maggio";
$months[6] = "giugno";
$months[7] = "luglio";
$months[8] = "agosto";
$months[9] = "settembre";
$months[10] = "ottobre";
$months[11] = "novembre";
$months[12] = "dicembre";

// giorni
$weekdays[0] = "domenica";
$weekdays[1] = "lunedì";
$weekdays[2] = "martedì";
$weekdays[3] = "mercoledì";
$weekdays[4] = "giovedì";
$weekdays[5] = "venerdì";
$weekdays[6] = "sabato";

function strftimeIta($format, $timestamp){

    global $weekdays, $months;

    preg_match_all('/%([a-zA-Z])/', $format, $results);

    $originals = $results[0];
    $factors = $results[1];


    foreach($factors as $key=>$factor){
        switch($factor){
            case 'a':
                /*** Abbreviated textual representation of the day ***/
                $n = date('w', $timestamp); // number of the weekday (0 for sunday, 6 for saturday);
                $replace = ucfirst($weekdays[$n]);
                $replace = substr($replace, 0, 3);
                break;
            case 'A':
                /*** Full textual representation of the day ***/
                $n = date('w', $timestamp); // number of the weekday (0 for sunday, 6 for saturday);
                $replace = ucfirst($weekdays[$n]);
                break;
            case 'h':
            case 'b':
                /*** Abbreviated month name ***/
                $n = date('n', $timestamp); // Numeric representation of a month, without leading zeros
                $replace = ucfirst($months[$n]);
                $replace = substr($replace, 0, 3);
                break;
            case 'B':
                /*** Full month name ***/
                $n = date('n', $timestamp); // Numeric representation of a month, without leading zeros
                $replace = ucfirst($months[$n]);
                break;
            default:
                /*** Use standard strftime function ***/
                $replace = strftime("%".$factor, $timestamp);
                break;
        }
        $search = $originals[$key];
        $format = str_replace($search, $replace, $format);
    }
    return $format;
}

答案 6 :(得分:0)

我知道这是一个老问题,但我认为无论如何我都会做出贡献。

如果您可以通过SSH连接到您正在处理的服务器,请写下:locale -a然后您可以看到您的可用语言环境。如果您的语言未列出,则需要安装。

对我来说,我看到了我要找的那个:nb_NO.utf8在列表中,所以我写下了它的编写方式:setlocale( LC_ALL, 'nb_NO.utf8' )这对我有用。