【问题标题】:Localized dropdown with all month names包含所有月份名称的本地化下拉列表
【发布时间】:2016-04-29 09:34:51
【问题描述】:

我正在尝试在 Rails 4 中创建一个包含所有月份的下拉列表。我是这样做的:

<select >
    <% (1..12).each do |month| %>
        <option value="<%= month %>"><%= Date::MONTHNAMES[month] %></option>
    <% end %>
</select>

现在的问题是我想本地化它,但是我不能将 locate 方法应用于带有月份名称的简单字符串。

我该如何解决这个问题?

更新

我知道我可以自己翻译它们,但我希望,因为 Rails 很乐意给我英文名字,如果 Rails 有什么方法可以用其他语言给我的话。

【问题讨论】:

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


    【解决方案1】:

    首先,安装rails-i18n gem。此 gem 包含许多语言环境的本地化数据。请根据 Rails 版本(如 README 中所述)特别注意您安装的 gem 版本。

    接下来,定义您需要在 application.rb 配置中支持的语言环境(如自述文件中所述):

    config.i18n.available_locales = [:cs, :en, :es, :de]
    

    然后,您可以在任何地方简单地使用 I18n.l(即 I18n 的 localize 方法)并使其仅打印给定语言环境中的月份名称(请参阅@987654328 上的更多信息@in the Rails guidesstrftime 用于格式化选项)。

    您需要为此首先生成一年中的日期序列(例如所有月份的第一天)。

    # generate dates for each month in the year
    dates = (1..12).map{|d| Date.parse("#{'%02d' % d}/01") }
    # => [Fri, 01 Jan 2016, Mon, 01 Feb 2016, Tue, 01 Mar 2016, Fri, ..., 01 Nov 2016, Thu, 01 Dec 2016]
    
    # use these dates to get month names in the given locale     
    dates.map{ |d| I18n.l(d, format: "%B", locale: :en) }
    # => ["January", "February", "March", "April", "May", ..., "November", "December"]
    
    dates.map{ |d| I18n.l(d, format: "%B", locale: :de) }
    # => ["Januar", "Februar", "März", "April", "Mai", ..., "November", "Dezember"]
    
    dates.map{ |d| I18n.l(d, format: "%B", locale: :cs) }
    # => ["leden", "únor", "březen", "duben", "květen", ..., "listopad", "prosinec"]
    

    【讨论】:

    • (1..12).map{ |d| Date.parse("#{'%02d' % d}/01").strftime('%B') }
    【解决方案2】:

    I18n.t("date.month_names") 提供一个类似于Date::MONTHNAMES 的数组,其中第一个元素为 nil,但已本地化。

    对于我们想要成对数组的选项:

    I18n.t("date.month_names").drop(1).zip(1..12)
    => [["January", 1], ["February", 2], ["March", 3], ["April", 4], ["May", 5], ["June", 6], ["July", 7], ["August", 8], ["September", 9], ["October", 10], ["November", 11], ["December", 12]]
    

    您可以将其传递给options_for_selectselect

    select(:thing, :month, I18n.t("date.month_names").drop(1).zip(1..12))
    

    【讨论】:

    • 迟到的答案,但我遇到了同样的问题,现有的答案看起来很老套和令人费解。
    • 这可以与包含大量语言本地化的 rails-i18n gem 结合使用。
    • 只是想知道 - 为什么第一个为零?
    【解决方案3】:

    这是我想出的解决方案。这会生成选择列表选项,以月份编号作为值,并使用内置的 Rails 翻译通过I18n 生成正确翻译的月份名称作为文本....全部在一行中!

    (1..12).map {|m| I18n.l(DateTime.parse(Date::MONTHNAMES[m]), format: "%B")}

    【讨论】:

    【解决方案4】:

    但你仍然可以显式调用翻译:

    <option value="<%= month %>"><%= t(Date::MONTHNAMES[month]) %></option>
    

    其中month 是月份数,Date::MONTHNAMES 是一个由虚线和小写月份组成的数组,例如['.january',...],并且您有一个翻译文件:

    config/locales/en.yml

    en:
       :controller:
          :action:
             january: January
    

    :controller 是控制器名称时,:view 是响应视图的操作名称(确切地说是视图名称)。

    【讨论】:

    • 是的,但是我必须手动进行翻译。我希望 Rails 可以为我处理翻译,因为它已经可以给我英文名字了...
    • 嗯,名称是自动提供英文的,所以我想知道是否可以自动获得其他语言的名称。
    • @Dbugger 他们为您创建的任何语言提供了这样的 yaml 记录。
    • @Dbugger 我的意思是只有当这些语言的翻译文件可用时才支持翻译成英语以外的其他语言,并且这些文件通常应该被多次创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多