функция сортировки на основе локали в ruby - PullRequest
3 голосов
/ 06 мая 2010

Для моего приложения (Ruby on Rails) у меня есть поле выбора страны для страницы регистрации. Эти страны локализованы на разные языки. Но я не мог найти способ отсортировать их, основываясь на языке, на котором он локализован. В настоящее время я разобрался на основе только на английском языке. Есть ли способ сортировки названий стран по локали? Т.е. порядок стран должен меняться (в порядке возрастания) в соответствии с языком локализации. Спасибо ..

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Вы можете создать собственный метод сравнения 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 голос
/ 11 марта 2014

Некоторое время назад твиттер выпустил библиотеку, которая может прекрасно позаботиться об этом на Ruby для нескольких языков, и она действительно работает https://github.com/twitter/twitter-cldr-rb#sorting-collation.Также очень приятно, что они предоставили более высокий уровень сортировки, а также низкоуровневый, который может просто сравнить две строки для данной локали.Это позволило мне избавиться от git: //github.com/k3rni/ffi-locale.git, который я использовал до сих пор для сортировки строк с учетом локали.

0 голосов
/ 06 мая 2010

Может быть, вы сможете перевести все и отсортировать после этого перевода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...