50 lines
2.2 KiB
Lua
50 lines
2.2 KiB
Lua
|
|
-- "Переведи буфер на английский" → grab clipboard, translate, speak, put back
|
|||
|
|
local phrase = (jarvis.context.phrase or ""):lower()
|
|||
|
|
|
|||
|
|
-- Detect target language from phrase, default English.
|
|||
|
|
local target = "english"
|
|||
|
|
if phrase:find("на русск") then target = "русский"
|
|||
|
|
elseif phrase:find("на украин") then target = "украинский"
|
|||
|
|
elseif phrase:find("на немецк") then target = "немецкий"
|
|||
|
|
elseif phrase:find("на французск") then target = "французский"
|
|||
|
|
elseif phrase:find("на испанск") then target = "испанский"
|
|||
|
|
elseif phrase:find("на китайск") then target = "китайский"
|
|||
|
|
elseif phrase:find("на японск") then target = "японский"
|
|||
|
|
elseif phrase:find("на польск") then target = "польский"
|
|||
|
|
elseif phrase:find("english") then target = "english"
|
|||
|
|
elseif phrase:find("russian") then target = "русский"
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local src = jarvis.system.clipboard.get()
|
|||
|
|
if not src or src == "" then
|
|||
|
|
jarvis.speak("Буфер пуст.")
|
|||
|
|
jarvis.audio.play_not_found()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- Trim long input — translate first ~2000 chars for cost/latency.
|
|||
|
|
if #src > 2000 then
|
|||
|
|
src = src:sub(1, 2000) .. "..."
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local result = jarvis.llm({
|
|||
|
|
{ role = "system", content = "Ты переводчик. Переводи строго на запрошенный язык без комментариев и пояснений. Сохраняй смысл и стиль." },
|
|||
|
|
{ role = "user", content = string.format("Переведи на %s:\n\n%s", target, src) }
|
|||
|
|
}, { max_tokens = 800, temperature = 0.2 })
|
|||
|
|
|
|||
|
|
if not result or result == "" then
|
|||
|
|
jarvis.speak("Не получилось перевести.")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- Put translation back into clipboard
|
|||
|
|
jarvis.system.clipboard.set(result)
|
|||
|
|
|
|||
|
|
-- Speak only first sentence to avoid long monologue.
|
|||
|
|
local first_sentence = result:match("^[^%.!?]*[%.!?]") or result:sub(1, 200)
|
|||
|
|
jarvis.speak("Перевёл на " .. target .. ". " .. first_sentence)
|
|||
|
|
jarvis.system.notify("Перевод (в буфере)", result:sub(1, 200))
|
|||
|
|
jarvis.audio.play_ok()
|
|||
|
|
return { chain = false }
|