2010-05-06 64 views
3

對於我的應用程序(Ruby on Rails),我有註冊頁面的國家/地區選擇框。這些國家被本地化爲不同的語言。但我無法找到一種方法來對其進行排序,基於其本地化語言。目前我已經根據英文對其進行了整理。有沒有辦法根據語言環境對國家名稱進行排序?即國家的順序應根據其本地化的語言而改變(升序)。 謝謝..ruby​​中基於區域設置的排序功能

+0

可能重複:http://stackoverflow.com/questions/2360281/alphabetize-arabic-and-japanese-text-that-is-in-unicode – 2010-05-09 23:58:49

回答

-1

也許你可以翻譯全部並在此翻譯後對其進行排序。

+0

但是,如果lang是中文,那麼應該如何對它進行排序對中國人? – anusuya 2010-05-06 12:26:24

3

您可以自定義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"] 

然後你要支持每一種語言提供按字母順序排列的訂單。

1

某個時間以前,twitter發佈了一個庫,可以在Ruby中很好地處理多種語言,它實際上可以工作https://github.com/twitter/twitter-cldr-rb#sorting-collation。他們也提供了更高層次的排序方法以及低層次的方法,只需比較給定語言環境中的兩個字符串,這也是非常好的。這讓我擺脫了git://github.com/k3rni/ffi-locale.git,到目前爲止我已經使用了一種可識別語言環境的字符串排序方式。