Message Translator
Key RequiredUniversal

Message Translator

Universal ScriptdMg8uVvzbn0dMg8uVvzbn0 11.2K views 10 executesUpdated Apr 11, 2022
Unrated
00
Lua Script•385 lines (11698 chars)
--[[
    Message Translator
    Made by Aim, updated by cli
    Credits to Riptxde for the sending chathook
--]]

if not game['Loaded'] then game['Loaded']:Wait() end; repeat wait(.06) until game:GetService('Players').LocalPlayer ~= nil
local YourLang = "en" -- Language code that the messages are going to be translated to

local googlev = isfile'googlev.txt' and readfile'googlev.txt' or ''

function googleConsent(Body) -- Because google really said: "Fuck you."
    local args = {}

    for match in Body:gmatch('<input type="hidden" name=".-" value=".-">') do
        local k,v = match:match('<input type="hidden" name="(.-)" value="(.-)">')
        args[k] = v
    end
    googlev = args.v
    writefile('googlev.txt', args.v)
end

local function got(url, Method, Body) -- Basic version of https://www.npmjs.com/package/got using synapse's request API for google websites
    Method = Method or "GET"
    
    local res = syn.request({
        Url = url,
        Method = Method,
        Headers = {cookie="CONSENT=YES+"..googlev},
        Body = Body
    })
    
    if res.Body:match('https://consent.google.com/s') then
        print('consent')
        googleConsent(res.Body)
        res = syn.request({
            Url = url,
            Method = "GET",
            Headers = {cookie="CONSENT=YES+"..googlev}
        })
    end
    
    return res
end

local languages = {
    auto = "Automatic",-- > keybind
    af = "Afrikaans",-- > keybind
    sq = "Albanian",-- > keybind
    am = "Amharic",-- > keybind
    ar = "Arabic",-- > keybind
    hy = "Armenian",-- > keybind
    az = "Azerbaijani",-- > keybind
    eu = "Basque",-- > keybind
    be = "Belarusian",-- > keybind
    bn = "Bengali",-- > keybind
    bs = "Bosnian",-- > keybind
    bg = "Bulgarian",-- > keybind
    ca = "Catalan",-- > keybind
    ceb = "Cebuano",-- > keybind
    ny = "Chichewa",-- > keybind
    ['zh-cn'] = "Chinese Simplified",-- > keybind
    ['zh-tw'] = "Chinese Traditional",-- > keybind
    co = "Corsican",-- > keybind
    hr = "Croatian",-- > keybind
    cs = "Czech",-- > keybind
    da = "Danish",-- > keybind
    nl = "Dutch",-- > keybind
    en = "English",-- > keybind
    eo = "Esperanto",-- > keybind
    et = "Estonian",-- > keybind
    tl = "Filipino",-- > keybind
    fi = "Finnish",-- > keybind
    fr = "French",-- > keybind
    fy = "Frisian",-- > keybind
    gl = "Galician",-- > keybind
    ka = "Georgian",-- > keybind
    de = "German",-- > keybind
    el = "Greek",-- > keybind
    gu = "Gujarati",-- > keybind
    ht = "Haitian Creole",-- > keybind
    ha = "Hausa",-- > keybind
    haw = "Hawaiian",-- > keybind
    iw = "Hebrew",-- > keybind
    hi = "Hindi",-- > keybind
    hmn = "Hmong",-- > keybind
    hu = "Hungarian",-- > keybind
    is = "Icelandic",-- > keybind
    ig = "Igbo",-- > keybind
    id = "Indonesian",-- > keybind
    ga = "Irish",-- > keybind
    it = "Italian",-- > keybind
    ja = "Japanese",-- > keybind
    jw = "Javanese",-- > keybind
    kn = "Kannada",-- > keybind
    kk = "Kazakh",-- > keybind
    km = "Khmer",-- > keybind
    ko = "Korean",-- > keybind
    ku = "Kurdish (Kurmanji)",-- > keybind
    ky = "Kyrgyz",-- > keybind
    lo = "Lao",-- > keybind
    la = "Latin",-- > keybind
    lv = "Latvian",-- > keybind
    lt = "Lithuanian",-- > keybind
    lb = "Luxembourgish",-- > keybind
    mk = "Macedonian",-- > keybind
    mg = "Malagasy",-- > keybind
    ms = "Malay",-- > keybind
    ml = "Malayalam",-- > keybind
    mt = "Maltese",-- > keybind
    mi = "Maori",-- > keybind
    mr = "Marathi",-- > keybind
    mn = "Mongolian",-- > keybind
    my = "Myanmar (Burmese)",-- > keybind
    ne = "Nepali",-- > keybind
    no = "Norwegian",-- > keybind
    ps = "Pashto",-- > keybind
    fa = "Persian",-- > keybind
    pl = "Polish",-- > keybind
    pt = "Portuguese",-- > keybind
    pa = "Punjabi",-- > keybind
    ro = "Romanian",-- > keybind
    ru = "Russian",-- > keybind
    sm = "Samoan",-- > keybind
    gd = "Scots Gaelic",-- > keybind
    sr = "Serbian",-- > keybind
    st = "Sesotho",-- > keybind
    sn = "Shona",-- > keybind
    sd = "Sindhi",-- > keybind
    si = "Sinhala",-- > keybind
    sk = "Slovak",-- > keybind
    sl = "Slovenian",-- > keybind
    so = "Somali",-- > keybind
    es = "Spanish",-- > keybind
    su = "Sundanese",-- > keybind
    sw = "Swahili",-- > keybind
    sv = "Swedish",-- > keybind
    tg = "Tajik",-- > keybind
    ta = "Tamil",-- > keybind
    te = "Telugu",-- > keybind
    th = "Thai",-- > keybind
    tr = "Turkish",-- > keybind
    uk = "Ukrainian",-- > keybind
    ur = "Urdu",-- > keybind
    uz = "Uzbek",-- > keybind
    vi = "Vietnamese",-- > keybind
    cy = "Welsh",-- > keybind
    xh = "Xhosa",-- > keybind
    yi = "Yiddish",-- > keybind
    yo = "Yoruba",-- > keybind
    zu = "Zulu"-- > keybind
};

