【问题标题】:Is there any way to chain messages together in Grails' message.properties file?有没有办法在 Grails 的 message.properties 文件中将消息链接在一起?
【发布时间】:2012-08-28 15:39:49
【问题描述】:

在 Grails 中有一个 message.properties 文件。在这个文件中消息的定义如下:

exampleClass.fieldOne.label=Field One

otherExampleClass.fieldOne.label=Field One

我希望能够同时使用这两条消息,即使它们在文本上是相同的。我想这样定义它们:

exampleClass.fieldOne.label=Field One

otherExampleClass.fieldOne.label=${message(code: 'exampleClass.fieldOne.label')}

...但只是调用otherExampleClass.fieldOne.label 返回字符串${message(code: 'exampleClass.fieldOne.label')} 而不是所需的字符串Field One

【问题讨论】:

  • 你为什么不只使用一次 fieldOne.label 而不用担心类?
  • 因为在某些地方(如脚手架和模板中)我依赖于具有消息标签的类的每个字段。

标签: grails


【解决方案1】:

在 message.properties 中,我认为您不能这样做,但也许通过约定和修改 Grails 的模板,您可以实现它。所以我的想法是:

为您的消息定义一个约定(例如,用一些特殊字符初始化消息)

exempleClass.fieldOne.label=FieldOne
otherExampleClass.fieldOne.label=#exempleClass.fieldOne.label

创建一个 TagLib 来处理消息

class MyTagLib {
  static namespace = "my"
  def inheritedMessage = { attrs, body -> 
    String message = g.message(attrs)
    if(message.startsWith("#")) {
      //get the other message...
    }
    out << message
  }
}

最后是install templates 并将&lt;g:message/&gt; 更改为&lt;my:inheritedMessage/&gt; 或任何您称呼的名称。

对于第 2 步,另一种方法是覆盖 g.message(),这样做的好处是不需要第 3 步,并为您的应用的所有部分提供修改。缺点是它必须有良好的文档记录和传播,否则可能会在其他开发人员中引起一些混乱。

编辑

为了覆盖所有消息,我认为更好的方法是自定义 Grails 使用的 messageResource。 Here 是一个问题,涵盖了如何使用 Spring 执行此操作,以从数据库中获取消息,这可能是一个起点。而here 是一个问题,展示了如何替换 Grails 中的 bean。

【讨论】:

  • 嗯,我不能在可以使用消息的任何地方都使用 taglib(比如在另一个 taglib 或类中)。如果我想如此彻底地绕过message.properties 文件,我只需创建一个带有静态变量作为消息标签的辅助类(我不想这样做)。我真的很想在message.properties 文件中包含我想要的消息标签更改。
  • 很公平。也许替换 bean messageResource 呢?
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
相关资源
最近更新 更多