-
Notifications
You must be signed in to change notification settings - Fork 0
/
mt_deepl_api.groovy
129 lines (95 loc) · 4.62 KB
/
mt_deepl_api.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* :name = MT -- Translate with DeepL API :description=foo
*
* @author Manuel Souto Pico
* @date 2024-06-07
* @version 0.0.3
*/
// https://mvnrepository.com/artifact/com.deepl.api/deepl-java
// https://github.com/DeepLcom/deepl-java
@Grapes(
@Grab(group='com.deepl.api', module='deepl-java', version='1.5.0')
)
import org.omegat.util.StaticUtils
import org.omegat.util.OConsts
import org.omegat.core.data.PrepareTMXEntry
import org.omegat.core.data.TMXEntry
import com.deepl.api.*;
// constants
def pretrans = true
// functions
def get_api_key() {
config_dir = StaticUtils.getConfigDir()
api_key_file = new File(config_dir + File.separator + "keys" + File.separator + "deepl_api_key.txt")
if (! api_key_file.exists()) {
console.println("API key file (deepl_api_key.txt) not found in the configuration folder.")
return
}
String api_key = api_key_file.text
return api_key.trim()
}
def repair_langtags(tags, translator) {
/* check whether the full tag is supported, if not fetch only language subtag
*
* tags is expected to be a map like this:
* ["source_lang": "aa-BB", "target_lang": "xx-YY"]
*/
repaired_tags = [:]
deepl_source_languages = translator.getSourceLanguages().collect { it.getCode() }
deepl_target_languages = translator.getTargetLanguages().collect { it.getCode() }
repaired_tags["source_lang"] = (deepl_source_languages.contains(tags["source_lang"])) ? tags["source_lang"] : tags["source_lang"].split("-")[0]
repaired_tags["target_lang"] = (deepl_target_languages.contains(tags["target_lang"])) ? tags["target_lang"] : tags["target_lang"].split("-")[0]
return repaired_tags
}
def get_transl(segm_list, source_language, target_language, options) {
String api_key = get_api_key()
translator = new Translator(api_key);
tags = repair_langtags(
["source_lang": source_language.toString(), "target_lang": target_language.toString()],
translator
)
List<TextResult> results = translator.translateText(segm_list, tags["source_lang"], tags["target_lang"], options = null);
return results.collect { it.getText() }
}
def set_options() {
new TextTranslationOptions().setFormality(Formality.More)
}
/* demo:
TextResult result = translator.translateText("You are wrong.", "en", "es", $options = null);
console.println(result.getText()); // "Bonjour, le monde !"
*/
def timestamp = new Date().format("YYYYMMddHHmm")
def prop = project.projectProperties
def project_root = prop.projectRootDir
def source_lang = prop.getSourceLanguage()
def target_lang = prop.getTargetLanguage()
def proj_name = prop.projectName
def tmdir_fs = prop.getTMRoot() // fs = forward slash
def mt_dpath = pretrans ? prop.getTMRoot() + "auto" + File.separator + "mt" : prop.getTMRoot() + "mt"
new File(mt_dpath).mkdirs()
def omegat_dir = prop.projectInternal // same as prop.getProjectInternal()
// def project_save_fobj = new File(prop.projectInternal, OConsts.STATUS_EXTENSION)
def tmxsave = prop.getProjectInternal() + OConsts.STATUS_EXTENSION
def mt_fpath = mt_dpath + File.separator + "deepl_${timestamp}" + OConsts.TMX_EXTENSION;
def segm_list = project.allEntries.collect { it.getSrcText() } // SourceTextEntry
def options = null // set_options() // todo
def translations = get_transl(segm_list, source_lang, target_lang, options)
// backlog: remove entries that already have a translation in the working TM
// backlog: remove entries that already have a 100% match in any ref TM
// backlog: remove entries with low QEst score
project.allEntries.each { ste ->
def index = ste.entryNum()-1
def target = translations[index]
def entry = new PrepareTMXEntry()
entry.source = ste.getSrcText()
entry.translation = target
project.setTranslation(ste, entry, true, TMXEntry.ExternalLinked.xAUTO)
// 3rd parameter indicates whenever we save this entry as a default translation (true) or alternative (false)
// when true, the first parameter is not really used, if false we use its key to set alternative.
// Fourth parameter ExternalLinked.xAUTO is used when entries come from tm/autop (nothing to do with machine translation).
// There is no equivalent to indicate entry coming from MT because OmegaT does not have a specific color for that.
}
project.ProjectTMX.save(prop, mt_fpath, true)
// 3rd parameter: false is used by OmegaT when there were no modifications since last save.
// set to true, or if you want to use DeepL only for not yet translated segments,
// use true only if there was at least one segment translated.
return // to avoid printing the last variable in memory