翻译Rails时区

jpo*_*poz 14 ruby-on-rails internationalization

我们几个月前将我们的网站国际化,但忘记了一个部分:用户选择时区的下拉菜单.

你如何翻译以下行:

  = f.time_zone_select :timezone, ActiveSupport::TimeZone.all
Run Code Online (Sandbox Code Playgroud)

Dav*_*rth 14

我遇到了同样的问题.但是,当我试图实现Peter的解决方案时,我发现了一个更简单的解决方案.该time_zone_select助手需要一个:model选项,该选项默认为ActiveSupport::TimeZone.根据API文档,所有这个模型必须做的是返回all方法中的时区对象数组.然后我们可以覆盖该to_s方法以返回翻译(如果未找到翻译,则默认为原始翻译).这是班级:

# lib/i18n_time_zone.rb
class I18nTimeZone < ActiveSupport::TimeZone
  def self.all
    super.map { |z| create(z.name, z.utc_offset) }
  end

  def to_s
    translated_name = I18n.t(name, :scope => :timezones, :default => name)
    "(GMT#{formatted_offset}) #{translated_name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

在视图中:

<%= time_zone_select :user, :time_zone, nil, :model => I18nTimeZone %>
Run Code Online (Sandbox Code Playgroud)

使用以前在翻译文件中指定的翻译:

# es.yml
es:
  timezones:
    "International Date Line West":    "Línea de fecha internacional del oeste"
    "Pacific Time (US & Canada)":      "Tiempo pacífico (& de los E.E.U.U.; Canadá)"
    # and so on
Run Code Online (Sandbox Code Playgroud)


小智 5

我在这篇文章中提出了一些想法并构建了一个宝石来处理时区翻译.我现在只有en和es翻译,但很容易将它添加到你的应用程序并添加更多的语言环境.只需将其添加到您的Gemfile:

宝石i18n-timezones

你可以在这里获取来源:

https://github.com/onomojo/i18n-timezones