代码之家  ›  专栏  ›  技术社区  ›  Peter Hilton

对于没有占位符的本地化消息,是否应该使用java.text.MessageFormat?

  •  11
  • Peter Hilton  · 技术社区  · 17 年前

    我们正在本地化一个运行在Java 5上的web应用程序的用户界面文本,对于如何输出在属性文件中定义的消息,我们有一个两难的选择——属性文件使用的类型 java.util.Properties

    某些消息包含一个占位符,将使用 java.text.MessageFormat . 例如:

    search.summary = Your search for {0} found {1} items.
    

    MessageFormat很烦人,因为单引号是一个特殊字符,尽管在英文文本中很常见。必须为文字单引号键入两个:

    warning.item = This item''s {0} is not valid.
    

    然而,应用程序的1000条左右的消息中有四分之三不包含占位符。这意味着我们可以直接输出它们,避免使用MessageFormat,而不使用单引号:

    help.url = The web page's URL
    

    问题: 我们应该对所有消息使用MessageFormat,以便语法一致,还是尽可能避免使用MessageFormat,这样大多数消息就不需要转义?

    请注意,MessageFormat的API文档承认了这个问题,并提出了一个非解决方案:

    在中使用引号的规则 有点令人困惑。 到本地化器是否使用单引号 要通知本地人规则, 并告诉他们(例如,使用 资源包源中的注释 文件)将处理哪些字符串 按消息格式。

    5 回复  |  直到 17 年前
        1
  •  2
  •   Boris Pavlović    17 年前

    只需编写自己的MessageFormat实现,而不需要这个烦人的特性。你可以看一下代码 SLF4J Logger

    logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
    

    空占位符可以与默认顺序一起使用,并在某些本地化情况下进行编号,在这些情况下,不同的语言对单词或句子的某些部分进行排列。

        2
  •  2
  •   Peter Hilton    17 年前

    最后,我们决定通过始终使用卷曲引号来回避单引号问题:

    warning.item = This item\u2019s {0} is not valid.
    
        3
  •  1
  •   Daniel Hiller    17 年前

    使用“字符而不是”进行引用。我们一直使用它,没有任何问题。

        4
  •  0
  •   Mr. Shiny and New 安宇    17 年前

    在我看来,一致性对于这类事情很重要。属性文件和MessageFormat已经有很多限制。如果您发现这些问题,您可以“编译”属性文件以生成格式正确的文件。但我要说的是,在任何地方都要使用MessageFormat。这样,在维护代码时,就不必担心哪些字符串是格式化的,哪些不是。它变得更容易处理,因为您可以将消息处理交给库,而不必担心高级别的细节。

        5
  •  -1
  •   Rob Di Marco    17 年前

    推荐文章