2011-11-28 2 views
2

나는 데이터베이스로 백업 된 i18n 등록 정보 파일을 사용할 수있는 상황을 얻으려고합니까?Grails i18n은 DB에 의해 백업 된 속성 파일에서 가져온 것입니까?

일부 표준 항목에 대해서는 속성 파일을 사용하고 싶지만 일부 필드는 최종 사용자가 편집 할 수 있어야하므로 데이터베이스에 i18n을 사용할 계획이었습니다. 따라서 실제 조합은 훌륭합니다. i18n 코드가 등록 정보 파일에서 발견되지 않으면 DB에서 조회를 수행하십시오.

내가 어떻게이 문제를 해결할 수 있을지 생각해보십시오. 나는이 게시물을 보았습니다 Grails i18n From Database but Default Back To File

그러나이 문제를 해결할 방법에 대한 다른 제안은 없습니까?

+0

에 대한 자세한 내용은 http://stackoverflow.com/questions/8100312/grails-i18n-from-database-but-default-back-to-file을 참조하십시오. 데이터베이스에서 메시지를 검색하는 방법을 보여주는 블로그가 있습니다. stackoverflow 메시지는 데이터베이스와 메시지 파일을 결합하는 방법을 보여줍니다. – Chris

+0

나를 지적 해 주셔서 고맙지 만, 실제 질문에 완전히 대답 한 적이 없습니다. 최소한 솔루션이 될 수있는 단서는 없습니다. :(이 게시물도 확인했습니다 .. http://grails.1312388.n4.nabble.com/i18n-Database-td4073132 다시 한 번 실제 해결책이 없습니다. – Marco

+0

이 블로그? http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html – Chris

답변

5

에 다음을 추가하여 구현과 messageSource 빈의 기본 구현을 대체 :

// Place your Spring DSL code here 
beans = { 
    messageSource(DatabaseMessageSource) { 
     messageBundleMessageSource = ref("messageBundleMessageSource") 
    }  
    messageBundleMessageSource(org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource) { 
     basenames = "WEB-INF/grails-app/i18n/messages" 
    } 
} 

그리고 당신의 src/groovy 폴더에 다음 클래스를 추가 :

class DatabaseMessageSource extends AbstractMessageSource { 

    def messageBundleMessageSource 

    protected MessageFormat resolveCode(String code, Locale locale) { 
     Message msg = messageBundleMessageSource.resolveCode(code, locale) 
     def format 
     if(msg) { 
      format = new MessageFormat(msg.text, msg.locale) 
     } 
     else { 
      format = Message.findByCodeAndLocale(code, locale) 
     } 
     return format; 
    } 
} 

이제 메시지 묶음에서 메시지를 분석하려고 시도합니다. 사용할 수없는 경우 데이터베이스에서 찾습니다. 오류 처리 기능을 추가 할 수 있지만이 버전은 모든 메시지를 적어도 한 곳에서 사용할 수 있으면 작동합니다.

자세한 내용은 http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html을 참조하십시오. resources.groovy에서 수행 변경에


일부 세부 정보 : 단지 resources.groovy에 정의 된 같은 이름을 갖는 변수를 정의하여 포함 할 수 있습니다 당신이 주사 끝내 클래스를 정의 할 수 있습니다이 파일에

. 예 : 이 파일에는 messageSourcemessageBundleMessageSource이 있으며 모든 컨트롤러 또는 서비스 파일에 포함시킬 수 있습니다. 이 변수가 정의되면 대괄호 안에 클래스의 인스턴스가 생성됩니다.

이 경우 일반 사용자 정의 구현 DatabaseMessageSource을 사용하기 위해 일반 messageSource을 덮어 씁니다. 따라서 I18n 함수 message은 이제 사용자 정의 구현을 사용합니다.

사용자 지정 구현에서는 message.properties 파일을 확인해야하므로 원래 메시지 원본을 두 번째 빈에 유지해야합니다. 사용자 정의 구현에서이 인스턴스를 정의하면 이전 구현을 계속 사용할 수 있으므로 일반적인 방식으로 메시지를 조회 할 수 있습니다.

+0

예제 코드에 대해 고마워요! 저에게는 모르는 것들이 조합되어 있습니다. resources.groovy의 구성은 여전히 ​​약간 어렵습니다. 완전히 이해하려면 설정 한 내용에 대해 좀 더 자세히 설명해 주시겠습니까? 보다 구체적인 .. 'messageBundleMessageSource (org.codehaus.groovy.grails.context.support.PluginAwareResourceBundleMessageSource가) { 의 basename = "WEB-INF/또, grails-app/i18n/메시지" }' – Marco

+0

나는 게시 할 예정입니다 내 귀하의 제안을 구현 한 솔루션, 코드를 빨리 보여 주시겠습니까 모든 괜찮아 보인다면 말해. 거기서 당신의 예를 실행할 때 작은 오류가 발생했습니다. 그러나 어쩌면 나는 무언가를 놓쳤다! 감사! – Marco

+0

응답을 업데이트 했으므로,'resources.groovy'의 변경 사항에 대해 더 자세히 설명합니다. – Chris

1

나는 당신이 데이터베이스

으로 백업

국제화 속성 파일이 무슨 뜻인지 모르겠어요하지만 당신이 단순히 의미하는 경우에 당신이 원하는 메시지 키로 (대신 .properties 파일의) 데이터베이스 테이블을 사용하여 해결, 다음은 MessageSource를 인터페이스

class DBMessageSource implements MessageSource { 
    String getMessage(MessageSourceResolvable resolvable, Locale locale) { 
    // IMPLEMENT ME 
    } 

    String getMessage(String code, Object[] args, Locale locale) { 
    // IMPLEMENT ME  
    } 

    String getMessage(String code, Object[] args, String defaultMessage, Locale locale) { 
    // IMPLEMENT ME  
    } 
} 

당신 자신의 구현을 작성하여이 작업을 수행 할 수 있습니다

class Message { 
    String code 
    Locale locale 
    String text 
} 

resources.groovy에 다음 줄을 추가합니다 : 단순히 프로젝트에 새 도메인 클래스를 넣어 resources.groovy

messageSource(DBMessageSource) 
+0

둘 다 결합하려고합니다. 코드가 원하는 속성 파일에서 찾을 수없는 경우 DB 테이블 내부에서 찾아보십시오. 필요한 경우 사용자가 특정 필드를 수정할 수 있도록하기 위해 필드의 95 %가 속성 파일에 있고 5 %가 db 테이블에 있습니다. – Marco

+0

OK, 구현이 필요합니다. 속성 파일을 먼저 확인한 다음 데이터베이스를 확인하는 MessageSource 예제 –

0

@crudolf의 답변을 추적하여 다음과 같은 목표를 달성하는 방법을 구현했습니다.

class DatabaseMessageSource extends AbstractMessageSource { 
    // the message bundle resource that holds all of the messages 
    def messageBundleMessageSource 

    // the default locale used when there is no correct results found 
    // if a visitor (x) comes along with an unknown locale in the DB 
    // then this locale will be used as fallback! 
    Locale fallbackLocale = new Locale("nl", "NL") 

    protected MessageFormat resolveCode(String code, Locale locale) { 
     // first try to find the message in the messagebundles 
     MessageFormat messageFormat = messageBundleMessageSource.resolveCode(code, locale) 

     if(!messageFormat) { 
      // no message found so lets find one in the database 
      def message = Message.findByCodeAndLocale(code, locale) ?: Message.findByCodeAndLocale(code, fallbackLocale) 
      if (message) { 
       // found one create a message format! 
       messageFormat = new MessageFormat(message.text, message.locale) 
      } else { 
       // not found! create a standard message format 
       messageFormat = new MessageFormat(code, locale) 
      } 
     } 
     return messageFormat 
    } 

} 
관련 문제