问题描述
项目需要做俄语国际化,历史代码里有的字段有俄语翻译、有的没有,需要把没翻译的中文整理出来翻译成俄文。
大概思路
- 列出所有res目录,根据是否包含values-ru分成两组(半自动
- 在“不包含”分组里把需要翻译的中文文件复制出来(半自动)
- 在“包含”组里把需要补充翻译的字段复制出来(纯手动)
- 把复制出来需要翻译的xml文件转换成excel用于翻译(自动)
- 把翻译好的文件根据转换成xml,根据之前记录的res目录放到项目里(半自动)
代码
列出所有string.xml文件路径
public static void listResPath(String src) throws Exception {
File path1 = new File(src);
if (!path1.exists()) {
return;
}
File[] items = path1.listFiles();
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
if (!item.getName().equals("strings.xml")) continue;
System.out.println(item.getPath());
} else {
listResPath(item.getPath());
}
}
}
手工找出不包含ru的模块,然后在项目里看一下应该翻译哪个文件,把需要翻译的文件路径放到一个txt里,例如:
D:\work\aaa\src\main\res\values-zh-rCN\strings.xml
D:\work\bbb\src\main\res\values-zh-rCN\strings.xml
D:\work\ccc\src\main\res\values\strings.xml
D:\work\ddd\src\main\res\values-zh\strings.xml
复制这些文件到translate文件夹
private static List<String> needCopyFiles = new ArrayList<>();
private static void getNeedCopyFiles() {
try {
FileInputStream inputStream = new FileInputStream("D:\xxx\needCopy.txt");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String str;
while ((str = bufferedReader.readLine()) != null) {
if (!str.isEmpty()) {
needCopyFiles.add(str);
}
}
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void listResPath(String src) throws Exception {
File path1 = new File(src);
File path2 = new File("D:\xxx\translate");
if (!path1.exists()) {
return;
}
File[] items = path1.listFiles();
if (items == null) return;
for (File item : items) {
if (item.isFile()) {
if (!item.getName().equals("strings.xml")) continue;
if (needCopyFiles.contains(item.getPath())) {
System.out.println(item.getPath());
FileInputStream fis = new FileInputStream(item);
String[] dir = item.getPath().split("\\");
String fileName = dir[7]+dir[8]+".xml";
FileOutputStream fos = new FileOutputStream(path2 + File.separator + fileName);
byte[] b = new byte[1024];
for (int i=0; (i=fis.read(b))!=-1;) {
fos.write(b,0,i);
fos.flush();
}
fos.close();
fis.close();
}
} else {
listResPath(item.getPath());
}
}
}
手工找出包含ru的模块,在项目里看一下需要补充翻译哪些字段,复制这些字段到新建的xml文件里,把这些xml文件也放在translate文件夹。
把translate文件夹里的文件读取到excel
import com.alibaba.excel.EasyExcel;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.*;
public class Strings2Excel {
private static final List<ExcelDataBean> excelDataBeanList = new ArrayList<>();
public static void main(String[] args) {
try {
traverseFile("D:\xxx\translate");
write2Excel();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void write2Excel() {
String dst = "D:\xxx\res.xlsx";
System.out.println("excel list size: " + excelDataBeanList.size());
EasyExcel.write(dst, ExcelDataBean.class).sheet("value").doWrite(excelDataBeanList);
}
public static void traverseFile(String src) throws Exception {
File path1 = new File(src);
if (!path1.exists()) {
System.out.println("源路径不存在");
return;
}
File[] items = path1.listFiles();
if (items == null) return;
for (File item : items) {
readXml(item);
}
}
private static void readXml(File file) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(file);
Element rootElement = document.getRootElement();
Iterator<Element> iterator = rootElement.elementIterator();
while (iterator.hasNext()) {
Element child = iterator.next();
String name = child.attribute(0).getValue();
String value = child.getStringValue();
System.out.println(name + " = " + value);
excelDataBeanList.add(new ExcelDataBean(name, value));
}
}
}
public class ExcelDataBean {
private String name;
private String value;
private String translate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getTranslate() {
return translate;
}
public void setTranslate(String translate) {
this.translate = translate;
}
public ExcelDataBean(String name, String value) {
this.name = name;
this.value = value;
}
public ExcelDataBean() {
}
}
需要引入的依赖:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.4</version>
</dependency>
<!--xls-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
因为不同模块可能会有重复的中文字段,翻译的同事是去重了翻译的,所以拿到翻译好了的excel之后,要把重复的翻译填充一下。思路是读取翻译前的文件到excelDataBeanList、读取翻译后的文件到translatedList,根据两个列表中相同的中文字段填充excelDataBeanList的俄文字段然后输出到新文件。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FillTranslated {
private static final List<ExcelDataBean> excelDataBeanList = new ArrayList<>();
private static final List<ExcelDataBean> translatedList = new ArrayList<>();
public static void main(String[] args) {
try {
readRes("D:\xxx\res.xlsx");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void readRes(String s) {
File file = new File(s);
EasyExcel.read(file, ExcelDataBean.class, new AnalysisEventListener<ExcelDataBean>() {
@Override
public void invoke(ExcelDataBean bean, AnalysisContext analysisContext) {
excelDataBeanList.add(bean);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
readTranslated("D:\xxx\translated.xlsx");
}
}).sheet().doRead();
}
private static void readTranslated(String s) {
File file = new File(s);
//这个read其实是按列读的,并不是根据列标题和类属性名称匹配的
EasyExcel.read(file, ExcelDataBean.class, new AnalysisEventListener<ExcelDataBean>() {
@Override
public void invoke(ExcelDataBean bean, AnalysisContext analysisContext) {
translatedList.add(bean);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
fillTranslated();
write2Excel();
}
}).sheet().doRead();
}
private static void fillTranslated() {
for (ExcelDataBean bean : translatedList) {
excelDataBeanList.forEach(a -> {
if (a.getValue() != null && a.getValue().equals(bean.getValue())) {
a.setTranslate(bean.getTranslate());
}
});
}
}
private static void write2Excel() {
String dst = "D:\xxx\翻译字段.xlsx";
System.out.println("excel list size: " + excelDataBeanList.size());
EasyExcel.write(dst, ExcelDataBean.class).sheet("value").doWrite(excelDataBeanList);
}
}
作者:臭屁格 链接:https://juejin.cn/post/7014678590885216264
|