ruby-on-rails I18n用JSON插值

mwg9r5ms  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(126)

我的en.yml中有以下文本

update_message: "The user updated device's name to <b>%{name}</b>"

字符串
我有下面的json对象

{ "user": { "id": 1, "name: "Wagner Junior" } }


服务会以与往常相同的方式动态解析插值:

t('update_message', json_object)


但没成功
我想用json对象中的name属性替换update_message中的%{name},类似于user/nameuser.nameuser>name等。我不能使用json_object['name'],因为我会有其他消息接收json对象。
我试过用不同的方法来做这个插值没有成功。

ybzsozfc

ybzsozfc1#

Rails希望插值值是一个平坦的哈希,而不是一个嵌套的哈希,所以你可以尝试这样做:
第一个月
如果您有多个深度级别,并且可能未知,您可能想要展平您的哈希值,以接收可以使用的{"user_id" => 1, "user_name" => "Wagner Junior"}
关于
我不能使用json_object ['name'],因为我会有其他消息接收json对象。
您没有指定其他JSON对象是什么,它们看起来如何,以及它们与其他消息的关系。这里有一个大致的想法:

def translate_with_json(key, json)
  if key == 'update_message'
    name = json['user']['name']
  elsif key == 'another_message'
    name = json['another']['name']
  else 
    ...
  end
  t(key, name: name)
end

字符串

7gyucuyw

7gyucuyw2#

我想用json对象中的name属性替换update_message中的%{name},kind user/name,user.name,user>name等。我不能使用json_object ['name']**,因为我会有其他消息接收json对象。
假设你的案子取决于上下文。然后你可以写一个函数(例如方法),它将接受上下文和对象,并返回相应的值用于I18 n转换:f(context,object)=> value

f = ->(context, obj) { ... }
name = f.call(context1, { user: { id: 1, name: 'Wagner Junior' } })
=> 'Wagner Junior'
t('update_message', name: name)
=> "The user updated device's name to <b>Wagner Junior</b>"

name = f.call(context2, { user: [:id, 1, :name, 'Wagner Junior'] })
=> 'Wagner Junior'
t('update_message', name: name)
=> "The user updated device's name to <b>Wagner Junior</b>"

字符串
但仅用于知道上下文是什么以及应该如何执行来自上下文的值的计算。

相关问题