1
/*
SubtitleTranslate - Ollama.as
Ollama (local) integration for PotPlayer
Model: translategemma:12b
Method: /api/chat (POST) with JsonReader
Version: 1.4 - Fixed with debug output
*/
// 全域變數
string g_model = "translategemma:12b";
string g_api_url = "hhttp://localhost:11434";
string GetTitle()
{
return "Ollama (Local translategemma:12b)";
}
string GetVersion()
{
return "1.4";
}
string GetDesc()
{
return "Translate using local Ollama. Model: " + g_model;
}
string GetLoginTitle()
{
return "Ollama Configuration";
}
string GetLoginDesc()
{
return "No login required for local Ollama.";
}
string GetUserText()
{
return "";
}
string GetPasswordText()
{
return "";
}
string ServerLogin(string User, string Pass)
{
return "200 ok";
}
void ServerLogout()
{
}
array<string> GetSrcLangs()
{
array<string> ret;
ret.insertLast("Auto");
ret.insertLast("en");
ret.insertLast("ja");
ret.insertLast("ko");
return ret;
}
array<string> GetDstLangs()
{
array<string> ret;
ret.insertLast("zh-TW");
ret.insertLast("zh-CN");
ret.insertLast("en");
return ret;
}
// 輔助函式:處理 JSON 請求內容的特殊字元轉義
string EscapeJsonString(string text)
{
string ret = text;
ret.replace("\\", "\\\\");
ret.replace("\"", "\\\"");
ret.replace("\n", "\\n");
ret.replace("\r", "\\r");
ret.replace("\t", "\\t");
return ret;
}
string Translate(string Text, string &in SrcLang, string &in DstLang)
{
// 調試輸出
HostPrintUTF8("[Ollama] Starting translation...\n");
HostPrintUTF8("[Ollama] Input text: " + Text + "\n");
// 1. 設定 API 網址與標頭
string url = g_api_url;
string UserAgent = "PotPlayer/1.0";
string SendHeader = "Content-Type: application/json\r\n";
// 2. 建立提示詞 (Prompt)
string systemPrompt = "You are a professional subtitle translator. Translate the given text to Traditional Chinese.Make it smooth, idiomatic, and sound like real spoken dialogue. Keep meaning, tone, and emotion. Output ONLY the translation, nothing else. No explanations, no notes.";
string userPrompt = Text;
// 3. 建立 JSON Body (使用 /api/chat 格式)
string PostData = "{";
PostData += "\"model\":\"" + g_model + "\",";
PostData += "\"messages\":[";
PostData += "{\"role\":\"system\",\"content\":\"" + EscapeJsonString(systemPrompt) + "\"},";
PostData += "{\"role\":\"user\",\"content\":\"" + EscapeJsonString(userPrompt) + "\"}";
PostData += "],";
PostData += "\"stream\":false,";
PostData += "\"options\":{\"temperature\":0.3}";
PostData += "}";
HostPrintUTF8("[Ollama] URL: " + url + "\n");
HostPrintUTF8("[Ollama] POST data: " + PostData + "\n");
// 4. 發送 HTTP POST 請求
uintptr http = HostOpenHTTP(url, UserAgent, SendHeader, PostData);
string ret = "";
HostPrintUTF8("[Ollama] HTTP handle: " + http + "\n");
if (http != 0)
{
// 5. 取得回傳內容
string json = HostGetContentHTTP(http);
HostCloseHTTP(http);
HostPrintUTF8("[Ollama] Response length: " + json.length() + "\n");
if (json.length() > 0)
{
HostPrintUTF8("[Ollama] Response: " + json.substr(0, 500) + "\n");
}
// 6. 使用 PotPlayer 內建的 JsonReader 解析回傳資料
if (json.length() > 0)
{
JsonReader Reader;
JsonValue Root;
// 解析 JSON
if (Reader.parse(json, Root))
{
HostPrintUTF8("[Ollama] JSON parsed successfully\n");
if (Root.isObject())
{
// /api/chat 回傳格式: {"message":{"role":"assistant","content":"翻譯內容"}}
JsonValue message = Root["message"];
if (message.isObject())
{
JsonValue content = message["content"];
if (content.isString())
{
ret = content.asString();
HostPrintUTF8("[Ollama] Translation result: " + ret + "\n");
}
}
}
}
else
{
HostPrintUTF8("[Ollama] JSON parse failed!\n");
}
}
}
else
{
HostPrintUTF8("[Ollama] HTTP request failed! Handle is 0\n");
}
if (ret.length() > 0)
{
SrcLang = "UTF8";
DstLang = "UTF8";
return ret;
}
HostPrintUTF8("[Ollama] No translation result\n");
return "";
}
For immediate assistance, please email our customer support: [email protected]