Android framework翻译问题处理脚本

Android framework翻译问题处理脚本

问题简介

在项目中,偶尔会遇到翻译不正确的单子,特别是升级项目,虽然这种问题基本都是简单问题,但每次要查找六七十个xml文件并修改,就是一件挺蛋疼的事。偶然听到室友说他们项目使用脚本处理的,所以打算自己也写一个。其次捡起大学学的shell命令,不使用基本都忘完了。

问题处理流程

一般遇到翻译的单子,基本都是通过monitor去捕获问题界面,查找到问题字符串,或者根据问题字串直接在opengrok上搜索,初步确定是哪个字串问题,然后尝试修改并编译版本进行验证,确认是这个字串后再去查看res目录下所有的values/strings.xml文件,对翻译有问题的进行修改。一般都不会只有一种翻译有问题,总会有个把语言也有问题,不要抱着测试报一个再处理一个的心态。因为不管是重新提单子还是reopen都会很不爽,不如一次处理好。

前面的确认问题字串基本都是手动操作,本文只描述后续用脚本修改那些翻译不正确的字串,同时讲述一些用到的shell命令。

问题分析和使用的shell命令

当确认出问题字串的name后,要做的就是找出有问题的并修改他,而没有正确的翻译时不要自己随便去找翻译,一般升级项目会有上一个版本的资源文件,非升级的直接找测试要。下面以Settings为例

首先我们要确认哪些是我们脚本要处理的,字符串的资源文件都在res目录下的各种values文件夹的strings.xml中,所以我们要获取所有的以values开头的文件夹,命令如下

#获取所有的包含values,不包含nokeys的文件夹
$ls code/android/packages/apps/Settings/res | grep "values" | grep -v "nokeys"

#在shell脚本中我们把它赋值给dirs变量
dirs=`ls $tar_path | grep 'values' | grep -v 'nokeys'`

命令很简单,说一下 grep -v “nokeys”,其中 -v 表示 选中不匹配的行 。而不匹配nokeys是由于这些带nokeys的文件夹中的strings.xml中一般是没有我们要处理的字符资源的,所以排除在外。
还有在shell脚本中使用管道符|在循环中要注意下开辟子进程而导致管道符右边命令无效的问题。还有执行命令使用的是 `` 符号,不是单引号,即TAB上面的与~符号一起的那个键。

获取到所有的values文件夹后,我们要做的就是一个个的对比其中那个有问题的key,如果有问题就处理,没有问题就跳过。命令如下

#在shell脚本循环处理那些文件夹
for dir in ${dirs[@]}
do
	...
done