function find(lang)
    for i,v in pairs(languages) do
        if i == lang or v == lang then
            return i
        end
    end
end

function isSupported(lang)
    local key = find(lang)
    return key and true or false 
end

function getISOCode(lang)
    local key = find(lang)
    return key
end

function stringifyQuery(dataFields)
    local data = ""
    for k, v in pairs(dataFields) do
        if type(v) == "table" then
            for _,v in pairs(v) do
                data = data .. ("&%s=%s"):format(
                    game.HttpService:UrlEncode(k),
                    game.HttpService:UrlEncode(v)
                )
            end
        else
            data = data .. ("&%s=%s"):format(
                game.HttpService:UrlEncode(k),
                game.HttpService:UrlEncode(v)
            )
        end
    end
    data = data:sub(2)
    return data
end

local reqid = math.random(1000,9999)
local rpcidsTranslate = "MkEWBc"
local rootURL = "https://translate.google.com/"
local executeURL = "https://translate.google.com/_/TranslateWebserverUi/data/batchexecute"
local fsid, bl

do -- init
	print('initialize')
    local InitialReq = got(rootURL)
    fsid = InitialReq.Body:match('"FdrFJe":"(.-)"')
    bl = InitialReq.Body:match('"cfb2h":"(.-)"')
end

local HttpService = game:GetService("HttpService")
function jsonE(o)
    return HttpService:JSONEncode(o)
end
function jsonD(o)
    return HttpService:JSONDecode(o)
end

function translate(str, to, from)
    reqid+=10000
    from = from and getISOCode(from) or 'auto'
    to = to and getISOCode(to) or 'en'

    local data = {{str, from, to, true}, {nil}}

    local freq = {
        {
            {
                rpcidsTranslate, 
                jsonE(data),
                nil,
                "generic"
            }
        }
    }

    local url = executeURL..'?'..stringifyQuery{rpcids = rpcidsTranslate, ['f.sid'] = fsid, bl = bl, hl="en", _reqid = reqid-10000, rt = 'c'}
    local body = stringifyQuery{['f.req'] = jsonE(freq)}
    
    local req = got(url, "POST", body)
	
    local body = jsonD(req.Body:match'%[.-%]\n')
    local translationData = jsonD(body[1][3])
    local result = {
        text = "",
        from = {
            language = "",
            text = ""
        },
        raw = ""
    }
    result.raw = translationData
    result.text = translationData[2][1][1][6][1][1]
    
    result.from.language = translationData[3]
    result.from.text = translationData[2][5][1]

    return result
end

