2010-06-29 9 views
13

Tengo el archivo de cadenas localizadas que se utiliza en la aplicación Iphone en la que trabajo para exportar a Android. ¿Hay alguna herramienta que vaya a través del archivo tomado del proyecto xcode y construya el xml necesario para usar las cadenas en android?¿Hay alguna herramienta para convertir un archivo de cadena localizado de Iphone en un archivo de recursos de cadena que se pueda usar en Android?

Como el archivo de manzana es un simple archivo de clave de valor hay una herramienta que convierte cadena en este formato

"tecla" = "valor"

a esto:

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

Esta herramienta debe ser fácil de construir, pero agradezco cualquier sugerencia a las herramientas que ya funcionan.

+0

debe ser capaz de lograr esto con algo de magia XSLT ... – Ben

+0

Esa "magia" solo se aplicaría en el problema opuesto (desde archivos Android XML a archivos de texto planos de iPhone). XSLT solo puede convertir de XML a XML/TEXT/HTML. Él no tuvo suerte esta vez. –

+0

@Jenusz tengo el mismo requisito, amablemente ¿me pueden guiar que cómo puedo lograr esto? Si usted tiene algún código de muestra, por favor envíeme a farhanshah_1987 @ yahoo.com, también +1 de mí .. gracias –

Respuesta

4

Ok escribí mi propio pequeño conversor usando un poco a partir del código de 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(); 
} 

Fue un poco difícil de conseguir Java para leer y escribir la entrada de UTF-16 Salí del proyecto Xcode correctamente pero ahora está trabajando como un encanto.

+0

Funciona, pero recomiendo aprender las herramientas de línea de comandos que tiene disponibles para usted. En mi opinión, este tipo de cosas es mucho más fácil si puedes escribir una o dos líneas en la línea de comandos en lugar de crear un nuevo programa Java para cada picazón que necesites arañar. – mbafford

+1

Depende de lo que quiero hacer y en qué idioma soy más rápido. Pensé en hacerlo en python porque es una tarea adecuada para un buen lenguaje de scripts, pero en este momento era más rápido hacerlo en Java. – Janusz

6

Esta es una de las áreas donde la mentalidad y el conjunto de herramientas de Unix son útiles. No sé cuál es el formato iPhone es como, pero si es lo que usted dice, con cada valor de uno por línea, un simple sed llamada podría hacer esto:

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

espero SED está disponible en su OSX instalar .

3

La "herramienta" que he usado para convertir un archivo de propiedades 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

que mejoraron su principal método de arriba para trabajar para mí:

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

agregue esta línea también partes [1] = partes [1] .replace ("&", "&"); – xydev

3

añadido algunas modificaciones a las soluciones anteriores:

  • Android nombres de cadena de estilo - mundos minúsculas, separadas por "_";
  • Convierta los argumentos de formato de cadena de iOS a formato Java (% @,% @ a% 1 $ s,% 2 $ s ...)
  • Convertir comentarios;

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

Esta realidad no responde a su pregunta, pero se puede considerar DMLocalizedString para su futuro IOS + proyecto Android. Actualmente, la fuente es solo para iOS, pero creo que hacer la versión de Android es bastante fácil.

0

Para convertir a Android, use mi código de expresiones regulares. Se puede comprobar en línea (copiar la cadena de reemplazo):

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

expresiones regulares utilizado es ^"(.*)"\s=\s"(.*)";$/m, cadena de reemplazo es <string name="$1">$2</string>

Para convertir a iOS, se usa el código expresiones regulares (copiar la cadena de reemplazo):

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

regex utilizado es ^\<string name=\"(.*)\"\>(.*)\<\/string\>/m, la sustitución cadena es "$1" = "$2";

Cuestiones relacionadas