所有月份名称的本地化下拉列表

时间:2016-04-29 09:34:51

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

我试图在Rails 4中提供所有月份的下拉列表。我是这样做的:

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

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

我怎么解决这个问题?

更新

我知道我可以自己翻译它们,但我希望,因为Rails非常友好地用英语给我一些名字,如果有任何方式Rails也可以用其他语言给我。

4 个答案:

答案 0 :(得分:2)

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

接下来,在application.rb配置中定义需要支持的语言环境(在README中再次描述):

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

然后,您只需在任意位置使用 I18n.l (即I18n的localize方法),并使其仅打印给定区域设置中的月份名称(请参阅更多内容)有关格式化选项的localize 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 :(得分: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))

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

但你仍然可以明确地调用翻译:

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

其中month是月份的数字,Date::MONTHNAMES是一系列虚线和下行月份,如['.january',...],您有翻译文件:

<强>配置/区域设置/ en.yml

en:
   :controller:
      :action:
         january: January

whene :controller是控制器名称,:view是响应视图的操作名称(完全是视图名称)。