Language Translator (Speak another Language)
Key RequiredUniversal

Language Translator (Speak another Language)

Universal ScriptMEMETHESCRIPTORMEMETHESCRIPTOR 46.7K views 3.9K executesUpdated Oct 25, 2025
3.8/ 5(8 votes)
6275% Positive
Lua Script•610 lines (22670 chars)
--[[
    All-in-One Chat Translator (Incoming Fix)
    - Added Backup API (GTX) for reliable incoming translation
    - Fixed issues where incoming text wouldn't translate
]]

-- Wait for the game to be fully loaded.
if not game:IsLoaded() then game.Loaded:Wait() end
repeat task.wait(.06) until game:GetService("Players").LocalPlayer

-- Services
local Http = game:GetService("HttpService")
local Players = game:GetService("Players")
local TCS = game:GetService("TextChatService")
local CoreGui = game:GetService("CoreGui")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")
local LP = Players.LocalPlayer

-- Translator State
local isTranslatorActive = false 
local isJumbleActive = false 
-- CONFIG: This is the language other people's messages turn into for YOU.
local yourLanguage = "en" 
local targetLanguage = nil 

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

local languages = {}
local langCodesArray = {}
for _, categoryData in ipairs(languageCategories) do
    for langName, langCode in pairs(categoryData.Languages) do
        languages[langName] = langCode
        table.insert(langCodesArray, langCode)
    end
end

--region Translation API
local gv 
local function req(opt)
    local fn = (syn and syn.request) or (http and http.request) or http_request or request
    if fn then return fn(opt) end
    return Http:RequestAsync(opt)
end

local function consent(body)
    local t = {}
    for tag in body:gmatch('<input type="hidden" name=".-" value=".-">') do
        local k, v = tag:match('<input type="hidden" name="(.-)" value="(.-)">')
        t[k] = v
    end
    gv = t.v or ""
end

local function got(url, method, body)
    method = method or "GET"
    local res = req({Url = url, Method = method, Headers = {cookie = "CONSENT=YES+" .. (gv or "")}, Body = body})
    local b = res.Body or res.body or ""
    if type(b) ~= "string" then b = tostring(b) end
    if b:match("https://consent.google.com/s") then
        consent(b)
        res = req({Url = url, Method = "GET", Headers = {cookie = "CONSENT=YES+" .. (gv or "")}})
    end
    return res
end

local function q(data)
    local s = ""
    for k, v in pairs(data) do
        if type(v) == "table" then
            for _, vv in pairs(v) do s ..= "&" .. Http:UrlEncode(k) .. "=" .. Http:UrlEncode(vv) end
        else
            s ..= "&" .. Http:UrlEncode(k) .. "=" .. Http:UrlEncode(v)
        end
    end
    return s:sub(2)
end

local jE = function(x) return Http:JSONEncode(x) end
local jD = function(x) return Http:JSONDecode(x) end
local rpc = "MkEWBc"
local root = "https://translate.google.com/"
local exec = "https://translate.google.com/_/TranslateWebserverUi/data/batchexecute"
local fsid, bl, rid = nil, nil, math.random(1000, 9999)

-- Initialize tokens in background
task.spawn(function()
    local b = (got(root).Body or "")
    fsid = b:match('"FdrFJe":"(.-)"')
    bl = b:match('"cfb2h":"(.-)"')
end)

-- The Backup API (GTX) - Used if the main one fails
local function translateBackup(text, target, source)
    source = source or "auto"
    local url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl="..source.."&tl="..target.."&dt=t&q="..Http:UrlEncode(text)
    local res = req({Url = url, Method = "GET"})
    
    local success, response = pcall(function()
        return jD(res.Body or res.body)
    end)
    
    if success and response and response[1] then
        local combinedText = ""
        -- Recombine sentences
        for _, section in ipairs(response[1]) do
            if section[1] then combinedText = combinedText .. section[1] end
        end
        return combinedText, response[3] -- Text, DetectedLang
    end
    return nil, nil
