seguito da this blog article Ho abilitato la mia applicazione a caricare i messaggi i18n dal database. Funziona alla grande. Tuttavia, non voglio gestire tutti i messaggi nel database. Quindi mi piacerebbe poter dire se non trovo il codice nel database, quindi caricarlo usando il meccanismo predefinito.Grail i18n dal database ma predefinito Torna al file
Ecco quello che ho:
class DatabaseMessageSource extends AbstractMessageSource {
protected MessageFormat resolveCode(String code, Locale locale) {
Message msg = Message.findByCodeAndLocale(code, locale)
def format = null
if (msg) {
format = new MessageFormat(msg.text, msg.locale)
}else{
// What do I do here to grab it from the file
}
return format;
}
}
Ho provato a chiamare super.resolveCode (codice, locale), ma che ha portato in errori di compilazione. E sto facendo fatica a rintracciare l'implementazione di AbstractMessageSource che Grails sta usando per default per guardare la fonte.
AGGIORNAMENTO: Grazie a doelleri ora mi rendo conto che quello che devo fare è qualcosa come estendere ResourceBundleMessageSource. Sfortunatamente, ci sono diversi problemi con questo approccio. Ho il seguente nel mio file resources.groovy:
messageSource(DatabaseMessageSource)
Prima di tutto, se ho semplicemente estendo ResourceBundleMessageSource e l'override del metodo resolveCode, tale metodo non viene mai chiamato. Quindi nel mio altro blocco, chiamare super.resolveCode è discutibile.
Ho quindi tentato di implementare la mia classe DatabaseMessageSource con tutto il codice da ResourceBundleMessageSource, ma apparentemente mi manca qualcosa in resources.groovy perché i bundle predefiniti non vengono cablati.
Quindi, a questo punto, sono ancora perso su quello che devo fare. Voglio prima controllare il database. Se il codice non esiste, ripristinare lo stesso comportamento predefinito di ResourceBundleMessageSource.
Hai mai funzionato? – Marco