目次
GraalVMの仕様と対応予定
(2021/2/9現在)ネイティブコンパイルすると、ネイティブコンパイルした時の言語以外の ResourceBundle の情報が失われます。
アプリケーションによっては国際化対応が必須要件だったりするので、ノックアウトになり得る仕様です。
バージョン21.1で対応するよと書いてあるので、それに期待。
[native-image] -H:IncludeResourceBundles only includes bundle for default locale · Issue #911 · orac…
With native-image RC10, -H:IncludeResourceBundles includes only the bundle for the default locale at image build-time. This is useful only if just a single loca…
以下、国際化対応出来なかった記録です。
なお、フレームワークとして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: ********-****-****-****-************