从一个对象的所有字符串添加一个调用函数

时间:2016-03-11 07:45:03

标签: javascript string internationalization

我有一个与此类似的语言环境对象:

cf push <app_name> -c "<original_command> ;sleep 1d"

我想添加一个函数,它只是简单地返回一个sprintf'ed版本的字符串,该字符串被“调用”来自对象,可以像L = { message: { hello: "Hello %s!", goodbye: "Farewell %s!" } error: { notfound: { title: "Can't find %s!", text: "But just where did I put it?" } } } 一样使用,这与某些魔法会像{{return L.message.hello("Ivan")一样1}}。

经过一番研究,我知道这一点:

  • PHP-i18n借助于Javascript中似乎不存在的魔术方法return sprintf(L.message.hello,"Ivan")来实现。
  • 我可以使用蛮力“deep each”来创建与字符串同名的方法,但我认为不可能将属性转换为方法,而且它会相当于资源密集型。
  • __callStatic看起来很可怕。
  • sprintf(L.message.goodbye,"Ivan")实际上有效!但我觉得它有点不够宽大。

有没有办法让优雅和简单的实施变得可行?

2 个答案:

答案 0 :(得分:1)

如果值是字符串,请尝试为对象的每个键编写一个setter函数。那应该可以帮到你

了解更多详情

Refer to Custom setters and getters section

答案 1 :(得分:0)

即使在Ruby on Rails中,我们也常常做同样的事情,除此之外,我们有一个专门的功能。在RoR中,我们这样做:

_(messages.config.say_hello, current_name)

同样,您可以执行以下操作:

_ = sprintf;
_(L.message.goodbye,"Ivan");

你可以通过100种方式做到。 :)