5

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

例如,九月:

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

我怎样才能覆盖这个?

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

我刚刚看到,如果我将日期从 this: 翻译8th of September 2011成俄语,它将看起来像这样:8 сентября 2011. 见翻译

所以解决问题的方法可能是重写日期格式。

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

有人可以验证吗?

4

8 回答 8

4

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

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

(假设 $date 是 dmY 格式)

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];
}
于 2012-02-02T19:31:11.903 回答
2

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

于 2016-10-11T10:10:33.797 回答
1

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

在显示月份名称的地方,请尝试:

str_replace("Сентябрь", "Сентября", $month);
于 2011-09-27T10:15:30.997 回答
1

您可以放入一个简单的 if 语句来覆盖月份名称:

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

或者

// Normal if
if ($month_name == "Сентябрь")
{
   echo "Сентября";
}
else
{
   echo $month_name;
}
于 2011-09-27T10:16:19.573 回答
0

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

在 Typo3 中实现@tsabz 的答案需要您对 tslib_content(即 tslib_cObj)进行 xclassing。这可以通过向您添加以下行来完成,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;
    }

}
于 2011-09-27T17:27:00.030 回答
0

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

和客户都是php对的!

问题是您的客户希望在属格中使用月份名称(可能还有所有月份名称),请参阅此页面

您使用的字符串格式化程序不尊重俄语语法:-(不幸的是,这是一件棘手的事情:-(因此,您将不得不实施其他人提供的一些解决方法。

于 2015-04-14T08:56:07.477 回答
0
setlocale(LC_ALL, 'ru_RU.UTF-8');
strftime('%B',strtotime($time));
于 2020-06-21T18:07:05.613 回答
0

每当你用俄语写一个日期时,月份名称必须是遗传的。为了避免弄乱语言环境,我想出了这个解决方案:

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

其中 $datum 是 strtotime 接受的任何格式的日期。PHP 文档
神秘的 'MMMM' 解释了。确保国际扩展已打开。

于 2020-12-07T12:52:51.073 回答