基于CSV用Bash实现Openbox menu.xml字符串替换以本地化菜单
需求说明
需要为Openbox的menu.xml文件做多语言本地化:根据两列CSV文件(第一列英文原文、第二列对应译文),精确替换菜单label属性中的目标文本,同时避免修改execute/action/item等功能术语,支持批量处理12种语言的翻译文件。
解决方案脚本
以下是可直接使用的Bash脚本,支持带空格的文本替换,且确保仅修改label属性内的内容:
#!/bin/bash # 检查输入参数是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <原始menu.xml路径> <翻译CSV路径>" exit 1 fi MENU_FILE="$1" CSV_FILE="$2" # 备份原始文件,防止误操作 cp "$MENU_FILE" "${MENU_FILE}.bak" # 读取CSV文件(默认逗号分隔,若CSV含逗号请改用tab分隔,将-F,改为-F$'\t') awk -F, '{print $1 "\t" $2}' "$CSV_FILE" | while read -r original translation; do # 转义sed特殊字符(/、&),避免替换失败 original_escaped=$(printf '%s\n' "$original" | sed 's/[\/&]/\\&/g') translation_escaped=$(printf '%s\n' "$translation" | sed 's/[\/&]/\\&/g') # 仅替换label属性中的目标文本,精准匹配避免误改功能术语 sed -i "s/label=\"$original_escaped\"/label=\"$translation_escaped\"/g" "$MENU_FILE" done echo "替换完成!原文件已备份为 ${MENU_FILE}.bak"
使用步骤
- 准备翻译CSV文件:确保第一列是
menu.xml中label的原文(完全匹配,包括空格),第二列是对应语言的译文。示例CSV行:File manager,文件管理器 Terminal,终端 - 给脚本添加执行权限:
chmod +x translate_menu.sh - 运行脚本(替换为实际文件路径):
./translate_menu.sh /path/to/menu.xml /path/to/zh-CN.csv - 针对12种语言,重复步骤3,传入对应语言的CSV文件即可。
注意事项
- 如果CSV文件中包含逗号,建议将分隔符改为制表符(Tab),并修改脚本中
awk的-F,为-F$'\t'。 - 若译文中包含双引号,需在CSV文件中用双引号转义(例如
"He said ""Hello""","他说""你好""")。 - 脚本会自动备份原始
menu.xml为menu.xml.bak,若替换出错可直接恢复。
内容的提问来源于stack exchange,提问作者Jerry Bond
相关产品推荐
相关产品推荐

