【问题标题】:Wrong month name in russian俄文月份名称错误
【发布时间】:2011-11-25 21:35:54
【问题描述】:

我正在开发一个网站,而我的客户来自俄罗斯。他说新闻里的月份翻译是错误的。

例如,九月:

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

我怎样才能覆盖它?

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

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

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

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

有人可以验证吗?

【问题讨论】:

  • 你说的“我从 PHP 和他那里得到这个”是什么意思。如果 PHP 将 Сентябрь 写入页面,用户会看到 Сентябрь。它不会神奇地变成Сентября。此外,谷歌翻译说translate.google.de/…。请澄清问题。
  • 使用区域设置 ru_RU 时,输出的月份名称将是俄语。但根据我的客户的说法,月份的名称是错误的。我不会说俄语,所以我不知道他是对是错。
  • 您可以使用 switch 语句来回显正确的月份。

标签: php strftime


【解决方案1】:

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

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

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

【讨论】:

  • 一个很好的解决方案。但是,当发布答案时,九月底已经临近,OP 很可能会发布另一个关于 октябрь/октября(十月)的问题 :)) jk
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    @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;
        }
    
    }
    

    【讨论】:

      【解决方案4】:

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

      俄语被认为是世界上最难的语言。在这种情况下,正确的变体绝对是Сентября。您可以说“现在是九月”,即“现在是 Сенбярь”。但是,如果您指的是诸如“明天是 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].'&nbsp;'.$m.'&nbsp;'.$date[2];
      }
      

      【讨论】:

        【解决方案5】:

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

        php和客户都是对的!

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

        您使用的字符串格式化程序不遵守俄语语法 :-( 不幸的是,这是一件棘手的事情 :-( 因此,您必须按照其他人的规定实施一些解决方法。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:
            setlocale(LC_ALL, 'ru_RU.UTF-8');
            strftime('%B',strtotime($time));
            

            【讨论】:

            • 我怀疑这是否有帮助,甚至根本没有用。否则,请edit 说服我,并解释它是如何工作的以及为什么它应该有所帮助。
            【解决方案8】:

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

            $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' explained。确保国际扩展已打开。

            【讨论】:

              猜你喜欢
              • 2023-03-24
              • 1970-01-01
              • 1970-01-01
              • 2017-02-19
              • 1970-01-01
              • 1970-01-01
              • 2011-03-12
              • 1970-01-01
              相关资源
              最近更新 更多