安卓多语言String文件生成器

来源:互联网 发布:ubuntu教程 编辑:程序博客网 时间:2024/06/11 04:08

由于现在正在负责一款海外项目,涉及到多语言应用。因为配置多语言比较麻烦,就写了一个多语言生成器,对应中文的不同国家的语言翻译添加到excel的同一个引用的key值和中文后面。利用生成器,生成不同语言对应的安卓资源String文件。

此生成器不仅适用于多语言,同样适用于只有中文的情况。只需要在引用key值后面添加对应的中文就行。

首先创建一个java工程,因为涉及到操作excel和xml,所以需要引入两个jar包。操作excel的POI和操作xml的jdom。至于如何操作excel和xml,有兴趣的可以百度一下相关api或者技术博客,讲的都比较详细,此处不再另行介绍。这里只讲解如何通过新创建的工程把统计好多语言的excel生成对应语言的xml,以及在安卓工程中引用生成的xml需要注意的地方。

下面先上代码。

具体的解析excel和生成xml的类如下:

public class ReadExcel {

class ConfigBean{
public String note;//注释名

public String key_name;//key

private String zh_name;//中文名称


private String en_name;//英文



public String getNote() {
return note;
}


public void setNote(String note) {
this.note = note;
}


public String getKey_name() {
return key_name;
}


public void setKey_name(String key_name) {
this.key_name = key_name;
}


public String getZh_name() {
return zh_name;
}


public void setZh_name(String zh_name) {
this.zh_name = zh_name;
}


public String getEn_name() {
return en_name;
}


public void setEn_name(String en_name) {
this.en_name = en_name;
}


}

public void getManyLanguages(String readPath,String outPath,String[] str){
List<ConfigBean> listAll = new ArrayList<ConfigBean>();
try{
if(str.length == 0){
str = fileName(readPath);
}
for(int i = 0;i < str.length;i++){
String name = str[i];
if(!".DS_Store".equals(name)){//判断苹果电脑隐藏文件.DS_Store
//注释名称=文件名称+sheet名
String noteName = name.substring(0,name.lastIndexOf("."));
name = readPath + name;
List<ConfigBean> list1 = new ReadExcel().readExcel(name,noteName);
if(list1 != null && list1.size() > 0){
listAll.addAll(list1);
}
}
}  
Class cls = ConfigBean.class;
Field[] fields = cls.getDeclaredFields();
//Method[] method = cls.getDeclaredMethods();
for(Field field : fields){
int mod = field.getModifiers();
if(mod == 2){
if("fan_name".equals(field.getName())){
continue;
}
ReadExcel et = new ReadExcel();
et.BuildXMLDoc(listAll,outPath,field.getName());
}
}
}catch(Exception e){
e.printStackTrace();

}


public static String[] fileName(String path){
File file = new File(path);
File []array = file.listFiles();
String []contArray = new String[array.length];
for(int i=0;i<array.length;i++){
if(array[i].isFile()){
contArray[i] = array[i].getName();
}
}
return contArray;
}
 
/**
 * 工具
 */
public static String getPostfix(String path) {
       if (path == null || Common.EMPTY.equals(path.trim())) {
           return Common.EMPTY;
       }
       if (path.contains(Common.POINT)) {
           return path.substring(path.lastIndexOf(Common.POINT) + 1, path.length());
       }
       return Common.EMPTY;
   }
    
    /**
     * 判断格式
     */
    public List<ConfigBean> readExcel(String path,String noteName) throws IOException {
        if (path == null || Common.EMPTY.equals(path)) {
            return null;
        } else {
            String postfix = getPostfix(path);
            if (!Common.EMPTY.equals(postfix)) {
                if (Common.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {
                    return readXls(path,noteName);
                } else if (Common.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {
                    return readXlsx(path,noteName);
                }
            } else {
                System.out.println(path + "找不到文件");
            }
        }
        return null;
    }
    /**
     * Excel 2010
     */
    public List<ConfigBean> readXlsx(String path,String noteName) throws IOException {
        InputStream is = new FileInputStream(path);
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
        ConfigBean ConfigBean = null;
        List<ConfigBean> list = new ArrayList<ConfigBean>();
        for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
            XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
            String sheetName = xssfSheet.getSheetName();//sheet名称
            if (xssfSheet == null) {
                continue;
            }
            for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
                XSSFRow xssfRow = xssfSheet.getRow(rowNum);
                if (xssfRow != null) {
                    ConfigBean = new ConfigBean();
                    XSSFCell key_name = xssfRow.getCell(0);
                    XSSFCell zh_name = xssfRow.getCell(1);
                    XSSFCell en_name = xssfRow.getCell(2);
                    if(rowNum == 1){
                    ConfigBean.setNote(noteName+"-"+sheetName);
                    }else{
                    ConfigBean.setNote("");
                    }
                    ConfigBean.setKey_name(getToString(key_name));
                    ConfigBean.setZh_name(getToString(zh_name));
                    ConfigBean.setEn_name(getToString(en_name));
                    list.add(ConfigBean);
                }
            }
        }
        return list;
    }
    
    private String getToString(Object obj) {
    String str = "";
    if(obj != null && !"".equals(obj)){
    str = this.getConvertToStr(String.valueOf(obj));
    }
    return str;
    }


    //转义字符串
    private String getConvertToStr(String string) {
    String str = "";
    int total = 0;
    String sst = "";
    int i = 0;
    for(String tmp = string;tmp!=null && tmp.length() >= "%@".length();i++){
    if(tmp.indexOf("%@") == 0){
    total++;
    str += sst + "%" + total + "$s";
      sst = "";
    }
    tmp = tmp.substring(1);
    sst += string.substring(i,string.length() - tmp.length());
    sst = sst.replace("%@", "");
    if(tmp.length() == 1 && !"@".equals(tmp) && !"%".equals(tmp)){
    str += sst + tmp;
    }
    }
    if(total == 0){
    return string;
    }
    return str;
    }
    
    /**
     * Excel 2003-2007
     */
    public List<ConfigBean> readXls(String path,String noteName) throws IOException {
        InputStream is = new FileInputStream(path);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        ConfigBean ConfigBean = null;
        List<ConfigBean> list = new ArrayList<ConfigBean>();
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            String sheetName = hssfSheet.getSheetName();//sheet名称
            if (hssfSheet == null) {
                continue;
            }
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow != null) {
                    ConfigBean = new ConfigBean();
                    HSSFCell key_name = hssfRow.getCell(0);
                    HSSFCell zh_name = hssfRow.getCell(1);
                    HSSFCell en_name = hssfRow.getCell(2);
                    if(rowNum == 1){
                    ConfigBean.setNote(noteName+"-"+sheetName);
                    }else{
                    ConfigBean.setNote("");
                    }
                    ConfigBean.setKey_name(getToString(key_name));
                    ConfigBean.setZh_name(getToString(zh_name));
                    ConfigBean.setEn_name(getToString(en_name));
                    list.add(ConfigBean);
                }
            }
        }
        return list;
    }


    
    /**
     * 生产xml文件
     * list 数据
     * path 输出路径
     */
    private void BuildXMLDoc(List<ConfigBean> list,String path,String name)throws IOException,JDOMException{
    Element root = new Element("resources");//创建根节点,设置它属文件
    Document doc = new Document(root);//将根节点添加到文档中
String xmlName = "strings.xml";
String outPathName = ""; 

    for(ConfigBean cbean : list){
Element elm = new Element("string");
elm.setAttribute("name",cbean.getKey_name());
if("zh_name".equals(name)){
System.out.println(cbean.getNote() +">>>>>中文>>>>>>");
if(cbean.getNote() != ""){
root.addContent(new Comment(cbean.getNote()));
}
elm.addContent(cbean.getZh_name().replace("'", "\\'").replace("@", "\\uff20").replace(":", "\\uff1a").replace("\"", "\\\""));
outPathName = "values-zh";
}
if("en_name".equals(name)){
System.out.println(cbean.getNote() +">>>>>英文>>>>>>");
if(cbean.getNote() != ""){
root.addContent(new Comment(cbean.getNote()));
}
elm.addContent(cbean.getEn_name().replace("'", "\\'").replace("@", "\\uff20").replace(":", "\\uff1a").replace("\"", "\\\""));
outPathName = "values-en";
}
root.addContent(elm);
}
    Format format = Format.getPrettyFormat();
    XMLOutputter xmlout = new  XMLOutputter(format);
    File file = new File(path+outPathName);
    if(!file.exists()){
    file.mkdir();
    }
    xmlout.output(doc,new FileOutputStream(path+outPathName+"/"+xmlName));
    }
}

