5

Tôi đang sử dụng các tệp .properties cho quốc tế hóa thư. Ví dụ:Tạo các hằng số chuỗi từ các khóa thuộc tính tệp

HELLO_WORLD = Hello World 
HELLO_UNIVERSE = Hello Universe 

Và sau đó trong mã Java:

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

literals chuỗi như "HELLO_WORLD" là vấn đề bởi vì chúng dễ bị lỗi và không thể tự động hoàn tất. Tôi muốn tạo mã từ các phím trong các thuộc tính tập tin như thế này:

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

Và sau đó sử dụng nó như thế này:

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

Có một cách tiêu chuẩn để làm điều này? Tôi thích một plugin Maven, nhưng bất kỳ công cụ độc lập nào mà tôi có thể chạy thủ công sẽ đủ tốt cho nhu cầu của tôi.

+0

Điều này nghe rất nhiều như hệ thống tài nguyên trong phát triển Android ... Tôi tự hỏi liệu nó có thể được sử dụng cho các dự án không phải của Android không? – Adam

+0

Bạn có muốn sử dụng http://owner.aeonbits.org/docs/welcome/ này không?có những tính năng hữu ích khác mà nó cung cấp mà bạn có thể quan tâm như tải lại và tải lại nội dung. – Aarjav

Trả lời

2

Mã sau sẽ tạo giao diện MyProperties trong thư mục gốc của dự án sau đó sau khi bạn có thể sử dụng giao diện đó ở bất kỳ đâu.

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

Tại sao bạn thêm vào tệp? –

3

tốt nhất là cách khác xung quanh:

public enum Message { 
    HELLO_WORLD, 
    HELLO_UNIVERSE; 

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

Tạo từ enum rằng một thuộc tính mẫu. Điều này có thể được lặp lại cho các tin nhắn mới nếu ngôn ngữ cơ bản của bạn nằm trong một riêng biệt ..._en.properties.

Thế hệ có thể được thực hiện bằng cách sử dụng các giá trị() - không phân tích cú pháp. Mặc dù có thể bạn muốn giới thiệu một số chú thích cho các nhận xét thuộc tính hoặc như vậy.

1

Không, không ai đã từng được viết kiểu như vậy của plugin đó có tất cả các tính năng bạn đã expexted, bởi vì:

  • Quốc tế hóa có thể có rất nhiều mục, và cuối cùng bạn sẽ có một lớp khổng lồ, giao diện, enum hoặc bất cứ điều gì vào cuối, đó là xấu.
  • Plugin maven/gradle tạo các lớp cho bạn, nhưng chỉ vào thời gian biên dịch. Tôi thấy bạn đã đề cập đến việc tự động hoàn thành , điều đó có nghĩa là bạn cũng sẽ cần một plugin IDE, có nghĩa là plugin cho công cụ xây dựng (gradle/ant/...) là không đủ. Tương tác giữa các plugin này có thể bị lỗi.
  • Sau này trong dự án, nếu bạn hoặc đồng nghiệp của bạn, muốn có một bản dịch mới, và bạn sẽ phải tạo lại các lớp học. Đó là một chút mệt mỏi.

Khi giao dịch với quốc tế, một số nội dung như i18n được đề xuất. Nếu bạn không muốn có một thư viện mới hoặc dự án của bạn là nhỏ, bạn có thể chọn để sử dụng Eclipse ra bên ngoài chuỗi chức năng, cho rằng, xem

Andriod: Externalize strings for Android project

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

Các vấn đề liên quan