代码之家  ›  专栏  ›  技术社区  ›  Janusz Daniel Rindt

有没有工具可以将Iphone本地化的字符串文件转换成可以在Android中使用的字符串资源文件?

  •  13
  • Janusz Daniel Rindt  · 技术社区  · 15 年前

    我有一个本地化的strings文件,它在我工作的Iphone应用程序中用于移植到Android。在android中,有没有什么工具可以遍历xcode项目中的文件并构建使用字符串所需的xml?

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

    8 回复  |  直到 15 年前
        1
  •  9
  •   NLemay    13 年前

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

    也是这个,但是它缺少一些特性(比如在名称中转换空白):

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

    它是免费的,不需要注册,你将不需要建立自己的脚本!

        2
  •  6
  •   mbafford    15 年前

    这是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>
    $
    

        3
  •  4
  •   Janusz Daniel Rindt    15 年前

    好吧,我用亚历克斯的代码写了我自己的小转换器。

    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正确地读写我从xcode项目中得到的UTF16输入有点棘手,但现在它的工作非常出色。

        4
  •  4
  •   johnthuss    15 年前

    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();
        }
    
    }
    
        5
  •  3
  •   yanchenko    15 年前

        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();
    
        6
  •  3
  •   Alex Askerov    12 年前

    • Android风格的字符串名称-小写世界,用“\”分隔;
    • 转换评论;

    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();
    }
    
        7
  •  0
  •   Lolloz89    12 年前

    这并不能真正回答您的问题,但是您可以考虑在未来的iOS+Android项目中使用DMLocalizedString。目前的来源是iOS的,但我相信,使Android版本是相当容易的。

        8
  •  0
  •   Oritm    11 年前

    安卓

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

    使用的正则表达式是 ^"(.*)"\s=\s"(.*)";$/m <string name="$1">$2</string>

    转换为 网间网操作系统

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

    ^\<string name=\"(.*)\"\>(.*)\<\/string\>/m ,替换字符串为 "$1" = "$2";

    推荐文章