options_for_select和i18n

时间:2019-01-19 19:48:26

标签: ruby-on-rails internationalization

我们的Rails应用程序具有存储在数组中的有效语言代码列表。

LANGUAGES = [:en,:fr,:es,:tr,:pt,:de,:it,:ga,:gr]

通过语言环境文件翻译。

  en: 'English'
  de: 'German'
  ga: 'Irish'
  fr: 'French'
  etc.

我想在options_for_select中显示转换后的字符串,但是此代码会将转换后的值传递给控制器​​,例如:“法语”。

<%= f.select :language, options_for_select(t(LanguageName::LANGUAGES), f.object.language || t('fr')) %>

请注意,只有在尚未填充此选择时,该选择才会默认为“ fr”。

1 个答案:

答案 0 :(得分:1)

请参阅此处的文档:https://apidock.com/rails/v3.2.8/ActionView/Helpers/FormOptionsHelper/options_for_select

options_for_select({ "Basic" => "$20", "Plus" => "$40" }, "$40")
  <option value="$20">Basic</option>\n<option value="$40" selected="selected">Plus</option>

假设您的语言环境文件中的语言名称如下:

en:
  languages:
    en: 'English'
    de: 'German'
    ga: 'Irish'
    fr: 'French'

我在想您需要的是以下内容:

f.select :language, options_for_select(
  LanguageName::LANGUAGES.map { |lang| [t("languages.#{lang}"), lang] }.to_h
  f.object.language || t('languages.fr')
)

当然最好将方法提取到帮助文件中:

class ApplicationHelper
  def map_locale_names(locale)
    LanguageName::LANGUAGES.map { |lang| [t("languages.#{lang}", locale: locale), lang] }.to_h
  end
end

这样您的方法将变为以下内容:

f.select :language, options_for_select(
  map_locale_names(locale: params[:locale]),
  f.object.language || t('languages.fr')
)

希望这会有所帮助。