Rodrigo21 Posted June 26, 2021 Posted June 26, 2021 Olá senhores, então estou querendo colocar sistema de linguagem na gamemode que estou, até consegui colocar porém, quero que quando muda a linguagem ela atualiza os textos para a linguagem escolhida, porém toda vez que mudo de linguagem tenho que relogar para trocar a linguagem e mudar os textos, tanto como o dxDrawText e o guiCreateLabel. script que estou usando: -- lado client GUIEditor.label[1] = guiCreateLabel(8, 30, 103, 19, exports.DayZ:getLanguageTextClient("languagecL"), false, GUIEditor.window[1]) guiSetFont(GUIEditor.label[1], "default-bold-small") GUIEditor.combobox[1] = guiCreateComboBox(175, 30, 177, 85, "", false, GUIEditor.window[1]) local languages = { en = "English", pt = "Portugues", ru = "Русский", } addEventHandler("onClientResourceStart",resourceRoot,function() if (languages) then local num=0; for i,v in pairs(languages) do guiComboBoxAddItem(GUIEditor.combobox[1],v) if i == getElementData(localPlayer,"language") then guiComboBoxSetSelected(GUIEditor.combobox[1],num); end num = num+1; end end end); function getLang(langid) for i,v in pairs(languages) do local language = guiComboBoxGetItemText(GUIEditor.combobox[1],langid) if (language == v) then return i; end end end function playerLogin() removeLogin() local langid = guiComboBoxGetSelected(GUIEditor.combobox[1]) triggerServerEvent ("loginPlayerBySeral",localPlayer,localPlayer,getLang(langid)) setCameraTarget(getLocalPlayer()) end -- lado Server local pass = "546586545" function playerJoin(language) account = getAccount((string.sub(getPlayerSerial(source), 25).."THS")) if account then logIn(source,account, pass) setElementData(source,"language",language) end end addEventHandler("onPlayerJoin", getRootElement(), playerJoin) function loginPlayerBySeralServer(source,language) local theAccount = getAccount((string.sub(getPlayerSerial(source), 25).."THS")) if theAccount then if theAccount then setAccountPassword ( theAccount, pass ) setElementData(source,"language",language) triggerEvent("onPlayerDayZLogin", getRootElement(), (string.sub(getPlayerSerial(source), 25).."THS"), source) else end else local theAccount = addAccount((string.sub(getPlayerSerial(source), 25).."THS"), pass ) if theAccount then logIn(source,theAccount, pass) setElementData(source,"language",language) triggerEvent("onPlayerDayZRegister", getRootElement(), (string.sub(getPlayerSerial(source), 25).."THS"), source) else end end end addEvent("loginPlayerBySeral", true) addEventHandler("loginPlayerBySeral", getRootElement(), loginPlayerBySeralServer) eu uso o exports.DayZ:getLanguageTextClient("playL") para chamar a tradução da tabela, a tabela: local languages = { en = "English", pt = "Portugues", ru = "Русский", } local translation = { -- Login ["playL"] = { en = "PLAY", pt = "JOGAR", ru = "ИГРАТЬ" }, ["characterL"] = { en = "CHARACTER", pt = "PERSONAGEM", ru = "ХАРАКТЕР" }, ["settingsL"] = { en = "SETTINGS", pt = "CONFIGURAÇÕES", ru = "НАСТРОЙКИ" }, ["exitL"] = { en = "EXIT", pt = "SAIR", ru = "ВЫХОД" }, } function getPlayerLanguage(player) if (not player) then outputDebugString("Player expected got '"..tostring(player).."'",1,255,0,0) return; end if (getElementData(player,"language")) then return getElementData(player,"language"); else return "en"; end return false; end function getLanguageTextClient(text) if (not text) then outputDebugString("String expected got '"..tostring(text).."'",1,255,0,0) return; end local translationText = translation[text]; if (translationText) then return translationText[getPlayerLanguage(localPlayer)]; end return text; end function getLanguageTextServer(text,player) if (not text) then outputDebugString("String expected got '"..tostring(text).."'",1,255,0,0) return; end if (not text) then outputDebugString("Player expected got '"..tostring(player).."'",1,255,0,0) return; end local translationText = translation[text]; if (translationText) then return translationText[getPlayerLanguage(player)]; end return text; end desde já agradeço. :)
Popular Post iDannz Posted June 26, 2021 Popular Post Posted June 26, 2021 (edited) Eai, tudo certo? Existem diversas maneiras de atingir esse objetivo, vou tentar te explicar a maneira que eu usaria. Na resource em que você faz a troca de linguagens: -- Adicione um evento, que será chamado sempre que houver mudança na seleção de idioma addEvent('onChangeLanguage', true) -- Adicione alguma maneira de trocar o idioma enquanto joga, já que no seu caso ele só está sendo setado entrar no jogo -- Por exemplo: ao clicar em um combobox de seleção de linguagens, chame a funçao abaixo SetNewLanguage = function(newLang) setElementData(localPlayer, 'language', newLang) -- Chame o evento (depois de atualizar o valor da linguagem atual) triggerEvent('onChangeLanguage', localPlayer) end Na outra resource (onde você criou alguma interface GUI): -- Incie uma tabela para armazenar os dados local toTranslate = {} -- Crie uma função para inserir os elementos dentro da tabela AssignTranslation = function(element, value) toTranslate[element] = value end -- Crie uma função para traduzir todos os elementos da tabela TranslateUI = function() for elem, value in pairs(toTranslate) do guiSetText(elem, exports.DayZ:getLanguageTextClient(value)) end end -- Adicione um handler para o evento de quando se troca de idioma, para forçar a tradução dos elementos que estão na tabela addEventHandler('onChangeLanguage', localPlayer, TranslateUI) -- Crie os elementos gui e configure uma tradução pra eles local guiWindow CreateUI = function() local w, h = 500, 500 guiWindow = guiCreateWindow((sW - w) / 2, (sH - h) / 2, w, h, '', false) AssignTranslation(guiWindow, 'settingsL') guiSetVisible(guiWindow, false) local label = guiCreateLabel(100, 100, 200, 200, '', false, guiWindow) AssignTranslation(label, 'playL') end addEventHandler('onClientResourceStart', resourceRoot, CreateUI) -- Adicione um comando para exibir/esconder a janela addCommandHandler('toggle', function() if (not isElement(guiWindow)) then return false end local state = not guiGetVisible(guiWindow) -- Caso vá exibir a janela, chamamos a função para traduzir os textos if state then TranslateUI() end guiSetVisible(guiWindow, state) showCursor(state) end) Dessa forma, sempre que você trocar de linguagem ou abrir a interface, todos os elementos GUI serão traduzidos para a linguagem atual do jogador. No caso de funções DX (como dxDrawText), não é necessário fazer esse procedimento, já que elas são chamadas a cada frame com o valor atualizado, a única recomendação que eu deixaria é que você crie uma função para fazer cache das traduções, justamente para evitar ficar chamando via exports o tempo todo, que pode causar uma grande perda de desempenho. Algo como: local cache = {} Translate = function(text) if (cache[text] == nil) then cache[text] = exports.DayZ:getLanguageTextClient(text) end return cache[text] end Dessa forma, ao invés de ficar sempre chamando o exports, voce chamaria diretamente a função Translate. Boa sorte Edited June 26, 2021 by iDannz 3 1
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now