从属性文件键生成字符串常量
Generate string constants from properties file keys
我正在使用 .properties 文件进行消息国际化。例如:
HELLO_WORLD = Hello World
HELLO_UNIVERSE = Hello Universe
然后在 Java 代码中:
String foo = resourceBundle.getString("HELLO_WORLD");
像 "HELLO_WORLD"
这样的字符串文字是有问题的,因为它们容易出错并且不能自动完成。我想从属性文件中的键生成代码,如下所示:
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";
}
然后像这样使用它:
String foo = resourceBundle.getString(Messages.HELLO_WORLD);
有没有标准的方法来做到这一点?我更喜欢 Maven 插件,但任何我可以手动 运行 的独立工具都足以满足我的需求。
反过来最好:
public enum Message {
HELLO_WORLD,
HELLO_UNIVERSE;
public String xlat(Locale locale) {
resourceBundle.getString(toString(), locale);
}
}
从该枚举生成属性模板。如果您的基本语言位于单独的 ..._en.properties
.
中,则可以对新消息重复此操作
可以使用 values() 完成生成 - 无需解析。虽然也许您想为属性注释等引入一些注释。
以下代码将在您的项目根目录中生成接口 MyProperties,然后您可以在任何地方使用该接口。
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();
}
}
}
不,没有人编写过具有您所扩展的所有功能的此类插件,因为:
- 国际化可能有很多条目,你最终会得到一个巨大的 class、接口、枚举或其他任何东西,这很糟糕。
- 一个 maven/gradle 插件会为您生成 classes,但仅限于编译时。我看到你提到了 auto-completion,这意味着你还需要一个 IDE 插件,意思是构建工具的插件(gradle/ant/. ..) 是不足够的。这些插件之间的交互可能是 error-prone.
- 稍后在项目中,如果您或您的同事想要一个新的翻译条目,您将不得不重新生成 classes。有点累。
在处理国际化时,建议使用 i18n 之类的东西。如果你不想要一个新的库或者你的项目很小,你可以选择使用 eclipse 的外部化字符串功能,为此,请参阅
安卓:Externalize strings for Android project
我正在使用 .properties 文件进行消息国际化。例如:
HELLO_WORLD = Hello World
HELLO_UNIVERSE = Hello Universe
然后在 Java 代码中:
String foo = resourceBundle.getString("HELLO_WORLD");
像 "HELLO_WORLD"
这样的字符串文字是有问题的,因为它们容易出错并且不能自动完成。我想从属性文件中的键生成代码,如下所示:
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";
}
然后像这样使用它:
String foo = resourceBundle.getString(Messages.HELLO_WORLD);
有没有标准的方法来做到这一点?我更喜欢 Maven 插件,但任何我可以手动 运行 的独立工具都足以满足我的需求。
反过来最好:
public enum Message {
HELLO_WORLD,
HELLO_UNIVERSE;
public String xlat(Locale locale) {
resourceBundle.getString(toString(), locale);
}
}
从该枚举生成属性模板。如果您的基本语言位于单独的 ..._en.properties
.
可以使用 values() 完成生成 - 无需解析。虽然也许您想为属性注释等引入一些注释。
以下代码将在您的项目根目录中生成接口 MyProperties,然后您可以在任何地方使用该接口。
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();
}
}
}
不,没有人编写过具有您所扩展的所有功能的此类插件,因为:
- 国际化可能有很多条目,你最终会得到一个巨大的 class、接口、枚举或其他任何东西,这很糟糕。
- 一个 maven/gradle 插件会为您生成 classes,但仅限于编译时。我看到你提到了 auto-completion,这意味着你还需要一个 IDE 插件,意思是构建工具的插件(gradle/ant/. ..) 是不足够的。这些插件之间的交互可能是 error-prone.
- 稍后在项目中,如果您或您的同事想要一个新的翻译条目,您将不得不重新生成 classes。有点累。
在处理国际化时,建议使用 i18n 之类的东西。如果你不想要一个新的库或者你的项目很小,你可以选择使用 eclipse 的外部化字符串功能,为此,请参阅
安卓:Externalize strings for Android project