Rodrigo21 Posted June 26, 2021 Share 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. :) Link to comment
Popular Post iDannz Posted June 26, 2021 Popular Post Share 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 Link to comment
Rodrigo21 Posted July 1, 2021 Author Share Posted July 1, 2021 @iDannzobrigado funcionou perfeitamente, 1 Link to comment
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