上面要说的就是shell中数组的遍历,如下

 #${dirs[@]}表示整个数组,[]中使用 @和 *都可以
 ${dirs[@]} 
 ${dirs[*]}
 #加#表示数组长度
 ${#dirs[@]}

然后获取这些strings.xml的路径,tar和des分别表示待修改的和修改所参考的

#在shell脚本获取strings.xml文件路径
tar_file_path=${tar_path}/${dir}/strings.xml
des_file_path=${des_path}/${dir}/strings.xml
#在shell脚本确保strings.xml文件存在
if [ -f "$tar_file_path" ] && [ -f "$des_file_path" ]; then
	...
fi

再根据关键字拿取对应的字串,以values/strings.xml中的disabled_low_ram_device为例

#获取disabled_low_ram_device关键字中的翻译字符串
$cat values/strings.xml | grep "disabled_low_ram_device" | awk -F '[><]' '{print $3}'

#在shell脚本把当前的和所参考的翻译字串都拿出来,方便后面对比
des_value=`cat "${des_file_path}" | grep "$key" | awk -F '[><]' '{print $3}'`
now_value=`cat "${tar_file_path}" | grep "$key" | awk -F '[><]' '{print $3}'`
#当他们不一样时说明说明我们找到了有问题的那个语言(文件)
if [ "$des_value" != "$now_value" ]; then
	...
fi

这里说一下 awk -F ‘[><]’ ‘{print $3}’ ,他表示使用>或者<进行分割,并打印第三部分,分割情况如下所示

	<string name="applications_settings_summary" msgid="6616938758022986257">"അപ്ലിക്കേഷനുകൾ നിയന്ത്രിക്കുക"</string>
|-1-|---------------------------------2-------------------------------------|--------------3--------------- ---|---4---|

找到有问题的文件后我们就要修改他了,可以分为两种情况,一是,当前文件中压根就没这个关键字,二是有这个关键字,但是字串不对。没有这个关键字的话我们就要把带这个关键字的整行复制过去,有关键字的话只需要替换正确的字串就行了。所以分别处理

#在shell脚本判断now_value值是否为空,并分别处理
if [ ! -n "$now_value" ]; then
	...
else
	...
fi

第一种添加整行的处理,以values/strings.xml中的disabled_low_ram_device为例,假设当前没有此条字串,

#输出参考翻译文件中包含关键字disabled_low_ram_device的那行
$grep -r "disabled_low_ram_device"  values/strings.xml
#输出当前此资源文件的行数,
$awk 'END{print NR}' values/strings.xml
#将This feature is not available on this device显示到values/strings.xml文件第9060行的下一行
$ cat values/strings.xml | sed '9060aThis feature is not available on this device'

#在shell脚本中的处理
#将那一行保存到变量中
new_line=`grep -r "$key"  $des_file_path`
#获取文件行号并减一
line_number=`expr $(awk 'END{print NR}' values/strings.xml) - 1`
#修改文件
sed -i ''"$line_number"'a'"$new_line"'' $tar_file_path

行号再减一的原因是string.xml文件最后一行是 </resources》,保证字串添加在resources中。对于命令套娃时,可以使用$(command)的方式。最后使用sed命令,-i表示对文件进行修改,要使用变量需要用单引号关闭sed作用域回到shell环境中,使得shell可以解析此变量,然后重新用单引号再次进入sed作用域。

第二种替换字串的处理,以values/strings.xml中的disabled_low_ram_device为例,假设当前此字串有误

#获取disabled_low_ram_device在values/strings.xml中的行号
$sed -n '/disabled_low_ram_device/=' values/strings.xml
#将values/strings.xml中9060行的This feature is not available on this device替换成hahaha
$cat values/strings.xml | sed '9060s/This feature is not available on this device/hahaha/g'

#在shell脚本中获取行号
line_number=`sed -n '/'"$key"'/=' $tar_file_path`
#修改文件
sed -i ''"$line_number"'s/'"$now_value"'/'"$des_value"'/g' $tar_file_path

综上,我们的翻译处理脚本基本就写好了,再加上一些参数验证和文字输出就行了,完整脚本如下

#!/bin/bash
echo "欢迎使用翻译处理脚本"
if [ $# -lt 3 ]; then
        echo "参数太少无法执行!"
        echo "使用方式:./translation.sh [待处理关键字] [待处理翻译资源路径] [参考翻译资源路径]"
        exit 1
fi
key=$1
tar_path=$2
des_path=$3
if [ ! -d $des_path ]; then
        echo "参考翻译资源路径不存在!"
        exit 1
fi
if [ ! -d $tar_path ]; then
        echo "待处理翻译资源路径不存在!"
        exit 1
fi
if [[ $tar_path =~ ^[a-z].* ]]; then
        tar_path=$(pwd)/$tar_path
fi
if [[ $des_path =~ ^[a-z].* ]]; then
        des_path=$(pwd)/$des_path
fi
echo "参考翻译资源路径:$des_path"
echo "待处理翻译资源路径:$tar_path"
echo "待处理关键字:$key"
dirs=`ls $tar_path | grep 'values' | grep -v 'nokeys'`
if [ ${#dirs[@]} -lt 1 ]; then
        echo "当前路径有误,不是资源文件路径!"
        echo "请更换正确路径!"
        exit 1
fi
for dir in ${dirs[@]}
do
        tar_file_path=${tar_path}/${dir}/strings.xml
        des_file_path=${des_path}/${dir}/strings.xml
        if [ -f "$tar_file_path" ] && [ -f "$des_file_path" ]; then
                des_value=`cat "${des_file_path}" | grep "$key" | awk -F '[><]' '{print $3}'`
                now_value=`cat "${tar_file_path}" | grep "$key" | awk -F '[><]' '{print $3}'`
                if [ "$des_value" != "$now_value" ]; then
                        echo "修改文件:$dir/strings.xml"
                        echo "参考值:$des_value"
                        echo "当前值:$now_value"
                        if [ ! -n "$now_value" ]; then
                                new_line=`grep -r "$key"  $des_file_path`
                                line_number=`expr $(awk 'END{print NR}' values/strings.xml) - 1`
                                echo "在第$line_number行添加$new_line"
                                sed -i ''"$line_number"'a'"$new_line"'' $tar_file_path
                        else
                                line_number=`sed -n '/'"$key"'/=' $tar_file_path`
                                echo "在$line_number行将$now_value替换成$des_value"
                                sed -i ''"$line_number"'s/'"$now_value"'/'"$des_value"'/g' $tar_file_path
                        fi
                        echo "  "
                fi
        fi
done
echo "处理结束!"

再提一点,当时用 . 或者 source 来执行此脚本时如果参数错误会导致ssh终端退出,是由于出错时使用的时exit退出,避免这种情况只需要使用 ./ 执行就可以了。

总结

这个脚本还是有些没处理到的,比如说当前资源的key与参考资源的key不一致时就无法修改,还有修改文件内容时一般我们都需要加上修改信息,这些都可以自己再思考下处理。最后,shell脚本和命令的使用还是要多练练,能够方便的处理很多问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值