[SPRING] 해결 스프링 : i18n 국제화를위한 javascript의 메시지
SPRING해결 스프링 : i18n 국제화를위한 javascript의 메시지
나는 우리 코드의 일부를 국제화하려고 시도하고있다. JSPX에서
내 JSPX 소스 자바처럼 :
<spring:theme code="jsFile" var="js" />
<script type="text/javascript" src="${js}" />
JS를 찾고있는 곳은 아래 문자열입니다.
buildList('settings', [{
name: '<spring:message code="proj.settings.toggle" javaScriptEscape="true" />',
id:"setting1",
description: '<spring:message code="proj.settings.toggle.description" javaScriptEscape="true" />',
installed: true
}]);
마지막으로 message.properties는 다음과 같습니다.
proj.settings.toggle=Click here to toggle
proj.settings.toggle.description=This toggles between on and off
그래서 내가 궁금해하는 것은 이것이 효과가 있을까요? 그것은 내가 여러 포럼에서 모은 것이 어야만하는 것처럼 보이지만 어디서 잘못 될지 알 수는 없습니다. 이 문제를 해결할 더 좋은 방법이 있습니까?
또한이 파일들은 WEB-INF 폴더 밖에 있지만, ReloadableResourceBundleMessageSource를 root applicationContext.xml에 두어 스프링 태그가 선택된다는 점도 유의해야합니다.
어떤 도움을 주셔서 감사합니다!
해결법
-
==============================
1.JS 파일을 JSP 파일처럼 취급하고 spring : message 태그를 통해 그 내용을 해결하는 것이 나에게 맞는 것 같다. 나는 그렇게하지 않을 것이다.
JS 파일을 JSP 파일처럼 취급하고 spring : message 태그를 통해 그 내용을 해결하는 것이 나에게 맞는 것 같다. 나는 그렇게하지 않을 것이다.
일반적으로 JS i18n은 다음 두 가지 방법 중 하나로 수행됩니다.
클라이언트 측 번역 가능 문자열에 대해 하나의 중앙 위치를 작성하는 경우이 둘 모두가 가장 효과적입니다. 귀하의 맥락에서, 나는 첫 번째 방법을 권장합니다 (훨씬 쉽게). 프로젝트가 꽤 크지 않고 클라이언트 측에서 많은 번역 가능한 문자열을 가지고 있지 않다면 그렇지 않습니다. 수정 내용은 다음과 같습니다.
<script type="text/javascript"> var strings = new Array(); strings['settings.toogle'] = "<spring:message code='proj.settings.toggle' javaScriptEscape='true' />"; strings['settings.toogle.description'] = "<spring:message code='proj.settings.toggle.description' javaScriptEscape='true' />"; </script> <spring:theme code="jsFile" var="js" /> <script type="text/javascript" src="${js}" />
JS 파일에서
buildList('settings', [{ name: strings['settings.toggle'], id:"setting1", description: strings['settings.toggle.description'], installed: true }]);
번역 된 문자열을 쓸 때 큰 따옴표를 사용했음을 기억하십시오. 이는 아포스트로피가 포함될 수있는 프랑스어 또는 이탈리아어로 된 일부 단어 때문입니다.
이유는 JS 파일에 대한 번역을 제공합니다. 일반적으로 UI의 일부분을 동적으로 생성하기를 원합니다. 일부 타사 구성 요소를 현지화해야하는 경우도 있습니다. 위의 답변에서 해당 구성 요소를 잘 처리 할 수 있습니다. UI 파트를 동적으로 생성하려는 경우 JavaScript에서 HTML 태그를 연결하는 대신 템플릿을 사용하는 것이 좋습니다. 훨씬 더 깔끔한 (그리고 아마도 재사용 가능한) 해결책을 만들기 때문에이 글을 쓰기로 결정했다. 따라서 JavaScript에 번역을 전달하는 대신 템플리트를 작성하여 페이지에 넣을 수 있습니다 (예제는 Handlebars.js를 사용하지만 다른 엔진을 사용할 수도 있습니다).
<script id="article" type="text/x-handlebars-template"> <div class="head"> <p> <span> <spring:message code="article.subject.header" text="Subject: " /> </span>{{subject}}</p> </div> <div class="body"> {{{body}}} </div> </script>
클라이언트 측 (자바 스크립트)에서는 템플릿에 액세스하면됩니다 (아래 예제에서는 분명히 jQuery가 사용됩니다).
var template = Handlebars.compile($("#article").html()); var html = template({subject: "It is really clean", body: "<p>Don't you agree?</p><p>It looks much better than usual spaghetti with JavaScript variables.</p>" }); $("#someDOMReference").html(html);
여기에 주목할 사항은 거의 없습니다.
그것은 기본적입니다. 가능한 경우 템플릿을 사용하는 것이 좋습니다.
-
==============================
2.귀하의 답변에 감사드립니다. 다음은보다 일반적인 솔루션입니다.
귀하의 답변에 감사드립니다. 다음은보다 일반적인 솔루션입니다.
현재 사용자 언어를 사용하여 java 리소스 번들에 등록 된 메시지의 연관 배열을 포함하는 "string.js"라는 동적 자바 스크립트 파일을 제공하는 것이 아이디어입니다.
1) Spring Controller에 메소드를 생성하여 리소스 번들에서 모든 리소스 키를로드하고 뷰 "spring.jsp"를 반환합니다.
@RequestMapping(value="strings.js") public ModelAndView strings(HttpServletRequest request) { // Retrieve the locale of the User Locale locale = RequestContextUtils.getLocale(request); // Use the path to your bundle ResourceBundle bundle = ResourceBundle.getBundle("WEB-INF.i18n.messages", locale); // Call the string.jsp view return new ModelAndView("strings.jsp", "keys", bundle.getKeys()); }
2)보기 "strings.jsp"구현
<%@page contentType="text/javascript" pageEncoding="UTF-8" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>var messages = new Array(); <c:forEach var="key" items="${keys}">messages["<spring:message text='${key}' javaScriptEscape='true'/>"] = "<spring:message code='${key}' javaScriptEscape='true' />"; </c:forEach>
3) HTML 소스 코드에서 "spring.js"를 가져옵니다. 메시지 배열을 사용할 수 있으며 올바른 언어로로드됩니다.
가능한 문제 : 사용자가 언어를 변경하면 "spring.js"를 탐색기에서 다시로드해야하지만 캐시됩니다. 사용자가 언어를 바꿀 때 (또는 파일을 다시로드하기위한 다른 트릭) 캐시를 지우는 것이 필요합니다.
-
==============================
3.@Toilal의 답변 외에도 strings.jsp에 도우미 함수를 추가하여 번역 배열을 더 잘 활용할 수 있습니다.
@Toilal의 답변 외에도 strings.jsp에 도우미 함수를 추가하여 번역 배열을 더 잘 활용할 수 있습니다.
<%@page contentType="text/javascript" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%> var messages = new Array(); <c:forEach var="key" items="${keys}">messages["<spring:message text='${key}' javaScriptEscape='true'/>"] = "<spring:message code='${key}' javaScriptEscape='true' />"; </c:forEach> /** * Tranlate a String by key, if key is not defined return the key. * * @author Pedro Peláez <aaaaa976 at gmail dot com>, Drupal/Wordpress authors, and others * @param {String} key * @returns {String} */ function t(key) { if (messages[key]) { return messages[key]; } return key; }
그렇다면 필요할 때 :
alert(t("menu.section.main"));
from https://stackoverflow.com/questions/6218970/resolving-springmessages-in-javascript-for-i18n-internationalization by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 모든 컨트롤러와 매핑을보기에 표시하는 방법 (0) | 2018.12.23 |
---|---|
[SPRING] jpa / hibernate가있는 Spring에서 초기화 지연 예외를 피하기 위해 세션을 어떻게 열어 두어야합니까? (0) | 2018.12.23 |
[SPRING] 스프링 보안 사용자 정의 필터 (비밀번호 변경) (0) | 2018.12.23 |
[SPRING] Spring MVC에서 전역 사용자 정의 편집기를 등록하려면 어떻게해야합니까? (0) | 2018.12.23 |
[SPRING] JSON을 생성하고 소비하는 컨트롤러 용 Spring RequestMapping (0) | 2018.12.23 |