当前位置: 首页 > article >正文

Android对工程中的String中文字符的整理


本文主要介绍使用python快速整理工程中的中文字符,为app国际化提供便利。

1. 查找Android工程中的所有中文字符串(find_chinese.py)

import os
import re
import argparsedef is_comment_line(line, file_ext):"""判断一行是否是注释:param line: 代码行:param file_ext: 文件扩展名:return: 是否是注释行"""line = line.strip()if not line:return True# 根据不同文件类型判断注释if file_ext in {'.java', '.kt', '.gradle', '.kts'}:return line.startswith('//') or line.startswith('/*') or line.endswith('*/') or line.startswith('/**')or line.startswith('*')elif file_ext in {'.xml', '.html'}:return line.startswith('<!--') or '<!--' in lineelif file_ext == '.py':return line.startswith('#')return Falsedef remove_xml_comments(content):"""移除XML文件中的注释"""return re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL)def remove_java_comments(content):# 移除多行注释content = re.sub(r'/\*\*(?:[^*]|\*(?!/))*\*/', '', content, flags=re.DOTALL)# 移除单行注释content = re.sub(r'//.*', '', content)return content
def is_log_statement(line):"""判断是否是Log或Debug开头的日志语句"""line = line.strip()return line.startswith(('Log.', 'LogUtils.', 'DebugLog.'))def remove_code_comments(content, file_ext):if file_ext in {'.java', '.kt', '.gradle', '.kts'}:return remove_java_comments(content)# 移除多行注释#content = re.sub(r'/\*\*(?:[^*]|\*(?!/))*\*/', '', content, flags=re.DOTALL)# 移除单行注释#content = re.sub(r'//.*', '', content)elif file_ext in {'.xml', '.html'}:# 移除XML/HTML注释 <!-- ... -->content = re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL)elif file_ext == '.py':# 移除Python注释content = re.sub(r'#.*', '', content)return contentdef find_chinese_in_files(project_dir, output_file):"""扫描Android工程目录,找出非strings.xml文件中的中文内容:param project_dir: Android工程根目录:param output_file: 输出文件路径"""# 匹配中文字符的正则表达式chinese_pattern = re.compile(r'[\u4e00-\u9fa5]+')# 排除的目录# excluded_dirs = {'.git', '.idea', 'build', 'gradle', 'libs', 'assets', 'bin', 'gen', 'captures'}excluded_dirs = {'.git', '.idea', 'build', 'gradle', 'libs', 'assets', 'bin', 'gen', 'captures','.gradle', '.kts', '.py', '.html', '.js', '.ts', '.json', '.txt'}# 排除的文件类型excluded_exts = {'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.svg','.mp3', '.wav', '.ogg', '.mp4', '.avi', '.mkv','.pdf', '.doc', '.docx', '.xls', '.xlsx','.jar', '.aar', '.so', '.keystore', '.pro', '.iml', '.dex','.txt'}# 需要检查的文件类型included_exts = {'.xml', '.java', '.kt'}# included_exts = {'.xml', '.java', '.kt', '.gradle', '.kts', '.py', '.html', '.js', '.ts', '.json', '.txt'}with open(output_file, 'w', encoding='utf-8') as out_f:for root, dirs, files in os.walk(project_dir):# 跳过排除的目录dirs[:] = [d for d in dirs if d not in excluded_dirs]for file in files:file_path = os.path.join(root, file)rel_path = os.path.relpath(file_path, project_dir)ext = os.path.splitext(file)[1].lower()# 跳过strings.xml文件if file == 'strings.xml':continue# 跳过排除的文件类型if ext in excluded_exts:continue# 如果指定了包含的文件类型,跳过不在列表中的文件if included_exts and ext not in included_exts:continuetry:with open(file_path, 'r', encoding='utf-8') as f:lines = f.readlines()found_chinese = []for line_num, line in enumerate(lines, start=1):original_line = lineline = line.strip()# 跳过空行和注释行if not line or is_comment_line(line, ext):continue# 预处理:移除注释内容if ext == '.xml':processed_line = remove_xml_comments(original_line)else:processed_line = remove_code_comments(original_line, ext)# 如果预处理后为空,跳过if not processed_line.strip():continue# 跳过空行和日志语句if is_log_statement(processed_line):continue# 检查中文内容matches = chinese_pattern.findall(processed_line)if matches:found_chinese.append({'line_num': line_num,'content': original_line.strip(),'matches': matches})if found_chinese:out_f.write(f"文件: {rel_path}\n")for item in found_chinese:# out_f.write(f"行号: {item['line_num']}\n")out_f.write(f"内容: {item['content']}\n")# out_f.write("找到的中文: " + ", ".join(item['matches']) + "\n")out_f.write("-" * 50 + "\n")out_f.write("\n")except (UnicodeDecodeError, PermissionError):# 跳过二进制文件或无权限文件continueexcept Exception as e:print(f"处理文件 {file_path} 时出错: {str(e)}")continueif __name__ == "__main__":parser = argparse.ArgumentParser(description='扫描Android工程中的非strings.xml中文内容(排除注释,带行号)')parser.add_argument('project_dir', help='Android工程根目录路径')parser.add_argument('output_file', help='输出文件路径')args = parser.parse_args()find_chinese_in_files(args.project_dir, args.output_file)print(f"扫描完成,结果已保存到 {args.output_file}")

