首页 > 解决方案 > local_time 的国际化(Rails)

问题描述

简单的问题,但很重要。我的视图中有一个字段:@event.start_time我将 local_time 应用于该字段,因为该表默认使用 UTC,但用户可以来自任何地方。

我想将时间从英语翻译成当前用户的语言环境。截至目前,我的领域看起来像<%= local_time(@event.start) %>

我试过<%= I18n.l(local_time(@event.start), format: :long) %>了,显然它不起作用,因为它需要一个日期对象,而不是一个字符串。

请问有人知道怎么处理吗?

谢谢

标签: ruby-on-rails

解决方案


您不能在这里直接使用国际化,local_time gem 支持它,但为此您必须提供翻译集,例如,如果您检查i18n.coffeegem 的文件,您会发现默认的英文翻译集已经添加,同样您可以为别人添加

例子:

LocalTime.config.i18n["es"] = {
  date: {
    dayNames: [ … ],
    monthNames: [ … ],
    …
  },
  time: {
    …
  },
  datetime: {
    …
  }
}

LocalTime.config.locale = "es"

来源: https ://github.com/basecamp/local_time#configuration

另一种选择是,如果您将他们的时区保存在您的数据库中,您可以将 UTC 时间转换为特定时区,然后传递给I18n.l它将以您需要的格式转换时间。为此,您可以Time.zone直接将 设置为用户的时区或使用in_time_zone方法将 UTC 时间转换为用户的时间。要直接设置,您Time.zone可以像这样添加:before_actionApplicationController

before_action :set_time_zone

def set_time_zone
  Time.zone = current_user.time_zone if current_user
end

现在,每当您获取此特定会话的时间时,它都会在用户的时区中返回它,因此您不必每次都转换它。


推荐阅读