【GraalVM】ResourceBundle を使った国際化対応 (i18n) に難あり?

目次

GraalVMの仕様と対応予定

(2021/2/9現在)ネイティブコンパイルすると、ネイティブコンパイルした時の言語以外の ResourceBundle の情報が失われます。
アプリケーションによっては国際化対応が必須要件だったりするので、ノックアウトになり得る仕様です。

バージョン21.1で対応するよと書いてあるので、それに期待。

以下、国際化対応出来なかった記録です。
なお、フレームワークとしてMicronaut、実行環境としてAWS Lambdaを使っています。


国際化対応できなかった記録

準備

ResourceBundleを用意します。

hoge_message=Default Message
hoge_message=message in English
hoge_message=message in Japanese

Resourceを読み込む設定、ResourceBundleを読み込む設定をします。
native-image実行時に、オプションでこの設定ファイルのパスを教えてあげます。

{
  "bundles": [
    {
      "name": "i18n.SampleLocalizedStrings"
    }
  ],
  "resources": {
    "includes": [
      {
        "pattern": ".*/resources/*.properties"
      }
    ]
  }
}

(Micronautの設定)ResourceBundleを読み込んでMessageSourceのBean生成

@Factory
public class AppConfig {

    @Bean
    public MessageSource messageSource(){
        return new ResourceBundleMessageSource("i18n.SampleLocalizedStrings");
    }

}

MessageSourceをInjectして、デフォルト言語/英語/日本語でログ出力

@Controller
public class SampleController {

    private static final Logger LOGGER = LoggerFactory.getLogger(SampleController.class);

    @Inject
    MessageSource message;

    @Get
    public String printLocalizedStrings() {
        LOGGER.debug(message.getMessage("hoge_message", MessageSource.MessageContext.DEFAULT).orElse("not found!!"));
        LOGGER.debug(message.getMessage("hoge_message", MessageSource.MessageContext.of(Locale.ENGLISH)).orElse("not found!!"));
        LOGGER.debug(message.getMessage("hoge_message", MessageSource.MessageContext.of(Locale.JAPANESE)).orElse("not found!!"));

        return "dummy";
    }
}

試してみる

GraalVM native image でネイティブコンパイルしてAWS Lambdaで実行した場合のログ
→ 全て英語で出力されてしまいます。

START RequestId: ********-****-****-****-************ Version: $LATEST
2021/02/09 14:56:52.449 DEBUG [main] message in English (SampleController printLocalizedStrings) 
2021/02/09 14:56:52.449 DEBUG [main] message in English (SampleController printLocalizedStrings) 
2021/02/09 14:56:52.449 DEBUG [main] message in English (SampleController printLocalizedStrings) 
END RequestId: ********-****-****-****-************

Javaのまま、AWS Lambdaで実行した場合のログ
→ ちゃんと指定した言語で出力されます。

START RequestId: ********-****-****-****-************ Version: $LATEST
2021/02/09 14:58:21.302 DEBUG [main] message in English (SampleController printLocalizedStrings) 
2021/02/09 14:58:21.302 DEBUG [main] message in English (SampleController printLocalizedStrings) 
2021/02/09 14:58:21.302 DEBUG [main] message in Japanese (SampleController printLocalizedStrings) 
END RequestId: ********-****-****-****-************

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
目次