是否有任何工具可以将 Iphone 本地化字符串文件转换为可在 Android 中使用的字符串资源文件? [关闭]

Posted

技术标签:

【中文标题】是否有任何工具可以将 Iphone 本地化字符串文件转换为可在 Android 中使用的字符串资源文件? [关闭]【英文标题】:Are there any tools to convert an Iphone localized string file to a string resources file that can be used in Android? [closed] 【发布时间】: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://***.com/questions/23382277/android-how-to-convert-ios-strings-file-to-android-xml-through-programmatically @Janusz twine可以使用github.com/mobiata/twine 【参考方案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/

【讨论】:

以上是关于是否有任何工具可以将 Iphone 本地化字符串文件转换为可在 Android 中使用的字符串资源文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 支持多种语言

是否有任何将图像转换为文本格式的 iphone 类?

是否有任何方法可以通过 Google 凭据登录 iphone 应用程序

是否有任何正则表达式可以查找本地化字符串,例如 en_US(或通用 xx_YY)? [关闭]

将 iPhone 应用程序与 Shibboleth 集成

是否可以将数据从 iPhone 迁移到任何桌面 SQL 数据库?