4.5. 国际化和本地化


4.5.1. 简介

4.5.1.1. 关于国际化

国际化是设计软件的过程,以便能够适应不同的语言和区域,无需修改工程。

4.5.1.2. 关于本地化

本地化是通过添加特定于区域或语言的国际化软件和文本翻译的过程。

4.5.2. JBoss Logging 工具国际化和本地化

JBoss Logging Tools 是一种 Java API,支持日志消息、异常消息和通用字符串的国际化和本地化。除了提供转换机制外,JBoss 日志工具还为每一日志消息提供唯一标识符支持。

国际化的消息和异常是作为使用 org.jboss.logging.annotations 注解标注的接口内的方法定义创建的。实施接口是不需要的;JBoss 记录工具在编译时可以做到这一点。定义之后,您可以使用这些方法记录消息或获取代码中的异常对象。

通过为每个捆绑包创建属性文件(包含特定语言和区域的翻译),JBoss Logging 工具创建的国际化日志记录和异常接口可以本地化。JBoss Logging Tools 可以为每个捆绑包生成模板属性文件,然后可由转换器编辑。

JBoss Logging Tools 为您项目中的每个相应翻译属性文件创建每个捆绑包的实施。您要做的只是使用捆绑包中定义的方法,JBoss Logging Tools 可确保为您的当前区域设置调用正确的实施。

消息 ID 和项目代码是每个日志消息前面的唯一标识符。可以在文档中使用这些唯一标识符,以方便查找日志消息的相关信息。通过适当的文档,日志消息的含义可以从标识符确定,无论消息所写所用的语言是什么。

JBoss Logging 工具包括对以下功能的支持:

MessageLogger
org.jboss.logging.annotations 软件包中的此接口用于定义国际化的日志消息。消息日志记录器接口标有 @MessageLogger
MessageBundle
此界面可用于定义通用可翻译消息和带有国际化消息的 Exception 对象。消息捆绑包不用于创建日志消息。消息捆绑包接口标有 @MessageBundle
国际化日志消息

这些日志消息通过在 MessageLogger 中定义方法来创建。该方法必须使用 @LogMessage 和 @Message 注释标注,并且必须使用 @Message 的 value 属性指定日志消息。通过在属性文件中提供翻译,国际化日志消息会进行本地化。

JBoss Logging Tools 在编译时为每次编译时生成所需的日志记录类,并在运行时调用当前区域设置的正确方法。

国际化例外
国际化的异常是从 MessageBundle 中定义的方法返回的异常对象。可以为这些消息捆绑包添加注解,以定义默认的异常消息。如果在当前区域设置的匹配属性文件中找到一条消息,则默认消息将被替换为转换。国际化的异常也可以分配有项目代码和消息 ID。
国际化的信息
国际化的消息是从 MessageBundle 中定义的方法返回的字符串。可以给返回 Java String 对象的消息捆绑包方法添加注释,以定义该字符串的默认内容,称为消息。如果在当前区域设置的匹配属性文件中找到一条消息,则默认消息将被替换为转换。
翻译属性文件
转换属性文件是 Java 属性文件,包含来自一个区域设置、国家/地区和变体的一个接口的消息转换。JBoss 日志工具使用转换属性文件来生成返回消息的类。
JBoss Logging Tools 项目代码

项目代码是标识消息组的字符字符串。它们显示在每个日志消息的开头,并在消息 ID 的前面显示。项目代码通过 @MessageLogger 注释的 projectCode 属性来定义。

注意

有关新日志消息项目代码前缀的完整列表,请参阅 JBoss EAP 7.4 中使用的项目 代码

JBoss Logging 工具消息 ID
消息 ID 是结合项目代码时唯一标识日志消息的数字。消息 ID 显示在每条日志消息的开头,并附加到消息的项目代码中。消息 ID 通过 @Message 注释的 ID 属性来定义。

JBoss EAP 附带的 logging-tools 快速入门是一个简单的 Maven 项目,提供 JBoss Logging 工具的许多功能的有效示例。以下代码示例取自 logging-tools quickstart。

4.5.3. 创建国际化的日志记录器、消息和例外

4.5.3.1. 创建国际化的日志消息

您可以通过创建 MessageLogger 接口,使用 JBoss Logging Tools 创建国际化日志消息。

注意

