如何在消息资源中使用i18n参数

时间:2014-04-12 06:11:32

标签: java spring validation

有优雅的方法吗? 像这样的消息资源:

label.username=User Name
error.empty={0} is mandatory
error.duplicate={0} is duplicate
info.name=name

我想要{0} i18n。这意味着它将显示“name is mandatory”之类的错误消息,如果用户更改了他的语言环境,那么整个错误消息将会改变,而不仅仅是“必须”。

public class UserValidator implements Validator{

    @Autowired
    private UserService userService;


    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User)target;
        List<User> ul = userService.getUsersByName(user.getName());
        if(ul.size() > 0){
            String argName = i18n("info.name");
            errors.reject("error.duplicate",new Object[]{argName}, null);
        }

    }

    private String i18n(String messageKey) {
        // TODO get message from message resources
        return null;
    }

}

1 个答案:

答案 0 :(得分:0)

通过Validator和Errors接口,我看不到任何直接链接到MesssageSource来获取i18n消息。 Errors接口只需一个键。显然,您必须通过自动装配MessageSource实例并分两步获取翻译:

public class UserValidator implements Validator{

    @Autowired
    private UserService userService;

    @Autowired
    private MessageSource messageSource;

    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        User user = (User)target;
        List<User> ul = userService.getUsersByName(user.getName());
        if(ul.size() > 0){
            String argName = i18n("info.name");
            errors.reject("error.duplicate",new Object[]{argName}, null);
        }
    }

    private String i18n(String messageKey) {
        return messageSource.getMessage(messageKey, null, getLocale();
    } 
}

现在的问题是以某种方式提供Locale。您必须自己弄清楚,具体取决于您希望如何管理此Validator的依赖项。如果你不能提供一个,Spring将获得默认值,但我猜你最终需要它。

如果您需要帮助准备MessageSource实例,请回复我并留下评论,我会给您一些代码。如果您想自己管理,here是一个教程。