javainternationalizationcode-generationproperties-file

Generate string constants from properties file keys


I'm using .properties files for message internationalization. For example:

HELLO_WORLD = Hello World
HELLO_UNIVERSE = Hello Universe

And then in Java code:

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

String literals like "HELLO_WORLD" are problematic because they're error-prone and can't be autocompleted. I'd like to generate code from the keys in the properties file like this:

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

And then use it like this:

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

Is there a standard way to do this? I prefer a Maven plugin, but any stand-alone tool that I can run manually would be good enough for my needs.


Solution

  • Following code will generate interface MyProperties in your root directory of the project then after you can use that interface anywhere.

    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();
            }
        }
    }