本节不涵盖所有可选功能或日志消息的本地化。

  1. 如果您还没有这样做,请将您的 Maven 设置配置为使用 JBoss EAP Maven 存储库。

    如需更多信息,请参阅使用 Maven 设置配置 JBoss EAP Maven 存储库

  2. 配置项目的 pom.xml 文件,以使用 JBoss Logging 工具。

    详情请查看 JBoss Logging Tools Maven 配置

  3. 通过添加 Java 接口到项目来创建消息日志记录器接口,以包含日志消息定义。

    指出用于描述它将定义的日志消息的接口。日志消息接口有以下要求:

    • 它必须标有 @org.jboss.logging.annotations.MessageLogger
    • 另外,还可扩展 org.jboss.logging.BasicLogger
    • 接口必须定义一个字段,该字段是与接口相同的类型的消息日志记录器。使用 @org.jboss.logging. Logger 的 getMessageLogger () 方法执行此操作。

      示例:创建消息日志器

      package com.company.accounts.loggers;
      
      import org.jboss.logging.BasicLogger;
      import org.jboss.logging.Logger;
      import org.jboss.logging.annotations.MessageLogger;
      
      @MessageLogger(projectCode="")
      interface AccountsLogger extends BasicLogger {
         AccountsLogger LOGGER = Logger.getMessageLogger(
               AccountsLogger.class,
               AccountsLogger.class.getPackage().getName() );
      }
      Copy to Clipboard Toggle word wrap

  4. 向接口添加一个方法定义,以用于每一日志消息。

    请以描述性方式命名每个方法,使其表示的日志消息。每个方法都有以下要求:

    • 该方法必须返回 void
    • 它必须标有 @org.jboss.logging.annotation.LogMessage 注释。
    • 它必须标有 @org.jboss.logging.annotations.Message 注释。
    • 默认日志级别为 INFO
    • @org.jboss.logging.annotations.Message 的 value 属性包含默认日志消息,如果没有可用的翻译则使用此消息。

      @LogMessage
      @Message(value = "Customer query failed, Database not available.")
      void customerQueryFailDBClosed();
      Copy to Clipboard Toggle word wrap
  5. 在您的代码中添加调用,以从其中记录消息来调用,从而调用方法。

    无需创建接口实施,注释处理器会在编译项目时为您执行此操作。

    AccountsLogger.LOGGER.customerQueryFailDBClosed();
    Copy to Clipboard Toggle word wrap

    自定义日志记录器从 BasicLogger 子级,因此也可以使用 BasicLogger 的日志记录方法。不需要创建其他日志记录器来记录非国际化的消息。

    AccountsLogger.LOGGER.error("Invalid query syntax.");
    Copy to Clipboard Toggle word wrap
  6. 该项目现在支持一个或多个可本地化的国际化日志记录器。
注意

JBoss EAP 附带的 logging-tools 快速入门是一个简单的 Maven 项目,它提供了一个如何使用 JBoss Logging Tools 的工作示例。

4.5.3.2. 创建和使用国际化的信息

此流程演示了如何创建和使用国际化的信息。

注意

本节不涵盖所有可选功能或对这些消息进行本地化的流程。

  1. 如果您还没有这样做,请将您的 Maven 设置配置为使用 JBoss EAP Maven 存储库。如需更多信息,请参阅使用 Maven 设置配置 JBoss EAP Maven 存储库
  2. 配置项目的 pom.xml 文件,以使用 JBoss Logging 工具。详情请查看 JBoss Logging Tools Maven 配置
  3. 为异常创建一个接口。JBoss 日志工具在接口中定义国际化的消息。为每个接口命名其包含的消息的描述性。接口有以下要求:

    • 必须将其声明为 公开
    • 它必须标有 @org.jboss.logging.annotations.MessageBundle
    • 接口必须定义与接口相同的消息捆绑包的字段。

      示例:创建一个 消息捆绑包 接口

      @MessageBundle(projectCode="")
      public interface GreetingMessageBundle {
         GreetingMessageBundle MESSAGES = Messages.getBundle(GreetingMessageBundle.class);
      }
      Copy to Clipboard Toggle word wrap

      注意

      调用 Messages.getBundle(GreetingMessagesBundle.class) 等同于调用 Messages.getBundle(GreetingMessagesBundle.class, Locale.getDefault())

      locale .getDefault() 获取 Java 虚拟机此实例的默认区域设置的当前值。Java 虚拟机会根据主机环境设置启动过程中的默认区域设置。如果未明确指定区域设置,它将被许多区域敏感方法使用。它可以通过 setDefault 方法更改。

      如需更多信息 ,请参阅《JBoss EAP 配置指南》 中设置服务器的默认 区域。

  4. 向每条消息的接口添加一个方法定义。请以描述性方式命名每个方法,使其表示的消息。每个方法都有以下要求:

    • 它必须返回类型为 String 的对象。
    • 它必须标有 @org.jboss.logging.annotations.Message 注释。
    • @org.jboss.logging.annotations.Message 的 value 属性必须设置为 default 消息。这是如果没有可用的翻译,则会使用的消息。

      @Message(value = "Hello world.")
      String helloworldString();
      Copy to Clipboard Toggle word wrap
  5. 在应用程序中调用需要获取消息的接口方法:

    System.out.println(helloworldString());
    Copy to Clipboard Toggle word wrap