local Players = game:GetService("Players")
local LP = Players.LocalPlayer
local StarterGui = game:GetService('StarterGui')
for i=1, 15 do
    local r = pcall(StarterGui["SetCore"])
    if r then break end
    game:GetService('RunService').RenderStepped:wait()
end
wait()

local properties = {
    Color = Color3.new(1,1,0);
    Font = Enum.Font.SourceSansItalic;
    TextSize = 16;
}

game:GetService("StarterGui"):SetCore("SendNotification",
    {
        Title = "Chat Translator",
        Text = "Ported to Google Translate",
        Duration = 3
    }
)
                  
properties.Text = "[TR] To send messages in a language, say > followed by the target language/language code, e.g.: >ru or >russian. To disable (go back to original language), say >d."
StarterGui:SetCore("ChatMakeSystemMessage", properties)

function translateFrom(message)
    local translation = translate(message, YourLang)

    local text
    if translation.from.language ~= YourLang then 
        text = translation.text
    end

    return {text, translation.from.language}
end

function get(plr, msg)
    local tab = translateFrom(msg)
    local translation = tab[1]
    if translation then
        properties.Text = "("..tab[2]:upper()..") ".."[".. plr.Name .."]: "..translation
        StarterGui:SetCore("ChatMakeSystemMessage", properties)
    end
end

for i, plr in ipairs(Players:GetPlayers()) do
    plr.Chatted:Connect(function(msg)
        get(plr, msg)
    end)
end
Players.PlayerAdded:Connect(function(plr)
    plr.Chatted:Connect(function(msg)
        get(plr, msg)
    end)
end)

local sendEnabled = false
local target = ""

function translateTo(message, target)
    target = target:lower() 
    local translation = translate(message, target, "auto")

    return translation.text
end

function disableSend()
    sendEnabled = false
    properties.Text = "[TR] Sending Disabled"
    StarterGui:SetCore("ChatMakeSystemMessage", properties)
end

local CBar, CRemote, Connected = LP['PlayerGui']:WaitForChild('Chat')['Frame'].ChatBarParentFrame['Frame'].BoxFrame['Frame'].ChatBar, game:GetService('ReplicatedStorage').DefaultChatSystemChatEvents['SayMessageRequest'], {}

local HookChat = function(Bar)
    coroutine.wrap(function()
        if not table.find(Connected,Bar) then
            local Connect = Bar['FocusLost']:Connect(function(Enter)
                if Enter ~= false and Bar['Text'] ~= '' then
                    local Message = Bar['Text']
                    Bar['Text'] = '';
                    if Message == ">d" then
                        disableSend()
                    elseif Message:sub(1,1) == ">" and not Message:find(" ") then
                        if getISOCode(Message:sub(2)) then
                            sendEnabled = true
                            target = Message:sub(2)
                        else
                            properties.Text = "[TR] Invalid language"
                            StarterGui:SetCore("ChatMakeSystemMessage", properties)
                        end
                    elseif sendEnabled then
                        Message = translateTo(Message, target)
                        if not _G.SecureChat then
                            game:GetService('Players'):Chat(Message); 
                        end
                        CRemote:FireServer(Message,'All')
                    else
                        if not _G.SecureChat then
                            game:GetService('Players'):Chat(Message); 
                        end
                        CRemote:FireServer(Message,'All')
                    end
                end
            end)
            Connected[#Connected+1] = Bar; Bar['AncestryChanged']:Wait(); Connect:Disconnect()
        end
    end)()
end

HookChat(CBar); local BindHook = Instance.new('BindableEvent')

local MT = getrawmetatable(game); local NC = MT.__namecall; setreadonly(MT, false)

MT.__namecall = newcclosure(function(...)
    local Method, Args = getnamecallmethod(), {...}
    if rawequal(tostring(Args[1]),'ChatBarFocusChanged') and rawequal(Args[2],true) then 
        if LP['PlayerGui']:FindFirstChild('Chat') then
            BindHook:Fire()
        end
    end
    return NC(...)
end)

BindHook['Event']:Connect(function()
    CBar = LP['PlayerGui'].Chat['Frame'].ChatBarParentFrame['Frame'].BoxFrame['Frame'].ChatBar
    HookChat(CBar)
end)

Features & Information

wow

Community Comments (1)

switch_twiceswitch_twiceApr 11, 2022(edited)

this only works on Synapse because of syn.request function check my git for Knrl Version: https://github.com/jaysswag/synapse-x-converted/blob/main/chat-translator.lua

More Scripts for Universal Scripts