LangArea.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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. from django.http import HttpResponse
  16. from django.views.generic import TemplateView
  17. from django.views.decorators.csrf import csrf_exempt
  18. from django.utils.decorators import method_decorator
  19. from object.ResponseObject import ResponseObject
  20. from django.contrib.auth.hashers import make_password, check_password
  21. from model.models import UserModel, LangSetModel, LangAreaModel, LangValModel, LangKeyModel, LangKeyClassModel, \
  22. SearchToolBlock, SearchToolKeyModel, LangLocationModel
  23. import time
  24. from object.TokenObject import TokenObject
  25. from django.http import StreamingHttpResponse
  26. class LangAreaView(TemplateView):
  27. def post(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation', None)
  30. request_dict = json.loads(request.body.decode('utf-8'))
  31. return self.validate(request_dict, operation)
  32. def get(self, request, *args, **kwargs):
  33. request.encoding = 'utf-8'
  34. request_dict = request.GET
  35. operation = kwargs.get('operation', None)
  36. return self.validate(request_dict, operation)
  37. def validate(self, request_dict, operation):
  38. response = ResponseObject()
  39. token = request_dict.get('token', None)
  40. tko = TokenObject(token)
  41. if tko.code == 0:
  42. userID = tko.userID
  43. user_qs = UserModel.objects.filter(id=userID, username='admin')
  44. if not user_qs.exists():
  45. return response.json(403)
  46. if operation == 'add':
  47. return self.do_add(request_dict, response)
  48. elif operation == 'update':
  49. return self.do_update(request_dict, response)
  50. elif operation == 'delete':
  51. return self.do_delete(request_dict, response)
  52. elif operation == 'query':
  53. return self.do_query(request_dict, response, userID)
  54. elif operation == 'export':
  55. return self.do_export(request_dict, response, userID)
  56. else:
  57. return response.json(414)
  58. else:
  59. return response.json(tko.code)
  60. def do_add(self, request_dict, response):
  61. lang = request_dict.get('lang', None)
  62. if lang:
  63. nowTime = int(time.time())
  64. create_dict = {
  65. 'lang': lang,
  66. 'addTime': nowTime,
  67. 'updTime': nowTime
  68. }
  69. try:
  70. LangAreaModel.objects.create(**create_dict)
  71. except Exception as e:
  72. return response.json(404, repr(e))
  73. else:
  74. return response.json(0)
  75. else:
  76. return response.json(414)
  77. def do_update(self, request_dict, response):
  78. lang = request_dict.get('lang', None)
  79. id = request_dict.get('id', None)
  80. nowTime = int(time.time())
  81. update_dict = {
  82. 'lang': lang,
  83. 'updTime': nowTime
  84. }
  85. try:
  86. LangAreaModel.objects.filter(id=id).update(**update_dict)
  87. except Exception as e:
  88. return response.json(404, repr(e))
  89. else:
  90. return response.json(0)
  91. def do_delete(self, request_dict, response):
  92. id = request_dict.get('id', None)
  93. try:
  94. LangAreaModel.objects.filter(id=id).delete()
  95. except Exception as e:
  96. return response.json(404, repr(e))
  97. else:
  98. return response.json(0)
  99. def do_query(self, request_dict, response, userID):
  100. user_qs = UserModel.objects.filter(id=userID, username='admin')
  101. if not user_qs.exists():
  102. return response.json(403)
  103. la_qs = LangAreaModel.objects.filter().values('lang', 'id')
  104. return response.json(0, list(la_qs))
  105. def do_export(self, request_dict, response, userID):
  106. print("进来了")
  107. id = request_dict.get('id', None)
  108. type = request_dict.get('type', None)
  109. # key_list = LangKeyModel.objects.filter().values_list('word_key', flat=True)
  110. print('id = ' + id)
  111. langType = (1, 3, 5, 7)
  112. if type == 'avss':
  113. langType = (2, 3, 6, 7)
  114. elif type == 'link_ios' or type == 'link_android':
  115. langType = (4, 5, 6, 7)
  116. en_qs = LangKeyModel.objects.filter(langvalmodel__la__id=20, type__in=langType).values('word_key',
  117. 'langvalmodel__word_val')
  118. en_kv = {}
  119. for e in en_qs:
  120. en_kv[e['word_key']] = e['langvalmodel__word_val']
  121. content = ''
  122. if type == 'ios' or type == 'link_ios' or type == 'flutter':
  123. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType). \
  124. values('word_key', 'langvalmodel__word_val')
  125. res = {}
  126. for r in res_qs:
  127. print(r['langvalmodel__word_val'])
  128. if r['langvalmodel__word_val']:
  129. res[r['word_key']] = r['langvalmodel__word_val']
  130. elif en_kv[r['word_key']]:
  131. res[r['word_key']] = en_kv[r['word_key']]
  132. for l in res:
  133. content_val = res[l].replace('"', '\'')
  134. if type == 'ios' or type == 'link_ios':
  135. content = content + '"' + l + '"="' + content_val + '";\n'
  136. else:
  137. content = content + '"' + l + '":"' + content_val + '",\n'
  138. if type == 'flutter':
  139. content = '{\n' + content + '}'
  140. elif type == 'android' or type == 'link_android':
  141. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType). \
  142. values('word_key', 'langvalmodel__word_val').order_by('addTime')
  143. res = {}
  144. for r in res_qs:
  145. print(r['langvalmodel__word_val'])
  146. if r['langvalmodel__word_val']:
  147. res[r['word_key']] = r['langvalmodel__word_val']
  148. elif en_kv[r['word_key']]:
  149. res[r['word_key']] = en_kv[r['word_key']]
  150. for l in res:
  151. lk = l
  152. lk = lk.replace('.', '_')
  153. lk = lk.replace('\\n', '_')
  154. lk = lk.replace('“', '_')
  155. lk = lk.replace('”', '_')
  156. lk = lk.replace(' ', '_')
  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. if lk[0].isdigit():
  177. lk = lk.replace(lk[0], '_')
  178. # 正则表达式
  179. # re.sub("[a-z]+", "$", "123abc78ab9cdeg00t8")
  180. content_val = res[l].replace("'", "\\'")
  181. content_val = content_val.replace('"', '\\"')
  182. content_val = content_val.replace('&', '&')
  183. content = content + '<string name="' + lk + '">' + content_val + '</string>\n'
  184. elif type == 'avss':
  185. content = self.do_download_avss(id)
  186. elif type == 'new_searchTool':
  187. content = self.do_download_SearchTool(id, 0)
  188. elif type == 'old_searchTool':
  189. content = self.do_download_SearchTool(id, 1)
  190. response = StreamingHttpResponse(content)
  191. response['Content-Type'] = 'application/octet-stream'
  192. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  193. return response
  194. def do_download_avss(self, id):
  195. content = ''
  196. en_result = self.get_area_language(20)
  197. target_result = self.get_area_language(id)
  198. if target_result:
  199. content += '<TS version=\"2.1\" language=\"' + self.get_avss_language(int(id)) + '\">\n'
  200. # keys = result.keys()
  201. keys = en_result.keys()
  202. for key in keys:
  203. content += '<context>\n<name>'
  204. content += key
  205. content += '</name>\n'
  206. messages = None
  207. if target_result.__contains__(key):
  208. messages = target_result[key]
  209. else:
  210. messages = en_result[key]
  211. messageKeys = en_result[key].keys()
  212. for messageKey in messageKeys:
  213. message = None
  214. if messages.__contains__(messageKey):
  215. message = messages[messageKey]
  216. else:
  217. message = en_result[key][messageKey]
  218. # message = messages[messageKey]
  219. content += '<message>\n'
  220. content += '<source>'
  221. content += message['source']
  222. content += '</source>\n'
  223. content += '<translation>'
  224. translation = message['translation']
  225. # if translation is None or translation == '':
  226. # content += '23333'
  227. # else:
  228. content += translation
  229. content += '</translation>\n'
  230. locations = message['locations']
  231. print(message)
  232. for location in locations:
  233. if location['filename'] != '':
  234. content += '<location filename=\"' + location['filename'] + '\" line=\"' + str(
  235. location['line']) + '\"/>\n'
  236. content += '</message>\n'
  237. content += '</context>\n'
  238. content += '</TS>'
  239. return content
  240. else:
  241. print('none')
  242. return content
  243. def get_area_language(self, id):
  244. result = {}
  245. lkc_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=(2, 3, 6, 7)).values('word_key',
  246. 'langkeyclassmodel__clazz__name',
  247. 'langvalmodel__word_val',
  248. 'langlocationmodel__filename',
  249. 'langlocationmodel__line')
  250. for lkc in lkc_qs:
  251. # print(lkc)
  252. name = lkc['langkeyclassmodel__clazz__name']
  253. hasClass = result.__contains__(name)
  254. if hasClass is False:
  255. result[name] = {}
  256. source = lkc['word_key']
  257. if not result[name].__contains__(source):
  258. result[name][source] = {}
  259. message = result[name][source]
  260. message['source'] = source
  261. message['translation'] = lkc['langvalmodel__word_val']
  262. # location
  263. locations = []
  264. locations.append({'filename': lkc['langlocationmodel__filename'], 'line': lkc['langlocationmodel__line']})
  265. message['locations'] = locations
  266. print(result)
  267. return result
  268. def get_area_language_search(self, id):
  269. result = {}
  270. lkc_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, project__id=4).values('word_key',
  271. 'searchtoolkeymodel__bk__name',
  272. 'langvalmodel__word_val',
  273. 'langlocationmodel__filename',
  274. 'langlocationmodel__line')
  275. for lkc in lkc_qs:
  276. # print(lkc)
  277. name = lkc['searchtoolkeymodel__bk__name']
  278. hasClass = result.__contains__(name)
  279. if hasClass is False:
  280. result[name] = {}
  281. source = lkc['word_key']
  282. if not result[name].__contains__(source):
  283. result[name][source] = {}
  284. message = result[name][source]
  285. message['source'] = source[(len(name) + 1):]
  286. message['translation'] = lkc['langvalmodel__word_val']
  287. # location
  288. locations = []
  289. locations.append({'filename': lkc['langlocationmodel__filename'], 'line': lkc['langlocationmodel__line']})
  290. message['locations'] = locations
  291. print(result)
  292. return result
  293. def get_avss_language(self, id):
  294. if id == 18: # 简体中文
  295. return 'zh_CN'
  296. elif id == 19: # 繁体中文
  297. return 'zh_HK'
  298. elif id == 20: # 英文
  299. return 'en_US'
  300. elif id == 21: # 俄语
  301. return 'ru'
  302. elif id == 22: # 德语
  303. return 'de'
  304. elif id == 23: # 波兰语
  305. return 'pl'
  306. elif id == 24: # 法语
  307. return 'fr'
  308. elif id == 25: # 西班牙语
  309. return 'es'
  310. elif id == 26: # 日语
  311. return 'ja'
  312. elif id == 27: # 阿拉伯语
  313. return 'ar'
  314. elif id == 29: # 意大利语
  315. return 'it'
  316. elif id == 30: # 葡萄牙语
  317. return 'pt'
  318. elif id == 31: # 荷兰语
  319. return 'nl'
  320. elif id == 32: # 越南语
  321. return 'vi'
  322. else:
  323. return 'en'
  324. def do_download_SearchTool(self, id, searchtype):
  325. content = ''
  326. en_result = self.get_area_language_search(20)
  327. print(en_result)
  328. target_result = self.get_area_language_search(id)
  329. if target_result:
  330. content += '<TS version=\"2.1\" language=\"' + self.get_avss_language(int(id)) + '\">\n'
  331. # keys = result.keys()
  332. keys = en_result.keys()
  333. for key in keys:
  334. content += '<context>\n<name>'
  335. content += key
  336. content += '</name>\n'
  337. messages = None
  338. if target_result.__contains__(key):
  339. messages = target_result[key]
  340. else:
  341. messages = en_result[key]
  342. messageKeys = en_result[key].keys()
  343. for messageKey in messageKeys:
  344. message = None
  345. if messages.__contains__(messageKey):
  346. message = messages[messageKey]
  347. else:
  348. message = en_result[key][messageKey]
  349. # message = messages[messageKey]
  350. content += '<message>\n'
  351. content += '<source>'
  352. content += message['source']
  353. content += '</source>\n'
  354. content += '<translation>'
  355. translation = message['translation']
  356. # if translation is None or translation == '':
  357. # content += '23333'
  358. # else:
  359. content += translation
  360. content += '</translation>\n'
  361. locations = message['locations']
  362. print(message)
  363. for location in locations:
  364. if location['filename'] != '':
  365. content += '<location filename=\"' + location['filename'] + '\" line=\"' + str(
  366. location['line']) + '\"/>\n'
  367. content += '</message>\n'
  368. content += '</context>\n'
  369. content += '</TS>'
  370. return content
  371. else:
  372. print('none')
  373. return content
  374. class exportLangView(TemplateView):
  375. def post(self, request, *args, **kwargs):
  376. request.encoding = 'utf-8'
  377. request_dict = json.loads(request.body.decode('utf-8'))
  378. return self.validate(request_dict)
  379. def get(self, request, *args, **kwargs):
  380. request.encoding = 'utf-8'
  381. request_dict = request.GET
  382. return self.validate(request_dict)
  383. def validate(self, request_dict):
  384. # 得到即将下载文件的路径和名称
  385. response = StreamingHttpResponse('123l4kjlkfjlksadjlfksdajlf')
  386. response['Content-Type'] = 'application/octet-stream'
  387. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  388. return response