Play 框架 DI 将 Lang 或 Messages 注入服务

Play framework DI injecting Lang or Messages into Service

我有一个使用 play framework 2.3.x 的应用程序,我 运行 变成了 2.4.x。作为迁移的一部分,我正在 运行 构建服务并 运行 挑战 i18n。 如何注入 Lang 或获取它的值?

class MyServiceUsedByController {
    @Inject
    private MessagesApi messagesApi;
    void someFoo() {
        Lang lang = ///How to get it?
        commentToSaveToDb = messagesApi.get(lang, "comment.addedPlace");
    }
}

我不能使用静态,因为我在应用程序启动时使用该服务,所以应用程序还没有 运行 并且对 Messages 的静态调用失败。

在服务器上,i18n 仅在请求上下文中有意义。从基于 cookie 的框中,您可以将其更改为基于 url 的 select 语言:

你的情况-应用程序启动,你不在请求上下文中,所以你可以使用任何你喜欢的语言。

假设您想使用默认的服务器语言,那么只需使用简单的 java 方法:

String javaServerLang = Locale.getDefault().getLanguage();

并将其转换为剧本Lang

Lang playLang = Lang.forCode(javaServerLang);

在请求上下文中你甚至可以将这种语言设置到上下文中,我不确定你是否可以在启动时这样做:

Context.current().changeLang(playLang);