我试图在Rails 4中提供所有月份的下拉列表。我是这样做的:
<select >
<% (1..12).each do |month| %>
<option value="<%= month %>"><%= Date::MONTHNAMES[month] %></option>
<% end %>
</select>
现在的问题是我想将其本地化,但我不能在简单的字符串上应用locate
方法和月份名称。
我怎么解决这个问题?
更新
我知道我可以自己翻译它们,但我希望,因为Rails非常友好地用英语给我一些名字,如果有任何方式Rails也可以用其他语言给我。
答案 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 guides和strftime
的信息。)
您需要在一年内生成一系列日期(例如,所有月份的第一天)。
# 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_select
或select
。
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
是响应视图的操作名称(完全是视图名称)。