2010-06-29 6 views
13

मेरे पास स्थानीय स्ट्रिंग्स फ़ाइल है जिसका उपयोग आईफोन ऐप में किया जाता है जिसे मैं एंड्रॉइड पर बंदरगाह पर काम करता हूं। क्या कोई उपकरण है जो एक्सकोड प्रोजेक्ट से ली गई फाइल के माध्यम से जाता है और एंड्रॉइड में तारों का उपयोग करने के लिए आवश्यक एक्सएमएल बनाता है?क्या आईफोन स्थानीयकृत स्ट्रिंग फ़ाइल को स्ट्रिंग संसाधन फ़ाइल में कनवर्ट करने के लिए कोई उपकरण है जिसका उपयोग एंड्रॉइड में किया जा सकता है?

के रूप में सेब फ़ाइल एक सरल कुंजी मान फ़ाइल है जो एक ऐसा टूल है कि इस प्रारूप

"कुंजी" = "का मान"

इस के लिए

में स्ट्रिंग परिवर्तित करता है:

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

यह टूल बनाना आसान होना चाहिए, लेकिन मैं पहले से ही काम करने वाले टूल के किसी भी पॉइंटर्स की सराहना करता हूं।

+0

आपको इसे कुछ एक्सएसएलटी जादू के साथ पूरा करने में सक्षम होना चाहिए ... – Ben

+0

वह "जादू" केवल विपरीत समस्या (एंड्रॉइड एक्सएमएल फाइलों से, फ्लैट आईफोन टेक्स्ट फाइलों तक) में लागू होगा। एक्सएसएलटी केवल एक्सएमएल से एक्सएमएल/टेक्स्ट/एचटीएमएल में परिवर्तित हो सकता है। वह इस बार भाग्य से बाहर है। –

+0

@ जेनुज़ मुझे एक ही आवश्यकता है, कृपया आप मुझे मार्गदर्शन कर सकते हैं कि मैं इसे कैसे प्राप्त कर सकता हूं? अगर आपके पास कोई नमूना कोड है तो कृपया मुझे farhanshah_1987 @ yahoo.com पर भेजें, मुझे भी +1 .. धन्यवाद –

उत्तर

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

यह एक छोटा सा जावा सही ढंग से पढ़ सकते हैं और UTF 16 इनपुट मैं xcode परियोजना से बाहर हो गया लिखने के लिए प्राप्त करने के लिए मुश्किल था, लेकिन अब यह एक आकर्षण की तरह काम कर रहा है।

+0

यह काम करता है, लेकिन मैं आपके लिए उपलब्ध कमांड लाइन टूल्स सीखने के लिए दृढ़ता से प्रोत्साहित करता हूं। मेरी राय में, इस तरह की चीजें इतनी आसान होती हैं कि आप स्क्रैच करने के लिए आवश्यक प्रत्येक खुजली के लिए एक नया जावा प्रोग्राम बनाने के बजाय कमांड लाइन पर एक या दो पंक्तियां लिख सकते हैं। – mbafford

+1

यह इस बात पर निर्भर करता है कि मैं क्या करना चाहता हूं और मैं कौन सी भाषा में सबसे तेज़ हूं। मैंने इसे पायथन में करने के बारे में सोचा क्योंकि यह एक अच्छी पटकथा भाषा के लिए उपयुक्त है लेकिन मैं इस समय जावा में तेज़ी से कर रहा था। – Janusz

6

यह उन क्षेत्रों में से एक है जहां यूनिक्स मानसिकता और टूलसेट काम में आता है। मैं क्या 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> 
$ 

मैं एसईडी उम्मीद अपने OSX पर उपलब्ध है स्थापित ।

3

"उपकरण" मैं एक जावा गुण फ़ाइल कन्वर्ट करने के लिए उपयोग किया है:

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

इस लाइन को भी बहुत भागों में जोड़ें [1] = भागों [1]। जगह ("और", "&"); – xydev

8

मुझे लगता है कि आप इस उपकरण पसंद कर सकते हैं:

http://members.home.nl/bas.de.reuver/files/stringsconvert.html

इसके अलावा इस एक, लेकिन यह कुछ सुविधाओं का अभाव है (जैसे नाम में व्हाइटस्पेस को परिवर्तित करना):

http://localise.biz/free/converter/ios-to-android

यह मुफ़्त है, पंजीकरण की कोई आवश्यकता नहीं है, और आपको अपनी खुद की स्क्रिप्ट बनाने की आवश्यकता नहीं होगी!

3

जोड़ा ऊपर समाधान करने के लिए कुछ संशोधन:

  • एंड्रॉयड स्टाइल स्ट्रिंग नाम - लोअरकेस दुनिया, द्वारा अलग "_";
  • जावा प्रारूप (% @,% @ से% 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

यह वास्तव में आपके प्रश्न का उत्तर नहीं है, लेकिन आप अपने भविष्य के आईओएस + Android परियोजना के लिए DMLocalizedString विचार कर सकते हैं। वर्तमान में स्रोत केवल आईओएस के लिए है, लेकिन मेरा मानना ​​है कि एंड्रॉइड संस्करण बनाना बहुत आसान है।

0

एंड्रॉइड में कनवर्ट करने के लिए, मेरे रेगेक्स कोड का उपयोग करें। आप इसे ऑनलाइन परीक्षण कर सकते हैं (कॉपी प्रतिस्थापन स्ट्रिंग):

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

इस्तेमाल किया regex ^"(.*)"\s=\s"(.*)";$/m है, प्रतिस्थापन स्ट्रिंग <string name="$1">$2</string>

है को बदलने आईओएस के लिए, मेरे regex कोड का उपयोग (प्रतिस्थापन स्ट्रिंग कॉपी):

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

इस्तेमाल किया regex ^\<string name=\"(.*)\"\>(.*)\<\/string\>/m, प्रतिस्थापन है स्ट्रिंग "$1" = "$2";