西班牙语的多元化和单一化

时间:2011-01-05 18:30:33

标签: ruby-on-rails internationalization pluralize singular

抱歉我的英语......

我有一个为西班牙开发的rails应用程序,因此,所有内容都是西班牙语,所以,我有一个搜索框在mysql数据库中搜索,所有行都是西班牙语,我想改进我的搜索以允许用户以单数或复数形式搜索关键字,例如:

keyword: patatas
found: patata

keyword: veces
found: vez

keyword: vez
found: veces

keyword: actividades
found: actividad

在英语中,在单一化和复数化方法的帮助下,这可能相对容易......

where `searching_field` like '%singularized_keyword%' or `searching_field` like '%pluralized_keyword%'

但是,对于西班牙语......

一些帮助?

谢谢!

4 个答案:

答案 0 :(得分:7)

您现在可以定义自己的变形。

查看config / initializers / inflections.rb

基于您的问题的示例

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'patata', 'patatas'
end

因此

"patata".pluralize # => "patatas"
"patatas".singularize #=> "patata"

当然,您需要事先知道关键字列表,以便在config / inflections.rb中使用不规则方法。看看该文件中注释掉的示例。还有其他方法允许使用正则表达式定义规则,您可以设计模式匹配以影响与已知模式匹配的任意关键字的变形。

答案 1 :(得分:5)

您必须清除所有英语默认变形并用西班牙语创建新变体。

添加 config / initializers / inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.clear :all

  inflect.plural /([^djlnrs])([A-Z]|_|$)/, '\1s\2'
  inflect.plural /([djlnrs])([A-Z]|_|$)/, '\1es\2'
  inflect.plural /(.*)z([A-Z]|_|$)$/i, '\1ces\2'

  inflect.singular /([^djlnrs])s([A-Z]|_|$)/, '\1\2'
  inflect.singular /([djlnrs])es([A-Z]|_|$)/, '\1\2'
  inflect.singular /(.*)ces([A-Z]|_|$)$/i, '\1z\2'
end

答案 2 :(得分:4)

答案 3 :(得分:3)

现在似乎可以使用本地化的变形:

# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:es) do |inflect|
  inflect.plural /([^djlnrs])([A-Z]|_|$)/, '\1s\2'
  inflect.plural /([djlnrs])([A-Z]|_|$)/, '\1es\2'
  inflect.plural /(.*)z([A-Z]|_|$)$/i, '\1ces\2'

  inflect.singular /([^djlnrs])s([A-Z]|_|$)/, '\1\2'
  inflect.singular /([djlnrs])es([A-Z]|_|$)/, '\1\2'
  inflect.singular /(.*)ces([A-Z]|_|$)$/i, '\1z\2'
end

使用它(以及重新启动服务器后),您可以使用:

"trebol".pluralize(:es) #=> "treboles"