This commit is contained in:
+50
-10
@@ -8,6 +8,7 @@ import (
|
||||
"io"
|
||||
"mime"
|
||||
"net/http"
|
||||
neturl "net/url"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@@ -201,15 +202,17 @@ func (g *GeminiService) TranslateQuery(query string) string {
|
||||
}
|
||||
|
||||
rawText, err := g.generateText(body)
|
||||
if err != nil {
|
||||
return strings.TrimSpace(query)
|
||||
if err == nil {
|
||||
translated := sanitizePlainEnglishLine(rawText)
|
||||
if translated != "" && !strings.EqualFold(translated, strings.TrimSpace(query)) {
|
||||
return translated
|
||||
}
|
||||
}
|
||||
|
||||
translated := sanitizePlainEnglishLine(rawText)
|
||||
if translated == "" {
|
||||
return strings.TrimSpace(query)
|
||||
if translated, err := g.translateViaGoogle(query); err == nil && translated != "" {
|
||||
return translated
|
||||
}
|
||||
return translated
|
||||
return strings.TrimSpace(query)
|
||||
}
|
||||
|
||||
func (g *GeminiService) generateText(body map[string]any) (string, error) {
|
||||
@@ -464,10 +467,6 @@ func fallbackQueryExpansion(originalQuery, englishQuery string) []string {
|
||||
base + " 4k footage",
|
||||
base + " cinematic b-roll",
|
||||
}
|
||||
if strings.TrimSpace(originalQuery) != "" && !strings.EqualFold(strings.TrimSpace(originalQuery), strings.TrimSpace(englishQuery)) {
|
||||
candidates = append(candidates, strings.TrimSpace(originalQuery))
|
||||
}
|
||||
|
||||
seen := map[string]bool{}
|
||||
queries := make([]string, 0, len(candidates))
|
||||
for _, item := range candidates {
|
||||
@@ -519,3 +518,44 @@ func looksMostlyASCII(text string) bool {
|
||||
}
|
||||
return ascii >= len(runes)*8/10
|
||||
}
|
||||
|
||||
func (g *GeminiService) translateViaGoogle(query string) (string, error) {
|
||||
endpoint := "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=" + neturl.QueryEscape(query)
|
||||
resp, err := g.Client.Get(endpoint)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode >= 300 {
|
||||
return "", fmt.Errorf("google translate fallback returned status %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
var payload []any
|
||||
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if len(payload) == 0 {
|
||||
return "", fmt.Errorf("google translate fallback returned no payload")
|
||||
}
|
||||
top, ok := payload[0].([]any)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("google translate fallback returned unexpected payload")
|
||||
}
|
||||
|
||||
var builder strings.Builder
|
||||
for _, part := range top {
|
||||
segment, ok := part.([]any)
|
||||
if !ok || len(segment) == 0 {
|
||||
continue
|
||||
}
|
||||
if text, ok := segment[0].(string); ok {
|
||||
builder.WriteString(text)
|
||||
}
|
||||
}
|
||||
translated := strings.TrimSpace(builder.String())
|
||||
if translated == "" {
|
||||
return "", fmt.Errorf("google translate fallback returned empty translation")
|
||||
}
|
||||
return translated, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user