【问题标题】:Are there any tools to convert an Iphone localized string file to a string resources file that can be used in Android? [closed]是否有任何工具可以将 Iphone 本地化字符串文件转换为可在 Android 中使用的字符串资源文件? [关闭]
【发布时间】:2011-03-09 15:21:50
【问题描述】:

我有本地化的字符串文件,该文件在我正在开发的 Iphone 应用程序中用于移植到 Android。是否有任何工具可以通过从 xcode 项目中获取的文件并构建在 android 中使用字符串所需的 xml?

由于苹果文件是一个简单的键值文件,有没有一种工具可以转换这种格式的字符串

“键”=“值”

到这里:

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

这个工具应该很容易构建,但我很欣赏任何指向已经工作的工具的指针。

【问题讨论】:

  • 你应该能够用一些 XSLT 魔法来完成这个......
  • 那个“魔法”只适用于相反的问题(从 Android XML 文件到平面 iPhone 文本文件)。 XSLT 只能从 XML 转换为 XML/TEXT/HTML。这次他倒霉了。
  • @Jenusz 我有同样的要求,请您指导我如何实现这一点?如果您有任何示例代码,请通过 farhanshah_1987@yahoo.com 发送给我,也来自 +1我..谢谢
  • 这是我发布的问题,请检查http://stackoverflow.com/questions/23382277/android-how-to-convert-ios-strings-file-to-android-xml-through-programmatically
  • @Janusz twine可以使用github.com/mobiata/twine

标签: android localization port


【解决方案1】:

我想你可能会喜欢这个工具:

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

也是这个,但它缺少一些功能(例如转换名称中的空格):

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

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

【讨论】:

    【解决方案2】:

    这是 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 安装中可用。

    【讨论】:

      【解决方案3】:

      好的,我使用来自 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();
      }
      

      让 Java 正确读取和写入我从 xcode 项目中获得的 UTF 16 输入有点棘手,但现在它的工作就像一个魅力。

      【讨论】:

      • 它有效,但我强烈建议您学习可用的命令行工具。在我看来,如果你可以在命令行上写一两行而不是为你需要从头开始的每一个痒编写一个新的 Java 程序,这样的事情就会容易得多。
      • 这取决于我想做什么以及我最快的语言。我考虑用 python 来做,因为它适合一个好的脚本语言,但我用 Java 做起来更快目前。
      【解决方案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();
          }
      
      }
      

      【讨论】:

      • 也加入这一行parts[1] = parts[1].replace("&", "&");
      【解决方案5】:

      我用来转换 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();
      

      【讨论】:

        【解决方案6】:

        对上述解决方案添加了一些修改:

        • Android 风格的字符串名称 - 小写世界,用“_”分隔;
        • 将 iOS 字符串格式参数转换为 java 格式(%@、%@ 为 %1$s、%2$s ...)
        • 转换 cmets;

        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】:

          这并不能真正回答您的问题,但您可以考虑将 DMLocalizedString 用于您未来的 iOS+Android 项目。目前源代码仅适用于 iOS,但我相信制作 Android 版本非常容易。

          【讨论】:

            【解决方案8】:

            要转换为 Android,请使用我的正则表达式代码。可以在线测试(复制替换字符串):

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

            使用的正则表达式是^"(.*)"\s=\s"(.*)";$/m,替换字符串是&lt;string name="$1"&gt;$2&lt;/string&gt;

            要转换为 iOS,请使用我的正则表达式代码(复制替换字符串):

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

            使用的正则表达式是^\&lt;string name=\"(.*)\"\&gt;(.*)\&lt;\/string\&gt;/m,替换字符串是"$1" = "$2";

            【讨论】:

              【解决方案9】:

              基于网络的在线转换器(双向): https://gunhansancar.com/tools/converter/

              【讨论】:

                猜你喜欢
                • 2010-12-21
                • 1970-01-01
                • 1970-01-01
                • 2011-10-29
                • 2011-10-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-06
                相关资源
                最近更新 更多