2012-09-09 3 views
10

У меня возникли проблемы с использованием I18n.translate для перевода массива.Rails: как i18n массив строк?

В частности, у меня есть этот массив,

module TaskEnums 
    OCTAVE_BANDS = [:hz63, :hz125, :hz250, :hz500, :hz1000, :hz2000, :hz4000, :hz8000, :hz16000] 
end 

и у меня есть следующий перевод в файле YAML.

en: 
    TaskEnums: 
    OCTAVE_BANDS: 
     hz63: "63 Hz" 
     hz125: "125 Hz" 
     hz250: "250 Hz" 
     hz500: "500 Hz" 
     hz1000: "1000 Hz" 
     hz2000: "2000 Hz" 
     hz4000: "4000 Hz" 
     hz8000: "8000 Hz" 
     hz16000: "16000 Hz" 

На мой взгляд, я хотел бы отобразить выпадающее меню, которое позволяет пользователям выбирать частоту.

<%= form_for(@task) do |f| %> 
    <%= f.select :frequency, TaskEnums::OCTAVE_BANDS %> 
<% end %> 

Я знаю, что могу перевести отдельные символы с t :symbol, но этот подход не похоже на работу с массивами (например t TaskEnums::OCTAVE_BANDS не делать то, что мне нужно).

Кто-нибудь знает, как я могу перевести массив OCTAVE_BANDS, чтобы переводы отображались в выпадающем меню? Кажется, что это должна быть общая проблема, поэтому я предполагаю (и надеюсь!), Что есть простое решение ... может ли кто-нибудь предложить, как это сделать?

Большое спасибо,

D. Опция

ответ

17

Использование scope для вашего I18n.t вызова: ответ

t TaskEnums::OCTAVE_BANDS, scope: 'TaskEnums.OCTAVE_BANDS' 
# => ["63 Hz", "125 Hz", "250 Hz", "500 Hz", "1000 Hz", "2000 Hz", "4000 Hz", "8000 Hz", "16000 Hz"] 
+1

Отлично, спасибо! Для записи я обнаружил, что мне нужно включить круглые скобки, чтобы сделать эту работу в представлении, например. 't (TaskEnums :: OCTAVE_BANDS, scope: 'TaskEnums.OCTAVE_BANDS')', но я думаю, это очевидно для более опытных рубистов. Очень признателен. :) –

2

JDoe работал для меня! Я использовал это в поле ввода формы.

f.input :state, as: :radio, collection: t(Model.states.map(&:name), scope: 'attributes.states')