Domanda

Abbiamo avuto un sacco di stringhe che contiene una sotto-stringa, frasi su un controllo del registro o come contattare il supporto tecnico, il branding come stringhe contenente l'azienda o il nome del prodotto.La ripetizione stava causando non pochi problemi per noi stessi (principalmente errori di battitura o di copia/incolla errori) ma causa problemi in quanto aumenta la quantità di testo per il nostro traduttore deve tradurre.

La soluzione mi è venuta è andato qualcosa come questo:

public class ExpandingResourceBundleControl extends ResourceBundle.Control {
  public static final ResourceBundle.Control EXPANDING =
    new ExpandingResourceBundleControl();

  private ExpandingResourceBundleControl() { }

  @Override
  public ResourceBundle newBundle(String baseName, Locale locale, String format,
                                  ClassLoader loader, boolean reload)
    throws IllegalAccessException, InstantiationException, IOException {

      ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
      return inner == null ? null : new ExpandingResourceBundle(inner, loader);
  }
}

ExpandingResourceBundle delegati per la vera risorsa bundle, ma esegue la conversione di {{questo.tipo.di.cosa}} per cercare la chiave in risorse.

Ogni volta che si desidera ottenere uno di questi, devi andare in:

ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);

E questo funziona bene -- per un po'.

Quello che succede è che il nuovo codice (nel nostro caso il codice generato automaticamente che è stato sputato fuori di Matisse) cerca lo stesso pacchetto di risorse senza specificare il controllo personalizzato.Questo sembra essere non riproducibile, se si scrive un semplice test di unità che la chiama con e poi senza, ma si verifica quando si esegue l'applicazione per il real.In qualche modo la cache all'interno ResourceBundle espelle il buon rapporto e la sostituisce con quello rotto.Devo ancora capire perché e del Sole i file jar sono stati compilati senza informazioni di debug in modo debug è un lavoro di routine.

Le mie domande:

  1. C'è qualche modo globalmente impostazione predefinita ResourceBundle.Controllo che potrei non essere a conoscenza di?Che avrebbe risolto tutto piuttosto elegante.

  2. C'è qualche altro modo di gestire questo genere di cose elegantemente, forse senza manomettere il ResourceBundle lezioni a tutti?

È stato utile?

Soluzione

Penso che questo sia un difetto fondamentale nel modo in cui ResourceBundles sono progettati per funzionare:le chiavi che fanno riferimento ad altri tasti automaticamente violare il DRY (don't repeat yourself) principio.Il modo che ho avuto in tutto questo è stato simile al tuo metodo:creare un ReflectiveResourceBundle classe che consente di specificare le chiavi di Risorsa nei messaggi utilizzando EL notazione.

IL MODO SBAGLIATO:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

IL MODO GIUSTO:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

Ho caricato il codice su GitHub quindi tu o chiunque altro può scaricare.Inoltre, ho aggiunto un codice di esempio per chi utilizza le Strisce Quadro (http://www.stripesframework.org/) per ottenere rapidamente e in esecuzione.

Il trucco per ottenere questo lavoro con standard JSTL fmt taglibs stato quello di impostare un intercettore, che ha sostituito il HttpServletRequest di risorse con la nostra.Codice simile a questo:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

Date un'occhiata a strisce.interceptor pacchetto nel link qui sopra per ulteriori dettagli.

Altri suggerimenti

Se la stringa ripetizioni sono localizzate nel senso che si conosce una certa stringa verrà ripetuto, ma solo all'interno dello stesso progetto, che la condivisione di pacchetti di risorse non è un design incubo, allora si potrebbe prendere in considerazione la rottura delle corde in più tasti, o parti di valore.Separare le parti che si ripetono da quelli che non lo fanno e riutilizzare i ripetuti parti.Per esempio, permette di dire che si hanno le seguenti due stringhe è necessario visualizzare in:

  1. "Il Rosso ricoperto Robin è un piccolo uccello passeriforme originario dell'Australia."
  2. "Il Rosso ricoperto Robin si trova in asciugatrice regioni in gran parte del continente".

Il pacchetto di risorse potrebbe essere come segue:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

e poi combinare le parti necessarie ove necessario bundle.getString("robin.name")+bundle.getString(robin.native).

Una cosa che dovete stare attenti, però, è che le regole di grammatica come soggetto predicato ordine etc.potrebbe non essere la stessa in tutte le lingue.Così si avrebbe bisogno di essere un po ' attenti quando si dividono le frasi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top