19. 国际化
19.1 资源包
资源包是一个 Java .properties 文件,其中包含特定于本地的数据。 给定此资源包:
src/main/resources/io/micronaut/docs/i18n/messages_en.properties
hello=Hello
hello.name=Hello {0}
src/main/resources/io/micronaut/docs/i18n/messages_es.properties
hello=Hola
hello.name=Hola {0}
ResourceBundleMessageSource 是 MessageSource 的一种实现,可简化资源捆绑访问并提供缓存功能。
警告
每次检索消息时,请勿实例化新的 ResourceBundleMessageSource
。只需实例化一次,例如在工厂中。
MessageSource 工厂示例
- Java
- Groovy
- Kotlin
import io.micronaut.context.MessageSource;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.i18n.ResourceBundleMessageSource;
import jakarta.inject.Singleton;
@Factory
class MessageSourceFactory {
@Singleton
MessageSource createMessageSource() {
return new ResourceBundleMessageSource("io.micronaut.docs.i18n.messages");
}
}
import io.micronaut.context.MessageSource;
import io.micronaut.context.annotation.Factory;
import io.micronaut.context.i18n.ResourceBundleMessageSource;
import jakarta.inject.Singleton;
@Factory
class MessageSourceFactory {
@Singleton
MessageSource createMessageSource() {
return new ResourceBundleMessageSource("io.micronaut.docs.i18n.messages");
}
}
import io.micronaut.context.MessageSource
import io.micronaut.context.annotation.Factory
import io.micronaut.context.i18n.ResourceBundleMessageSource
import jakarta.inject.Singleton
@Factory
internal class MessageSourceFactory {
@Singleton
fun createMessageSource(): MessageSource = ResourceBundleMessageSource("io.micronaut.docs.i18n.messages")
}
然后,你就可以检索提供本地语言的消息:
ResourceBundleMessageSource 示例
- Java
- Groovy
- Kotlin
assertEquals("Hola", messageSource.getMessage("hello", MessageContext.of(new Locale("es"))).get());
assertEquals("Hello", messageSource.getMessage("hello", MessageContext.of(Locale.ENGLISH)).get());
expect:
messageSource.getMessage("hello", MessageContext.of(new Locale("es"))).get() == 'Hola'
and:
messageSource.getMessage("hello", MessageContext.of(Locale.ENGLISH)).get() == 'Hello'
Assertions.assertEquals("Hola", messageSource.getMessage("hello", MessageSource.MessageContext.of(Locale("es"))).get())
Assertions.assertEquals("Hello", messageSource.getMessage("hello", MessageSource.MessageContext.of(Locale.ENGLISH)).get())
19.2 本地化信息源
LocalizedMessageSource 是一个 @RequestScope
Bean,你可以将其注入控制器中,它使用 Micronaut 区域解析 来解析当前 HTTP 请求的本地化消息。