복붙노트

[SPRING] 해결 스프링 : i18n 국제화를위한 javascript의 메시지

SPRING

해결 스프링 : i18n 국제화를위한 javascript의 메시지

나는 우리 코드의 일부를 국제화하려고 시도하고있다. JSPX에서 태그를 사용하여 message.properties 파일에서 문자열을 분석하는 페이지가 있습니다. 이것은 JSPX 페이지에있는 HTML과 CSS에서 잘 작동하지만 거기에 자바 스크립트 파일이 소스되어 있기 때문에 문자열에 태그를 대신 사용하면 축약되어 인쇄됩니다.

내 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. ==============================

    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. ==============================

    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. ==============================

    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"));
    
  4. from https://stackoverflow.com/questions/6218970/resolving-springmessages-in-javascript-for-i18n-internationalization by cc-by-sa and MIT license