该项目现在支持可本地化的国际化消息字符串。

注意

请参阅 JBoss EAP 附带的 logging-tools quickstart,以获取完整的工作示例。

4.5.3.3. 创建国际化例外

您可以使用 JBoss Logging Tools 创建和使用国际化的异常。

以下说明假定您要为使用 Red Hat CodeReady Studio 或 Maven 构建的现有软件项目添加国际化的异常。

注意

本节不涵盖这些例外的所有可选功能或本地化过程。

  1. 配置项目的 pom.xml 文件,以使用 JBoss Logging 工具。详情请查看 JBoss Logging Tools Maven 配置
  2. 为异常创建一个接口。JBoss 日志工具在接口中定义了国际化的异常。为每个接口命名其定义的异常的描述性。接口有以下要求:

    • 必须将其声明为 公开
    • 它必须标有 @MessageBundle
    • 接口必须定义与接口相同的消息捆绑包的字段。

      示例:创建一个 例外捆绑包 接口

      @MessageBundle(projectCode="")
      public interface ExceptionBundle {
         ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class);
      }
      Copy to Clipboard Toggle word wrap

  3. 为每个例外向接口添加一个方法定义。以描述性方式命名每个方法表示的异常。每个方法都有以下要求:

    • 它必须返回 例外 对象或子类型 例外
    • 它必须标有 @org.jboss.logging.annotations.Message 注释。
    • @org.jboss.logging.annotations.Message 的 value 属性必须设置为默认异常消息。这是如果没有可用的翻译,则会使用的消息。
    • 如果返回的异常具有除消息字符串外还需要参数的构造器,则必须使用 @Param 注释在方法定义中提供这些参数。这些参数的类型和顺序必须与在异常的结构中相同。

      @Message(value = "The config file could not be opened.")
      IOException configFileAccessError();
      
      @Message(id = 13230, value = "Date string '%s' was invalid.")
      ParseException dateWasInvalid(String dateString, @Param int errorOffset);
      Copy to Clipboard Toggle word wrap
  4. 在您需要获得其中一个例外的地方,调用代码中的接口方法。方法不会抛出异常,它们返回异常对象,然后您可以抛出它。

    try {
       propsInFile=new File(configname);
       props.load(new FileInputStream(propsInFile));
    }
    catch(IOException ioex) {
      //in case props file does not exist
       throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
    }
    Copy to Clipboard Toggle word wrap

该项目现在支持国际化的异常,可以本地化。

注意

请参阅 JBoss EAP 附带的 logging-tools quickstart,以获取完整的工作示例。

4.5.4. 本地化国际化日志记录器、消息和例外

4.5.4.1. 使用 Maven 生成新转换属性文件

使用 Maven 构建的项目可以为每个 MessageLogger 和 Message Bundle 生成空的转换属性文件。这些文件随后可用作新的转换属性文件。

以下步骤演示了如何配置 Maven 项目以生成新的转换属性文件。

先决条件

  • 您必须已有一个正常工作的 Maven 项目。
  • 必须已为 JBoss Logging 工具配置该项目。
  • 该项目必须包含一个或多个定义国际化日志消息或异常的接口。

生成转换属性文件

  1. 通过将 -AgenereatedTranslationFilePath 编译器参数添加到 Maven 编译器插件配置来添加 Maven 配置,并为它分配创建新文件的路径。

    此配置会在 Maven 项目的 target/generated-translation-files 目录中创建新文件。

    示例:定义转换文件路径

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>2.3.2</version>
       <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArgument>
          -AgeneratedTranslationFilesPath=${project.basedir}/target/generated-translation-files
          </compilerArgument>
          <showDeprecation>true</showDeprecation>
       </configuration>
    </plugin>
    Copy to Clipboard Toggle word wrap

  2. 使用 Maven 构建项目:

    $ mvn compile
    Copy to Clipboard Toggle word wrap

    为标有 @MessageBundle 或 @Message Logger 的每个接口创建了一个属性文件。

    • 新文件创建在与声明每个接口的 Java 软件包对应的子目录中。
    • 每一新文件采用以下模式命名,其中 INTERFACE_NAME 是用于生成文件的接口的名称。

      INTERFACE_NAME.i18n_locale_COUNTRY_VARIANT.properties
      Copy to Clipboard Toggle word wrap

