Coverage for app/venv/lib/python3.14/site-packages/weblate/machinery/alibaba.py: 51%

33 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 07:15 +0000

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4from __future__ import annotations 

5 

6import json 

7from typing import TYPE_CHECKING, ClassVar 

8 

9from aliyunsdkalimt.request.v20181012 import TranslateGeneralRequest 

10from aliyunsdkcore.client import AcsClient 

11from django.utils.functional import cached_property 

12 

13from .base import MachineTranslation, MachineTranslationError 

14from .forms import AlibabaMachineryForm 

15 

16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true

17 from .base import DownloadTranslations 

18 

19 

20class AlibabaTranslation(MachineTranslation): 

21 """Alibaba API machine translation support.""" 

22 

23 name = "Alibaba" 

24 max_score = 80 

25 

26 language_map: ClassVar[dict[str, str]] = { 

27 "zh_Hans": "zh", 

28 "zh_Hant": "zh-tw", 

29 } 

30 

31 settings_form = AlibabaMachineryForm 

32 

33 @cached_property 

34 def client(self): 

35 return AcsClient( 

36 ak=self.settings["key"], 

37 secret=self.settings["secret"], 

38 region_id=self.settings["region"], 

39 ) 

40 

41 def download_languages(self): 

42 """List of supported languages.""" 

43 return [ 

44 "ab", 

45 "sq", 

46 "ak", 

47 "ar", 

48 "an", 

49 "am", 

50 "as", 

51 "az", 

52 "ast", 

53 "nch", 

54 "ee", 

55 "ay", 

56 "ga", 

57 "et", 

58 "oj", 

59 "oc", 

60 "or", 

61 "om", 

62 "os", 

63 "tpi", 

64 "ba", # codespell:ignore 

65 "eu", 

66 "be", 

67 "ber", 

68 "bm", 

69 "pag", 

70 "bg", 

71 "se", 

72 "bem", 

73 "byn", 

74 "bi", 

75 "bal", 

76 "is", 

77 "pl", 

78 "bs", 

79 "fa", 

80 "bho", 

81 "br", 

82 "ch", 

83 "cbk", 

84 "cv", 

85 "ts", 

86 "tt", 

87 "da", 

88 "shn", 

89 "tet", 

90 "de", 

91 "nds", 

92 "sco", 

93 "dv", 

94 "kdx", 

95 "dtp", 

96 "ru", 

97 "fo", # codespell:ignore fo 

98 "fr", 

99 "sa", 

100 "fil", 

101 "fj", 

102 "fi", 

103 "fur", 

104 "fvr", 

105 "kg", 

106 "km", 

107 "ngu", 

108 "kl", 

109 "ka", 

110 "gos", 

111 "gu", 

112 "gn", 

113 "kk", 

114 "ht", 

115 "ko", 

116 "ha", 

117 "nl", 

118 "cnr", 

119 "hup", 

120 "gil", 

121 "rn", 

122 "quc", 

123 "ky", 

124 "gl", 

125 "ca", 

126 "cs", 

127 "kab", 

128 "kn", 

129 "kr", 

130 "csb", 

131 "kha", 

132 "kw", 

133 "xh", 

134 "co", 

135 "mus", 

136 "crh", 

137 "tlh", 

138 "hbs", 

139 "qu", 

140 "ks", 

141 "ku", 

142 "la", 

143 "ltg", 

144 "lv", 

145 "lo", 

146 "lt", 

147 "li", 

148 "ln", 

149 "lg", 

150 "lb", 

151 "rue", 

152 "rw", 

153 "ro", 

154 "rm", 

155 "rom", 

156 "jbo", 

157 "mg", 

158 "gv", 

159 "mt", 

160 "mr", 

161 "ml", 

162 "ms", 

163 "chm", 

164 "mk", 

165 "mh", 

166 "kek", 

167 "mai", 

168 "mfe", 

169 "mi", 

170 "mn", 

171 "bn", 

172 "my", 

173 "hmn", 

174 "umb", 

175 "nv", 

176 "af", 

177 "ne", 

178 "niu", 

179 "no", 

180 "pmn", 

181 "pap", 

182 "pa", 

183 "pt", 

184 "ps", 

185 "ny", 

186 "tw", 

187 "chr", 

188 "ja", 

189 "sv", 

190 "sm", 

191 "sg", 

192 "si", 

193 "hsb", 

194 "eo", 

195 "sl", 

196 "sw", 

197 "so", 

198 "sk", 

199 "tl", 

200 "tg", 

201 "ty", 

202 "te", # codespell:ignore te 

203 "ta", 

204 "th", 

205 "to", 

206 "toi", # codespell:ignore toi 

207 "ti", 

208 "tvl", 

209 "tyv", 

210 "tr", 

211 "tk", 

212 "wa", 

213 "war", 

214 "cy", 

215 "ve", 

216 "vo", 

217 "wo", 

218 "udm", 

219 "ur", 

220 "uz", 

221 "es", 

222 "ie", 

223 "fy", 

224 "szl", 

225 "he", 

226 "hil", 

227 "haw", 

228 "el", 

229 "lfn", 

230 "sd", 

231 "hu", 

232 "sn", 

233 "ceb", 

234 "syr", 

235 "su", 

236 "hy", 

237 "ace", 

238 "iba", 

239 "ig", 

240 "io", 

241 "ilo", 

242 "iu", 

243 "it", 

244 "yi", 

245 "ia", 

246 "hi", 

247 "id", 

248 "inh", # codespell:ignore inh 

249 "en", 

250 "yo", 

251 "vi", 

252 "zza", 

253 "jv", 

254 "zh", 

255 "zh-tw", 

256 "yue", 

257 "zu", 

258 ] 

259 

260 def download_translations( 

261 self, 

262 source_language, 

263 target_language, 

264 text: str, 

265 unit, 

266 user, 

267 threshold: int = 75, 

268 ) -> DownloadTranslations: 

269 """Download list of possible translations from a service.""" 

270 # Create an API request and set the request parameters. 

271 request = TranslateGeneralRequest.TranslateGeneralRequest() 

272 request.set_SourceLanguage(source_language) # source language 

273 request.set_SourceText(text) # original 

274 request.set_TargetLanguage(target_language) 

275 request.set_FormatType("text") 

276 request.set_method("POST") 

277 

278 # Initiate the API request and obtain the response. 

279 response = self.client.do_action_with_exception(request) 

280 payload = json.loads(response) 

281 if "Message" in payload: 

282 msg = f"Error {payload['Code']}: {payload['Message']}" 

283 raise MachineTranslationError(msg) 

284 

285 yield { 

286 "text": payload["Data"]["Translated"], 

287 "quality": self.max_score, 

288 "service": self.name, 

289 "source": text, 

290 }