5

Utilizzo file .properties per l'internazionalizzazione dei messaggi. Per esempio:Genera costanti stringa da chiavi file proprietà

HELLO_WORLD = Hello World 
HELLO_UNIVERSE = Hello Universe 

E poi nel codice Java:

String foo = resourceBundle.getString("HELLO_WORLD"); 

stringhe letterali come "HELLO_WORLD" sono problematici perché sono soggette a errori e non possono essere compilato automaticamente. Mi piacerebbe per generare il codice dalle chiavi nelle proprietà del file in questo modo:

public interface Messages { // Or abstract class with private constructor 
    public static final String HELLO_WORLD = "HELLO_WORLD"; 
    public static final String HELLO_UNIVERSE = "HELLO_UNIVERSE"; 
} 

E poi usare in questo modo:

String foo = resourceBundle.getString(Messages.HELLO_WORLD); 

C'è un modo standard per fare questo? Preferisco un plugin Maven, ma qualsiasi strumento autonomo che posso eseguire manualmente sarebbe abbastanza buono per le mie esigenze.

+0

questo suona un sacco come il sistema di risorse nello sviluppo Android ... Mi chiedo se può essere utilizzato per progetti non Android? – Adam

+0

Vuoi utilizzare questo http://owner.aeonbits.org/docs/welcome/?ci sono altre utili funzionalità che ti offre il tuo interesse, ad esempio il ricaricamento e la roba di ricarica. – Aarjav

risposta

2

Il codice seguente genererà l'interfaccia MyProperties nella directory principale del progetto, quindi dopo sarà possibile utilizzare tale interfaccia ovunque.

public class PropertiesToInterfaceGenerator { 

    public static void main(String[] args) throws IOException { 

     Properties properties = new Properties(); 
     InputStream inputStream =PropertiesToInterfaceGenerator.class.getClassLoader().getResourceAsStream("xyz.properties"); 
     if(null != inputStream){ 
      properties.load(inputStream); 
     } 
     generate(properties); 
    } 


    public static void generate(Properties properties) { 
     Enumeration e = properties.propertyNames(); 
     try { 
      FileWriter aWriter = new FileWriter("MyProperties.java", true); 
      aWriter.write("public interface MyProperties{\n"); 
      while (e.hasMoreElements()) { 
       String key = (String) e.nextElement(); 
       String val = properties.getProperty(key); 
       aWriter.write("\tpublic static String "+key+" = \""+val+"\";\n"); 
      } 
      aWriter.write(" }\n"); 
      aWriter.flush();  
      aWriter.close(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

Perché si aggiunge al file? –

3

migliore il contrario:

public enum Message { 
    HELLO_WORLD, 
    HELLO_UNIVERSE; 

    public String xlat(Locale locale) { 
     resourceBundle.getString(toString(), locale); 
    } 
} 

generare da quel enum un modello di proprietà. Questo può essere ripetuto per nuovi messaggi se la tua lingua di base risiede in un separato ..._en.properties.

La generazione può essere eseguita utilizzando values ​​() - senza analisi. Sebbene forse tu voglia introdurre alcune annotazioni per i commenti delle proprietà o simili.

1

No, nessuno ha mai scritto come una sorta di plugin che hanno tutte le funzionalità che avete expexted, perché:

  • Internazionalizzazione possono avere un sacco di voci, e vi troverete infine ottenuto una classe enorme, interfaccia, enum o qualsiasi cosa alla fine, che è male.
  • Un plugin Maven/Gradle genera classi per te, ma solo in fase di compilazione. Vedo che hai menzionato il completamento automatico , il che significa che avrai bisogno anche di un plug-in IDE, il che significa che un plugin per uno strumento di costruzione (gradle/ant/...) non è sufficiente. L'interazione tra questi plugin potrebbe essere soggetta a errori.
  • Successivamente nel progetto, se tu oi tuoi colleghi desiderate una nuova voce di traduzione e dovrete rigenerare le classi. È un po 'stancante.

Quando si tratta di internazionalizzazione, è consigliabile qualcosa come i18n. Se non si desidera una nuova libreria o il vostro progetto è di piccole dimensioni, è possibile scegliere di utilizzare Eclipse di esternare la funzione stringhe, per questo, vedi

Andriod: Externalize strings for Android project

Altro: help.eclipse.org - Java development user guide > Reference > Wizards and Dialogs > Externalize Strings Wizard