rails 7.days到人类可读的字符串

时间:2013-03-08 17:00:10

标签: ruby-on-rails ruby-on-rails-3

我知道这看起来微不足道,但我要说在Ruby on Rails中

document.expire_in = 7.days

如何打印到期消息的人类可读版本?

"Document will expire in #{document.expire_in}"
=> Document will expire in 7 days

可能适用于I18n.tI18n.l

唯一可行的方法是

7.days.inspect    => " 7天"

这是唯一的方法吗?

我正在查看ActiveSupport::Duratio n并且没有看到答案

THX

3 个答案:

答案 0 :(得分:3)

这不能回答您的具体问题,但在我看来,您最好设置过期的日期时间,然后利用distance_of_time_in_words

如果你总是简单地说7天,为什么不把它写成硬编码的字符串?

答案 1 :(得分:2)

因此Rails中没有内置的解决方案。我决定和

一起去
7.days.inspect => "7 days"

以及稍后,当项目将被翻译时,我将ActiveSupport::Duration扩展一些有意义的内容,以便翻译这些内容

但我建议看看罗伯特对这个问题的评论。我同意在数据库中保持价值的解决方案,例如:" 7天"并从那里做的东西。喜欢翻译单位价值

document = Document.new
document.expire_in = "7 days"

document.translated_day
文档模型(或装饰器)中的

class Document < ActiveRecord::Base
  #....

  def translated_day
    timeline = expire_in.split(' ')
    "#{timeline.first} #{I18n.t("timeline.${timeline.last}")}"
  end
  #..
end


#config/locales/svk.yml
svk:
  timeline:
    days: "dni"

答案 2 :(得分:1)

下面是一个示例,展示了使用ActiveSupport::Duration#parts

的i18n解决方案
duration.parts.map { |unit, n| I18n.t unit, count: n, scope: 'duration' }.to_sentence

可以与以下本地化版本配合使用:

en:
  duration:
    years:
      one: "%{count} year"
      other: "%{count} years"
    months:
      one: "%{count} month"
      other: "%{count} months"
    weeks:
      one: "%{count} week"
      other: "%{count} weeks"
    days:
      one: "%{count} day"
      other: "%{count} days"
    hours:
      one: "%{count} hour"
      other: "%{count} hours"
    minutes:
      one: "%{count} minute"
      other: "%{count} minutes"
    seconds:
      one: "%{count} second"
      other: "%{count} seconds"