Существуют ли какие-либо инструменты для преобразования локализованного строкового файла Iphone в файл строковых ресурсов, который можно использовать в Android?

У меня есть файл локализованных строк, который используется в приложении для iPhone, над которым я работаю, чтобы перенести его на Android. Существуют ли какие-либо инструменты, которые проходят через файл, взятый из проекта xcode, и создают xml, необходимый для использования строк в Android?

Поскольку файл Apple представляет собой простой файл значения ключа, есть ли инструмент, который преобразует строку в этот формат?

"ключ" = "значение"

к этому:

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

Этот инструмент должен быть прост в создании, но я ценю любые указатели на уже работающие инструменты.


person Janusz    schedule 29.06.2010    source источник
comment
вы должны быть в состоянии выполнить это с помощью некоторой магии XSLT...   -  person Ben    schedule 29.06.2010
comment
Эта магия применима только в противоположной задаче (от XML-файлов Android до плоских текстовых файлов iPhone). XSLT может только преобразовывать XML в XML/TEXT/HTML. На этот раз ему не повезло.   -  person Fernando Miguélez    schedule 29.06.2010
comment
@Jenusz, у меня такое же требование, пожалуйста, подскажите, как мне этого добиться?   -  person Farhan Shah    schedule 30.04.2014
comment
это мой опубликованный вопрос, пожалуйста, проверьтеhttp://stackoverflow.com/questions/23382277/android-how-to-convert-ios-strings-file-to-android-xml-через-программно   -  person Farhan Shah    schedule 30.04.2014
comment
Можно использовать шпагат @Janusz github.com/mobiata/twine   -  person bikram990    schedule 17.11.2014


Ответы (9)


Я думаю, вам может понравиться этот инструмент:

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

Также этот, но в нем отсутствуют некоторые функции (например, преобразование пробелов в имени):

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

Это бесплатно, не требует регистрации, и вам не нужно создавать собственный скрипт!

person NLemay    schedule 21.01.2013

Это одна из областей, где мышление и набор инструментов 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.

person mbafford    schedule 29.06.2010

Хорошо, я написал свой собственный конвертер, используя немного кода Алекса.

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, но теперь он работает как шарм.

person Janusz    schedule 29.06.2010
comment
Это работает, но я настоятельно рекомендую изучить имеющиеся у вас инструменты командной строки. На мой взгляд, такие вещи намного проще, если вы можете написать одну или две строки в командной строке, а не создавать новую программу Java для каждого зуда, который вам нужно поцарапать. - person mbafford; 29.06.2010
comment
Это зависит от того, что я хочу делать и на каком языке у меня получается быстрее всего. Я думал о том, чтобы сделать это на питоне, потому что это задача, подходящая для хорошего языка сценариев, но в данный момент я быстрее делал это на Java. - person Janusz; 30.06.2010

Я улучшил ваш основной метод выше, чтобы он работал на меня:

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

}
person johnthuss    schedule 30.04.2011
comment
добавьте и эту строку parts[1] = parts[1].replace(&, ); - person xydev; 23.05.2013

«Инструмент», который я использовал для преобразования файла свойств 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();
person yanchenko    schedule 29.06.2010

Добавлено несколько изменений к вышеуказанным решениям:

  • Строковые имена в стиле 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();
}
person Alex Askerov    schedule 20.08.2013

На самом деле это не отвечает на ваш вопрос, но вы можете рассмотреть DMLocalizedString для своего будущего проекта iOS + Android. В настоящее время исходный код предназначен только для iOS, но я считаю, что сделать версию для Android довольно просто.

person Lolloz89    schedule 08.09.2013

Для преобразования в 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";

person Oritm    schedule 02.08.2014

Интернет-конвертер (в обе стороны): https://gunhansancar.com/tools/converter/

person ODAXY    schedule 06.06.2019