0基础配合ai写python,小白的开发日志,大神们勿喷
import os
import re
from translate import Translator
import json
# 翻译:实现中文转英文
# translator库的api有字符限制,5000个/天
def translate_content_en(str):
#国家代码为zh,不是chinese
translator=Translator(from_lang='zh',to_lang='en')
translationString=translator.translate(str)
#去除英文单词中的-,‘,.等特殊字符
translationString = translationString.replace('-','').replace("'","").replace(".","")
return translationString
# 是否是注释
def isAnnotation(str):
string = str.strip()
# 项目里注释的写法千奇百怪...
if string.startswith("//") or string.startswith("/*") or string.startswith("* "):
return True
# //注释 前中后空格
elif ';//' in string or ';// ' in string or ' ;//' in string or '; //' in string or ' ;// ' in string or ' ; // ' in string:
return True
# //注释 前中后空格
elif ',//' in string or ',// ' in string or ' ,//' in string or ', //' in string or ' ,// ' in string or ' , // ' in string:
return True
# ///注释 前中后空格
elif ';///' in string or ';/// ' in string or ' ;///' in string or '; ///' in string or ' ;/// ' in string or ' ; /// ' in string:
return True
return False
#windows系统的换行符为CRLF, mac为LF
#做换行符替换为原来的操作可以避免出现无用的git记录
#处理结尾的换行符
def handleLineEnd(line):
if line.endswith('\r\n'):
# print('这是CRLF')
line = line.replace('\r\n','XXXCRLF')
elif line.endswith('\n'):
line = line.replace('\n','XXXLF')
return line
#添加结尾的换行符
def addLineEnd(newLine):
if newLine.endswith('XXXLF'):
newLine = newLine.replace('XXXLF','\n')
elif newLine.endswith('XXXCRLF'):
newLine = newLine.replace('XXXCRLF','\r\n')
return newLine
# 查找所有的中文文案
data_list = [];
def extract_chinese_from_files_with_translate(folder_path,output_path,module):
print('开始执行:')
chinese_text = []
pattern = re.compile("[\u4e00-\u9fa5]+")
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".dart"):
file_path = os.path.join(root, file)
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
lines = content.split("\n")
for line in lines:
stripped_line = line.strip()
if isAnnotation(stripped_line):
continue
matches = pattern.findall(line)
chinese_text.extend(matches)
# 去重
new_chinese_text = []
for text in chinese_text:
if (text in new_chinese_text) == False:
new_chinese_text.append(text)
chinese_text = new_chinese_text
print('查找的中文文案结果:')
print(chinese_text)
# 翻译
print('翻译语言:')
oriChineseString = '*'.join(chinese_text)
englishString = translate_content_en(oriChineseString)
english_list = englishString.split('*')
# print(english_list)
# 处理单词
print('处理单词:')
new_list = []
for text in english_list:
tempList = text.strip().split(' ')
newText = ''
for index,str1 in enumerate(tempList):
if index == 0:
newText = newText + str1.lower()
else:
newText = newText + str1.capitalize();
new_list.append(newText)
english_list = new_list
print(english_list)
#准备写入文件
key_file_path = output_path + 'language_'+ module +'_key.dart'
key_value_file_path = output_path + 'language_'+module+'_key_value.dart'
data_json_path = output_path + 'language_'+module+'_data.json'
keyClassName = 'Language'+ module.capitalize() +'Key'
print('开始写入key文件:')
print('key文件地址:'+key_file_path)
print('key_value地址:'+key_value_file_path)
print('keyClassName:'+keyClassName)
## 写key文件
with open(key_file_path,'w',encoding='utf-8') as f:
f.write("import 'package:app/core/langs/langs.dart';")
f.write("extension "+ keyClassName +" on LanguageKey {\n")
#内容
for text in english_list:
zhKey = "static const String " + text + " = " + "'" + text + "';";
f.write(zhKey)
f.write("}")
f.close()
print('写入key文件完成')
#写key-value文件
print('开始写入key-value文件:')
with open(key_value_file_path,'w',encoding='utf-8') as f:
f.write("import 'language.dart';")
f.write("import 'package:app/core/langs/language_"+module+"_key.dart';")
f.write("extension "+ keyClassName + "ZhCN" + " on Language {\n")
f.write("Map<String, String> get getZhCN"+ keyClassName +" => { \n")
#内容
for index,text in enumerate(english_list):
zhText = chinese_text[index]
zhValue = keyClassName + "." + text +": '" + zhText + "',";
f.write(zhValue)
#保存到data_list里
data_list.append({'key':keyClassName + "." + text,'value':zhText})
f.write("};")
f.write("}")
f.close()
print('写入key-value文件完成')
print('全部写入完成,您可以整理key文件,替换一些比较长的语句,也可以立即执行替换。')
#开始替换,也可以分开执行
#接收用户的终端输入,处理完key文件,输入Y继续执行替换操作
user_input = input('是否立即执行替换脚本(Y/N)?')
#替换
if (user_input == 'Y'):
#写json文件
print('开始写入json文件:')
with open(data_json_path,'w',encoding='utf-8') as f:
f.write("[")
for index,data in enumerate(data_list):
f.write("{")
f.write('"key":'+'"'+data['key']+'.tr",\n')
f.write('"value":' + '"'+data['value']+'"')
if index != len(data_list) - 1:
f.write("},")
else:
f.write("}")
f.write("]")
f.close()
print('写入json文件完成')
replace_chinese_word(folder_path,data_json_path)
# 替换中文为英文单词
def replace_chinese_word(folder_path, json_path):
# print('开始读取json')
pattern = re.compile("[\u4e00-\u9fa5]+")
with open(json_path,'r',encoding='utf-8') as f:
jsonData = json.load(f);
# print(jsonData)
f.close()
# 给key添加特定的头和尾,方便后期统一替换
# for data in jsonData:
# data['key'] = keyPre + data['key']
print('开始替换.....');
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".dart"):
file_path = os.path.join(root, file)
newLines = []
changeFiles = []
with open(file_path, "rb") as f:
# content = f.read()
# lines = content.split("\n")
# print(f)
for line in f:
line = line.decode()
# 如果是注释
if isAnnotation(line):
line = handleLineEnd(line)
newLines.append(line)
continue
matches = pattern.findall(line)
if len(matches) > 0:
# 循环替换
newLine = line
# 去除行首空格,校验是否是注释
stripped_line = line.strip()
# 保留替换之前的,并变成注释,可以直观看到修改前后的值
if stripped_line.startswith('//') == False:
newLines.append('///' + newLine)
# 精准匹配
for data in jsonData:
#'内容'
if newLine == str.format("'%s'",data['value']):
newLine = data['key']
#'内容?'
#也可以处理key文件,加上?
elif newLine == str.format("'%s?'",data['value']):
newLine = data['key']
#"内容"
elif newLine == str.format('"%s"',data['value']):
newLine = data['key']
#"内容?"
elif newLine == str.format('"%s?"',data['value']):
newLine = data['key']
#其他包含场景
else:
newLine = newLine.replace(data['value'],'${'+data['key']+'}')
#其他包含拼接等
if newLine in newLines or newLine == data['value']:
continue
# 加入到新lines中
newLine = handleLineEnd(newLine)
changeFiles.append(f.name)
newLines.append(newLine)
else:
line = handleLineEnd(line)
newLines.append(line)
f.close()
# print('文件行数=' + str(len(newLines)))
#写入文件
# print('这是修改的文件')
# print(changeFiles)
with open(file_path,'w', encoding="utf-8") as fff:
# print('开始写入---')
if fff.name in changeFiles:
fff.write("import 'package:app/core/langs/langs.dart';\n")
for i, line1 in enumerate(newLines):
line1 = addLineEnd(line1)
fff.write(line1)
fff.close()
print('替换'+fff.name+'完成')
def main():
# print("----查找了----")
file_data_list = [
{
'path':'项目名/lib/page/root',
'module':'root'#模块名字
}
]
for data in file_data_list:
print(data)
extract_chinese_from_files_with_translate(data['path'],'项目名/lib/core/langs/',data['module'])
# print("----替换结束--")
if __name__== "__main__" :
main()
# 有一说一,python虽然用代码缩进感觉别扭,但是还挺好玩。。。。