2014-12-04 1 views
1

Wicket은 wicket : 메시지를 사용하여 https://cwiki.apache.org/confluence/display/WICKET/Everything+about+Wicket+internationalization에 설명 된 링크 등의 HTML 요소가 포함 된 복잡한 변환 가능한 메시지를 지원합니다. 예컨대 :Apache Wicket : HTML이 포함 된 메시지의 동적 키

<wicket:message key="messageKey"> 
    <a wicket:id="link"><wicket:message key="linkLabel"></wicket:message></a> 
</wicket:message> 

및 특성 :

messageKey=Click on ${link} 

및 Java

add(new BookmarkablePage<Void>("link", SomePage.class); 

이 좋은 작품에서, 그러나 메시지 키는 HTML에서 하드 코딩되어있다.

필자의 경우 Java에서 메시지 키를 동적으로 결정해야합니다. 문자열 매개 변수를 사용하는 일반 메시지의 경우 키를 매개 변수로 사용하는 LabelStringResourceModel을 사용하여이를 수행 할 수 있습니다. 그러나 Wicket 구성 요소를 매개 변수로 포함하는 메시지에 대해 동일한 작업을 수행하려면 어떻게해야합니까? 나는 마크 업이 다음과 같이 보일 것이라고 생각한다.

<span wicket:id="messageId"> 
    <a wicket:id="link"><wicket:message key="linkLabel"></wicket:message></a> 
<span> 

그러나 Java는 무엇이겠습니까? Label에는 어린이가 없습니다. :(

=== 업데이트 ===이 개인 정적입니다 때문에, 내가 직접 사용할 수 없습니다하지만 난 공용 클래스에 코드를 붙여 복사 할 경우와를 조정할. 흥미로운 보이는 개찰구 클래스 org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer있다

구성 요소 계층 구조와 관련된 몇 가지, 나는 해결책에 가까워지고있어하지만 꽤 해키 청소기 해결책이 있습니까

답변

-1

나는 org.apache.wicket.markup.resolver에 중첩 개찰구의 개인 클래스 MessageContainer을 (수정/복사를했다.

final String messageKey; 
if (userLoggedIn) { 
    messageKey = "logged.in"; 
} else { 
    messageKey = "logged.out"; 
} 
MessageContainer message = new MessageContainer("message", messageKey); 
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("link", UserProfilePage.class); 
link.add(new Label("username", user.getUsername()); 
message.add(link); 
add(message); 

html로는 다음과 같습니다 : WicketMessageResolver)과 같이 : 같은

https://gist.github.com/totof3110/cf5f05731816a58d8597

가 그럼 난 자바 코드를 가질 수

<span wicket:id="message"> 
    <a wicket:id="link"><span wicket:id="username"></span></a> 
</span> 

특성 파일과 같이 보인다 :

logged.in = ${link} logged in. 
logged.out = ${link} logged out. 

userLoggedIn이 참인지 거짓인지에 따라 렌더링 된 HTML은 다음과 같이 표시됩니다

<a href="/profile">totof3110</a> logged in. 

또는

<a href="/profile">totof3110</a> logged out. 
0
<wicket:message key="messageKey"> 
    <a wicket:id="link">...</a> 
</wicket:message> 

올바른 보이지 않는 그것은 오히려되어야합니다 :..?.

<a wicket:id="link"><wicket:message key="messageKey"/></a> 

레이블을 클릭 할 수 있기를 원하기 때문입니다. 라벨은 텍스트 (예 : HTML 텍스트 노드)이므로 어린이 HTML 요소를 가질 수 없습니다.

같은 점은 Java 측에서 유효합니다. 링크는 Label의 부모 여야합니다.

HTH는

+0

미안 내 예를 혼동 될 수 있습니다. 내가 뭘 하려는지 Wicket 구성 요소 (bookmarkable 링크, 아약스 링크 등) 및 동적 메시지 키를 매개 변수가있는 번역 가능한 리소스가 있습니다. wicket : message 태그는 모든 종류의 Wicket 구성 요소를 중첩 할 수 있으므로 훌륭하게 작동하지만 메시지 키는 HTML에 입력해야하므로 동적으로 선택할 수 없습니다. –

+0

Localizer 클래스를 사용하여 고유 한 구성 요소를 구성하여 i18n 값을 가져올 수 있습니다. localizer를 얻으려면 : application.getResourceSettings(). getLocalizer(). 그런 다음 적절하다고 생각되면 getString() 메소드를 사용하십시오. 나는 당신의 문제를 이해하기가 어렵다. 샘플 출력을 제공하고 i18n의 일부분을 표시하고 다른 구성 요소를 표시하십시오. –

+0

나는 현재 사용중인 답변을 추가했습니다. 더 나은 해결책을 생각하면 저에게 알려주십시오! 감사. –

0

당신은 링크 텍스트와 같은 모델을 사용하기 위해 링크에 대한 setBody() 방법을 사용할 수 있습니다. 예를 들어

:

Link l = new AjaxLink("linkid"); 
l.setBody(new StringResourceModel(...)); 

HTML로는 :

<a wicket:id="linkid">this text will be replaced by the model</a>