2016-04-29 5 views
1

Ich versuche, in Rails 4 ein Dropdown mit allen Monaten zu machen. Ich mache es wie folgt aus:Localized Dropdown mit allen Monatsnamen

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

Das Problem ist jetzt, dass ich es lokalisieren möchte, aber ich kann die locate Verfahren auf einfache Strings mit den Namen der Monate keine Anwendung.

Wie könnte ich das lösen?

aktualisieren

Ich weiß, dass ich sie selbst übersetzen kann, aber ich hatte gehofft, da Rails so freundlich ist mir die Namen in Englisch zu geben, wenn es eine Möglichkeit ist, die Rails es mir geben konnten in andere Sprachen auch.

Antwort

0

Sie können aber nach wie vor die Übersetzung explizit aufrufen:

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

wo month eine Reihe von Monat, Date::MONTHNAMES ist ein Array von punktierten und downcased Monate, wie ['.january',...], und Sie haben ein Übersetzungsdateien:

config/locales/en.yml:

en: 
    :controller: 
     :action: 
     january: January 

When :controller ist ein Controller-Name und :view ist eine Aktion Namen reagierte auf Ansicht (genaue Ansicht Name).

+0

Ja, aber dann muss ich manuell die Übersetzung machen. Ich hatte gehofft, wenn Rails sowieso die Übersetzung für mich übernimmt, da es mir schon die Namen in Englisch geben könnte ... –

+0

@Dbugger was meinst du manuelle Übersetzung? –

+0

Nun, die Namen werden automatisch in Englisch bereitgestellt, also habe ich mich gefragt, ob ich sie auch automatisch in anderen Sprachen bekommen könnte. –

1

Zuerst installieren Sie die rails-i18n gem. Dieses Juwel enthält Lokalisierungsdaten für viele Ländereinstellungen. Achten Sie sorgfältig darauf, welche Version des Gems Sie basierend auf der Rails-Version installieren (wie in der README dokumentiert).

Als nächstes definieren Sie die Schauplätze (wie wieder in der Readme beschrieben), die Sie benötigen in Ihrem application.rb Config zu unterstützen:

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

Dann können Sie einfach I18n.l (dh die localize Methode von I18n verwenden) überall und drucken Sie nur den Monatsnamen im angegebenen Gebietsschema (siehe einige weitere Informationen auf localizein the Rails guides und strftime für die Formatierungsoptionen).

Sie müssen zuerst eine Sequenz von Daten (z. B. die ersten Tage aller Monate) in einem Jahr generieren.

# 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

Dies ist die Lösung, die ich mir ausgedacht habe. Dies erzeugt die Auswahllistenoptionen mit der Monatsnummer als Wert und erzeugt den korrekt übersetzten Monatsnamen unter Verwendung der eingebauten Rails-Übersetzungen über I18n als Text .... alles in einer Zeile!

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

+0

Während dieses Code-Snippet das Problem lösen kann, erklärt es nicht, warum oder wie es die Frage beantwortet. Bitte [fügen Sie eine Erklärung für Ihren Code hinzu] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers), da dies wirklich zur Verbesserung der Qualität Ihres Posts beiträgt. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. ** Flaggers/Reviewer: ** [Für Code-only Antworten wie diese, Downvote, nicht löschen!] (// meta.stackoverflow.com/a/260413/2747593) –

1

I18n.t("date.month_names") gibt einen Array wie Date::MONTHNAMES mit Null als das erste Element, aber lokalisiert.

Für die Optionen wollen wir eine Reihe von Paaren:

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]] 

Sie dies options_for_select oder select passieren kann.

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

Späte Antwort, aber ich habe das gleiche Problem und die vorhandenen Antworten schienen hacky und verschachtelt. – max

+0

Dies kann mit dem Juwel 'rails-i18n' kombiniert werden, das Lokalisierungen für viele Sprachen enthält. – max