dudeks Posted January 15, 2014 Share Posted January 15, 2014 Witam. Myślę nad pewną rzeczą, teoretycznie wiem jak ją zrobić, ale w praktyce z tym już gorzej. Potrzebuję zamienić w stringu pewną rzecz w klamrach na wartość z tablicy. Pokażę to na przykładzie, najprościej będzie to wytłumaczyć. local table = { ["cos"] = "Wygrałeś", ["money"] = 1000 } Teraz ze stringu: local str = "GRATULACJE! {cos} {money} Ma być: local str = "GRATULACJE! Wygrałeś 1000 Pozdrawiam i czekam na jakieś sugestie co do wykonania tego, kod, inne... Link to comment
Wielebny Posted January 16, 2014 Share Posted January 16, 2014 wartosci = { ["cos"] = "Wygrales", ["money"] = 1000 } function r(text, podmiany) for k,v in pairs(podmiany) do text=string.gsub(text, "{"..k.."}", v) end return text end Tak na szybko - nie będzie działac prawidłowo z kluczami zawierającymi znaki uznawane za pattern. Klucz składające się z liter i znaków bedą działać bez zarzutu. Zwróć też uwagę, że ten kod iteruje przez wszystkie elementy tabeli podmian, więc dobrze aby nie bylo tam wartości które nie są używane. Swoją drogą, czy string.format Ci nie wystarczy? string.format("Gracz %s wygral %d!", nickGracza, ileWygral) Link to comment
dudeks Posted January 16, 2014 Author Share Posted January 16, 2014 Właśnie string.format mi nie wystarczy, chcę zrobić gamemode nie tylko w języku polskim, dlatego czasem argumenty będą w innej kolejności wynikające z innego ułożenia zdania. A co do twojej pierwszej propozycji, miałem coś podobnego, działało. Myślałem, że da się to zrobić jakoś lepiej Link to comment
Wielebny Posted January 16, 2014 Share Posted January 16, 2014 No string.format faktycznie nie obsługuje modyfikatora %n$, nie znam lepszej implementacji tylko w Lua od tej którą podałem wyżej. Za to można by się pokusić o napisanie modułu do MTA który dałby dostęp do prawdziwego printf: http://lua-users.org/wiki/LuaPrintf Link to comment
Wojak Posted January 21, 2014 Share Posted January 21, 2014 Pewnie to już nieaktualne, ale co tam: local tab={ eng={ grat="Congratulations!", cos="You won", money="1000", }, pl={ grat="Gratulacje!", cos="wygrales", money="1000", }, } local lang="eng" print(tab[lang].grat.." "..tab[lang].cos.." "..tab[lang].money) lang="pl" print(tab[lang].grat.." "..tab[lang].cos.." "..tab[lang].money) http://luachunks.com/chunk/F216vf0a6m Link to comment
Wielebny Posted January 21, 2014 Share Posted January 21, 2014 (edited) To w żaden sposób nie rozwiązuje przedstawionego problemu: w niektórych tłumaczeniach kolejność argumentów musi być inna. Edited January 27, 2014 by Guest Link to comment
Wojak Posted January 21, 2014 Share Posted January 21, 2014 Tylko mi nie mów że te szpagaty z pętlą i sting.gsub to lepsze rozwiązanie? Fakt – tłumaczenie pojedynczych słów nie ma sensu, najlepiej jest przetłumaczyć całe zdanie formułując je tak żeby w każdym języku argument był na końcu: „Wygrałeś następującą ilość kasy: 1000” wykorzystując tą metodę można sprawić że każdy gracz będzie widział tylko tekst w języku, który zadeklarował przy wejściu na serwer, więc chyba jakiś problem to rozwiązuje Link to comment
dudeks Posted January 26, 2014 Author Share Posted January 26, 2014 Rozwiązanie z pętla dla mnie i dla rozwoju mojego skryptu jest lepsze. langStrings = { ["Polski"] = { ["CHOOSED_LANG"] = "Wybrałeś język: $1!", ["LOGIN_LAST_VISIT"] = "Ostatnio na serwerze byłeś $1-$2-$3 o godzinie $4:$5", ... } ... } Sprawdza się bardzo dobrze, nawet jeżeli argumentów jest więcej niż jeden, lub ułożenie argumentów w innym języku się zmienia. 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