2010-06-29 15 views
13

Tôi có tệp chuỗi được bản địa hóa được sử dụng trong ứng dụng Iphone mà tôi làm việc để chuyển sang Android. Có bất kỳ công cụ nào đi qua tệp được lấy từ dự án xcode và xây dựng xml cần thiết để sử dụng các chuỗi trong android không?Có công cụ nào để chuyển đổi tệp chuỗi địa phương hóa Iphone thành tệp tài nguyên chuỗi có thể được sử dụng trong Android không?

Như file táo là một tập tin có giá trị quan trọng đơn giản là có một công cụ có thể chuyển đổi chuỗi trong định dạng này

"chìa khóa" = "giá trị"

này:

<string name="key"> value </string>

Công cụ này phải dễ xây dựng nhưng tôi đánh giá cao bất kỳ gợi ý nào về công cụ đã làm việc.

+0

bạn sẽ có thể thực hiện điều này với một số phép thuật XSLT ... – Ben

+0

"Magic" đó sẽ chỉ áp dụng trong vấn đề ngược lại (từ tệp XML của Android, tới tệp văn bản iPhone phẳng). XSLT chỉ có thể chuyển đổi từ XML sang XML/TEXT/HTML. Anh ấy không may mắn lần này. –

+0

@ Jenusz tôi đã nhận được cùng một yêu cầu, vui lòng bạn có thể hướng dẫn tôi rằng làm thế nào tôi có thể đạt được điều này? Nếu u có bất kỳ mã mẫu sau đó xin vui lòng gửi cho tôi trên farhanshah_1987 @ yahoo.com, cũng +1 từ tôi .. cảm ơn –

Trả lời

4

Ok tôi đã viết Chuyển đổi nhỏ cho riêng mình sử dụng một chút từ mã từ alex.

public static void main(String[] args) throws IOException { 
    Scanner fileScanner = 
      new Scanner(new FileInputStream(args[0]), "utf-16"); 
    Writer writer = 
      new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
        new File(args[1])), "UTF8")); 
    writer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?> <resources>"); 
    while (fileScanner.hasNextLine()) { 
     String line = fileScanner.nextLine(); 
     if (line.contains("=")) { 
      line = line.trim(); 
      line = line.replace("\"", ""); 
      line = line.replace(";", ""); 
      String[] parts = line.split("="); 
      String nextLine = 
        "<string name=\"" + parts[0].trim() + "\">" 
          + parts[1].trim() + "</string>"; 
      System.out.println(nextLine); 
      writer.append(nextLine); 
     } 
    } 
    fileScanner.close(); 
    writer.append("</resources>"); 
    writer.close(); 
} 

Đó là một chút khó khăn để Java đọc chính xác và ghi đầu vào UTF 16 tôi đã thoát khỏi dự án xcode nhưng giờ nó hoạt động như một nét duyên dáng.

+0

Nó hoạt động, nhưng tôi mạnh mẽ khuyến khích học các công cụ dòng lệnh bạn có sẵn cho bạn. Theo tôi, những thứ như thế này sẽ dễ dàng hơn nhiều nếu bạn có thể viết một hoặc hai dòng trên dòng lệnh thay vì tạo một chương trình Java mới cho mọi thứ mà bạn cần phải làm xước. – mbafford

+1

Nó phụ thuộc vào những gì tôi muốn làm và ngôn ngữ nào tôi đang sử dụng nhanh nhất. Tôi đã nghĩ về việc làm nó trong python vì nó là nhiệm vụ phù hợp với ngôn ngữ kịch bản tốt nhưng tôi đã làm nhanh hơn trong Java vào lúc này. – Janusz

6

Đây là một trong những lĩnh vực mà tư duy và bộ công cụ Unix có ích. Tôi không biết những gì các định dạng iPhone là như thế, nhưng nếu đó là những gì bạn nói, với mỗi một giá trị trên mỗi dòng, một sed gọi đơn giản có thể làm điều này:

$ cat infile 
"key"="value" 
"key2"="value2" 
$ sed 's/ *"\([^"]*\)" *= *"\([^"]*\)"/<string name="\1">\2<\/string>/' infile 
<string name="key">value</string> 
<string name="key2">value2</string> 
$ 

Tôi hy vọng sed có sẵn trên OSX của bạn cài đặt .

3

Các "cụ" Tôi đã sử dụng để chuyển đổi một tập tin thuộc tính Java:

BufferedReader br = new BufferedReader(new InputStreamReader(
      new FileInputStream("c:/messages_en.properties"), "utf-8")); 
    String line = null; 
    while ((line = br.readLine()) != null) { 
     line = line.trim(); 
     if (line.length() > 0) { 
      String[] parts = line.split(" = "); 
      System.out.println("<string name=\"" + parts[0] + "\">" 
        + parts[1] + "</string>"); 
     } 
    } 
    br.close(); 
4

tôi cải thiện phương pháp chính của bạn ở trên làm việc cho tôi:

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 
import java.util.Scanner; 

public class StringsConverter { 

