如何在FreeMarker模板文件中调用消息获取方法时指定本地消息文件或特定Locale
嗨,这个需求其实很常见,Spring的springMacroRequestContext.getMessage本身就支持指定Locale来获取对应语言的消息,刚好能解决你的问题,给你两种实用的方案:
方案一:通过传递指定Locale对象获取对应语言消息
getMessage方法有多个重载版本,其中就包含支持传入Locale参数的版本。你可以先在后端把需要的Locale对象(比如德语对应的Locale.GERMANY或者new Locale("de", "de"))放到Model中,然后在FTL模板里直接调用:${springMacroRequestContext.getMessage("your.message.key", null, deDeLocale)}这里简单解释下参数:第二个参数是消息的占位符参数数组,如果你的消息文本里没有需要替换的占位符,直接传
null即可;第三个参数就是你指定的Locale对象,这样Spring就会自动从messages-de-de.properties文件中读取对应key的消息内容了。如果不想依赖后端传递Locale,在FreeMarker配置允许创建对象的前提下,也可以直接在模板里构造Locale对象:
${springMacroRequestContext.getMessage("your.message.key", null, new java.util.Locale("de", "de"))}不过这种硬编码Locale的方式灵活性稍差,更推荐后端统一管理常用的Locale对象。
方案二:理解Spring MessageSource的加载逻辑(无需直接指定文件路径)
其实Spring的消息源是按照basename + 语言_地区的命名规则自动加载properties文件的,比如messages-en-us.properties对应英文(美国)Locale,messages-de-de.properties对应德语(德国)Locale。所以你完全不需要直接指定文件路径,只要传入正确的Locale,Spring就会自动匹配到对应的properties文件,这也是Spring国际化的标准设计思路。
备注:内容来源于stack exchange,提问作者mche

