5

Używam plików .properties do internacjonalizacji wiadomości. Na przykład:Generowanie ciągów znaków z kluczy plików właściwości

HELLO_WORLD = Hello World 
HELLO_UNIVERSE = Hello Universe 

, a następnie w kodzie Java:

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

literały łańcuchowe jak "HELLO_WORLD" są problematyczne, ponieważ są one podatne na błędy i nie może być automatycznie uzupełnioną. Chciałbym wygenerować kod z pliku klawisze właściwości tak:

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"; 
} 

a następnie używać go tak:

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

Czy istnieje standardowy sposób to zrobić? Wolę wtyczkę Mavena, ale każde samodzielne narzędzie, które mogę uruchomić ręcznie byłoby wystarczająco dobre dla moich potrzeb.

+0

To brzmi dużo jak system zasobów w rozwoju Androida ... Zastanawiam się, czy można go wykorzystać w projektach innych niż Android? – Adam

+0

Czy chcesz użyć tego http://owner.aeonbits.org/docs/welcome/?istnieją inne użyteczne funkcje, które mogą Cię zainteresować, takie jak przeładowanie i przeładowanie. – Aarjav

Odpowiedz

2

Poniższy kod wygeneruje interfejs MyProperties w katalogu głównym projektu, a następnie po użyciu tego interfejsu w dowolnym miejscu.

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

Dlaczego dołączasz do pliku? –

3

Najlepszy na odwrót:

public enum Message { 
    HELLO_WORLD, 
    HELLO_UNIVERSE; 

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

wygenerować z tego wyliczenia szablon właściwości. Można to powtórzyć dla nowych wiadomości, jeśli twój język podstawowy znajduje się w oddzielnym ..._en.properties.

Generowanie można wykonać za pomocą wartości() - bez analizowania. Być może jednak chcesz wprowadzić adnotację do komentarzy o właściwościach lub takich.

1

Nie, nikt nigdy nie napisał takiego rodzaju wtyczki, które mają wszystkie możliwości zostały expexted, ponieważ:

  • Internacjonalizacja może mieć wiele wpisów, a w końcu dostał gigantyczną klasę, interfejs, enum czy cokolwiek na końcu, co jest złe.
  • Wtyczka maven/gradle generuje klasy dla ciebie, ale tylko w czasie kompilacji. Widzę, że wspomniałeś o autouzupełnianiu, co oznacza, że ​​będziesz potrzebował wtyczki IDE, co oznacza, że ​​wtyczka do narzędzia budowlanego (gradle/ant/...) nie wystarczy. Interakcja pomiędzy tymi wtyczkami może być podatna na błędy.
  • Później w projekcie, jeśli Ty lub Twoi współpracownicy, chcecie nowego wpisu, a będziecie musieli zregenerować klasy. To trochę męczące.

W przypadku internacjonalizacji zaleca się coś w stylu i18n. Jeśli nie chcą nowej biblioteki lub projekt jest niewielki, można zdecydować się na stosowanie Eclipse uzewnętrznić funkcję struny, za to zobaczyć

Andriod: Externalize strings for Android project

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