@@ -33,6 +33,8 @@ import java.util.Locale
33
33
import java.util.concurrent.CompletableFuture
34
34
import java.util.concurrent.Executor
35
35
import kotlinx.serialization.json.Json
36
+ import kotlinx.serialization.json.JsonArray
37
+ import kotlinx.serialization.json.JsonPrimitive
36
38
import kotlinx.serialization.json.jsonArray
37
39
import kotlinx.serialization.json.jsonObject
38
40
import kotlinx.serialization.json.jsonPrimitive
@@ -42,11 +44,14 @@ internal class GoogleBasicTranslator(private val apiKey: String, executor: Execu
42
44
private val http = HttpClient .newBuilder().executor(executor).build()
43
45
internal val supported: Set <Locale > = fetchSupportedLanguages()
44
46
45
- override fun translateDetecting (text : String , source : Locale , target : Locale ): CompletableFuture <TranslatedText > {
47
+ override fun translateDetecting (
48
+ texts : List <String >,
49
+ source : Locale ,
50
+ target : Locale ,
51
+ ): CompletableFuture <List <TranslatedText >> {
46
52
if (source == Translator .ROUTER || target == Translator .ROUTER ) {
47
- return CompletableFuture .completedFuture(TranslatedText (" router" ))
48
- } else if (text.isBlank() || source.language == target.language) {
49
- return CompletableFuture .completedFuture(TranslatedText (text, source))
53
+ val result = TranslatedText (" router" )
54
+ return CompletableFuture .completedFuture(List (texts.size) { result })
50
55
}
51
56
52
57
var fixedSource = source
@@ -63,8 +68,17 @@ internal class GoogleBasicTranslator(private val apiKey: String, executor: Execu
63
68
}
64
69
}
65
70
71
+ if (fixedSource.language == fixedTarget.language) {
72
+ return CompletableFuture .completedFuture(List (texts.size) { i -> TranslatedText (texts[i], fixedSource) })
73
+ }
74
+
66
75
val parameters =
67
- mutableMapOf (" key" to apiKey, " q" to text, " target" to fixedTarget.toLanguageTag(), " format" to " text" )
76
+ mutableMapOf (
77
+ " key" to apiKey,
78
+ " q" to JsonArray (texts.map(::JsonPrimitive )).toString(),
79
+ " target" to fixedTarget.toLanguageTag(),
80
+ " format" to " text" ,
81
+ )
68
82
69
83
if (fixedSource != Translator .AUTO_DETECT ) {
70
84
parameters[" source" ] = fixedSource.toLanguageTag()
@@ -79,22 +93,22 @@ internal class GoogleBasicTranslator(private val apiKey: String, executor: Execu
79
93
if (response.statusCode() != 200 ) {
80
94
CompletableFuture .failedFuture(Exception (" Failed to translate text: ${response.statusCode()} " ))
81
95
} else {
82
- val result =
96
+ CompletableFuture .completedFuture(
83
97
Json .parseToJsonElement(response.body())
84
98
.jsonObject[" data" ]!!
85
99
.jsonObject[" translations" ]!!
86
100
.jsonArray
87
- .first()
88
- .jsonObject
89
- CompletableFuture .completedFuture (
90
- TranslatedText (
91
- result[ " translatedText " ] !! .jsonPrimitive.content,
92
- if (fixedSource == Translator . AUTO_DETECT ) {
93
- Locale .forLanguageTag(result[ " detectedSourceLanguage " ] !! .jsonPrimitive.content)
94
- } else {
95
- fixedSource
96
- },
97
- )
101
+ .map { element ->
102
+ val obj = element .jsonObject
103
+ TranslatedText (
104
+ obj[ " translatedText " ] !! .jsonPrimitive.content,
105
+ if (fixedSource == Translator . AUTO_DETECT ) {
106
+ Locale .forLanguageTag(obj[ " detectedSourceLanguage " ] !! .jsonPrimitive.content)
107
+ } else {
108
+ fixedSource
109
+ },
110
+ )
111
+ }
98
112
)
99
113
}
100
114
}
0 commit comments