1. 背景
由于国际化项目需要,部分主数据信息需要支持英文名称显示,虽然页面做了可编辑主数据信息的英文字段信息,但由于历史数据很多,就想着能不能通过Python的一些功能插件实现中文字段翻译英文字段。
2. 采坑
- 一开始通过HTTP请求的方式调有道翻译(网上很多这样的例子),但是调用过多后,直接被拉进黑名单。
TODO: 如何不会被识别出被拉黑
- Python有一个插件叫translator,这个也不能使用太多次,不然会抛出错误告诉你今天不能再使用翻译功能了(MYMEMORY WARNING: YOU USED ALL AVAILABLE FREE TRANSLATIONS FOR TODAY. NEXT AVAILABLE IN 06 HOURS 45 MINUTES 18 SECONDSVISIT HTTPS://MYMEMORY.TRANSLATED.NET/DOC/USAGELIMITS.PHP TO TRANSLATE MORE)。不是很理解本次插件为什么也要限制次数,难道底层还是调用了一些开源的翻译网站吗
- 在导入translator包的时候,本地IDEA无法安装这模块,因此去官网下载了该插件,想执行本地安装,但是本地执行安装的时候,又报错了,提示无法用gbk编码方式解码(UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 51: illegal multibyte sequence)。解决方法见参考资料
3. Pyhon如何本地安装-Windows
主要还是去插件的官网下载插件,解压后到子目录再使用该方法:python setup.py install。方法千万种,用这个感觉最舒适
4. Translator插件使用
# 导包区域
import pymysql as pymysql
from translate import Translator
# 我定义了一个类
class District(object):
def __init__(self, id, name, en_name):
self.id = None
self.name = name
self.en_name = en_name
def generate(self):
return [self.pid, self.name, self.en_name]
# 连接数据库,执行sql语句的
def connect_mysql(db, sql, data):
cursor = db.cursor()
try:
result = None
if data:
if isinstance(data[0], list):
cursor.executemany(sql, data)
else:
cursor.execute(sql, data)
else:
cursor.execute(sql)
result = cursor.fetchall()
except Exception as e:
print(e)
db.rollback()
finally:
cursor.close()
# 提交操作
db.commit()
return result
# 查询操作
def get_district(db):
sql = "select id, name from a where en_name = '' or en_name is null"
res = connect_mysql(db, sql, None)
# 定义数组,一开始不会用
disList = []
# 遍历数组,有两种方式,一种是下标,一种是对象,可以见下面update_en_name_of_district方法
for i in range(0, len(res)):
d = District(None, None, None)
d.id = res[i][0]
d.name = res[i][1]
# 数组添加元素方法
disList.append(d)
return disList
def update_en_name_of_district(districtList):
sql = "update a set en_name = %s where id = %s"
translator = Translator(from_lang="chinese",to_lang="english")
for i in districtList:
print("Start")
# 这个就是翻译方法了
en_name = translator.translate(i.name)
print("End")
res = connect_mysql(db, sql, [en_name, i.id])
print(i.name)
if __name__ == '__main__':
# mysql连接
db = pymysql.connect("127.0.0.1", "root", "123456", "local", charset="utf8mb4")
country_dist = get_district(db)
update_en_name_of_district(country_dist)
print("结束")
参考资料:
【python安装第三方库报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 51: illegal multiby】