在Rails中使用i18n在选择框中按字母顺序排列国家/地区名称

时间:2013-10-05 06:31:12

标签: ruby-on-rails ruby-on-rails-3 rails-i18n i18n-gem

即时通过使用rails和i18n编写应用程序,我已经在6个lenguajes中翻译了各个国家/地区,并且它们都在每个自己的yml文件中,包含所有其他lenguaje内容..

我的问题是我如何订购,并根据语言重新排序(英语,西班牙语,法语,阿拉伯语,中文,葡萄牙语)

我想我可以设置一个代码来订购这个列表吗? ,但是怎么样?

{|p| [ t("generales."+p.iso), p.id ] }

这是我的视图中的代码,其中该行是

  <div >
 <%= f.fields_for :citizens do |citizen_form| %>

    <div>
      <%= citizen_form.label  :citizen, t('generales.citizen')  %>
      <%= citizen_form.select :country_id , Country.all.collect {|p| [ t("generales."+p.iso), p.id ] }, { :include_blank => true } , { :class => 'pca33' } %>
      <div id="delerr"><%= citizen_form.link_to_remove t('generales.delete') %></div>
    </div>

  <% end %>

  <%= f.link_to_add t('generales.add'), :citizens %>
  </div>

这是模型

class Citizen < ActiveRecord::Base
  attr_accessible  :country_id

  belongs_to :player
  belongs_to :country
end

在en.yml文件中我喜欢这个翻译,它在数据库中查找iso,因此您可以看到该列表基于iso。

AF: 'Afghanistan'
    AL: 'Albania'
    DZ: 'Algeria'
    AD: 'Andorra'
    AO: 'Angola'
    AG: 'Antigua and Barbuda'
    AR: 'Argentina'
    AM: 'Armenia'
    AU: 'Australia'
    AT: 'Austria'
    AZ: 'Azerbaijan'
    BS: 'Bahamas'
    BH: 'Bahrain'
    BD: 'Bangladesh'
    BB: 'Barbados'
    BY: 'Belarus'
    BE: 'Belgium'
    BZ: 'Belice' 

1 个答案:

答案 0 :(得分:2)

使用sort_by对列表进行排序,使用iconv忽略重音字符:

require 'iconv'
...

@countries = Country.all.collect {|p| [ t("generales."+p.iso), p.id ] }
@countries = @countries.sort_by {|label,code| Iconv.iconv('ascii//ignore//translit', 'utf-8', label).to_s}

通常这段代码放在控制器或帮助器中,而不是直接放在视图中。