2. 将xml中的中文字符转成Execl表格输出(xml_to_excel.py)

import xml.etree.ElementTree as ET
import pandas as pddef convert_xml_to_excel(xml_file, excel_file):tree = ET.parse(xml_file)root = tree.getroot()data = []for child in root:if child.tag == 'string':data.append({'name': child.attrib['name'],'value': child.text if child.text else ''})df = pd.DataFrame(data)df.to_excel(excel_file, index=False)# 使用示例
convert_xml_to_excel('app/src/main/res/values/strings.xml', 'strings.xlsx')

3. 具体使用

3.1.将中文提取出来

python [find_chinese.py目录] [你的工程所在的目录] [生成的txt目录(如:c:\chinese_content.txt)]

3.2. 将string.xml 转成string.xlsx,在你工程目录下执行

python [xml_to_excel.py]

相关文章:

Android对工程中的String中文字符的整理

​ 本文主要介绍使用python快速整理工程中的中文字符&#xff0c;为app国际化提供便利。 1. 查找Android工程中的所有中文字符串(find_chinese.py) import os import re import argparsedef is_comment_line(line, file_ext):"""判断一行是否是注释:param lin…...

菜鸟之路Day30一一MySQL之DMLDQL

菜鸟之路Day30一一MySQL之DML&DQL 作者&#xff1a;blue 时间&#xff1a;2025.5.8 文章目录 菜鸟之路Day30一一MySQL之DML&DQL一.DML0.概述1.插入语句&#xff08;insert&#xff09;2.更新语句&#xff08;update&#xff09;3.删除语句&#xff08;delete&#xf…...

集团云解决方案:集团企业IT基础架构的降本增效利器

在当今数字化飞速发展的时代&#xff0c;集团企业面临着诸多挑战&#xff0c;尤其是IT基础架构的管理和运营成本居高不下&#xff0c;效率却难以提升。别担心&#xff0c;集团云解决方案的出现为集团企业带来了全新的曙光&#xff0c;真正实现了降本增效&#xff01; 一、集团…...

基 LabVIEW 的多轴电机控制系统

在工业自动化蓬勃发展的当下&#xff0c;多轴伺服电机控制系统的重要性与日俱增&#xff0c;广泛应用于众多领域。下面围绕基于 LabVIEW 开发的多轴伺服电机控制系统展开&#xff0c;详细阐述其应用情况。 一、应用领域与场景 在 3D 打印领域&#xff0c;该系统精确操控打印头…...

SD06_前后端分离项目部署流程(采用Nginx)

本文档详细描述了如何在Ubuntu 20.04服务器上从零开始部署Tlias前后端分离系统。Tlias系统由Spring Boot后端&#xff08;tlias-web-management&#xff09;和Vue前端&#xff08;vue-tlias-management&#xff09;组成。 目录 环境准备安装MySQL数据库部署后端项目部署前端项…...

【kubernetes】通过Sealos 命令行工具一键部署k8s集群

一、前言 1、sealos安装k8s集群官网&#xff1a;K8s > Quick-start > Deploy-kubernetes | Sealos Docs 2、本文安装的k8s版本为v1.28.9 3、以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。所有节点的时间需要同步。需要…...

