俄语中的月份名称错误。

5
我正在开发一个网站,我的客户来自俄罗斯。他说新闻中的月份翻译有误。
例如,九月:
我从php中得到:Сентябрь
而他给出的是:Сентября
我该如何覆盖它?
澄清:
当使用区域设置ru_RU时,输出的月份名称将为俄语。但根据我的客户,月份名称是错误的。我不会说俄语,所以我不知道他是对还是错。
我刚刚看到,如果将日期从“2011年9月8日”翻译成俄语,它将变成这样:“8 сентября 2011”。查看翻译
因此,解决问题的方法可能是重写日期格式。
我还没有修复这个问题;显然这是一个由于俄语的高级变格而导致的错误/缺失功能。而且我需要的日期格式并不存在。我认为这会影响strftime和PHP date()。
有人能够验证一下吗?

“我从PHP这里得到了这个,从他那里得到了那个”是什么意思?如果PHP在页面上写入“Сентябрь”,用户将看到“Сентябрь”。它不会神奇地变成“Сентября”。此外,谷歌翻译说http://translate.google.de/?hl=de#ru|en|%D0%A1%D0%B5%D0%BD%D1%82%D1%8F%D0%B1%D1%80%D1%8C%0A。请澄清问题。 - Gordon
当使用区域设置ru_RU时,输出的月份名称将为俄语。但是根据我的客户,月份名称是错误的。我不会说俄语,所以我不知道他是对还是错。 - Patrik
你可以使用 switch 语句来输出正确的月份。 - Mob
8个回答

4

我知道现在可能太晚了,但希望这能为某些人节省时间。

俄语被认为是世界上最难学的语言之一。在这种情况下,正确的变体肯定是“Сентября”。你可以说“现在是九月”(即“现在是 Сенбярь”)。但如果你指的是日期,比如“明天是九月六日”,那么用俄语就应该改成“明天是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];
}

2

虽然现在有点晚了,但是你可以使用一个日期格式化程序来获取“LLLL”,这是一个独立的月份名称。我只是想分享一些我刚刚发现的信息。 :)


1
如果您的客户真的想要“Сентября”,那么一个简单的 str_replace() 就可以完成工作。
在显示月份名称时,请尝试:
str_replace("Сентябрь", "Сентября", $month);

1
一个好的解决方案。然而,当答案发布时,九月即将结束,OP很可能会发布另一个关于十月的问题:)) jk - Luka Ramishvili

1
您可以放置一个简单的if语句来覆盖月份名称:
// Shorthand if
echo $month_name == "Сентябрь" ? "Сентября" : $month_name;

或者

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

0

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

将@tsabz的答案实现到Typo3中需要您扩展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;
    }

}

0

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

php和客户都是正确的!

问题在于您的客户希望月份名称(可能是所有月份名称)处于属格情况,请参见this page

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


0

无论何时你在俄语中写日期,月份名称必须使用属格形式。为了避免与本地化设置混淆,我想出了以下解决方案:

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

$datum是日期,可以使用strtotime接受的任何格式。请参考PHP文档
神秘的'MMMM'解释。确保intl扩展已开启。


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

2
我怀疑这并没有帮助,甚至可能根本不起作用。如果想让我改变看法,请[编辑]并添加说明如何运作以及为什么会有所帮助。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接