2016-04-29 3 views
1

私はすべての月をドロップダウンしてRails 4に入れようとしています。すべての月名でローカライズされたドロップダウン

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

問題は今、私はそれをローカライズしたいということですが、私は月の名前を持つ単純な文字列にlocate方法を適用することはできません。私はこのようにそれを行います。

どうすればこの問題を解決できますか?

更新

Railsは私に英語で名前を与えるためにとても親切であるため、Railsはで私にそれを与えることができるどのような方法があった場合、私は彼らに自分自身を翻訳することができます知っているが、私は期待していました他の言語も同様です。

答えて

0

しかし、あなたはまだ明示的に翻訳を呼び出すことができます。

monthは月の数である
<option value="<%= month %>"><%= t(Date::MONTHNAMES[month]) %></option> 

Date::MONTHNAMES['.january',...]のように、点線とdowncasedヶ月の配列であり、そしてあなたが翻訳ファイルを持っている:

のconfig /ロケール/ en.yml

en: 
    :controller: 
     :action: 
     january: January 

whene :controllerはコントローラ名で、:viewはビュー(正確なビュー名)に応答したアクション名です。

+0

はい、その後、手動で翻訳を行う必要があります。とにかくRailsが私のために翻訳を処理してくれるのであれば、私はすでに英語の名前を私に与えることができるので、私は望んでいた。 –

+0

@Dbugger何を手作業で翻訳するのですか? –

+0

名前は自動的に英語で提供されるので、私はそれらを別の言語でも自動的に入手できるかどうか疑問に思っていました。 –

1

まず、rails-i18n gemをインストールします。この宝石には、多くのロケールのローカリゼーションデータが含まれています。 READMEに記載されているように、Railsのバージョンに基づいてインストールする宝石のバージョンを細心の注意を払ってください。

次に、あなたがあなたのapplication.rb設定でサポートする必要があるロケール(として再びREADMEに記載)を定義します。次に

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

を、あなたは、単に(すなわち国際化のlocalize方法I18n.lを使用することができます)を指定し、指定されたロケールで月名のみを出力するようにします(書式設定オプションについては、localizein the Rails guidesstrftimeの詳細を参照してください)。

最初に1年間に一連の日付(たとえば、すべての月の第1日)を生成する必要があります。

# 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

これは私が思いついた解決策です。これにより月の数値を値として選択リストオプションが生成され、I18nを介して組み込みのRails変換を使用して正しく翻訳された月名がテキストとして生成されます。

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

+0

このコードスニペットは問題を解決するかもしれませんが、それがなぜ、どのように問題に答えるかは説明しません。 [あなたのコードの説明を含めてください](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)、本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 **フラッグスタッフ/批評家:** [この1つのコードのみの回答については、downvote、削除しないでください!](// meta.stackoverflow.com/a/260413/2747593) –

1

I18n.t("date.month_names")ちょうど最初の要素としてゼロとDate::MONTHNAMESような配列を与えるが、ローカライズされました。

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)) 
+0

既存の答えはハッキリで渦巻くように見えました。 – max

+0

これは、数多くの言語のローカリゼーションを含む 'rails-i18n' gemと組み合わせることができます。 – max

関連する問題