JSF切换语言的commandButton点击后未更新HTML lang属性如何解决
问题根因
你当前用PrimeFaces commandButton的默认AJAX行为切换语言,仅设置了更新menupanel面板,而页面<html>标签的lang属性是从<f:view>的locale属性生成,不属于menupanel的更新范围,因此AJAX局部刷新不会修改根节点的lang属性,只有整页刷新时才会重新渲染整个页面的根节点属性,所以F5刷新后才会生效。
修复步骤
1. 先修正现有代码的语法错误
- 你的JSF模板里多写了一个
</h:form>闭合标签,删除最靠近<p:outputPanel id="menupanel">下方的多余闭合标签 - 按钮上的选中状态EL表达式没有放在
styleClass属性中,直接写在标签里属于无效代码,修正后示例:
<p:commandButton value="FI" pt:aria-label="Suomeksi" actionListener="#{language.countryLocaleCodeChanged}" styleClass="#{view.locale.language eq 'fi'? 'ws-lang-selected' : ''}" update="menupanel"/>
2. 选择对应解决方案
方案一:整页刷新(最简方案)
给所有语言切换按钮添加ajax="false"属性,点击时走整页提交渲染,自然会更新lang属性:
<p:commandButton value="FI" pt:aria-label="Suomeksi" actionListener="#{language.countryLocaleCodeChanged}" styleClass="#{view.locale.language eq 'fi'? 'ws-lang-selected' : ''}" update="menupanel" ajax="false"/>
方案二:AJAX模式下主动修改lang属性
如果需要保留无刷新切换的体验,给按钮添加oncomplete事件,调用JS直接修改页面根节点的lang属性:
<p:commandButton value="FI" pt:aria-label="Suomeksi" actionListener="#{language.countryLocaleCodeChanged}" styleClass="#{view.locale.language eq 'fi'? 'ws-lang-selected' : ''}" update="menupanel" oncomplete="document.documentElement.lang = this.value.toLowerCase()"/>
3. 可选优化控制器代码
你的countryLocaleCodeChanged方法里存在重复赋值的问题:先在if判断里给localeCode赋值为fi/sv/en,后面循环里又覆盖为fi_FI/sv_SE这类完整编码,属于无效代码,可以删除if块里的localeCode = "fi"这类赋值逻辑,避免后续维护混淆。
内容的提问来源于stack exchange,提问作者WScoder
相关产品推荐
相关产品推荐

