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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章