现在可将生成的文件复制到您的项目中,作为新翻译的基础。

注意

请参阅 JBoss EAP 附带的 logging-tools quickstart,以获取完整的工作示例。

属性文件可用于使用 JBoss 日志工具为接口中定义的日志和异常消息提供翻译。

以下步骤演示了如何创建和使用转换属性文件,并且假定您已拥有为国际化异常或日志消息定义的一个或多个接口的项目。

先决条件

  • 您必须已有一个正常工作的 Maven 项目。
  • 必须已为 JBoss Logging 工具配置该项目。
  • 该项目必须包含一个或多个定义国际化日志消息或异常的接口。
  • 项目必须配置为生成模板转换属性文件。

转换国际化的日志记录器、例外或消息

  1. 运行以下命令来创建模板转换属性文件:

    $ mvn compile
    Copy to Clipboard Toggle word wrap
  2. 将您要从创建它们的目录中转换的接口模板复制到项目的 src/main/resources 目录中。属性文件必须与要转出的接口位于同一个软件包中。
  3. 重命名复制的模板文件,以指明它将包含的语言。例如: GreeterLogger.i18n_fr_FR.properties
  4. 编辑新转换属性文件的内容,使其包含适当的翻译:

    # Level: Logger.Level.INFO
    # Message: Hello message sent.
    logHelloMessageSent=Bonjour message envoyé.
    Copy to Clipboard Toggle word wrap
  5. 重复复制模板的过程,并根据捆绑包中的每个转换进行修改。

该项目现在包含一个或多个消息或日志记录器捆绑包的转换。构建项目会生成适当的类,以使用提供的转换记录日志消息。无需显式调用特定语言的方法或提供参数,JBoss 日志工具会自动将正确的类用于应用服务器的当前区域设置。

生成类的源代码可以在 target/generated-sources/annotations/ 下查看。

4.5.5. 自定义国际化日志消息

4.5.5.1. 添加消息 ID 和项目代码到日志消息

此流程演示了如何将消息 ID 和项目代码添加到使用 JBoss Logging Tools 创建的国际化日志消息中。日志消息中必须同时显示项目代码和消息 ID。如果消息同时没有项目代码和消息 ID,则不会显示任何消息。

先决条件

  1. 您必须已拥有含有国际化日志消息的项目。详情请查看 创建国际化的日志消息
  2. 您需要知道您将要使用的项目代码。您可以使用单个项目代码,或者为每个接口定义不同的项目代码。

添加消息 ID 和项目代码到日志消息

  1. 利用附加至自定义日志记录器接口的 @MessageLogger 注释的 projectCode 属性,指定接口的项目代码。接口中定义的所有消息都将使用该项目代码。

    @MessageLogger(projectCode="ACCNTS")
    interface AccountsLogger extends BasicLogger {
    
    }
    Copy to Clipboard Toggle word wrap
  2. 利用附加至消息方法的 @Message 注释的 id 属性,指定每条消息的消息 ID。

    @LogMessage
    @Message(id=43, value = "Customer query failed, Database not available.")  void customerQueryFailDBClosed();
    Copy to Clipboard Toggle word wrap
  3. 如果日志消息同时关联了消息 ID 和项目代码,这些日志消息会将它们添加到记录的消息中。

    10:55:50,638 INFO  [com.company.accounts.ejb] (MSC service thread 1-4) ACCNTS000043: Customer query failed, Database not available.
    Copy to Clipboard Toggle word wrap

4.5.5.2. 指定消息的日志级别

JBoss Logging Tools 定义的消息的默认日志级别为 INFO。可以使用附加至日志记录方法的 @LogMessage 注释的 level 属性来指定不同的日志级别。使用以下步骤指定不同的日志级别。

  1. level 属性添加到日志消息方法定义的 @LogMessage 注释。
  2. 利用 level 属性,分配此消息的日志级别。level 的有效值是在 org.jboss.logging.Logger.Level:DEBUGERRORFATALINFOTRACEWARN 中定义的六个常量。

    import org.jboss.logging.Logger.Level;
    
    @LogMessage(level=Level.ERROR)
    @Message(value = "Customer query failed, Database not available.")
    void customerQueryFailDBClosed();
    Copy to Clipboard Toggle word wrap