代码兼容了不同版本的excle。其中内部类ConfigBean属性值,代表了key值,还有对应的语言种类,note用来保存sheet页的名称。若有需要增加语言,可以仿造中文zh_name新建属性名,新开一个流程,需要注意的是key值还有中文及对应的翻译必须放到excel的同一行。代码中一些静态变量在如下Common类:

public class Common {


public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";
public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";
public static final String EMPTY = "";
public static final String POINT = ".";
public static final String LIB_PATH = "lib";

public static void main(String[] args) {
ReadExcel readExcel = new ReadExcel();
//读取excel文件路径na bu
String readPath = "D:/car/";
//生成xml文件地址
String outPath = "d:/car/";
//如果不是选择性的读文件,默认数字为空就可以了 str={},否则str = {"a.xlsx","b.xlsx"}
String[] str = {};
readExcel.getManyLanguages(readPath, outPath, str);
}
}

readPath是存放多语言的excel的路径,outPath是生成xml的路径。运行生成器成功之后,可以在outPath路径下找到对应语言的文件夹下的String文件替换掉安卓工程对应语言文件夹下String文件。此时需要注意的是,假如excel中有未指定引用key值名称的多语言,安卓工程会报错,R文件找不到,就需要处理String文件中key值为空的词条,然后保存并clean一下工程即可。


1 0
原创粉丝点击