I18n和distance_of_time_in_words_to_now

时间:2013-09-11 21:41:01

标签: ruby-on-rails ruby-on-rails-4 rails-i18n

我正试图让i18n更加优雅地使用distance_of_time_in_words_to_now。

问题是,在英语中,可以说“不到一分钟前”,但在日语中,“1分以内前”不起作用。那个“以前”的翻译基本上不应该存在,但应该在一分钟之后(字符之间没有空格)。

现在我用<%= "#{distance_of_time_in_words_to_now(message.created_at)} #{t(:ago, scope: 'datetime.distance_in_words')}" %>生成该文本,但这对于不同的语言环境是不正确的,所以我想要编写自己的帮助方法来支持这个轻微的i18n问题。

然而,在我这样做之前,我想知道Rails 4中是否已经包含了这样的内容?

我不愿意写自己的原因之一是因为我遇到时区和范围问题:

from_time = Time.zone.now
to_time = t1 + 30
range = t1..t2
range.include? Time.zone.now

返回~/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/time_with_zone.rb:368: warning: Time#succ is obsolete; use time + 1

所以我相信我必须以错误的方式做这件事。 任何人都知道这是否已经在Rails 4中的某个地方内置过,或者如果没有,是否有关于处理时间范围的好方法的任何提示?

1 个答案:

答案 0 :(得分:1)

我用以下代码解决了我的问题,但我认为i18n默认支持这个问题会很好。

def i18n_distance_of_time_in_words_to_now_with_ago(from_time, include_seconds_or_options = {}) 
  ago = t(:ago, scope: 'datetime.distance_in_words')
  langs = [:ja]
  if langs.include? I18n.locale 
    if(from_time..from_time+60).cover? Time.zone.now
      distance_of_time_in_words_to_now(from_time, include_seconds_or_options)
    else
      space = false
    end
  else
    space = true
  end
  "#{distance_of_time_in_words_to_now(from_time, include_seconds_or_options)}#{space ? ' ' : ''}#{ago}"
end