我正在国际化一些JSF文件,因此正在对字符串进行外部化(以及使用占位符连接字符串)。我几乎没有使用JSF的经验(今天和昨天),所以请原谅,如果我的问题有一个明显的答案!
对于简单的占位符,我已经成功地使用了h:outputFormat标记(和f:param标记),但是现在我想用commandLink组件替换占位符。
即
<h:outputFormat value="#{adminMsgs.scheduleUpdateLink} ">
<h:commandLink value="#{adminMsgs.update}" action="refresh" />
</h:outputFormat>属性文件:
scheduleUpdateLink = After waiting a few seconds, please {0} the page.
update = update并按照以下方针进行产出:
After waiting a few seconds, please <a href="#" class="..." onclick="...;return false;">update</a> the page.这不起作用(更新链接出现在'scheduleUpdateLink‘文本之前),有人知道我会怎么做吗?
提前谢谢。
编辑/更新
谢谢你的回复McDowell -非常有用,但仍然没有完全解决我的问题。我还需要对输入框(h:inputText)进行同样的操作,而且在一个资源字符串中也可能存在多个占位符。因此,我不能保证,比方说阿拉伯语的顺序是一样的。
如果我使用了一个Java函数;您知道我是否可以以字符串的形式传递JSF标记,例如<h:outputFormat value=..。并使用faces上下文获取呈现的HTML,然后我可以将其插入到相应的占位符中,并以普通HTML的形式返回?或者其他类似的想法?
干杯。
发布于 2009-07-30 10:23:46
据我所知,H:输出格式标记将只使用f:param子元素作为参数。
如果消息是一个链接(而不是一个H:命令链接),您可以使用HTML文本:
<h:outputFormat escape="false"
value="...seconds, please <a href='etc..." />.我不建议通过这样做来模仿h:commandLink。也许可以在第三方图书馆中找到一个更丰富的h:命令链接版本,它完全可以实现您想要的功能。
将字符串分成两部分是可能的,但这会使翻译人员的生活变得困难,翻译质量可能会受到影响(尤其是如果您经常这样做的话)。
我会考虑使用这样的自定义函数:
<f:loadBundle basename="i18n.I18n" var="bundle" />
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 0)}" />
<h:commandLink>
<h:outputText value="#{bundle.update}" />
</h:commandLink>
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 1)}" />呈现的输出的形式如下:
After waiting a few seconds, please <script type="text/javascript"><!--
/*JavaScript elided*/
//-->
</script><a href="#"
onclick="return oamSubmitForm('someClientId');">update</a> the page.函数由一个静态方法支持,该方法拆分字符串并返回请求的片段:
public static String fragment(String string, int index) {
// TODO: regex probably not complete; ask stackoverflow!
// see http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html
final String regex = "\\{\\d.*?\\}";
String[] fragments = string.split(regex, index + 2);
return fragments[index];
// TODO: error handling
}取决于您的视图技术(Facelets或JSP),函数声明略有不同:
编辑:基于更多信息
JSF采用声明式方法来构建接口。您需要一个动态UI,并根据其子用户在翻译后的字符串中显示的顺序进行排序。这两件事是不一致的,但并非都失去了。
有几种方法可以解决这个问题。
。
<ed:formatPane string="click {0} after filling in forename {1} and surname {2}">
<h:commandLink value="#{bundle.linkMsg}" />
<h:inputText value="#{bean.prop1}" />
<h:inputText value="#{bean.prop2}" />
</ed:formatPane>只需替换h:outputFormat以支持任意的子控件(而不是创建一个完整的自定义控件)可能(而且工作量较少)是可能的,但我反对它,因为它可能会导致长期维护过程中的混乱。
有人可能已经写了一个定制的控件来做我建议的事情(这很难是一个原创的想法)。
发布于 2009-07-30 09:29:58
为了让JSF正确地呈现纯文本,它必须由生成(有一些模糊的技术原因)。我会用一个outputText、一个commandLink和一个outputText来完成这个任务。
一般来说,在处理JSF时,一切都必须是标记,而不是纯文本。
方便的参考资料:http://exadel.com/tutorial/jsf/jsftags-guide.html
发布于 2009-07-30 10:21:08
为了解决你的问题,你可以用代替,就像Thorbj rn说的。
基本上,您的代码和属性文件如下所示:
<h:outputText value="#{adminMsgs.scheduleUpdateLink1}" />
<h:commandLink value="#{adminMsgs.update}" action="refresh" />
<h:outputText value0"#{adminMsgs.scheduleUpdateLink2}" />属性文件如下所示:
scheduleUpdateLink1 = After waiting a few seconds, please
update = update
scheduleUpdateLink2 = the page.我认为outputFormat不适用于UiComponents,而只适用于文本。
https://stackoverflow.com/questions/1205386
复制相似问题