    public static void main(String[] args) throws IOException { 
     Scanner fileScanner = new Scanner(new FileInputStream(args[0]), "utf-16"); 
     Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(args[1])), "UTF8")); 
     writer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n"); 
     while (fileScanner.hasNextLine()) { 
      String line = fileScanner.nextLine(); 
      if (line.contains("=")) {    
       String[] parts = line.split("="); 

       parts[0] = parts[0].trim() 
        .replace(" ", "_") 
        .replace("\\n", "_") 
        .replace("-", "_") 
        .replace("\"", "") 
        .replace(";", "") 
        .replace("'", "") 
        .replace("/", "") 
        .replace("(", "") 
        .replace(")", "") 
        .replace("?", "_Question"); 

       parts[1] = parts[1].trim().substring(1, parts[1].length()-3); 
       parts[1] = parts[1].replace("'", "\\'"); 

       String nextLine = "<string name=\"" + parts[0] + "\">" + parts[1].trim() + "</string>"; 
       System.out.println(nextLine); 
       writer.append(nextLine + "\n"); 
      } 
     } 
     fileScanner.close(); 
     writer.append("</resources>"); 
     writer.close(); 
    } 

} 
+1

thêm dòng này quá các phần [1] = phần [1] .replace ("&", "&"); – xydev

3

Added vài sửa đổi để các giải pháp trên:

  • Android tên chuỗi theo kiểu - thế giới chữ thường, cách nhau bằng "_";
  • Chuyển đổi đối số định dạng chuỗi iOS sang định dạng java (% @,% @ thành% 1 $ s,% 2 $ s ...)
  • Chuyển đổi nhận xét;

public static void main(String[] args) throws IOException 
{ 
    Scanner fileScanner = 
      new Scanner(new FileInputStream(args[0]), "utf-16"); 
    Writer writer = 
      new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
        new File(args[1])), "UTF8")); 
    writer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>"); 
    writer.append("\n"); 
    while (fileScanner.hasNextLine()) 
    { 
     String line = fileScanner.nextLine(); 
     if (line.contains("=")) 
     { 
      line = line.trim(); 
      line = line.replace("\"", ""); 
      line = line.replace(";", ""); 
      String[] parts = line.split("="); 
      String resultName = processName(parts[0]); 
      String resultValue = processValue(parts[1]); 
      String nextLine = 
        "<string name=\"" + resultName.toLowerCase() + "\">" 
          + resultValue + "</string>"; 
      System.out.println(nextLine); 
      writer.append(nextLine); 
      writer.append("\n"); 
     } else 
     { 

      line = line.replace("/*", "<!--"); 
      line = line.replace("*/", "-->"); 
      writer.append(line); 
      writer.append("\n"); 
     } 
    } 
    fileScanner.close(); 
    writer.append("</resources>"); 
    writer.close(); 
} 

private static String processValue(String part) 
{ 
    String value = part.trim(); 
    StringBuilder resultValue = new StringBuilder(); 
    if (value.contains("%@")) 
    { 
     int formatCnt = 0; 
     for (int i = 0; i < value.length(); i++) 
     { 
      char c = value.charAt(i); 
      char next = value.length() > i + 1 ? value.charAt(i + 1) : '\0'; 
      if (c == '%' && next == '@') 
      { 
       formatCnt++; 
       resultValue.append('%'); 
       resultValue.append(formatCnt); 
       resultValue.append("$s"); 
       i++; 
      } else 
      { 
       resultValue.append(value.charAt(i)); 
      } 
     } 
    } else{ 
     resultValue.append(value); 
    } 
    return resultValue.toString(); 
} 

private static String processName(String part) 
{ 
    String name = part.trim(); 
    name = name.replace(" ", "_"); 
    name = name.replace("-", "_"); 
    name = name.replace("\n", "_"); 
    name = name.replaceAll("[^A-Za-z0-9 _]", ""); 
    if (Character.isDigit(name.charAt(0))) 
    { 
     name = "_" + name; 
    } 
    StringBuilder resultName = new StringBuilder(); 
    for (int i = 0; i < name.length(); i++) 
    { 
     char c = name.charAt(i); 
     if (Character.isUpperCase(c)) 
     { 
      char prev = i > 0 ? name.charAt(i - 1) : '\0'; 
      if (prev != '_' && !Character.isUpperCase(prev) && prev != '\0') 
      { 
       resultName.append('_'); 
      } 
      resultName.append(Character.toLowerCase(c)); 


     } else 
     { 
      resultName.append(Character.toLowerCase(c)); 
     } 
    } 
    return resultName.toString(); 
} 
0

này không thực sự trả lời câu hỏi của bạn, nhưng bạn có thể xem xét DMLocalizedString dành cho iOS + dự án Android tương lai của bạn. Hiện tại nguồn chỉ dành cho iOS, nhưng tôi tin rằng việc tạo phiên bản Android khá dễ dàng.

0

Để chuyển đổi thành Android, hãy sử dụng mã regex của tôi. Bạn có thể kiểm tra nó trực tuyến (sao chép các chuỗi thay thế):

http://www.phpliveregex.com/p/6dA

regex sử dụng là ^"(.*)"\s=\s"(.*)";$/m, chuỗi thay thế là <string name="$1">$2</string>

Để chuyển đổi để iOS, sử dụng mã regex của tôi (sao chép các chuỗi thay thế):

http://www.phpliveregex.com/p/6dC

regex sử dụng là ^\<string name=\"(.*)\"\>(.*)\<\/string\>/m, thay thế string là "$1" = "$2";