在上例中调用日志记录方法将在 at ERROR 级别上生成一条日志消息。

10:55:50,638 ERROR  [com.company.app.Main] (MSC service thread 1-4)
 Customer query failed, Database not available.
Copy to Clipboard Toggle word wrap

4.5.5.3. 使用参数自定义日志消息

自定义日志记录方法可以定义参数。这些参数用于传递要在日志消息中显示的其他信息。在日志消息中出现参数时,使用显式或普通索引方式在消息本身中指定。

使用参数自定义日志消息

  1. 向方法定义中添加任何类型的参数。无论类型如何,参数的 String 表示法就是消息中显示的内容。
  2. 添加对该日志消息的参数引用。参考可以使用显式或普通索引。

    • 要使用普通索引,请在您希望显示每个参数的消息字符串中插入 %s 字符。%s 的第一个实例将插入第一个参数,第二个实例将插入第二个参数,以此类推。
    • 要使用显式索引,请在消息中插入 %#$s 字符,其中 # 代表您要显示的参数数。

使用显式索引时,消息中的参数引用的顺序与方法中定义的不同顺序不同。这对于可能需要对参数进行不同排序的转换消息来说非常重要。

重要

参数数量必须与指定消息中参数的引用数量匹配,否则代码不会编译。标有 @Cause 注释的参数 不包含在参数数中。

以下是使用普通索引的消息参数示例:

@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
Copy to Clipboard Toggle word wrap

以下是使用显式索引的消息参数示例:

@LogMessage(level=Logger.Level.DEBUG)
@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
Copy to Clipboard Toggle word wrap

4.5.5.4. 指定一个例外作为日志消息的 Causeion

JBoss Logging Tools 允许将自定义日志记录方法的一个参数定义为消息的原因。此参数必须是 可浏览 类型或其任何子类,并且标上 @Cause 注释。此参数无法像其他参数一样在日志消息中引用,并在日志消息后显示。

以下步骤演示了如何使用 @Cause 参数 更新日志记录方法以指示"阻碍"异常:假设您已创建了您要向其添加此功能的国际化日志消息。

指定一个例外作为日志消息的 Causeion

  1. 向方法添加类型为 浏览或其子类的参数。

    @LogMessage
    @Message(id=404, value="Loading configuration failed. Config file:%s")
    void loadConfigFailed(Exception ex, File file);
    Copy to Clipboard Toggle word wrap
  2. 添加 @Cause 注释到 参数。

    import org.jboss.logging.annotations.Cause
    
    @LogMessage
    @Message(value = "Loading configuration failed. Config file: %s")
    void loadConfigFailed(@Cause Exception ex, File file);
    Copy to Clipboard Toggle word wrap
  3. 调用 方法。在您的代码中调用该方法时,必须传递一个正确类型的对象,并在日志消息后显示该方法。

    try
    {
       confFile=new File(filename);
       props.load(new FileInputStream(confFile));
    }
    catch(Exception ex) //in case properties file cannot be read
    {
         ConfigLogger.LOGGER.loadConfigFailed(ex, filename);
    }
    Copy to Clipboard Toggle word wrap

如果代码引发 FileNotFoundException 类型异常,则以上代码示例的输出如下:

10:50:14,675 INFO [com.company.app.Main] (MSC service thread 1-3) Loading configuration failed. Config file: customised.properties
java.io.FileNotFoundException: customised.properties (No such file or directory)
   at java.io.FileInputStream.open(Native Method)
   at java.io.FileInputStream.<init>(FileInputStream.java:120)
   at com.company.app.demo.Main.openCustomProperties(Main.java:70)
   at com.company.app.Main.go(Main.java:53)
   at com.company.app.Main.main(Main.java:43)
Copy to Clipboard Toggle word wrap

4.5.6. 自定义国际化例外

4.5.6.1. 添加消息 ID 和项目代码到例外消息

消息 ID 和项目代码是国际化异常所显示的每条消息的前面的唯一标识符。通过这些识别代码,可以创建对应用中所有异常消息的引用。这允许用户查找以自己不理解的语言编写的异常消息的含义。

以下步骤演示了如何将消息 ID 和项目代码添加到使用 JBoss Logging Tools 创建的国际化异常消息中。

先决条件

  1. 您必须已有具有国际化例外的项目。详情请查看 创建国际化例外。
  2. 您需要知道您将要使用的项目代码。您可以使用单个项目代码,或者为每个接口定义不同的项目代码。

