Android字符串数组:将字符串移出数组以获得更好的可见性

时间:2016-11-15 18:47:17

标签: regex android-studio

我在Android字符串资源文件中包含了很多string-array个定义,如下所示:

<string-array name="my_items">
    <item>First Option</item>
    <item>Second Option</item>
    <item>Third Option</item>
</string-array>

虽然这很好用,但我发现应用本地化工具通常不会理解string-array定义,这使得导出字符串进行翻译变得很麻烦。甚至Android Studio中的翻译编辑器似乎也忽略了这些string-array定义。

所以我想做的是将字符串本身从数组中移出,它们具有更好的可见性,并引用数组内部的字符串,如下所示:

<string name="my_items_1">First Option</string>
<string name="my_items_2">Second Option</string>
<string name="my_items_3">Third Option</string>

<string-array name="my_items">
    <item>@string/my_items_1</item>
    <item>@string/my_items_2</item>
    <item>@string/my_items_3</item>
</string-array>

由于我有很多这些(在几个语言资源文件中),我正在寻找一种以自动方式进行转换/映射的方法。我想也许可能会有一个非常狡猾的基于正则表达式的解决方案,包括前瞻或后视,或类似的东西。我对正则表达式毫无希望,所以我不确定这是可能的。如果没有,也许有一个基于脚本的方法?

希望得到某人的启发!

1 个答案:

答案 0 :(得分:1)

你需要知道哪个文件包含上面提到的模式...一旦你知道应该处理的文件然后你应用以下,代码是用java7编写的,因为你不会在android上做到这一点手机...而不是你需要它用于开发上下文因此,请将以下代码视为一个工具来修改文件,如下所示:

作为安全预防措施,请确保在完成以下代码之前备份文件

package regex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.nio.file.Files.readAllBytes;
import static java.nio.file.Paths.get;

/**
 *
 * @author Maverick
 */
public class Regex {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {


        final String regex = "<string-array name=\\\"(.*?)\\\">(.*?)<\\/string-array>";
        String string = null;
        string = new String(readAllBytes(get("G:/sample.xml")));
        final String subRegex = "(<item>)(.*?)(<\\/item>)";
        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL);
        final Pattern subPattern = Pattern.compile(subRegex, Pattern.MULTILINE | Pattern.DOTALL);
        final Matcher matcher = pattern.matcher(string);
        Matcher submatcher;

        String str1 = "", str2 = "";
        String finalResult = "";

        while (matcher.find()) {
            submatcher = subPattern.matcher(matcher.group(2));
            str1 = "";
            str2 = "<string-array name=\"" + matcher.group(1) + "\">\n";

            int j = 0;
            while (submatcher.find()) {
                j += 1;
                str1 += "<string name=\"" + matcher.group(1) + "_" + j + "\">" + submatcher.group(2) + "</string>\n";
                str2 += "<item>@string/" + matcher.group(1) + "_" + j + "</item>\n";
            }
            str1 += "\n\n";
            str2 += "</string-array>\n\n";

            finalResult = str1 + str2;
            string = string.replace(matcher.group(0), finalResult);
        }
        File myFoo = new File("G:/sample.xml");
        FileWriter fooWriter = new FileWriter(myFoo, false);
        fooWriter.write(string);
        fooWriter.close();


    }
}

执行前的sample.xml内容:

<string-array name="my_items1">
    <item>First Option1</item>
    <item>Second Option1</item>
    <item>Third Option1</item>
</string-array>

asdfadsf
safasdfadsf

<string-array name="my_items1">
    <item>First Option1</item>
    <item>Second Option1</item>
    <item>Third Option1</item>
</string-array>

sdfasfasdf

<string-array name="my_items12">
    <item>First Option12</item>
    <item>Second Option12</item>
    <item>Third Option12</item>
</string-array>

aa
basfad

<string-array name="my_items13">
    <item>First Option13</item>
    <item>Second Option13</item>
    <item>Third Option13</item>
</string-array>

afsdfadsf

执行后

<string name="my_items1_1">First Option1</string>
<string name="my_items1_2">Second Option1</string>
<string name="my_items1_3">Third Option1</string>


<string-array name="my_items1">
<item>@string/my_items1_1</item>
<item>@string/my_items1_2</item>
<item>@string/my_items1_3</item>
</string-array>



asdfadsf
safasdfadsf

<string name="my_items1_1">First Option1</string>
<string name="my_items1_2">Second Option1</string>
<string name="my_items1_3">Third Option1</string>


<string-array name="my_items1">
<item>@string/my_items1_1</item>
<item>@string/my_items1_2</item>
<item>@string/my_items1_3</item>
</string-array>



sdfasfasdf

<string name="my_items12_1">First Option12</string>
<string name="my_items12_2">Second Option12</string>
<string name="my_items12_3">Third Option12</string>


<string-array name="my_items12">
<item>@string/my_items12_1</item>
<item>@string/my_items12_2</item>
<item>@string/my_items12_3</item>
</string-array>



aa
basfad

<string name="my_items13_1">First Option13</string>
<string name="my_items13_2">Second Option13</string>
<string name="my_items13_3">Third Option13</string>


<string-array name="my_items13">
<item>@string/my_items13_1</item>
<item>@string/my_items13_2</item>
<item>@string/my_items13_3</item>
</string-array>



afsdfadsf