您的位置:首页 > 移动开发 > Android开发

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

2014-02-10 16:17 507 查看
根据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要一致
注意选择写入的文件夹时一定要选择没有重要内容的文件夹,因为会有删除选中文件夹中内容的操作!!

相关代码、[b]excel模板、[b]工具类jar[/b]下载:http://git.oschina.net/ldwtill/Androidi18nBuilder[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: