【问题标题】:locale based sorting function in rubyruby 中基于语言环境的排序功能
【发布时间】:2010-05-06 09:14:52
【问题描述】:

对于我的应用程序(Ruby on Rails),我有注册页面的国家/地区选择框。这些国家被本地化为不同的语言。但是我找不到根据本地化语言对它们进行排序的方法。目前,我仅根据英语对其进行了整理。有没有办法根据语言环境对国家名称进行排序?即国家的顺序应根据其本地化的语言而改变(升序)。 谢谢..

【问题讨论】:

标签: ruby-on-rails ruby internationalization


【解决方案1】:

您可以根据给定的字母表制作自定义的String 比较方法,如下所示(适用于 Ruby 1.9):

class String
  # compares two strings based on a given alphabet
  def cmp_loc(other, alphabet)
    order = Hash[alphabet.each_char.with_index.to_a]

    self.chars.zip(other.chars) do |c1, c2|
      cc = (order[c1] || -1) <=> (order[c2] || -1)
      return cc unless cc == 0
    end
    return self.size <=> other.size
  end
end

class Array
  # sorts an array of strings based on a given alphabet
  def sort_loc(alphabet)
    self.sort{|s1, s2| s1.cmp_loc(s2, alphabet)}
  end
end

array_to_sort = ['abc', 'abd', 'bcd', 'bcde', 'bde']

ALPHABETS = {
  :language_foo => 'abcdef',
  :language_bar => 'fedcba'
}

p array_to_sort.sort_loc(ALPHABETS[:language_foo])
#=>["abc", "abd", "bcd", "bcde", "bde"]

p array_to_sort.sort_loc(ALPHABETS[:language_bar])
#=>["bde", "bcd", "bcde", "abd", "abc"]

然后为您想要支持的每种语言提供字母顺序。

【讨论】:

    【解决方案2】:

    不久前 twitter 发布了一个库,它可以很好地在 Ruby 中为多种语言处理它,它实际上可以工作 https://github.com/twitter/twitter-cldr-rb#sorting-collation 。他们提供了一种更高级别的排序方式以及可以仅比较给定语言环境的两个字符串的低级别方式,这也非常好。这让我摆脱了 git://github.com/k3rni/ffi-locale.git 到目前为止我用来以区域设置方式对字符串进行排序。

    【讨论】:

      【解决方案3】:

      也许你可以翻译全部并在翻译后排序。

      【讨论】:

      • 但是,如果语言是中文,如何根据中文排序?
      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 2015-02-03
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多