v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-20 17:40:25 -07:00

feat: add gemini

This commit is contained in:
eeeXun 2023-12-29 13:31:26 +08:00
parent d56deea3ca
commit b266188a28
4 changed files with 245 additions and 1 deletions

View File

@ -50,6 +50,8 @@ func configInit() {
"destination.language.chatgpt": "English",
"source.language.deepl": "English",
"destination.language.deepl": "English",
"source.language.gemini": "English",
"destination.language.gemini": "English",
"source.language.google": "English",
"destination.language.google": "English",
"source.language.reverso": "English",
@ -153,7 +155,7 @@ func configInit() {
uiStyle.SetSrcBorderColor(config.GetString("source.border_color")).
SetDstBorderColor(config.GetString("destination.border_color"))
// Set API Keys
for _, name := range []string{"ChatGPT", "DeepL"} {
for _, name := range []string{"ChatGPT", "DeepL", "Gemini"} {
if config.Get(fmt.Sprintf("api_key.%s", name)) != nil {
translators[name].SetAPIKey(config.GetString(fmt.Sprintf("api_key.%s", name)))
}

View File

@ -0,0 +1,142 @@
package gemini
var (
// Generated from Google
lang = []string{
"Afrikaans",
"Albanian",
"Amharic",
"Arabic",
"Armenian",
"Auto",
"Assamese",
"Aymara",
"Azerbaijani",
"Bambara",
"Basque",
"Belarusian",
"Bengali",
"Bhojpuri",
"Bosnian",
"Bulgarian",
"Catalan",
"Cebuano",
"Chinese (Simplified)",
"Chinese (Traditional)",
"Corsican",
"Croatian",
"Czech",
"Danish",
"Dhivehi",
"Dogri",
"Dutch",
"English",
"Esperanto",
"Estonian",
"Ewe",
"Filipino (Tagalog)",
"Finnish",
"French",
"Frisian",
"Galician",
"Georgian",
"German",
"Greek",
"Guarani",
"Gujarati",
"Haitian Creole",
"Hausa",
"Hawaiian",
"Hebrew",
"Hindi",
"Hmong",
"Hungarian",
"Icelandic",
"Igbo",
"Ilocano",
"Indonesian",
"Irish",
"Italian",
"Japanese",
"Javanese",
"Kannada",
"Kazakh",
"Khmer",
"Kinyarwanda",
"Konkani",
"Korean",
"Krio",
"Kurdish",
"Kurdish (Sorani)",
"Kyrgyz",
"Lao",
"Latin",
"Latvian",
"Lingala",
"Lithuanian",
"Luganda",
"Luxembourgish",
"Macedonian",
"Maithili",
"Malagasy",
"Malay",
"Malayalam",
"Maltese",
"Maori",
"Marathi",
"Meiteilon (Manipuri)",
"Mizo",
"Mongolian",
"Myanmar (Burmese)",
"Nepali",
"Norwegian",
"Nyanja (Chichewa)",
"Odia (Oriya)",
"Oromo",
"Pashto",
"Persian",
"Polish",
"Portuguese (Portugal, Brazil)",
"Punjabi",
"Quechua",
"Romanian",
"Russian",
"Samoan",
"Sanskrit",
"Scots Gaelic",
"Sepedi",
"Serbian",
"Sesotho",
"Shona",
"Sindhi",
"Sinhala (Sinhalese)",
"Slovak",
"Slovenian",
"Somali",
"Spanish",
"Sundanese",
"Swahili",
"Swedish",
"Tagalog (Filipino)",
"Tajik",
"Tamil",
"Tatar",
"Telugu",
"Thai",
"Tigrinya",
"Tsonga",
"Turkish",
"Turkmen",
"Twi (Akan)",
"Ukrainian",
"Urdu",
"Uyghur",
"Uzbek",
"Vietnamese",
"Welsh",
"Xhosa",
"Yiddish",
"Yoruba",
"Zulu",
}
)

View File

@ -0,0 +1,96 @@
package gemini
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"github.com/eeeXun/gtt/internal/translate/core"
)
const (
textURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=%s"
)
type Translator struct {
*core.APIKey
*core.Language
*core.TTSLock
core.EngineName
}
func NewTranslator() *Translator {
return &Translator{
APIKey: new(core.APIKey),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
EngineName: core.NewEngineName("Gemini"),
}
}
func (t *Translator) GetAllLang() []string {
return lang
}
func (t *Translator) Translate(message string) (translation *core.Translation, err error) {
translation = new(core.Translation)
var data map[string]interface{}
if len(t.GetAPIKey()) <= 0 {
return nil, errors.New("Please write your API Key in config file for " + t.GetEngineName())
}
urlStr := fmt.Sprintf(textURL, t.GetAPIKey())
userData, _ := json.Marshal(map[string]interface{}{
"contents": []map[string]interface{}{
{
"parts": []map[string]interface{}{
{
"text": fmt.Sprintf(
"Translate following text from %s to %s\n%s",
t.GetSrcLang(),
t.GetDstLang(),
message,
),
},
},
}},
})
req, _ := http.NewRequest(http.MethodPost,
urlStr,
bytes.NewBuffer(userData),
)
req.Header.Add("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
if err = json.Unmarshal(body, &data); err != nil {
return nil, err
}
if len(data) <= 0 {
return nil, errors.New("Translation not found")
}
if data["error"] != nil {
return nil, errors.New(data["error"].(map[string]interface{})["message"].(string))
}
translation.TEXT =
data["candidates"].([]interface{})[0].(map[string]interface{})["content"].(map[string]interface{})["parts"].([]interface{})[0].(map[string]interface{})["text"].(string)
return translation, nil
}
func (t *Translator) PlayTTS(lang, message string) error {
defer t.ReleaseLock()
return errors.New(t.GetEngineName() + " does not support text to speech")
}

View File

@ -7,6 +7,7 @@ import (
"github.com/eeeXun/gtt/internal/translate/chatgpt"
"github.com/eeeXun/gtt/internal/translate/core"
"github.com/eeeXun/gtt/internal/translate/deepl"
"github.com/eeeXun/gtt/internal/translate/gemini"
"github.com/eeeXun/gtt/internal/translate/google"
"github.com/eeeXun/gtt/internal/translate/reverso"
)
@ -18,6 +19,7 @@ var (
"Bing",
"ChatGPT",
"DeepL",
"Gemini",
"Google",
"Reverso",
}
@ -78,6 +80,8 @@ func NewTranslator(name string) Translator {
translator = chatgpt.NewTranslator()
case "DeepL":
translator = deepl.NewTranslator()
case "Gemini":
translator = gemini.NewTranslator()
case "Google":
translator = google.NewTranslator()
case "Reverso":