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]
国际化是一个痛苦的过程,不断修改文案的国际化更加痛苦
为了减轻痛苦,特意制作了以下工具,
由一个人来维护这份文档并使用工具生成所需的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]
相关文章推荐
- Android国际化资源文件自动化生成工具
- Android国际化资源文件自动化生成工具
- Android国际化资源文件自动化生成工具
- Android国际化资源文件自动化生成工具
- Android国际化资源文件自动化生成工具
- NO.77 AR Tools-Arch3用国际化资源文件中英对照Excel生成工具
- SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具
- android 开发,eclipse生成jar包,分离资源文件并混淆
- android 资源文件国际化
- Android工程中R.java文件的重新生成——注意资源文件的错误
- Android导入工程,R 资源文件无法生成
- android R.java资源文件不自动生成的原因
- Android 比对国际化资源文件中的翻译缺失
- android 资源文件处理工具
- Android导入工程,R 资源文件无法生成
- android的dmtracedump工具生成trace文件图片 'dot' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- Q: android R.java资源文件不自动生成
- 使用native2ascii工具将资源文件国际化
- 工欲善其事,必先利其器 软件工具开发关键词 protractor自动化测试工具 RegexBuddy正则 CodeSmith,LightSwitch:代码生成 CheatEngine:玩游戏修改内存值必备神器 ApkIDE:Android反编译工具 Reflector:反编译dll动态链接库
- android项目 R资源文件无法生成(import xxxx.R报错)