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