【问题标题】:I18n.t Translation Missing Default Value NilI18n.t 翻译缺少默认值 Nil
【发布时间】:2016-04-04 20:25:37
【问题描述】:

所以我知道如果在读取 yaml 文件时出现“翻译缺失:”,如何返回默认值。

some = I18n.t("something.something_else", default: "value")

但是,如果我希望默认值为 nil,我该如何以 Ruby 方式执行此操作?我知道我可以正则表达式并匹配变量中的“翻译缺失:”,如果匹配,我会将其分配给 nil。但我想做的是拥有

some = I18n.t("something.something_else", default: nil)

但它只是返回了我缺少的翻译。有谁知道好的方法吗?

【问题讨论】:

    标签: ruby ruby-on-rails-3 yaml rails-i18n


    【解决方案1】:

    :default 不能为零。将值设置为nil 相当于根本不设置选项。

    但是,由于 gem 似乎是 only check whether the key is nil or not,您可以尝试将空字符串作为默认值传递。如果缺少翻译,translate 方法可能会返回一个空字符串。

    some = I18n.t("something.something_else", default: "")
    

    我相信这是您可以获得的更接近的解决方案,除非您定义自定义 translate 方法,该方法在内部查找密钥的存在并在密钥不存在时返回 nil。

    【讨论】:

    • 所以基本上没有翻译缺失时返回 nil 的好方法。感谢您的回答。我不太明白为什么。这是一个实现功能吗?或者只是代码是如何编写的?
    • 您可以添加一个存在检查,这样您就可以确保得到一个翻译后的字符串或返回 nil:some = I18n.t("something.something_else", default: "").presence
    【解决方案2】:

    试试这个some = I18n.t!("something.something_else") rescue nil

    好的,执行rescue nil 是一种不好的做法,但是它又短又可爱:)

    你可以这样做

    def translate(key)
      I18n.t!(key)
    rescue I18n::MissingTranslationData
      nil
    end
    

    那么……

    some = translate("something.something_else")

    【讨论】:

    • 这对于具有大量字符串的应用程序来说不是很有效,因为在解释器级别引发异常并抢救它会产生明显的成本。最好的解决方案是在不触发异常的情况下检查密钥是否存在。
    • 我认为这是一个决定...如果此代码在所使用的上下文中会显着影响性能,我同意您的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多