LangArea.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: langer
  7. @software: PyCharm
  8. @DATE: 2019/6/4 11:44
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: LangArea.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. import json
  15. import requests
  16. from django.db.models import Min, Q
  17. from django.http import HttpResponse
  18. from django.views.generic import TemplateView
  19. from django.views.decorators.csrf import csrf_exempt
  20. from django.utils.decorators import method_decorator
  21. from object.ResponseObject import ResponseObject
  22. from django.contrib.auth.hashers import make_password, check_password
  23. from model.models import UserModel, LangSetModel, LangAreaModel, LangValModel, LangKeyModel, LangKeyClassModel, \
  24. SearchToolBlock, SearchToolKeyModel, LangLocationModel
  25. import time
  26. from object.TokenObject import TokenObject
  27. from django.http import StreamingHttpResponse
  28. class LangAreaView(TemplateView):
  29. def post(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation', None)
  32. request_dict = json.loads(request.body.decode('utf-8'))
  33. return self.validate(request_dict, operation)
  34. def get(self, request, *args, **kwargs):
  35. request.encoding = 'utf-8'
  36. request_dict = request.GET
  37. operation = kwargs.get('operation', None)
  38. return self.validate(request_dict, operation)
  39. def validate(self, request_dict, operation):
  40. response = ResponseObject()
  41. token = request_dict.get('token', None)
  42. tko = TokenObject(token)
  43. if tko.code == 0:
  44. userID = tko.userID
  45. user_qs = UserModel.objects.filter(id=userID, username='admin')
  46. if not user_qs.exists():
  47. return response.json(403)
  48. if operation == 'add':
  49. return self.do_add(request_dict, response)
  50. elif operation == 'update':
  51. return self.do_update(request_dict, response)
  52. elif operation == 'delete':
  53. return self.do_delete(request_dict, response)
  54. elif operation == 'query':
  55. return self.do_query(request_dict, response, userID)
  56. elif operation == 'export':
  57. return self.do_export(request_dict, response, userID)
  58. elif operation == 'AITranslation':
  59. return self.ai_translation(request_dict, response)
  60. else:
  61. return response.json(414)
  62. else:
  63. return response.json(tko.code)
  64. def do_add(self, request_dict, response):
  65. lang = request_dict.get('lang', None)
  66. if lang:
  67. nowTime = int(time.time())
  68. create_dict = {
  69. 'lang': lang,
  70. 'addTime': nowTime,
  71. 'updTime': nowTime
  72. }
  73. try:
  74. LangAreaModel.objects.create(**create_dict)
  75. except Exception as e:
  76. return response.json(404, repr(e))
  77. else:
  78. return response.json(0)
  79. else:
  80. return response.json(414)
  81. def do_update(self, request_dict, response):
  82. lang = request_dict.get('lang', None)
  83. id = request_dict.get('id', None)
  84. nowTime = int(time.time())
  85. update_dict = {
  86. 'lang': lang,
  87. 'updTime': nowTime
  88. }
  89. try:
  90. LangAreaModel.objects.filter(id=id).update(**update_dict)
  91. except Exception as e:
  92. return response.json(404, repr(e))
  93. else:
  94. return response.json(0)
  95. def do_delete(self, request_dict, response):
  96. id = request_dict.get('id', None)
  97. try:
  98. LangAreaModel.objects.filter(id=id).delete()
  99. except Exception as e:
  100. return response.json(404, repr(e))
  101. else:
  102. return response.json(0)
  103. def do_query(self, request_dict, response, userID):
  104. user_qs = UserModel.objects.filter(id=userID, username='admin')
  105. if not user_qs.exists():
  106. return response.json(403)
  107. la_qs = LangAreaModel.objects.filter().values('lang', 'id')
  108. return response.json(0, list(la_qs))
  109. def do_export(self, request_dict, response, userID):
  110. print("进来了")
  111. id = request_dict.get('id', None)
  112. type = request_dict.get('type', None)
  113. # key_list = LangKeyModel.objects.filter().values_list('word_key', flat=True)
  114. print('id = ' + id)
  115. langType = (1, 3, 5, 7)
  116. if type == 'avss':
  117. langType = (2, 3, 6, 7)
  118. elif type == 'link_ios' or type == 'link_android':
  119. langType = (4, 5, 6, 7)
  120. en_qs = LangKeyModel.objects.filter(langvalmodel__la__id=20, type__in=langType).values('word_key',
  121. 'langvalmodel__word_val')
  122. en_kv = {}
  123. for e in en_qs:
  124. en_kv[e['word_key']] = e['langvalmodel__word_val']
  125. content = ''
  126. if type == 'ios' or type == 'link_ios' or type == 'flutter':
  127. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType). \
  128. values('word_key', 'langvalmodel__word_val')
  129. res = {}
  130. for r in res_qs:
  131. print(r['langvalmodel__word_val'])
  132. if r['langvalmodel__word_val']:
  133. res[r['word_key']] = r['langvalmodel__word_val']
  134. elif en_kv[r['word_key']]:
  135. res[r['word_key']] = en_kv[r['word_key']]
  136. for l in res:
  137. content_val = res[l].replace('"', '\'')
  138. if type == 'ios' or type == 'link_ios':
  139. content = content + '"' + l + '"="' + content_val + '";\n'
  140. else:
  141. content = content + '"' + l + '":"' + content_val + '",\n'
  142. if type == 'flutter':
  143. content = '{\n' + content + '}'
  144. elif type == 'android' or type == 'link_android':
  145. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType). \
  146. values('word_key', 'langvalmodel__word_val').order_by('addTime')
  147. res = {}
  148. for r in res_qs:
  149. if r['langvalmodel__word_val']:
  150. res[r['word_key']] = r['langvalmodel__word_val']
  151. elif en_kv[r['word_key']]:
  152. res[r['word_key']] = en_kv[r['word_key']]
  153. for l in res:
  154. lk = l
  155. lk = lk.replace('.', '_')
  156. lk = lk.replace('\\n', '_')
  157. lk = lk.replace('“', '_')
  158. lk = lk.replace('”', '_')
  159. lk = lk.replace(' ', '_')
  160. lk = lk.replace('\\\'', '_')
  161. lk = lk.replace('\'', '_')
  162. lk = lk.replace('\\', '_')
  163. lk = lk.replace('!', '_')
  164. lk = lk.replace('’', '_')
  165. lk = lk.replace('...', '_')
  166. lk = lk.replace('…', '_')
  167. lk = lk.replace(':', '_')
  168. lk = lk.replace(':', '_')
  169. lk = lk.replace('(', '_')
  170. lk = lk.replace(')', '_')
  171. lk = lk.replace('?', '_')
  172. lk = lk.replace('?', '_')
  173. lk = lk.replace(',', '_')
  174. lk = lk.replace('-', '_')
  175. lk = lk.replace('%', '_')
  176. lk = lk.replace(';', '_')
  177. lk = lk.replace('‘', '_')
  178. lk = lk.replace('&', '&')
  179. if lk[0].isdigit():
  180. lk = lk.replace(lk[0], '_')
  181. # 正则表达式
  182. # re.sub("[a-z]+", "$", "123abc78ab9cdeg00t8")
  183. content_val = res[l].replace("'", "\\'")
  184. content_val = content_val.replace('"', '\\"')
  185. content_val = content_val.replace('&', '&')
  186. content = content + '<string name="' + lk + '">' + content_val + '</string>\n'
  187. elif type == 'avss':
  188. content = self.do_download_avss(id)
  189. elif type == 'new_searchTool':
  190. content = self.do_download_SearchTool(id, 0)
  191. elif type == 'old_searchTool':
  192. content = self.do_download_SearchTool(id, 1)
  193. response = StreamingHttpResponse(content)
  194. response['Content-Type'] = 'application/octet-stream'
  195. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  196. return response
  197. @classmethod
  198. def ai_translation(cls, request_dict, response):
  199. lang_id = request_dict.get('lang_id', None)
  200. if not lang_id:
  201. return response.json(444)
  202. lang_id = int(lang_id)
  203. # 英文不翻译
  204. if lang_id == 20:
  205. return response.json(0)
  206. try:
  207. # 查询语种
  208. lang_area_qs = LangAreaModel.objects.filter(id=lang_id).values('lang')
  209. if not lang_area_qs.exists():
  210. return response.json(444)
  211. lang = lang_area_qs[0]['lang']
  212. # 查询英文不为空,并根据lk_id去重
  213. lang_val_qs = LangValModel.objects.filter(~Q(word_val=''), Q(la_id=20)).values('lk_id').\
  214. annotate(word_val=Min('word_val')).order_by('lk_id')
  215. if not lang_val_qs.exists():
  216. return response.json(444)
  217. bulk = []
  218. now_time = int(time.time())
  219. # 根据lk_id查询有无对应语种,没有则调用API翻译并保存数据
  220. for lang_val in lang_val_qs:
  221. lk_id = lang_val['lk_id']
  222. lang_qs = LangValModel.objects.filter(la_id=lang_id, lk_id=lk_id).values('word_val')
  223. if not lang_qs.exists():
  224. # 翻译内容不存在,进行AI翻译
  225. word_val_en = lang_val['word_val']
  226. word_val = cls.deepseek_translation(lang, word_val_en)
  227. lang_val_model = LangValModel(
  228. lk_id=lk_id, la_id=lang_id, word_val=word_val, addTime=now_time, updTime=now_time, status=1
  229. )
  230. bulk.append(lang_val_model)
  231. else:
  232. # 翻译内容为空,进行AI翻译
  233. if lang_qs[0]['word_val'] == '':
  234. word_val_en = lang_val['word_val']
  235. word_val = cls.deepseek_translation(lang, word_val_en)
  236. lang_qs.update(word_val=word_val, addTime=now_time, updTime=now_time, status=1)
  237. LangValModel.objects.bulk_create(bulk)
  238. return response.json(0)
  239. except Exception as e:
  240. return response.json(10, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  241. @staticmethod
  242. def deepseek_translation(lang, word_val_en):
  243. url = "https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/271c9332-4aa6-4ff5-95b3-0cf8bd94c394/v1/chat/completions" # API地址
  244. api_key = "obPL2x_aJKJpm11JLz1GFKTfXcwF_2ra4bdogC1pbFgV7GobDRW3AD6iHPxCvDZqM87buJ3xyT6-bl1xiDV6aQ" # 把yourApiKey替换成已获取的API Key
  245. # Send request.
  246. headers = {
  247. 'Content-Type': 'application/json',
  248. 'Authorization': f'Bearer {api_key}'
  249. }
  250. content = '请将以下英文内容翻译成{},忽略转义符和占位符,直接返回翻译好的内容即可:{}'.format(lang, word_val_en)
  251. data = {
  252. "model": "DeepSeek-V3", # 模型名称
  253. "max_tokens": 1024, # 最大输出token数
  254. "messages": [
  255. {"role": "system",
  256. "content": "你是一名翻译家"},
  257. {"role": "user", "content": content}
  258. ],
  259. # 是否开启流式推理, 默认为False, 表示不开启流式推理
  260. "stream": False,
  261. # 在流式输出时是否展示使用的token数目。只有当stream为True时改参数才会生效。
  262. # "stream_options": { "include_usage": True },
  263. # 控制采样随机性的浮点数,值较低时模型更具确定性,值较高时模型更具创造性。"0"表示贪婪取样。默认为0.6。
  264. "temperature": 0.6
  265. }
  266. # 延迟请求
  267. time.sleep(1.1)
  268. response = requests.post(url, headers=headers, data=json.dumps(data), verify=False, timeout=10)
  269. text = json.loads(response.text)
  270. choices = text.get('choices')
  271. content = ''
  272. if choices is None:
  273. print(text)
  274. else:
  275. content = choices[0]['message']['content']
  276. return content
  277. def do_download_avss(self, id):
  278. content = ''
  279. en_result = self.get_area_language(20)
  280. target_result = self.get_area_language(id)
  281. if target_result:
  282. content += '<TS version=\"2.1\" language=\"' + self.get_avss_language(int(id)) + '\">\n'
  283. # keys = result.keys()
  284. keys = en_result.keys()
  285. for key in keys:
  286. content += '<context>\n<name>'
  287. content += key
  288. content += '</name>\n'
  289. messages = None
  290. if target_result.__contains__(key):
  291. messages = target_result[key]
  292. else:
  293. messages = en_result[key]
  294. messageKeys = en_result[key].keys()
  295. for messageKey in messageKeys:
  296. message = None
  297. if messages.__contains__(messageKey):
  298. message = messages[messageKey]
  299. else:
  300. message = en_result[key][messageKey]
  301. # message = messages[messageKey]
  302. content += '<message>\n'
  303. content += '<source>'
  304. content += message['source']
  305. content += '</source>\n'
  306. content += '<translation>'
  307. translation = message['translation']
  308. # if translation is None or translation == '':
  309. # content += '23333'
  310. # else:
  311. content += translation
  312. content += '</translation>\n'
  313. locations = message['locations']
  314. print(message)
  315. for location in locations:
  316. if location['filename'] != '':
  317. content += '<location filename=\"' + location['filename'] + '\" line=\"' + str(
  318. location['line']) + '\"/>\n'
  319. content += '</message>\n'
  320. content += '</context>\n'
  321. content += '</TS>'
  322. return content
  323. else:
  324. print('none')
  325. return content
  326. def get_area_language(self, id):
  327. result = {}
  328. lkc_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=(2, 3, 6, 7)).values('word_key',
  329. 'langkeyclassmodel__clazz__name',
  330. 'langvalmodel__word_val',
  331. 'langlocationmodel__filename',
  332. 'langlocationmodel__line').order_by(
  333. 'langkeyclassmodel__clazz__name', 'word_key')
  334. for lkc in lkc_qs:
  335. # print(lkc)
  336. name = lkc['langkeyclassmodel__clazz__name']
  337. source = lkc['word_key']
  338. localtion = {'filename': lkc['langlocationmodel__filename'], 'line': lkc['langlocationmodel__line']}
  339. hasClass = result.__contains__(name)
  340. if not hasClass:
  341. result[name] = {
  342. source: {'source': source, 'translation': lkc['langvalmodel__word_val'], 'locations': [localtion]}}
  343. else:
  344. hasKey = result[name].__contains__(source)
  345. if not hasKey:
  346. result[name][source] = {'source': source, 'translation': lkc['langvalmodel__word_val'],
  347. 'locations': [localtion]}
  348. else:
  349. if localtion not in result[name][source]['locations']:
  350. result[name][source]['locations'].append(localtion)
  351. print(result)
  352. return result
  353. def get_area_language_search(self, id):
  354. result = {}
  355. lkc_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, project__id=4).values('word_key',
  356. 'searchtoolkeymodel__bk__name',
  357. 'langvalmodel__word_val',
  358. 'langlocationmodel__filename',
  359. 'langlocationmodel__line')
  360. for lkc in lkc_qs:
  361. # print(lkc)
  362. name = lkc['searchtoolkeymodel__bk__name']
  363. hasClass = result.__contains__(name)
  364. if hasClass is False:
  365. result[name] = {}
  366. source = lkc['word_key']
  367. if not result[name].__contains__(source):
  368. result[name][source] = {}
  369. message = result[name][source]
  370. message['source'] = source[(len(name) + 1):]
  371. message['translation'] = lkc['langvalmodel__word_val']
  372. # location
  373. locations = []
  374. locations.append({'filename': lkc['langlocationmodel__filename'], 'line': lkc['langlocationmodel__line']})
  375. message['locations'] = locations
  376. print(result)
  377. return result
  378. def get_avss_language(self, id):
  379. if id == 18: # 简体中文
  380. return 'zh_CN'
  381. elif id == 19: # 繁体中文
  382. return 'zh_HK'
  383. elif id == 20: # 英文
  384. return 'en_US'
  385. elif id == 21: # 俄语
  386. return 'ru'
  387. elif id == 22: # 德语
  388. return 'de'
  389. elif id == 23: # 波兰语
  390. return 'pl'
  391. elif id == 24: # 法语
  392. return 'fr'
  393. elif id == 25: # 西班牙语
  394. return 'es'
  395. elif id == 26: # 日语
  396. return 'ja'
  397. elif id == 27: # 阿拉伯语
  398. return 'ar'
  399. elif id == 29: # 意大利语
  400. return 'it'
  401. elif id == 30: # 葡萄牙语
  402. return 'pt'
  403. elif id == 31: # 荷兰语
  404. return 'nl'
  405. elif id == 32: # 越南语
  406. return 'vi'
  407. else:
  408. return 'en'
  409. def do_download_SearchTool(self, id, searchtype):
  410. content = ''
  411. en_result = self.get_area_language_search(20)
  412. print(en_result)
  413. target_result = self.get_area_language_search(id)
  414. if target_result:
  415. content += '<TS version=\"2.1\" language=\"' + self.get_avss_language(int(id)) + '\">\n'
  416. # keys = result.keys()
  417. keys = en_result.keys()
  418. for key in keys:
  419. content += '<context>\n<name>'
  420. content += key
  421. content += '</name>\n'
  422. messages = None
  423. if target_result.__contains__(key):
  424. messages = target_result[key]
  425. else:
  426. messages = en_result[key]
  427. messageKeys = en_result[key].keys()
  428. for messageKey in messageKeys:
  429. message = None
  430. if messages.__contains__(messageKey):
  431. message = messages[messageKey]
  432. else:
  433. message = en_result[key][messageKey]
  434. # message = messages[messageKey]
  435. content += '<message>\n'
  436. content += '<source>'
  437. content += message['source']
  438. content += '</source>\n'
  439. content += '<translation>'
  440. translation = message['translation']
  441. # if translation is None or translation == '':
  442. # content += '23333'
  443. # else:
  444. content += translation
  445. content += '</translation>\n'
  446. locations = message['locations']
  447. print(message)
  448. for location in locations:
  449. if location['filename'] != '':
  450. content += '<location filename=\"' + location['filename'] + '\" line=\"' + str(
  451. location['line']) + '\"/>\n'
  452. content += '</message>\n'
  453. content += '</context>\n'
  454. content += '</TS>'
  455. return content
  456. else:
  457. print('none')
  458. return content
  459. class exportLangView(TemplateView):
  460. def post(self, request, *args, **kwargs):
  461. request.encoding = 'utf-8'
  462. request_dict = json.loads(request.body.decode('utf-8'))
  463. return self.validate(request_dict)
  464. def get(self, request, *args, **kwargs):
  465. request.encoding = 'utf-8'
  466. request_dict = request.GET
  467. return self.validate(request_dict)
  468. def validate(self, request_dict):
  469. # 得到即将下载文件的路径和名称
  470. response = StreamingHttpResponse('123l4kjlkfjlksadjlfksdajlf')
  471. response['Content-Type'] = 'application/octet-stream'
  472. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  473. return response