《Go小技巧易错点100例》第三十二篇

本期分享&#xff1a; 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全&#xff1a; 1&#xff09;双存储结构&#xff1a; 包含原子化的 read&#xff08;只读缓存&#xff0c;无锁快…...

怎么判断是不是公网IP?如何查看自己本地路由器是内网ip还是公网?

在网络世界中&#xff0c;IP 地址如同每台设备的 “门牌号”&#xff0c;起着至关重要的标识作用。而 IP 地址又分为公网 IP 和私网 IP&#xff0c;准确判断一个 IP 属于哪一类&#xff0c;对于网络管理、网络应用开发以及理解网络架构等都有着重要意义。接下来&#xff0c;我们…...

【上位机——MFC】单文档和多文档视图架构

单文档视图架构 特点&#xff1a;只能管理一个文档(只有一个文档类对象) #include <afxwin.h> #include "resource.h"//文档类 class CMyDoc :public CDocument {DECLARE_DYNCREATE(CMyDoc) //支持动态创建机制 }; IMPLEMENT_DYNCREATE(CMyDoc,CDocument) //…...

需求分析阶段测试工程师主要做哪些事情

在软件测试需求分析阶段&#xff0c;主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作&#xff0c;为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情&#xff1a; 1. 需求收集与整理 收集需求文档&#x…...

Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析

一、WebSocket&#xff1a; &#xff08;一&#xff09;WebSocket 是什么&#xff1f; WebSocket 是一种网络通信协议&#xff0c;它提供了一种在单个 TCP 连接上进行全双工通信的方式。与传统的 HTTP 请求 - 响应模型不同&#xff0c;WebSocket 允许服务器和客户端在连接建立…...

项目模拟实现消息队列第二天

消息应答的模式 1.自动应答: 消费者把这个消息取走了&#xff0c;就算是应答了&#xff08;相当于没有应答) 2.手动应答: basicAck方法属于手动应答(消费者需要主动调用这个api进行应答) 小结 1.需要实现生产者,broker server&#xff0c;消费者这三个部分的 2.针对生产者和消费…...

5.Redission

5.1 前文锁问题 基于 setnx 实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如 HashTable 这样的代码中&#xff0c;他的方法都是使用 sync…...

c#数据结构 线性表篇 非常用线性集合总结

本人能力有限,使用了一些Ai的结论,如有不足还请斧正 目录 1.HashSet <> Dictionary 2.SortedSet <>提供升序方法的List 3.ArrayList<>List 4.BitArray <> Bit[] array 5.StringCollection <>List 6.StringDictionary<>Dictionary 1…...

dify 部署后docker 配置文件修改

1&#xff1a;修改 复制 ./dify/docker/.env.example ./dify/docker/.env 添加一下内容 # 启用自定义模型 CUSTOM_MODEL_ENABLEDtrue# 将OLLAMA_API_BASE_URL 改为宿主机的物理ip OLLAMA_API_BASE_URLhttp://192.168.72.8:11434# vllm 的 OPENAI的兼容 API 地址 CUSTOM_MODE…...

数据结构——排序(万字解说)初阶数据结构完

目录 1.排序 2.实现常见的排序算法 2.1 直接插入排序 ​编辑 2.2 希尔排序 2.3 直接选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 递归版本 2.6.1.1 hoare版本 2.6.1.2 挖坑法 2.6.1.3 lomuto前后指针 2.6.1.4 时间复杂度 2.6.2 非递归版本 2.7 归并排序…...

SQLite3介绍与常用语句汇总

SQLite3简介 SQLite3是一款轻量级的、基于文件的开源关系型数据库引擎&#xff0c;由 D. Richard Hipp 于 2000 年首次发布。它遵循 SQL 标准&#xff0c;但与传统的数据库系统不同&#xff0c;SQLite 并不运行在独立的服务器进程中&#xff0c;而是作为一个嵌入式数据库引擎直…...

快速入门深度学习系列(3)----神经网络

本文只针对图进行解释重要内容 这就是入门所需要掌握的大部分内容 对于不懂的名词或概念 你可以及时去查 对于层数 标在上面 对于该层的第几个元素 标在下面 输入层算作第0层 对于第一层的w b 参数 维度如下w:4*3 b:4*1 这个叫做神经元 比如对于第一层的神经元 这里说的很…...

