Android国际化资源文件自动化生成工具

根据http://www.tuicool.com/articles/MFbIRf 提供的方案进行了修改

国际化是一个痛苦的过程,不断修改文案的国际化更加痛苦

为了减轻痛苦,特意制作了以下工具,

由一个人来维护这份文档并使用工具生成所需的string.xmlarray.xml,每次增加或修改文案,一定由此人重新生成所有stringarray,然后程序无需对比直接替换。

1、准备一个存放各个apk各国语言文字的excel模板文件。模板数据格式说明:

1> 每个sheet代表一个apk

2> sheet中的 第一列 存放strings.xml或arrays.xml文件中的 id

3> 第二列存放默认文字(当设备找不到当前语言的文字时,使用默认的)

4> 第三列存放各个国家的语言缩写(列名使用语言缩写,比如中文:cn

 

sheet命名注意:

a、生成strings.xml文件:直接用模块名即可,如:MusicPlayer

b、生成arrays.xml文件: 用模块名+_arrays,如:MusicPlayer_arrays


2、使用Apache的开源框架POI解析excel读取各个apk的语言文字,并通过dom4j生成strings.xml和arrays.xml

/**

   * 生成strings.xml资源文件

   */

  public static voidbuilderStringResources(HSSFWorkbook book) throws Exception {

    for (int i = 0; i <STRINGS_SHEETS.size(); i++) {

      HSSFSheet sheet =book.getSheetAt(book.getSheetIndex(STRINGS_SHEETS.get(i)));

      System.out.println("build stringsfor " + sheet.getSheetName());

      int rowNum = sheet.getLastRowNum();

      for (int j = 0; j < LANGUAGE.size();j++) {

        String language = LANGUAGE.get(j);

        ArrayList<StringEntity>stringEntitys = new ArrayList<StringEntity>();

        File dir = null;

        if(DEFAULT_LANGUAGE_FLAG.equals(language)) { //创建默认语言

          dir = new File(I18N_TEMP_DIR +STRINGS_SHEETS.get(i) + File.separator + language);

        } else {

          dir = new File(I18N_TEMP_DIR +STRINGS_SHEETS.get(i) + File.separator + RESOURCES_DIR_PREFIX + language);

        }

        File file = newFile(dir,STRING_RESOURCES_FILE_NAME);

        for (int k = 1; k <= rowNum; k++) {

          HSSFRow row = sheet.getRow(k);

          if (row.getLastCellNum() < 1)

            continue;

          String resId =row.getCell(0).getStringCellValue().trim();                //resId

          HSSFCell cell = row.getCell(j+1);

          String value = null;

          if (cell != null) {

            value = cell.getStringCellValue();                       // 某一个国家的语言

            if (value == null ||"".equals(value.trim())) {

              continue;

            }

            StringEntity entity = newStringEntity(resId, value.trim());

            stringEntitys.add(entity);

          }

        }

        // 创建资源文件

       builderStringResources(stringEntitys,file);

      }

    }

   System.out.println("------------------strings.xml资源文件生成成功!------------------");

  }

 

 

 /**

   * 生成arrays.xml资源文件

   */

  public static voidbuilderArrayResources(HSSFWorkbook book) throws Exception {

    

    for (int i = 0; i <ARRAYS_SHEETS.size(); i++) { // 功能模块

      HSSFSheet sheet =book.getSheetAt(book.getSheetIndex(ARRAYS_SHEETS.get(i)+"_arrays"));

      System.out.println("build arrays for" + sheet.getSheetName());

      int rowNum = sheet.getNumMergedRegions();      // sheet.getLastRowNum();

      for (int j = 0; j < LANGUAGE.size();j++) {            // 语言

        String language = LANGUAGE.get(j);

        ArrayList<ArrayEntity>arrayEntities = new ArrayList<ArrayEntity>();

        File dir = null;

        if(DEFAULT_LANGUAGE_FLAG.equals(language)) { //创建默认语言

          dir = new File(I18N_TEMP_DIR +ARRAYS_SHEETS.get(i) + File.separator + language);

        } else {

          dir = new File(I18N_TEMP_DIR +ARRAYS_SHEETS.get(i) + File.separator + RESOURCES_DIR_PREFIX + language);

        }

        File file = newFile(dir,ARRAY_RESOURCES_FILE_NAME);

        for (int k = 1; k <= rowNum; k++) {

          CellRangeAddress range = sheet.getMergedRegion(k-1);

          int mergedRows =range.getNumberOfCells();

          int lastRow = range.getLastRow();

          int rowIndex = (lastRow - mergedRows)+ 1;

          String resId =sheet.getRow(rowIndex).getCell(0).getStringCellValue().trim();              //resId

          ArrayEntity entity = newArrayEntity(resId);

          ArrayList<String> items = newArrayList<String>();

          for (int z = rowIndex; z <=lastRow; z++) {

            HSSFCell cell =sheet.getRow(z).getCell(j+1);

            String value = getValue(cell);

           

            if (value == null ||"".equals(value.trim())) {  // 如果该语言没有对应的翻译,默认使用英语

              HSSFCell defaultCell =sheet.getRow(z).getCell(1);

              value = getValue(defaultCell);

            }

           

            if("temp".equalsIgnoreCase(value.trim())) {

              continue;

            }

           

            items.add(value);

          }

          entity.setItems(items);

          arrayEntities.add(entity);

        }

        // 创建资源文件

       builderArrayResources(arrayEntities,file);

      }

    }

   System.out.println("------------------arrays.xml资源文件生成成功!------------------");

  }

 

3、使用截图:

 

4、注意

注意:language.xls是模板,在使用时,红色字部分所有sheet要一致

注意选择写入的文件夹时一定要选择没有重要内容的文件夹,因为会有删除选中文件夹中内容的操作!!


相关代码、excel模板、工具类jar下载:http://git.oschina.net/ldwtill/Androidi18nBuilder





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值