【问题标题】:pluralize and singularize for spanish language西班牙语的复数和单数
【发布时间】:2026-01-14 23:00:02
【问题描述】:

对不起我的英语......

我有一个在西班牙开发的 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%'

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

一些帮助?

谢谢!

【问题讨论】:

    标签: ruby-on-rails internationalization pluralize singular


    【解决方案1】:

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

    查看 config/initializers/inflections.rb

    基于您的问题的示例

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

    因此

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

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

    【讨论】:

      【解决方案2】:

      您必须清除所有默认的英语屈折变化并创建新的西班牙语。

      添加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
      

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 为找到解决方案而欢呼。最好在这个网站上放置(至少一些!)答案,因为外部链接很容易中断
        【解决方案4】:

        现在似乎可以使用局部变形:

        # 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"
        

        【讨论】:

        • 请注意,以 s 结尾的急性 (agudas) 词,如具有这些规则的“危机”。