end

local function translateInfo(txt, tgt, src)
    rid += 10000
    src = src or "auto"
    
    -- Try Main Method
    if fsid and bl then
        local data = {{txt, src, tgt, true}, {nil}}
        local freq = {{{rpc, jE(data), nil, "generic"}}}
        local url = exec .. "?" .. q{rpcids = rpc, ["f.sid"] = fsid, bl = bl, hl = "en", _reqID = rid - 10000, rt = "c"}
        local body = q{["f.req"] = jE(freq)}
        local res = got(url, "POST", body)
        local ok, out = pcall(function()
            local arr = jD((res.Body or ""):match("%[.-%]\n"))
            return jD(arr[1][3])
        end)
        
        if ok and out and out[2] and out[2][1] and out[2][1][1] and out[2][1][1][6] then
            local t = out[2][1][1][6][1][1]
            local l = out[3]
            if t then return t, l end
        end
    end

    -- Fallback to Backup Method
    return translateBackup(txt, tgt, src)
end

-- Simplified wrapper for just text
local function translate(txt, tgt, src)
    local t, _ = translateInfo(txt, tgt, src)
    return t
end
--endregion

--region Chat Helper Functions
local chatVersion = "Legacy"
if TCS.ChatVersion == Enum.ChatVersion.TextChatService then
    chatVersion = "TCS"
end

local function sys(msg)
    if chatVersion == "TCS" then
        local chans = TCS:WaitForChild("TextChannels", 5)
        if chans then
            local c = chans:FindFirstChild("RBXGeneral") or chans:FindFirstChild("RBXSystem")
            if c and c.DisplaySystemMessage then 
                c:DisplaySystemMessage(msg) 
            end
        end
    else
        pcall(function()
            StarterGui:SetCore("ChatMakeSystemMessage", {
                Text = msg, 
                Color = Color3.fromRGB(100, 255, 100), -- Greenish for visibility
                Font = Enum.Font.SourceSansBold, 
                FontSize = Enum.FontSize.Size18
            })
        end)
    end
end

local function sendChat(text)
    task.spawn(function()
        if chatVersion == "TCS" then
            local chan = TCS.TextChannels:FindFirstChild("RBXGeneral") or TCS.TextChannels:FindFirstChild("General")
            if chan then chan:SendAsync(text) end
        else
            local remote = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents") 
            if remote then 
                local say = remote:FindFirstChild("SayMessageRequest")
                if say then say:FireServer(text, "All") end
            end
        end
    end)
end

local function handleOutgoing(rawMessage)
    if not rawMessage or rawMessage == "" then return end
    if rawMessage:sub(1, 1) == "/" then 
        sendChat(rawMessage)
        return 
    end

    if isJumbleActive then
        local words = {}
        for word in rawMessage:gmatch("%S+") do table.insert(words, word) end
        local translatedWords = {}
        for _, word in ipairs(words) do
            local randomLangCode = langCodesArray[math.random(#langCodesArray)]
            local translatedWord = translate(word, randomLangCode, "auto") or word
            table.insert(translatedWords, translatedWord)
        end
        sendChat(table.concat(translatedWords, " "))
    elseif isTranslatorActive and targetLanguage then
        local translatedText = translate(rawMessage, targetLanguage, "auto") or rawMessage
        sendChat(translatedText)
    else
        sendChat(rawMessage)
    end
end
--endregion

--region UI Creation (Untouched)
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "TranslatorUI"
if syn and syn.protect_gui then syn.protect_gui(screenGui) end 
screenGui.Parent = CoreGui
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Parent = screenGui
mainFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
mainFrame.BorderColor3 = Color3.fromRGB(80, 80, 80)
mainFrame.BorderSizePixel = 1
mainFrame.Position = UDim2.new(0, 20, 0, 20)
mainFrame.Size = UDim2.new(0, 280, 0, 30)
mainFrame.ClipsDescendants = true
mainFrame.Active = true
mainFrame.Draggable = true

local titleLabel = Instance.new("TextLabel")
titleLabel.Name = "Title"
titleLabel.Parent = mainFrame
titleLabel.BackgroundTransparency = 1
titleLabel.Position = UDim2.new(0, 10, 0, 0)
titleLabel.Size = UDim2.new(0, 100, 0, 30)
titleLabel.Font = Enum.Font.SourceSansBold
titleLabel.Text = "Translator"
titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
titleLabel.TextSize = 16
titleLabel.TextXAlignment = Enum.TextXAlignment.Left

local toggleButton = Instance.new("TextButton")
toggleButton.Name = "ToggleButton"
toggleButton.Parent = mainFrame
toggleButton.BackgroundColor3 = Color3.fromRGB(55, 55, 55)
toggleButton.Size = UDim2.new(0, 25, 0, 20)
toggleButton.Position = UDim2.new(1, -30, 0.5, -10)
toggleButton.Font = Enum.Font.SourceSansBold
toggleButton.Text = "[+]"
toggleButton.TextColor3 = Color3.fromRGB(200, 200, 200)
toggleButton.TextSize = 16
toggleButton.ZIndex = 2

local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Name = "ScrollFrame"
scrollFrame.Parent = mainFrame
scrollFrame.BackgroundTransparency = 1
scrollFrame.Position = UDim2.new(0, 0, 0, 30)
scrollFrame.Size = UDim2.new(1, 0, 1, -30)
scrollFrame.Visible = false
scrollFrame.ZIndex = 1
scrollFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y
scrollFrame.ScrollBarImageColor3 = Color3.fromRGB(120, 120, 120)
scrollFrame.ScrollBarThickness = 6
scrollFrame.BorderSizePixel = 0

local listLayout = Instance.new("UIListLayout")
listLayout.Parent = scrollFrame
listLayout.SortOrder = Enum.SortOrder.LayoutOrder
listLayout.Padding = UDim.new(0, 5)

local controlFrame = Instance.new("Frame")
controlFrame.Name = "ControlFrame"
controlFrame.Parent = scrollFrame
controlFrame.BackgroundTransparency = 1
controlFrame.Size = UDim2.new(1, 0, 0, 30) 
controlFrame.AutomaticSize = Enum.AutomaticSize.Y
controlFrame.LayoutOrder = 1 

local controlGrid = Instance.new("UIGridLayout")
controlGrid.Parent = controlFrame
controlGrid.CellPadding = UDim2.new(0, 5, 0, 5)
controlGrid.CellSize = UDim2.new(0, 85, 0, 25)
controlGrid.StartCorner = Enum.StartCorner.TopLeft
controlGrid.HorizontalAlignment = Enum.HorizontalAlignment.Center
controlGrid.SortOrder = Enum.SortOrder.LayoutOrder

local stopButton = Instance.new("TextButton")
stopButton.Name = "StopButton"
stopButton.Parent = controlFrame
stopButton.BackgroundColor3 = Color3.fromRGB(150, 40, 40)
stopButton.BorderColor3 = Color3.fromRGB(80, 80, 80)
stopButton.Font = Enum.Font.SourceSansBold
stopButton.Text = "Stop"
stopButton.TextColor3 = Color3.fromRGB(255, 255, 255)
stopButton.TextSize = 14
stopButton.LayoutOrder = 1 

local jumbleButton = Instance.new("TextButton")
jumbleButton.Name = "JumbleButton"
jumbleButton.Parent = controlFrame
jumbleButton.BackgroundColor3 = Color3.fromRGB(120, 60, 180) 
jumbleButton.BorderColor3 = Color3.fromRGB(80, 80, 80)
jumbleButton.Font = Enum.Font.SourceSansBold
jumbleButton.Text = "Jumble"
jumbleButton.TextColor3 = Color3.fromRGB(255, 255, 255)
jumbleButton.TextSize = 14
jumbleButton.LayoutOrder = 2 

local searchBoxFrame = Instance.new("Frame")
searchBoxFrame.Name = "SearchBoxFrame"
searchBoxFrame.Parent = scrollFrame
searchBoxFrame.BackgroundTransparency = 1
searchBoxFrame.Size = UDim2.new(1, -10, 0, 25)
searchBoxFrame.Position = UDim2.new(0, 5, 0, 0)
searchBoxFrame.LayoutOrder = 2 

local searchBoxLabel = Instance.new("TextLabel")
searchBoxLabel.Name = "SearchLabel"
searchBoxLabel.Parent = searchBoxFrame
searchBoxLabel.BackgroundTransparency = 1
searchBoxLabel.Size = UDim2.new(0, 60, 1, 0)
searchBoxLabel.Font = Enum.Font.SourceSans
searchBoxLabel.Text = "Search: "
searchBoxLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
searchBoxLabel.TextSize = 14
searchBoxLabel.TextXAlignment = Enum.TextXAlignment.Left

local searchBox = Instance.new("TextBox")
searchBox.Name = "SearchBox"
searchBox.Parent = searchBoxFrame
searchBox.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
searchBox.BorderColor3 = Color3.fromRGB(80, 80, 80)
searchBox.Position = UDim2.new(0, 60, 0, 0)
searchBox.Size = UDim2.new(1, -65, 1, 0)
searchBox.Font = Enum.Font.SourceSans
searchBox.Text = ""
searchBox.TextColor3 = Color3.fromRGB(240, 240, 240)
searchBox.TextSize = 14
searchBox.PlaceholderText = "Type to filter..."
searchBox.PlaceholderColor3 = Color3.fromRGB(150, 150, 150)
searchBox.ClearTextOnFocus = false

local langButtons = {}
local categoryElements = {}
local categoryLayoutOrder = 3 

for _, categoryData in ipairs(languageCategories) do
    local headerLabel = Instance.new("TextLabel")
    headerLabel.Name = categoryData.Name .. "Header"
    headerLabel.Parent = scrollFrame
    headerLabel.BackgroundTransparency = 1
    headerLabel.Size = UDim2.new(1, -10, 0, 20)
    headerLabel.Position = UDim2.new(0, 5, 0, 0)
    headerLabel.Font = Enum.Font.SourceSansBold
    headerLabel.Text = categoryData.Name
    headerLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    headerLabel.TextSize = 16
    headerLabel.TextXAlignment = Enum.TextXAlignment.Left
    headerLabel.LayoutOrder = categoryLayoutOrder
    categoryLayoutOrder += 1
    
    local buttonContainer = Instance.new("Frame")
    buttonContainer.Name = categoryData.Name .. "Container"
    buttonContainer.Parent = scrollFrame
    buttonContainer.BackgroundTransparency = 1
    buttonContainer.Size = UDim2.new(1, 0, 0, 50) 
    buttonContainer.AutomaticSize = Enum.AutomaticSize.Y
    buttonContainer.LayoutOrder = categoryLayoutOrder
    categoryLayoutOrder += 1
    
    local gridLayout = Instance.new("UIGridLayout")
    gridLayout.Parent = buttonContainer
    gridLayout.CellPadding = UDim2.new(0, 5, 0, 5)
    gridLayout.CellSize = UDim2.new(0, 85, 0, 25)
    gridLayout.StartCorner = Enum.StartCorner.TopLeft
    gridLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
    gridLayout.SortOrder = Enum.SortOrder.Name 
    
    local sortedLangNames = {}
    for langName in pairs(categoryData.Languages) do
        table.insert(sortedLangNames, langName)
    end
    table.sort(sortedLangNames)
    
    local categoryButtons = {}
    for _, langName in ipairs(sortedLangNames) do
        local button = Instance.new("TextButton")
        button.Name = langName
        button.Parent = buttonContainer
        button.BackgroundColor3 = Color3.fromRGB(55, 55, 55)
        button.BorderColor3 = Color3.fromRGB(80, 80, 80)
        button.Font = Enum.Font.SourceSans
        button.Text = langName
        button.TextColor3 = Color3.fromRGB(255, 255, 255)
        button.TextSize = 12
        langButtons[langName] = button 
        categoryButtons[langName] = button 
    end
    
    table.insert(categoryElements, {
        header = headerLabel,
        container = buttonContainer,
        buttons = categoryButtons
    })
end

local function updateFilter(searchText)
    local searchTextLower = string.lower(searchText)
    if searchTextLower == "" then
        for _, category in ipairs(categoryElements) do
            category.header.Visible = true
            category.container.Visible = true
            for _, button in pairs(category.buttons) do button.Visible = true end
        end
        return
    end
    for _, category in ipairs(categoryElements) do
        local anyButtonVisible = false
        for langName, button in pairs(category.buttons) do
            local langNameLower = string.lower(langName)
            if string.find(langNameLower, searchTextLower) then
                button.Visible = true; anyButtonVisible = true
            else
                button.Visible = false
            end
        end
        category.header.Visible = anyButtonVisible
        category.container.Visible = anyButtonVisible
    end
end

local isExpanded = false
toggleButton.MouseButton1Click:Connect(function()
    isExpanded = not isExpanded
    scrollFrame.Visible = isExpanded
    if isExpanded then
        toggleButton.Text = "[-]"
        mainFrame.Size = UDim2.new(0, 280, 0, 300)
        searchBox.Text = ""
        updateFilter("") 
    else
        toggleButton.Text = "[+]"
        mainFrame.Size = UDim2.new(0, 280, 0, 30)
    end
end)

local function resetButtonColors()
    for _, button in pairs(langButtons) do button.BackgroundColor3 = Color3.fromRGB(55, 55, 55) end
    stopButton.BackgroundColor3 = Color3.fromRGB(150, 40, 40)
    jumbleButton.BackgroundColor3 = Color3.fromRGB(120, 60, 180)
end

for langName, button in pairs(langButtons) do
    button.MouseButton1Click:Connect(function()
        resetButtonColors()
        button.BackgroundColor3 = Color3.fromRGB(70, 115, 190)
        isTranslatorActive = true; isJumbleActive = false 
        targetLanguage = languages[langName]
        sys("[TR] Translator enabled. Language set to " .. langName .. ".")
    end)
end

stopButton.MouseButton1Click:Connect(function()
    resetButtonColors()
    isTranslatorActive = false; isJumbleActive = false 
    targetLanguage = nil
    sys("[TR] Auto-translation DISABLED.")
end)

jumbleButton.MouseButton1Click:Connect(function()
    resetButtonColors()
    jumbleButton.BackgroundColor3 = Color3.fromRGB(160, 90, 220) 
    isTranslatorActive = false; isJumbleActive = true
    targetLanguage = nil
    sys("[TR] Jumble mode ENABLED. Have fun!")
end)

searchBox.Changed:Connect(function() updateFilter(searchBox.Text) end)
--endregion

--region Main Logic
local function hookChatBox()
    local box = nil
    if LP:FindFirstChild("PlayerGui") and LP.PlayerGui:FindFirstChild("Chat") then
        box = LP.PlayerGui.Chat:FindFirstChild("ChatBar", true)
    end
    if not box and CoreGui:FindFirstChild("ExperienceChat") then
        for _, v in pairs(CoreGui.ExperienceChat:GetDescendants()) do
            if v:IsA("TextBox") and v.Parent and v.Parent.Name == "TextBoxContainer" then
                box = v; break
            end
        end
    end
    
    if box then
        local connections = getconnections(box.FocusLost)
        box.FocusLost:Connect(function(enter)
            if enter then
                local msg = box.Text
                if (isTranslatorActive or isJumbleActive) and msg ~= "" and msg:sub(1,1) ~= "/" then
                    box.Text = "" 
                    task.spawn(function() handleOutgoing(msg) end)
                end
            end
        end)
        sys("[TR] Chat Hooked Successfully.")
    end
end

-- Incoming Chat Handling (Updated with threading & fallback)
if chatVersion == "TCS" then
    TCS.MessageReceived:Connect(function(msg)
        if not msg.TextSource then return end
        if msg.TextSource.UserId == LP.UserId then return end -- Don't translate self
        
        task.spawn(function()
            local text, detectedLang = translateInfo(msg.Text, yourLanguage, "auto")
            -- Comparison logic: Ignore if translation is identical or nil
            if text and text ~= "" and string.lower(text) ~= string.lower(msg.Text) then
                local langTag = detectedLang and detectedLang ~= "" and detectedLang:upper() or "UNK"
                sys("(" .. langTag .. ") " .. msg.PrefixText .. ": " .. text)
            end
        end)
    end)
else
    local chatEvents = ReplicatedStorage:WaitForChild("DefaultChatSystemChatEvents", 5)
    if chatEvents then
        chatEvents.OnMessageDoneFiltering.OnClientEvent:Connect(function(data)
            task.spawn(function()
                local speaker = data.FromSpeaker
                local message = data.Message
                if speaker ~= LP.Name then
                    local text, detectedLang = translateInfo(message, yourLanguage, "auto")
                    if text and text ~= "" and string.lower(text) ~= string.lower(message) then
                        local langTag = detectedLang and detectedLang ~= "" and detectedLang:upper() or "UNK"
                        sys("(" .. langTag .. ") [" .. speaker .. "]: " .. text)
                    end
                end
            end)
        end)
    end
end

task.wait(1)
hookChatBox()
LP.CharacterAdded:Connect(function() task.wait(1); hookChatBox() end)
--MEME

Features & Information

Let's you swap what language you speak in chat so if you pick Spanish and say HI in English if would change to Hola. SO YOU CAN SPEAK LANGUAGES YOU DO NOT KNOW AND UNDERSTAND THEM.
#Language#Gui#Translator

Community Comments (19)

Sander_NLSander_NLOct 25, 2025

cool, (i know this is scriptblox) but people wouldnt risk getting banned just to use a translator

Replying to @Sander_NL
MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

@Sander_NL Erm is undetected and cant me detected.

Replying to @MEMETHESCRIPTOR
Sander_NLSander_NLOct 25, 2025

@bowlingbrendan1 executors, not this script, and a ai script can very easily be detected

Replying to @Sander_NL
MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

@Sander_NL it aint detected with xeno or delta

Replying to @Sander_NL
voltexvoltexNov 7, 2025

@Sander_NL youre not downloading an executor just to use a translator

MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

Made it open source.

MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

Should work now sorry

MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

In one hour 100 views? Crazy.

MEMETHESCRIPTORMEMETHESCRIPTOROct 25, 2025

@SheScripts its not a chat translator.. it changes the language you speek

OdetariOdetariOct 25, 2025

the translator chat:🫠

Replying to @Odetari
MEMETHESCRIPTORMEMETHESCRIPTOROct 26, 2025

@SCRlPT ? Wym

bro still doesn't work

it doesn't work it only works on different games, this script dont work on all games:/

DiddyDiddyDec 28, 2025

broken/patched

MEMETHESCRIPTORMEMETHESCRIPTORDec 29, 2025

Ill have it fixed

MEMETHESCRIPTORMEMETHESCRIPTORJan 3, 2026

Its fixed. Sorry I forgot to tell yall.

Kim__DawudeKim__DawudeJan 3, 2026

this script not working

Replying to @Kim__Dawude
MEMETHESCRIPTORMEMETHESCRIPTORJan 7, 2026

@xiehedawude what executor do you use. If im right i know it works on Delta and Xeno but I havent tested others.

broken

More Scripts for Universal Scripts