【问题标题】:I18n error message of restrict_dependent_destroy: interpolated %{record} is downcase, which is grammatically incorrect in Germanrestrict_dependent_destroy 的 I18n 错误消息:插值 %{record} 是小写的,这在德语中的语法不正确
【发布时间】:2019-09-03 13:49:16
【问题描述】:

我刚刚注意到,activerecord.messages.restrict_dependent_destroy 的 I18n 插入了 %{record} 键,同时使其小写

activerecord:
  errors:
    messages:
      restrict_dependent_destroy:
        one: Cannot delete record because a dependent %{record} exists

变成:

Cannot delete record because a dependent users exists

对于英语,这很好,但对于德语,名词必须以大写开头:

Kann Datensatz nicht löschen, weil abhängige benutzer existieren # Must be "Benutzer"!

如何改变这种行为?

【问题讨论】:

  • 我认为唯一可能的方法是通过猴子修补I18n.interpolate_hash 来评估占位符,以便您可以执行Kann Datensatz nicht löschen, weil abhängige #{record.capitalize} existieren。有一个较旧的问题here 可能是重复的,但我不确定它是否与最新版本的 rails 相关。
  • 另一种可能的解决方案是在您的模型中用I18n.locale == :de ? super.capitalize : super 之类的东西覆盖ActiveModel::Naming#model_name。但这可能只会产生新的问题,因为它不知道上下文。

标签: ruby-on-rails internationalization rails-i18n


【解决方案1】:

建议更改用户的语言环境:

# config/locales/de.yml
de:
  activerecord:
    models:
      user: "Benutzer"

通过这样做,您的翻译应该在上面的代码中使用大写的新翻译。不要忘记重新启动您的 Rails 服务器。

【讨论】:

  • 我认为正确的密钥是de.activerecord.models.user.one。这正是我在我的应用程序中使用它的方式,我希望它能够工作。但事实并非如此。因此提出了这个问题。
【解决方案2】:

问题不在于您的翻译词典。这就是为什么在您的词典中将其更改为大写不起作用的原因。

下面是来自 activerecord-5.1.6 处理函数的代码 sn-ps 用于针对您的特定错误的 has_one 和 has_many 关联,意思是:restrict_dependent_destroy

有一个:

  def handle_dependency
    case options[:dependent]
    when :restrict_with_exception
      raise ActiveRecord::DeleteRestrictionError.new(reflection.name) if load_target

    when :restrict_with_error
      if load_target
        record = owner.class.human_attribute_name(reflection.name).downcase
        owner.errors.add(:base, :'restrict_dependent_destroy.has_one', record: record)
        throw(:abort)
      end

    else
      delete
    end
  end

has_many:

def handle_dependency
    case options[:dependent]
    when :restrict_with_exception
      raise ActiveRecord::DeleteRestrictionError.new(reflection.name) unless empty?

    when :restrict_with_error
      unless empty?
        record = owner.class.human_attribute_name(reflection.name).downcase
        owner.errors.add(:base, :'restrict_dependent_destroy.has_many', record: record)
        throw(:abort)
      end

    when :destroy
      # No point in executing the counter update since we're going to destroy the parent anyway
      load_target.each { |t| t.destroyed_by_association = reflection }
      destroy_all
    else
      delete_all
    end
  end

在这两种情况下,您都可以看到“记录”是通过以下行获得的:

record = owner.class.human_attribute_name(reflection.name).downcase

你说这是你的问题。

覆盖我刚刚在 sn-ps 中显示的特定函数,并从它们的末尾删除.downcase 调用,并且它一定会起作用。

如果您不知道如何覆盖 gem 模块方法,请参阅this 问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多