代码之家  ›  专栏  ›  技术社区  ›  port5432 Feather

用于选择和i18n的选项

  •  0
  • port5432 Feather  · 技术社区  · 6 年前

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

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

    通过区域设置文件转换。

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

    我想将翻译后的字符串显示在 options_for_select 但此代码正在将转换后的值传递给控制器,例如:“French”。

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

    请注意,仅当尚未填充时,此选择将默认选择为“fr”。

    1 回复  |  直到 6 年前
        1
  •  1
  •   yihyang    6 年前

    参考本文: 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')
    )
    

    希望这有帮助。