添加消息 ID 和项目代码到例外消息

  1. 使用附加至异常捆绑包接口的 @MessageBundle 注释的 projectCode 属性来指定项目代码。接口中定义的所有消息都将使用该项目代码。

    @MessageBundle(projectCode="ACCTS")
    interface ExceptionBundle
    {
       ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class);
    }
    Copy to Clipboard Toggle word wrap
  2. 使用与定义异常的方法关联的 @Message 注释的 id 属性,指定各个异常的消息 ID。

    @Message(id=143, value = "The config file could not be opened.")
    IOException configFileAccessError();
    Copy to Clipboard Toggle word wrap
重要

包含项目代码和消息 ID 的消息在消息前面显示。如果消息同时没有项目代码和消息 ID,则也不会显示。

示例:国际化例外

这个异常捆绑包接口示例使用 "ACCTS" 的项目代码。它包含一个异常方法,其 ID 为 "143"。

@MessageBundle(projectCode="ACCTS")
interface ExceptionBundle
{
    ExceptionBundle EXCEPTIONS = Messages.getBundle(ExceptionBundle.class);

    @Message(id=143, value = "The config file could not be opened.")
    IOException configFileAccessError();
}
Copy to Clipboard Toggle word wrap

可以使用以下代码获取并抛出异常对象:

throw ExceptionBundle.EXCEPTIONS.configFileAccessError();
Copy to Clipboard Toggle word wrap

这会显示类似如下的异常信息:

Exception in thread "main" java.io.IOException: ACCTS000143: The config file could not be opened.
at com.company.accounts.Main.openCustomProperties(Main.java:78)
at com.company.accounts.Main.go(Main.java:53)
at com.company.accounts.Main.main(Main.java:43)
Copy to Clipboard Toggle word wrap

4.5.6.2. 使用参数自定义例外消息

定义例外的异常捆绑包方法可以指定参数,以传递要在异常消息中显示的其他信息。在消息本身中使用显式或普通索引来指定参数在异常消息中的确切位置。

使用参数自定义例外消息

  1. 向方法定义中添加任何类型的参数。无论类型如何,参数的 String 表示法就是消息中显示的内容。
  2. 添加对异常消息的参数引用。参考可以使用显式或普通索引。

    • 要使用普通索引,请在您希望显示每个参数的消息字符串中插入 %s 字符。%s 的第一个实例将插入第一个参数,第二个实例将插入第二个参数,以此类推。
    • 要使用显式索引,请在消息中插入 %#$s 字符,其中 # 代表您要显示的参数数。

使用显式索引时,消息中的参数引用的顺序与方法中定义的不同顺序不同。这对于可能需要对参数进行不同排序的转换消息来说非常重要。

重要

参数数量必须与指定消息中参数的引用数量匹配,否则代码将不会编译。标有 @Cause 注释的参数 不包含在参数数中。

示例:使用机构索引

@Message(id=2, value="Customer query failed, customerid:%s, user:%s")
void customerLookupFailed(Long customerid, String username);
Copy to Clipboard Toggle word wrap

示例:使用 Explicit Indexes

@Message(id=2, value="Customer query failed, user:%2$s, customerid:%1$s")
void customerLookupFailed(Long customerid, String username);
Copy to Clipboard Toggle word wrap

异常捆绑包方法返回的异常可能会有另一个例外指定为根本原因。这可以通过向方法添加 参数并使用 @Cause 标注 参数。此参数用于传递导致的异常,且无法在异常消息中引用。

下列步骤演示了如何使用 @Cause 参数 从异常捆绑包更新方法以指示导致的异常。假设您已创建了要添加此功能的异常捆绑包。

  1. 向方法添加类型为 浏览或其子类的参数。

    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calculationError(Throwable cause, String msg);
    Copy to Clipboard Toggle word wrap
  2. 添加 @Cause 注释到 参数。

    import org.jboss.logging.annotations.Cause
    
    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calculationError(@Cause Throwable cause, String msg);
    Copy to Clipboard Toggle word wrap
  3. 调用 interface 方法以获取异常对象。最常见的用例是从 catch 块中抛出新的异常,并将捕获的异常指定为原因。

    try
    {
       ...
    }
    catch(Exception ex)
    {
       throw ExceptionBundle.EXCEPTIONS.calculationError(
                                        ex, "calculating payment due per day");
    }
    Copy to Clipboard Toggle word wrap

