我正在网站上工作,我的客户来自俄罗斯。他说,新闻中的月翻译是错误的。
例如,9月:
Сентябрь
Сентября
我该如何覆盖?
澄清:
使用区域设置ru_RU
时,输出的月份名称将为俄语。但据我的客户说,月份的名称是错误的。我不会说俄语,所以我不知道他是对还是错
我刚刚看到,如果我将日期从8th of September 2011
翻译成俄语,它将如下所示:8 сентября 2011
。 See the translation
因此问题的解决方案可能是重写日期格式。
我还没有解决这个问题;显然这是一个错误/缺失的功能,因为俄罗斯先前的变化。我需要的日期格式不存在。我认为这会影响strftime
和PHP date()
。
有人可以验证吗?
答案 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。确保打开了国际扩展名。