【问题标题】:Thymeleaf: Message as a parameter to another MessageThymeleaf:消息作为另一个消息的参数
【发布时间】:2016-11-02 13:49:31
【问题描述】:

我是 Thymeleaf 的新手,正在移动一些 facelets 页面以使用 Thymeleaf。由于我使用的是旧系统,我们正在使用带有 xml 配置的 Thymeleaf 2.1.5。

我遇到了一个问题,我一直在努力寻找足够的文档。我想要完成的是将本地化消息作为其他消息中的参数。

我在几个模板中的一个例子是这样的

Some text string <a href="url">CLICK HERE</a>

其中的属性文件是这样的:

some.text=Some text string {0} 
click.here=CLICK HERE 

我试着做这样的事情:

<p th:utext="#{some.text('<a th:utext="#{click.here}" href="url">')}"></p>

但没有运气让它工作。

另外,有没有办法本地化一个字符串,而不是它自己的 dom 元素的一部分?例如,我想像这样放置一个字符串:

String 

而不是这个:

<div> String </div>

任何见解都将不胜感激。谢谢。

【问题讨论】:

    标签: spring thymeleaf


    【解决方案1】:

    这适用于您的具体示例的 Thymeleaf 3:

    <p th:with="openTag='<a href=\'stackoverflow.com\'>',anchorLabel=#{click.here},closeTag='</a>'" th:remove="tag" th:utext="#{some.text(${openTag+anchorLabel+closeTag})}"></p>
    

    不幸的是,在输出中的链接周围产生 double 引号似乎不起作用。不知道 Thymeleaf 是否支持这个。如果我找到方法,我会更新。不过单引号似乎可以工作。

    但总的来说,您可能会寻找th:with 的某种组合来创建变量。至于你的第二个问题,你会想要使用th:remove="tag" 来删除标签。

    Answer 假设如下配置:

    @Bean
    public ThymeleafViewResolver viewResolver() {
    
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setOrder(1);
        resolver.setCharacterEncoding("UTF-8");
        resolver.setTemplateEngine(templateEngine());
        return resolver;
    }
    
    @Bean
    public ITemplateResolver webTemplateResolver() {
    
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("/WEB-INF/thymeleaf/");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCharacterEncoding("UTF-8");
        resolver.setSuffix(".html");
        resolver.setCacheable(false);
        resolver.setOrder(2);
        return resolver;
    }
    

    【讨论】:

    • 感谢您的回复。我相信你已经让我快到了,但我收到了这个错误:与元素类型“null”关联的属性“th:with”的值不能包含“
    • 是您提供 null 的值之一吗?我会看click.here
    • click.here 据我所知不为空。我可以在没有参数的情况下使用它。我认为可能需要以某种方式转义“
    • 发现删除 '' 的转义值。 '<'和'>'分别。
    • 好的,另外需要注意的是,在我的解析器配置中,我使用了带有 UTF-8 字符编码的 TemplateMode.HTML。
    【解决方案2】:

    你真的应该用 i18n 和链接来分割文本生成。您可以将“some.text”包装在一个跨度中,然后呈现链接。像这样,您可以避免utext,并且可以根据需要正确生成带有翻译文本的链接。

    避免在生成的 html 中出现跨度的一种方法是使用属性th:remove="tag"

    如果我没记错的话,现在应该可以通过使用&lt;th:block&gt;...&lt;/&gt; 元素来实现另一种解决方案,因此您无需再次删除标签。

    <span th:remove="tag" th:text="#{some.text}">some text that will be replaced but shows in the mock</span> <a href="url" th:text="#{click.me}">CLICK HERE</a>
    

    【讨论】:

    • 不幸的是,我不认为将其拆分是一种选择。
    • 为什么不可能呢?您不能完全控制模板和消息的创建吗?
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2011-12-19
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多