2010-06-29 12 views
13

我有我用於移植到Android的Iphone應用程序中使用的本地化字符串文件。是否有任何工具通過從xcode項目中獲取的文件並構建在android中使用字符串所需的xml?是否有任何工具將Iphone本地化的字符串文件轉換爲可在Android中使用的字符串資源文件?

由於蘋果文件是一個簡單的鍵值文件是存在的,在這種格式

「鑰匙」 =「值」

這種轉換字符串的工具:

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

這個工具應該很容易建立,但我很欣賞任何指向已經工作的工具。

+0

你應該可以用一些XSLT魔術來實現這個...... – Ben 2010-06-29 13:34:51

+0

這個「魔術」只適用於相反的問題(從Android XML文件到平面iPhone文本文件)。 XSLT只能從XML轉換爲XML/TEXT/HTML。這次他運氣不好。 – 2010-06-29 13:49:56

+0

@Jenusz我已經得到相同的要求,請問你能指導我如何實現這個目標嗎?如果你有任何示例代碼,請發送我farhanshah_1987 @ yahoo.com,也+1我..謝謝 – 2014-04-30 07:06:54

回答

4

好吧,我用一點點從亞歷克斯的代碼寫我自己的小轉爐。

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

這是一個有點棘手獲取Java正確讀寫UTF 16輸入我下了Xcode項目,但現在它的工作就像一個魅力。

+0

它的工作原理,但我強烈鼓勵學習你可用的命令行工具。在我看來,如果你可以在命令行上寫出一兩行文件,而不是爲每一個需要從頭開始的每一個文件都創建一個新的Java程序,那麼這樣的事情就會容易得多。 – mbafford 2010-06-29 15:20:08

+1

這取決於我想做什麼以及哪種語言是我最快的。我考慮過在python中執行它,因爲它適合於一種很好的腳本語言,但我現在正在用Java更快地完成它。 – Janusz 2010-06-30 07:59:38

6

這是Unix思維方式和工具集派上用場的地方之一。我不知道是什麼的iPhone格式是這樣,但如果它是你說的話,每行的每個值之一,一個簡單的sed呼叫可以這樣做:

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

我希望SED可以用你的OSX安裝。

3

的「工具」,我用來轉換一個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

我提高了你的主要方法上面爲我工作:

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

add this line too parts [1] = parts [1] .replace(「&」,「&」); – xydev 2013-05-23 11:31:15

3

添加一些修改,上述解決方案:

  • 的Android風格字符串名稱 - 小寫的世界,通過分離 「_」;
  • 將iOS字符串格式參數轉換爲java格式(%@,%@到%1 $ s,%2 $ s ...)
  • 轉換評論;

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

這真的不回答你的問題,但你可以考慮DMLocalizedString爲你將來的iOS + Android項目。目前該源代碼僅適用於iOS,但我相信製作Android版本非常簡單。

0

轉換爲Android,請使用我的正則表達式代碼。您可以在線測試(複製替換字符串):

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

使用正則表達式是^"(.*)"\s=\s"(.*)";$/m,替換字符串是<string name="$1">$2</string>

對於轉換爲的iOS,用我的正則表達式的代碼(複製替換字符串):

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

使用正則表達式是^\<string name=\"(.*)\"\>(.*)\<\/string\>/m,更換字符串是"$1" = "$2";

相關問題