LangArea.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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. import time
  23. from object.TokenObject import TokenObject
  24. from django.http import StreamingHttpResponse
  25. class LangAreaView(TemplateView):
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation', None)
  29. request_dict = json.loads(request.body.decode('utf-8'))
  30. return self.validate(request_dict, operation)
  31. def get(self, request, *args, **kwargs):
  32. request.encoding = 'utf-8'
  33. request_dict = request.GET
  34. operation = kwargs.get('operation', None)
  35. return self.validate(request_dict, operation)
  36. def validate(self, request_dict, operation):
  37. response = ResponseObject()
  38. token = request_dict.get('token', None)
  39. tko = TokenObject(token)
  40. if tko.code == 0:
  41. userID = tko.userID
  42. user_qs = UserModel.objects.filter(id=userID, username='admin')
  43. if not user_qs.exists():
  44. return response.json(403)
  45. if operation == 'add':
  46. return self.do_add(request_dict, response)
  47. elif operation == 'update':
  48. return self.do_update(request_dict, response)
  49. elif operation == 'delete':
  50. return self.do_delete(request_dict, response)
  51. elif operation == 'query':
  52. return self.do_query(request_dict, response, userID)
  53. elif operation == 'export':
  54. return self.do_export(request_dict, response, userID)
  55. else:
  56. return response.json(414)
  57. else:
  58. return response.json(tko.code)
  59. def do_add(self, request_dict, response):
  60. lang = request_dict.get('lang', None)
  61. if lang:
  62. nowTime = int(time.time())
  63. create_dict = {
  64. 'lang': lang,
  65. 'addTime': nowTime,
  66. 'updTime': nowTime
  67. }
  68. try:
  69. LangAreaModel.objects.create(**create_dict)
  70. except Exception as e:
  71. return response.json(404, repr(e))
  72. else:
  73. return response.json(0)
  74. else:
  75. return response.json(414)
  76. def do_update(self, request_dict, response):
  77. lang = request_dict.get('lang', None)
  78. id = request_dict.get('id', None)
  79. nowTime = int(time.time())
  80. update_dict = {
  81. 'lang': lang,
  82. 'updTime': nowTime
  83. }
  84. try:
  85. LangAreaModel.objects.filter(id=id).update(**update_dict)
  86. except Exception as e:
  87. return response.json(404, repr(e))
  88. else:
  89. return response.json(0)
  90. def do_delete(self, request_dict, response):
  91. id = request_dict.get('id', None)
  92. try:
  93. LangAreaModel.objects.filter(id=id).delete()
  94. except Exception as e:
  95. return response.json(404, repr(e))
  96. else:
  97. return response.json(0)
  98. def do_query(self, request_dict, response, userID):
  99. user_qs = UserModel.objects.filter(id=userID, username='admin')
  100. if not user_qs.exists():
  101. return response.json(403)
  102. la_qs = LangAreaModel.objects.filter().values('lang', 'id')
  103. return response.json(0, list(la_qs))
  104. def do_export(self, request_dict, response, userID):
  105. print("进来了")
  106. id = request_dict.get('id', None)
  107. type = request_dict.get('type', None)
  108. # key_list = LangKeyModel.objects.filter().values_list('word_key', flat=True)
  109. print('id = ' + id)
  110. langType = (0, 2)
  111. if type == 'avss':
  112. langType = (1, 2)
  113. en_qs = LangKeyModel.objects.filter(langvalmodel__la__id=20, type__in=langType).values('word_key', 'langvalmodel__word_val')
  114. en_kv = {}
  115. for e in en_qs:
  116. en_kv[e['word_key']] = e['langvalmodel__word_val']
  117. content = ''
  118. if type == 'ios':
  119. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType).\
  120. values('word_key', 'langvalmodel__word_val')
  121. res = {}
  122. for r in res_qs:
  123. print(r['langvalmodel__word_val'])
  124. if r['langvalmodel__word_val']:
  125. res[r['word_key']] = r['langvalmodel__word_val']
  126. elif en_kv[r['word_key']]:
  127. res[r['word_key']] = en_kv[r['word_key']]
  128. for l in res:
  129. content_val = res[l].replace('"', '\'')
  130. content = content + '"' + l + '"="' + content_val + '";\n'
  131. elif type == 'android':
  132. res_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=langType).\
  133. values('word_key', 'langvalmodel__word_val').order_by('addTime')
  134. res = {}
  135. for r in res_qs:
  136. print(r['langvalmodel__word_val'])
  137. if r['langvalmodel__word_val']:
  138. res[r['word_key']] = r['langvalmodel__word_val']
  139. elif en_kv[r['word_key']]:
  140. res[r['word_key']] = en_kv[r['word_key']]
  141. for l in res:
  142. lk = l
  143. lk = lk.replace('.', '_')
  144. lk = lk.replace('\\n', '_')
  145. lk = lk.replace('“', '_')
  146. lk = lk.replace('”', '_')
  147. lk = lk.replace(' ', '_')
  148. lk = lk.replace('\\\'', '_')
  149. lk = lk.replace('\'', '_')
  150. lk = lk.replace('\\', '_')
  151. lk = lk.replace('!', '_')
  152. lk = lk.replace('’', '_')
  153. lk = lk.replace('...', '_')
  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. # 正则表达式
  166. # re.sub("[a-z]+", "$", "123abc78ab9cdeg00t8")
  167. content_val = res[l].replace("'", "\\'")
  168. content_val = content_val.replace('"', '\\"')
  169. content = content + '<string name="' + lk + '">' + content_val + '</string>\n'
  170. elif type == 'avss':
  171. content = self.do_download_avss(id)
  172. response = StreamingHttpResponse(content)
  173. response['Content-Type'] = 'application/octet-stream'
  174. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  175. return response
  176. return response.json(0, res)
  177. def do_download_avss(self, id):
  178. content = ''
  179. en_result = self.get_area_language(20)
  180. target_result = self.get_area_language(id)
  181. if target_result:
  182. content += '<TS version=\"2.1\" language=\"' + self.get_avss_language(int(id)) + '\">\n'
  183. # keys = result.keys()
  184. keys = en_result.keys()
  185. for key in keys:
  186. content += '<context>\n<name>'
  187. content += key
  188. content += '</name>\n'
  189. messages = None
  190. if target_result.__contains__(key):
  191. messages = target_result[key]
  192. else:
  193. messages = en_result[key]
  194. messageKeys = en_result[key].keys()
  195. for messageKey in messageKeys:
  196. message = None
  197. if messages.__contains__(messageKey):
  198. message = messages[messageKey]
  199. else:
  200. message = en_result[key][messageKey]
  201. # message = messages[messageKey]
  202. content += '<message>\n'
  203. content += '<source>'
  204. content += message['source']
  205. content += '</source>\n'
  206. content += '<translation>'
  207. translation = message['translation']
  208. # if translation is None or translation == '':
  209. # content += '23333'
  210. # else:
  211. content += translation
  212. content += '</translation>\n'
  213. locations = message['locations']
  214. print(message)
  215. for location in locations:
  216. if location['filename'] != '':
  217. content += '<location filename=\"' + location['filename'] + '\" line=\"' + str(location['line']) + '\"/>\n'
  218. content += '</message>\n'
  219. content += '</context>\n'
  220. content += '</TS>'
  221. return content
  222. else:
  223. print('none')
  224. return content
  225. def get_area_language(self, id):
  226. result = {}
  227. lkc_qs = LangKeyModel.objects.filter(langvalmodel__la__id=id, type__in=(1, 2)).values('word_key',
  228. 'langkeyclassmodel__clazz__name',
  229. 'langvalmodel__word_val',
  230. 'langlocationmodel__filename',
  231. 'langlocationmodel__line')
  232. for lkc in lkc_qs:
  233. # print(lkc)
  234. name = lkc['langkeyclassmodel__clazz__name']
  235. hasClass = result.__contains__(name)
  236. if hasClass is False:
  237. result[name] = {}
  238. source = lkc['word_key']
  239. if not result[name].__contains__(source):
  240. result[name][source] = {}
  241. message = result[name][source]
  242. message['source'] = source
  243. message['translation'] = lkc['langvalmodel__word_val']
  244. # location
  245. locations = []
  246. locations.append({'filename': lkc['langlocationmodel__filename'], 'line': lkc['langlocationmodel__line']})
  247. message['locations'] = locations
  248. print(result)
  249. return result
  250. def get_avss_language(self, id):
  251. if id == 18: # 简体中文
  252. return 'zh_CN'
  253. elif id == 19: # 繁体中文
  254. return 'zh_HK'
  255. elif id == 20: # 英文
  256. return 'en_US'
  257. elif id == 21: # 俄语
  258. return 'ru'
  259. elif id == 22: # 德语
  260. return 'de'
  261. elif id == 23: # 波兰语
  262. return 'pl'
  263. elif id == 24: # 法语
  264. return 'fr'
  265. elif id == 25: # 西班牙语
  266. return 'es'
  267. elif id == 26: # 日语
  268. return 'ja'
  269. elif id == 27: # 阿拉伯语
  270. return 'ar'
  271. elif id == 29: # 意大利语
  272. return 'it'
  273. elif id == 30: # 葡萄牙语
  274. return 'pt'
  275. elif id == 31: # 荷兰语
  276. return 'nl'
  277. elif id == 32: # 越南语
  278. return 'vi'
  279. class exportLangView(TemplateView):
  280. def post(self, request, *args, **kwargs):
  281. request.encoding = 'utf-8'
  282. request_dict = json.loads(request.body.decode('utf-8'))
  283. return self.validate(request_dict)
  284. def get(self, request, *args, **kwargs):
  285. request.encoding = 'utf-8'
  286. request_dict = request.GET
  287. return self.validate(request_dict)
  288. def validate(self, request_dict):
  289. # 得到即将下载文件的路径和名称
  290. response = StreamingHttpResponse('123l4kjlkfjlksadjlfksdajlf')
  291. response['Content-Type'] = 'application/octet-stream'
  292. response['Content-Disposition'] = 'attachment;filename="lang.txt"'
  293. return response