2011-10-05 2 views
4

Dans une application Android, toutes les valeurs des chaînes sont codées en dur (étiquettes, titres de dialogues, boutons, etc.). Ma tâche consiste à extraire toutes ces chaînes dans un fichier de ressources. Sans passer manuellement par le code et faire beaucoup de c/p, y at-il un moyen que je puisse extraire toutes les chaînes de l'application? Utiliser des regex? Je pensais à écrire un motif avec quelque chose comme ". *" Ou en quelque sorte l'analyse du code?Comment extraire toutes les chaînes de l'application en Java

Editer: Je suis conscient des chaînes externaliser pour Eclipse, mais il crée le fichier .properties et ce dont j'ai besoin est un fichier .xml. Donc, il faudrait encore un effort pour le convertir en un fichier .xml.

Je pensais à écrire un programme simple qui va extraire toutes les chaînes avec les noms des classes qu'ils trouvaient.

+0

Pensez-vous résolu votre problème là-bas: P. –

+0

Qu'est-ce qu'un "c/p"? –

+0

c/p est pour copier/coller :) – Maggie

Répondre

3

Eclipse fournit un assistant externalize strings. Pour les solutions spécifiques à Android: Externalize strings for Android project.

Espérons que ça aide.

+0

Merci, je suis conscient de cela. Mais il crée un fichier .properties, et ce n'est pas tout à fait ce dont j'ai besoin. Android utilise le fichier xml pour la ressource de chaîne. Donc, je voudrais en quelque sorte convertir le fichier .properties en un fichier .xml, ce qui est également un problème. – Maggie

+0

J'ai édité la réponse, j'espère qu'elle répondra à votre question. –

+0

Je ne peux pas le trouver dans mon Eclipse, mais dans le commentaire il est dit que je dois mettre à jour ma version adt. Merci, vous êtes le meilleur :) – Maggie

1

J'ai écrit un petit programme pour m'aider à y parvenir. J'ai eu un fichier avec plus de cent chaînes de caractères, donc juste en appuyant sur Ctrl + 1 -> Entrée dans chaque ligne serait trop de tracas. Le petit programme prend l'emplacement de fichier de votre fichier .java en entrée et place les informations sur votre console pour C & P. On pourrait améliorer l'image pour parcourir le système de fichiers et le faire pour tous les fichiers .java, mais il suffisait à mon but ...

package de.panschk.androidutil; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import java.util.HashSet; 
import java.util.Set; 

public class ExtractStringHelper { 

public static void main (String[] args) throws IOException { 
    String fileName = "LOCATION OF .JAVA FILE"; 
    FileInputStream fis = new FileInputStream(fileName); 
    streamToStringReplaceEntities(fis); 
    fis.close(); 

} 

private static Set<String> varNames= new HashSet<String>(); 
public static void streamToStringReplaceEntities(InputStream is) 
     throws IOException { 
    BufferedInputStream bis = new BufferedInputStream(is); 
    ByteArrayOutputStream codeOut = new ByteArrayOutputStream(); 
    StringBuffer xmlOut = new StringBuffer(); 
    boolean inLineComment = false; 
    boolean inMultilineComment = false; 
    boolean inQuotes = false; 
    char lastChar = ' '; 
    ByteArrayOutputStream stringContent = new ByteArrayOutputStream(); 
    int result = bis.read(); 
    while (result != -1) { 
     boolean inComment = inLineComment || inMultilineComment; 
     byte b = (byte) result; 
     // read next byte 
     result = bis.read(); 
     boolean copyCharToBuffer = true; 
     if (!inQuotes && !inComment && b == '"') { 
      stringContent = new ByteArrayOutputStream(); 
      inQuotes = true; 
      copyCharToBuffer = false; 
     } else if (inQuotes && b == '"') { 
      String content = stringContent.toString("UTF-8"); 
      String varName = makeVariableName(content); 
      inQuotes = false; 
      addXMLContent(varName, content, xmlOut); 
      addCodeContent(varName, codeOut); 
      copyCharToBuffer = false; 

     } else if (inQuotes) { 
      copyCharToBuffer = false; 
      stringContent.write(b); 

     } else if (!inComment && !inQuotes && lastChar == '/' && b == '/') { 
      inLineComment = true; 
     } else if (!inComment && !inQuotes && lastChar == '/' && b == '*') { 
      inMultilineComment = true; 
     } else if (inLineComment && b == '\n') { 
      inLineComment = false; 
     } else if (inMultilineComment && lastChar == '*' && b == '/') { 
      inMultilineComment = false; 
     } 

     if (copyCharToBuffer) { 
      codeOut.write(b); 
     } 
     lastChar = (char) b; 
    } 

    System.out.println(codeOut.toString("UTF-8")); 
    System.out.println(xmlOut.toString()); 

} 

private static void addCodeContent(String varName, 
     ByteArrayOutputStream codeOut) throws IOException { 
    String contentToAdd = "getResources().getString(R.string."+varName+")"; 
    byte[] bytes; 
    try { 
     bytes = contentToAdd.getBytes("UTF-8"); 
     codeOut.write(bytes); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

} 

private static void addXMLContent(String varName, String content, 
     StringBuffer xmlOut) { 
    if (!varNames.contains(varName)) { 
     content = content.replace("'", "\\'"); 
     xmlOut.append(" <string name=\"").append(varName).append("\">").append(content).append("</string>\n"); 
     varNames.add(varName); 
    } 

} 

static String makeVariableName(String s) { 
    s = s.replace(' ', '_'); 
    s = s.replaceAll("[^A-Za-z0-9_]", "").toLowerCase(); 
    return s; 
} 

}

Questions connexes