以下是将异常指定为另一例外的原因的示例。此异常捆绑包定义了一个返回类型 ArithmeticException 异常的方法。

@MessageBundle(projectCode = "TPS")
interface CalcExceptionBundle
{
    CalcExceptionBundle EXCEPTIONS = Messages.getBundle(CalcExceptionBundle.class);

    @Message(id=328, value = "Error calculating: %s.")
    ArithmeticException calcError(@Cause Throwable cause, String value);
}
Copy to Clipboard Toggle word wrap

以下示例演示了引发异常的操作,因为它尝试将整数除以零。这个异常会被捕获,使用第一个异常作为原因创建新的异常。

int totalDue = 5;
int daysToPay = 0;
int amountPerDay;

try
{
   amountPerDay = totalDue/daysToPay;
}
catch (Exception ex)
{
   throw CalcExceptionBundle.EXCEPTIONS.calcError(ex, "payments per day");
}
Copy to Clipboard Toggle word wrap

以下是从上例生成的异常消息:

Exception in thread "main" java.lang.ArithmeticException: TPS000328: Error calculating: payments per day.
    at com.company.accounts.Main.go(Main.java:58)
    at com.company.accounts.Main.main(Main.java:43)
Caused by: java.lang.ArithmeticException: / by zero
    at com.company.accounts.Main.go(Main.java:54)
    ... 1 more
Copy to Clipboard Toggle word wrap

4.5.7. JBoss Logging 工具参考

4.5.7.1. JBoss Logging Tools Maven 配置

以下步骤将 Maven 项目配置为使用 JBoss Logging 和 JBoss Logging 工具进行国际化。

  1. 如果您还没有这样做,请将您的 Maven 设置配置为使用 JBoss EAP 存储库。如需更多信息,请参阅使用 Maven 设置配置 JBoss EAP Maven 存储库

    在项目的 pom.xml 文件的 <dependencyManagement> 部分中包含 jboss-eap-jakartaee8 BOM。

    <dependencyManagement>
      <dependencies>
        <!-- JBoss distributes a complete set of Jakarta EE APIs including
          a Bill of Materials (BOM). A BOM specifies the versions of a "stack" (or
          a collection) of artifacts. We use this here so that we always get the correct versions of artifacts.
          Here we use the jboss-javaee-7.0 stack (you can
          read this as the JBoss stack of the Jakarta EE APIs). You can actually
          use this stack with any version of JBoss EAP that implements Jakarta EE. -->
        <dependency>
          <groupId>org.jboss.bom</groupId>
           <artifactId>jboss-eap-jakartaee8</artifactId>
           <version>7.4.0.GA</version>
           <type>pom</type>
           <scope>import</scope>
        </dependency>
      <dependencies>
    <dependencyManagement>
    Copy to Clipboard Toggle word wrap
  2. 将 Maven 依赖项添加到项目的 pom.xml 文件中:

    1. 添加 jboss-logging 依赖项,以访问 JBoss Logging 框架。
    2. 如果您计划使用 JBoss Logging 工具,还要添加 jboss-logging-processor 依赖项。

      这两个依赖关系都在上一步中添加的 JBoss EAP BOM 中提供,因此每个依赖项的 scope 元素可以设置为 提供

      <!-- Add the JBoss Logging Tools dependencies -->
      <!-- The jboss-logging API -->
      <dependency>
         <groupId>org.jboss.logging</groupId>
         <artifactId>jboss-logging</artifactId>
         <scope>provided</scope>
      </dependency>
      <!-- Add the jboss-logging-tools processor if you are using JBoss Tools  -->
      <dependency>
         <groupId>org.jboss.logging</groupId>
         <artifactId>jboss-logging-processor</artifactId>
         <scope>provided</scope>
      </dependency>
      Copy to Clipboard Toggle word wrap
  3. maven-compiler-plugin 必须至少是 3.1 版本,并且针对目标及生成的 1.8 源进行配置。

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.1</version>
       <configuration>
          <source>1.8</source>
          <target>1.8</target>
       </configuration>
    </plugin>
    Copy to Clipboard Toggle word wrap
注意

有关配置为使用 JBoss Logging 工具的 pom.xml 文件的完整工作示例,请查看 JBoss EAP 附带的 logging-tools quickstart。

4.5.7.2. 翻译属性文件格式

用于 JBoss Logging Tools 中消息转换的属性文件是标准 Java 属性文件。文件的格式是 java.util.Properties 类文档 中描述的简单面向行的 key=value 对格式。

文件名格式具有以下格式:

