【问题标题】:Rails / I18n: How to translate constants of model?Rails / I18n:如何翻译模型常量?
【发布时间】:2014-12-27 15:11:21
【问题描述】:

如果我有一个带有类似常量的模型

class Topic < ActiveRecord::Base
  STATUS_DISABLED = 0
  STATUS_ENABLED  = 1
end

如何使用语言环境进行翻译?
我想做这样的事情:

en:
 Topic:
   STATUS_ENABLED: 'Enable'
   STATUS_DISABLED: 'Disable'

转换模型常量的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails-4 internationalization translation constants rails-i18n


    【解决方案1】:

    你不能。您的 YAML 文件无法访问 Ruby 级别的常量,它们是两种不同的语言。

    此外,您不应该这样做。常量用于您的源代码。不用翻译,你不妨问问如何本地化类名。

    如果你想将你的符号常量映射到可翻译的字符串,你应该添加一个返回英语(或其他母语)版本的函数,然后翻译那个

    class Topic < ActiveRecord::Base
      STATUS_DISABLED = 0
      STATUS_ENABLED  = 1
    
      def status_name(status)
        case status
        when CASE_DISABLED then 'disabled'
        when CASE_ENABLED then 'enabled'
        end
      end
    end
    

    您的 YAML 文件将包含:

    en:
      topic:
        enabled: 'Enable'
        disable: 'Disable'
    

    如果您有 许多 个值要存储为整数但要转换为字符串,那么您可能需要enum

    class Topic
      enum status: [:disabled, :enabled]
    end
    

    这使您可以访问Topic.statuses,这将返回[:disabled, :enabled];您可以在这些符号上调用to_s 以生成字符串'disabled''enabled',您可以将它们输入I18n 进行翻译。

    【讨论】:

    • 为每个常数做这件事真的很无聊。这里没有技巧吗? :'(
    • 不,再次,问题是您正在尝试翻译常量。你真的不应该。常量是源代码的一个元素,它们不应该需要翻译。如果你有一堆东西想要存储为常量并翻译,你应该使用enum
    • 你能告诉我同样的例子,但有枚举上下文吗?请。
    • 好的,但是我们失去了 CONSTANT 的宗旨:例如,我需要在 BD 中输入值“0”和“1”。 def enable? status == STATUS_ENABLE end 等等...
    • @Matrix 好吧,你不能。你不能同时拥有这两种方式。要么以 RubyRails 方式执行操作,并使用带有enum 的符号,要么不使用。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2014-02-05
    • 2015-04-20
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多