flutter国际化一键替换脚本(python翻译库translator,open函数,CRLF,LF)

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虽然用代码缩进感觉别扭,但是还挺好玩。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值