InterfaceName.i18n_locale_COUNTRY_VARIANT.properties
Copy to Clipboard Toggle word wrap
  • interfaceName 是转换应用到的接口的名称。
  • localeCO UNT RY 和 VARIANT 识别该转换应用到的区域设置。
  • localeCOUNTRY 分别使用 ISO-639 和 ISO-3166 语言及国家/地区代码指定语言和区域。COUNTRY 是可选的。
  • VARIANT 是一个可选标识符,可用于识别仅适用于特定操作系统或浏览器的翻译。

转换文件中包含的属性是正在转换的接口中方法的名称。属性的分配值是转换。如果方法过载,则通过附加点以及参数数到名称来指示这一点。转换方法只能通过提供不同数量的参数来过载。

示例:转换属性文件

文件名: GreeterService.i18n_fr_FR_POSIX.properties.

# Level: Logger.Level.INFO
# Message: Hello message sent.
logHelloMessageSent=Bonjour message envoyé.
Copy to Clipboard Toggle word wrap

4.5.7.3. JBoss Logging 工具注释参考

以下注释在 JBoss Logging 中定义,用于日志消息、字符串和异常的国际化和本地化。

Expand
表 4.2. JBoss Logging 工具注释
注解目标描述属性

@MessageBundle

Interface

将接口定义为消息捆绑包。

projectCode

@MessageLogger

Interface

将接口定义为消息日志记录器。

projectCode

@Message

方法

可以在消息捆绑包和消息日志记录器中使用。在消息捆绑包中,它将方法定义为返回本地化 String 或 Exception 对象的方法。在消息日志记录器中,它将方法定义为本地化日志记录器。

值, id

@LogMessage

方法

在消息日志记录器中将某一方法定义为记录方法。

level(默认 INFO

@Cause

参数

将参数定义为传递例外作为日志消息或其他例外的原因的参数。

-

@Param

参数

将参数定义为传递到例外构造器的参数。

-

4.5.7.4. JBoss EAP 中使用的项目代码

下表列出了 JBoss EAP 7.4 中使用的所有项目代码,以及它们所属的 Maven 模块。

Expand
表 4.3. JBoss EAP 中使用的项目代码
Maven 模块项目代码

AppClient

WFLYAC

批处理/扩展-jberet

WFLYBATCH

批处理/扩展

WFLYBATCH-DEPRECATED

batch/jberet

WFLYBAT

bean-validation

WFLYBV

controller-client

WFLYCC

controller

WFLYCTL

clustering/common

WFLYCLCOM

clustering/ejb/infinispan

WFLYCLEJBINF

群集/infinispan/extension

WFLYCLINF

clustering/jgroups/extension

WFLYCLJG

Cluster/server

WFLYCLSV

clustering/web/infinispan

WFLYCLWEBINF

connector

WFLYJCA

deployment-repository

WFLYDR

deployment-scanner

WFLYDS

domain-http

WFLYDMHTTP

域管理

WFLYDM

EE

WFLYEE

ejb3

WFLYEJB

嵌入式

WFLYEMB

host-controller

WFLYDC

host-controller

WFLYHC

iiop-openjdk

WFLYIIOP

io/subsystem

WFLYIO

jaxrs

WFLYRS

jdr

WFLYJDR

jmx

WFLYJMX

jpa/hibernate5

JIPI

jpa/spi/src/main/java/org/jipijapa/JipiLogger.java

JIPI

jpa/subsystem

WFLYJPA

jsf/subsystem

WFLYJSF

jsr77

WFLYEEMGMT

启动程序

WFLYLNCHR

legacy/jacorb

WFLYORB

传统/消息传递

WFLYMSG

legacy/web

WFLYWEB

logging

WFLYLOG

mail

WFLYMAIL

management-client-content

WFLYCNT

messaging-activemq

WFLYMSGAMQ

mod_cluster/extension

WFLYMODCLS

命名

WFLYNAM

network

WFLYNET

patching

WFLYPAT

PicketLink

WFLYPL

platform-mbean

WFLYPMB

pojo

WFLYPOJO

process-controller

WFLYPC

协议

WFLYPRT

远程

WFLYRMT

request-controller

WFLYREQCON

rTS

WFLYRTS

sar

WFLYSAR

security-manager

WFLYSM

安全

WFLYSEC

server

WFLYSRV

system-jmx

WFLYSYSJMX

threads

WFLYTHR

事务

WFLYTX

undertow

WFLYUT

webservices/server-integration

WFLYWS

weld

WFLYWELD

xts

WFLYXTS

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat