· 2 years ago · Feb 21, 2023, 08:50 PM
1--I have included my own API key in this script for it to work as of right now.
2--Not made by me, made by 'Aim'
3--This will translate messages sent in chat by other players into english, you can also make yourself type in a different language in chat using '>ru' as a command in russian
4
5
6if not game['Loaded'] then game['Loaded']:Wait() end; repeat wait(.06) until game:GetService('Players').LocalPlayer ~= nil
7
8local YourLang = "en" -- Language code that the messages are going to be translated to
9local keys = {"trnsl.1.1.20230221T202841Z.9e58176c0e5272d3.30a18fda31fdfe778ab6c6f405cf2faf7e90cd39"}
10
11
12local Players = game:GetService("Players")
13local LP = Players.LocalPlayer
14local StarterGui = game:GetService('StarterGui')
15for i=1, 15 do
16 local r = pcall(StarterGui["SetCore"])
17 if r then break end
18 game:GetService('RunService').RenderStepped:wait()
19end
20wait()
21
22local HttpService = game:GetService("HttpService")
23local properties = {
24 Color = Color3.new(1,1,0);
25 Font = Enum.Font.SourceSansItalic;
26 TextSize = 16;
27}
28
29game:GetService("StarterGui"):SetCore("SendNotification",
30 {
31 Title = "Chat Translator",
32 Text = "",
33 Duration = 3
34 }
35)
36
37properties.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."
38StarterGui:SetCore("ChatMakeSystemMessage", properties)
39
40-- See if selected API key is working, and if not, get a new one.
41function test()
42 game:HttpGetAsync("https://translate.yandex.net/api/v1.5/tr.json/detect?key="..key.."&text=h")
43end
44local s, e = pcall(test)
45while not s do
46 print("Error: "..e)
47 key = keys[math.random(#keys)]
48 wait()
49 s, e = pcall(test)
50end
51
52function translateFrom(message)
53 local URL = "https://translate.yandex.net/api/v1.5/tr.json/detect?key="..key.."&text="..HttpService:UrlEncode(message)
54 local lang = HttpService:JSONDecode(game:HttpGetAsync(URL)).lang
55 local translation
56 if lang and lang ~= YourLang then
57 local URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key="..key.."&text="..HttpService:UrlEncode(message).."&lang="..lang.."-"..YourLang
58 translation = HttpService:JSONDecode(game:HttpGetAsync(URL)).text[1]
59 end
60 return {translation, lang}
61end
62
63function get(plr, msg)
64 local tab = translateFrom(msg)
65 local translation = tab[1]
66 if translation then
67 properties.Text = "("..tab[2]:upper()..") ".."[".. plr.Name .."]: "..translation
68 StarterGui:SetCore("ChatMakeSystemMessage", properties)
69 end
70end
71
72for i, plr in ipairs(Players:GetPlayers()) do
73 plr.Chatted:Connect(function(msg)
74 get(plr, msg)
75 end)
76end
77Players.PlayerAdded:Connect(function(plr)
78 plr.Chatted:Connect(function(msg)
79 get(plr, msg)
80 end)
81end)
82
83-- Language Dictionary
84local l = {afrikaans = "af",albanian = "sq",amharic = "am",arabic = "ar",armenian = "hy",azerbaijani = "az",bashkir = "ba",basque = "eu",belarusian = "be",bengal = "bn",bosnian = "bs",bulgarian = "bg",burmese = "my",catalan = "ca",cebuano = "ceb",chinese = "zh",croatian = "hr",czech = "cs",danish = "da",dutch = "nl",english = "en",esperanto = "eo",estonian = "et",finnish = "fi",french = "fr",galician = "gl",georgian = "ka",german = "de",greek = "el",gujarati = "gu",creole = "ht",hebrew = "he",hillmari = "mrj",hindi = "hi",hungarian = "hu",icelandic = "is",indonesian = "id",irish = "ga",italian = "it",japanese = "ja",javanese = "jv",kannada = "kn",kazakh = "kk",khmer = "km",kirghiz = "ky",korean = "ko",laotian = "lo",latin = "la",latvian = "lv",lithuanian = "lt",luxembourg = "lb",macedonian = "mk",malagasy = "mg",malayalam = "ml",malay = "ms",maltese = "mt",maori = "mi",marathi = "mr",mari = "mhr",mongolian = "mn",nepalese = "ne",norwegian = "no",papiamento = "pap",persian = "fa",polish = "pl",portuguese = "pt",punjabi = "pa",romanian = "ro",russian = "ru",scottish = "gd",serbian = "sr",sinhalese = "si",slovak = "sk",slovenian = "sl",spanish = "es",sundanese = "su",swahili = "sw",swedish = "sv",tagalog = "tl",tajik = "tg",tamil = "ta",tartar = "tt",telugu = "te",thai = "th",turkish = "tr",udmurt = "udm",ukrainian = "uk",urdu = "ur",uzbek = "uz",vietnamese = "vi",welsh = "cy",xhosa = "xh",yiddish = "yi"}
85
86local sendEnabled = false
87local target = ""
88
89function translateTo(message, target)
90 target = target:lower()
91 if l[target] then target = l[target] end
92 local URL = "https://translate.yandex.net/api/v1.5/tr.json/detect?key="..key.."&text="..HttpService:UrlEncode(message)
93 local lang = HttpService:JSONDecode(game:HttpGetAsync(URL)).lang
94 local translation
95 if lang and lang ~= target then
96 local URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key="..key.."&text="..HttpService:UrlEncode(message).."&lang="..lang.."-"..target
97 translation = HttpService:JSONDecode(game:HttpGetAsync(URL)).text[1]
98 end
99 return translation
100end
101
102function disableSend()
103 sendEnabled = false
104 properties.Text = "[TR] Sending Disabled"
105 StarterGui:SetCore("ChatMakeSystemMessage", properties)
106end
107
108local CBar, CRemote, Connected = LP['PlayerGui']:WaitForChild('Chat')['Frame'].ChatBarParentFrame['Frame'].BoxFrame['Frame'].ChatBar, game:GetService('ReplicatedStorage').DefaultChatSystemChatEvents['SayMessageRequest'], {}
109
110local HookChat = function(Bar)
111 coroutine.wrap(function()
112 if not table.find(Connected,Bar) then
113 local Connect = Bar['FocusLost']:Connect(function(Enter)
114 if Enter ~= false and Bar['Text'] ~= '' then
115 local Message = Bar['Text']
116 Bar['Text'] = '';
117 if Message == ">d" then
118 disableSend()
119 elseif Message:sub(1,1) == ">" and not Message:find(" ") then
120 sendEnabled = true
121 target = Message:sub(2)
122 elseif sendEnabled then
123 Message = translateTo(Message, target)
124 game:GetService('Players'):Chat(Message); CRemote:FireServer(Message,'All')
125 else
126 game:GetService('Players'):Chat(Message); CRemote:FireServer(Message,'All')
127 end
128 end
129 end)
130 Connected[#Connected+1] = Bar; Bar['AncestryChanged']:Wait(); Connect:Disconnect()
131 end
132 end)()
133end
134
135HookChat(CBar); local BindHook = Instance.new('BindableEvent')
136
137local MT = getrawmetatable(game); local NC = MT.__namecall; setreadonly(MT, false)
138
139MT.__namecall = newcclosure(function(...)
140 local Method, Args = getnamecallmethod(), {...}
141 if rawequal(tostring(Args[1]),'ChatBarFocusChanged') and rawequal(Args[2],true) then
142 if LP['PlayerGui']:FindFirstChild('Chat') then
143 BindHook:Fire()
144 end
145 end
146 return NC(...)
147end)
148
149BindHook['Event']:Connect(function()
150 CBar = LP['PlayerGui'].Chat['Frame'].ChatBarParentFrame['Frame'].BoxFrame['Frame'].ChatBar
151 HookChat(CBar)
152end)