错误的月份名称用俄语

时间:2011-09-27 09:46:59

标签: php strftime

我正在网站上工作,我的客户来自俄罗斯。他说,新闻中的月翻译是错误的。

例如,9月:

  • 我从php得到这个:Сентябрь
  • 这是他的:Сентября

我该如何覆盖?

澄清: 使用区域设置ru_RU时,输出的月份名称将为俄语。但据我的客户说,月份的名称是错误的。我不会说俄语,所以我不知道他是对还是错

我刚刚看到,如果我将日期从8th of September 2011翻译成俄语,它将如下所示:8 сентября 2011See the translation

因此问题的解决方案可能是重写日期格式。

我还没有解决这个问题;显然这是一个错误/缺失的功能,因为俄罗斯先前的变化。我需要的日期格式不存在。我认为这会影响strftime和PHP date()

有人可以验证吗?

8 个答案:

答案 0 :(得分:3)

我知道现在为时已晚,但希望可以节省一些人的时间。

俄语被认为是世界上最难的语言。在这种情况下,正确的变体肯定是Сентября。你可以说'现在是九月',那就是'现在是'Сенбярь'。但是,如果您指的是“明天是9月6日”之类的日期,那么将改为“明天是6Сентября”。将语言环境改为ru_RU显然不知道这一点,所以这里有一个简单的解决方案完成这项任务:

(假设$ date是d.m.Y格式)

function russianDate($date){
    $date=explode(".", $date);
    switch ($date[1]){
        case 1: $m='января'; break;
        case 2: $m='февраля'; break;
        case 3: $m='марта'; break;
        case 4: $m='апреля'; break;
        case 5: $m='мая'; break;
        case 6: $m='июня'; break;
        case 7: $m='июля'; break;
        case 8: $m='августа'; break;
        case 9: $m='сентября'; break;
        case 10: $m='октября'; break;
        case 11: $m='ноября'; break;
        case 12: $m='декабря'; break;
    }
    return $date[0].' '.$m.' '.$date[2];
}

答案 1 :(得分:2)

我知道太晚了,但你可以使用带有“LLLL”的日期格式化程序,它是一个独立的月份名称。只想分享我刚发现的一条信息。 :)

答案 2 :(得分:1)

如果您的客户真的想要“Сентября”,那么简单的str_replace()就可以完成这项工作。

在显示月份名称的位置,请尝试:

str_replace("Сентябрь", "Сентября", $month);

答案 3 :(得分:1)

您可以使用简单的if语句来覆盖月份名称:

// Shorthand if
echo $month_name == "Сентябрь" ? "Сентября" : $month_name;

// Normal if
if ($month_name == "Сентябрь")
{
   echo "Сентября";
}
else
{
   echo $month_name;
}

答案 4 :(得分:0)

@ tsabz的答案可能是解决方案,因为错误在PHP内部。那,或者俄罗斯有某种方言需要设置。

在Typo3中实现@ tsabz的答案需要你xclassing tslib_content(即tslib_cObj)。这可以通过在typo3conf/localconf.php内的自定义扩展程序中向您typo3conf/ext/your_ext/ext_localconf.php或更好地添加以下行来完成:

$GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['tslib/class.tslib_content.php']                  = PATH_typo3conf.'ext/your_ext/xclass/class.ux_tslib_content.php';

然后创建文件typo3conf/ext/your_ext/xclass/class.ux_tslib_content.php并输入以下内容:

<?php
class ux_tslib_cObj extends tslib_cObj {
    /**
     * date
     * Will return a formatted date based on configuration given according to PHP date/gmdate properties
     * Will return gmdate when the property GMT returns true
     *
     * @param   string      Input value undergoing processing in this function.
     * @param   array       stdWrap properties for date.
     * @return  string      The processed input value
     */
    public function stdWrap_date($content = '', $conf = array()) {
        $content = parent::stdWrap_date($content, $conf);
        $content = str_replace("Сентябрь", "Сентября", $content);
        return $content;
    }

}

答案 5 :(得分:0)

我知道它有点晚了,但其他人也可能会遇到这个问题,所以可能仍然值得回答。来自@hraban的答案最接近于解释它,所有其他答案仅提供(部分不满意)解决方法:

php和客户都是正确的!

问题在于您的客户需要使用季度案例中的月份名称(可能还有所有月份名称),请参阅this page

你正在使用的字符串格式化程序不尊重俄语语法:-(不幸的是,这是一个棘手的事情:-(因此,你必须实现一些解决方法,如其他人提供的。

答案 6 :(得分:0)

setlocale(LC_ALL, 'ru_RU.UTF-8');
strftime('%B',strtotime($time));

答案 7 :(得分:0)

每当您用俄语写一个日期时,一个月的名字都必须有泛音。为了避免弄乱设置语言环境,我想出了以下解决方案:

$monthGenetive = 
   (new \IntlDateFormatter(
   'ru_RU', 
   \IntlDateFormatter::FULL, 
   \IntlDateFormatter::FULL, 
   'Europe/Moscow', 
   \IntlDateFormatter::GREGORIAN, 
   'MMMM'))->format(new \DateTime('@' . strtotime($datum)));

其中$ datum是strtotime可接受的格式的日期。 PHP docs
mysterious 'MMMM' expained。确保打开了国际扩展名。