根據http://www.tuicool.com/articles/MFbIRf 提供的方案進行了修改
國際化是一個痛苦的過程,不斷修改文案的國際化更加痛苦
爲了減輕痛苦,特意製作了以下工具,
由一個人來維護這份文檔並使用工具生成所需的string.xml和array.xml,每次增加或修改文案,一定由此人重新生成所有string和array,然後程序無需對比直接替換。
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