在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器,安装教程

在线工具源码_字典查询_汉语词典_成语查询_择吉黄历等255个工具数百万数据 养站神器&#xff0c;安装教程 资源宝分享&#xff1a;https://www.httple.net/154301.html 一次性打包涵盖200个常用工具&#xff01;无论是日常的图片处理、文件格式转换&#xff0c;还是实用的时间…...

ORB-SLAM3和VINS-MONO的对比

直接给总结&#xff0c;整体上orbslam3&#xff08;仅考虑带imu&#xff09;在初始化阶段是松耦合&#xff0c;localmap和全局地图优化是紧耦合。而vins mono则是全程紧耦合。然后两者最大的区别就在于vins mono其实没有对地图点进行优化&#xff0c;为了轻量化&#xff0c;它一…...

大数据处理利器:Hadoop 入门指南

一、Hadoop 是什么&#xff1f;—— 分布式计算的基石 在大数据时代&#xff0c;处理海量数据需要强大的技术支撑&#xff0c;Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架&#xff0c;致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…...

Docker容器网络架构深度解析与技术实践指南——基于Linux内核特性的企业级容器网络实现

第1章 容器网络基础架构 1 Linux网络命名空间实现原理 1.1内核级隔离机制深度解析 1.1.1进程隔离的底层实现 通过clone()系统调用创建新进程时&#xff0c;设置CLONE_NEWNET标志位将触发内核执行以下操作&#xff1a; 内核源码示例&#xff08;linux-6.8.0/kernel/fork.c&a…...

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(下)

文章目录 k8s安装部署Pulsar集群前期准备版本要求 安装 Pulsar Helm chart管理pulsarClustersBrokersTopic k8s安装部署Pulsar集群 前期准备 版本要求 Kubernetes 集群&#xff0c;版本 1.14 或更高版本Helm v3&#xff08;3.0.2 或更高版本&#xff09;数据持久化&#xff…...

IoTDB端边云同步技术的五大常见场景及简便使用方式

IoTDB端边云同步技术提供了一种高效、可靠的数据同步解决方案&#xff0c;通过简洁灵活的SQL操作和直观的配置方式&#xff0c;实现了数据在端、边、云之间的无缝流动。以下是IoTDB端边云同步的五大常见场景及其简便的使用方式。 一、基础数据同步 基础数据同步包括全量数据同…...

Linux 阻塞和非阻塞 I/O 简明指南

目录 声明 1. 阻塞和非阻塞简介 2. 等待队列 2.1 等待队列头 2.2 等待队列项 2.3 将队列项添加/移除等待队列头 2.4 等待唤醒 2.5 等待事件 3. 轮询 3.1 select函数 3.2 poll函数 3.3 epoll函数 4. Linux 驱动下的 poll 操作函数 声明 本博客所记录的关于正点原子…...

libtorch配置指南(包含Windows和Linux)

libtorch libtorch是pytorch的c库&#xff0c;提供了用于深度学习和张量计算的功能&#xff0c;允许开发者在c环境中使用pytorch的核心功能。特别是当一些pt模型无法转换到ncnn、mnn等模型时&#xff08;ncnn、mnn可能还不支持某些层&#xff09;&#xff0c;可以在libtorch直…...

Java开发经验——阿里巴巴编码规范经验总结2

摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制&#xff0c;因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…...

机器人手臂“听不懂“指令?Ethercat转PROFINET网关妙解通信僵局

机器人手臂"听不懂"指令&#xff1f;Ethercat转PROFINET网关妙解产线通信僵局 协作机器人&#xff08;如KUKA iiWA&#xff09;使用EtherCAT控制&#xff0c;与Profinet主站&#xff08;如西门子840D CNC&#xff09;同步动作。 客户反馈&#xff1a;基于Profinet…...

深度学习 CNN

CNN 简介 什么是 CNN&#xff1f; 卷积神经网络&#xff08;Convolutional Neural Network&#xff09;是专为处理网格数据&#xff08;如图像&#xff09;设计的神经网络。核心组件&#xff1a; 卷积层 &#xff1a;提取局部特征&#xff08;如边缘、纹理&#xff09;通过卷…...

GrassRoot备份项目

Windows服务项目 Grass.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Time…...