Popular Post Quiter 99 Odesláno: 3. Únor, 2018 Popular Post Share Odesláno: 3. Únor, 2018 Multi jazyk pre GM Obtížnost: 2/5 Osnova/obsah: 1. Úvod 2. Čo je multi jazyk (multilanguage) a načo sa dá použiť? 3. Vytváranie vlastných funkcií a ich použitie 4. Záver 1. Úvod Tento návod som sa rozhodol vytvoriť, pretože v dnešnej dobe už GM s jedným jazykom nemá veľkú popularitu, a mladší hráči ktorý neovládajú veľmi angličtinu nehrávajú na serveroch písaných po anglicky. Upozorňujem, že tento návod nie je copy + paste. Pre tvorbu svojích funkcií je nutné kódu rozumieť. 2. Čo je multi jazyk a načo sa dá použiť? Multi jazyk je implementácia dvoch a viacerých jazykov do GM. V tomto návode sa Vám posnažím čo najjednoduchšie vysvetliť, ako si vytvoriť svoje funkcie na multijazyčnosť a ako ich použiť. Multijazyčnosť je vhodná pre servery, ktoré plánujú expandovať na zahraničný "trh" a tým rozšíriť svoju klientelu (hráčov). 3. Vytvárania vlastných funkcií a ich použitie Celý systém funguje na princípe #define. Pre pochopenie kódu je nutné poznať: #include, #define, cyklus for, SendClientMessage/ToAll, format(...) V prvom rade, budeme potrebovať definície naších textov (textových reťazcov/stringov). Pre lepší prehľad som ich vložil do zložky INCLUDE s názvom lang_SK.inc a lang_CZ.inc. !!! POZOR !!! Je nutné nastaviť formátovanie textu na ANSI. Načítame naše includy: #include "../include/lang_SK" #include "../include/lang_CZ" Takto nejako by mal vyzerať váš include: // Uvítacia správa pre hráča #define msgCONN_SK "Vitaj na servery. Použi /lang pre zmenu jazyka." // Informácia o príchode hráča #define msgCONNAll_SK "Na server prišiel nový hráč." // Informácia o zmene jazyka #define msgLangCHG_SK "Tvoj jazyk bol zmenený na slovenčinu." // Formátovaná správa - slúži na test #define formMSG_SK "Tvoje herné ID %d:%d" // Počet znakov formátovanej správy formMSG #define formMSG_size_SK 22 #define msgCONN_CZ "Vitaj na servery. Použi /lang pre zmenu jazyka." #define msgCONNAll_CZ "Na server prišiel nový hráč." #define msgLangCHG_CZ "Tvoj jazyk bol zmenený na češtinu." #define formMSG_CZ "Tvoje herné ID %d:%d" #define formMSG_size_CZ 22 Týmto vložíme do nášho GM texty vo všetkých jazykoch. Platí, že pre každý jazyk bude zvlášť *.inc súbor kvôli prehladnosti. Ako ďalší bod by sme si mali zadefinovať maximálny počet jazykov a taktiež zoradenie jazykov. #define MAX_LANG 2 // Maximálny počet jazykov #define LANG_SK 0 // slúži len pre nastavenie jazyka a nie je nutné ho definovať #define LANG_CZ 1 // slúži len pre nastavenie jazyka a nie je nutné ho definovať Takže teraz už mám v našom GM textové reťazce a máme definované koľko jazykov náš GM má. Ďalším krokom je tvorba vlastných funkcií. Názorne predvediem funkcie SendClientMessage, SendClientMessageToAll a formátovanie textu. #define SCM(%0,%1,%2); \ if(GetPlayerLang(%0) == 0) SendClientMessage(%0, %1, %2_SK); \ else if(GetPlayerLang(%0) == 1) SendClientMessage(%0, %1, %2_CZ); //#define SCM(%0,%1,%2); - zadefinujeme ako má funkcia vyzerať a aké má mať parametre // \ - znamená že definícia pokračuje na novom riadku //if(GetPlayerLang(%0) == 0) skontroluje či je hráčov jazyk 0,1,2 atď... //SendClientMessage(%0, %1, %2_CZ); //%0 je ID hráča, %1 je farba správy a %2 je názov definície textovej správy // Príklad použitia SCM(playerid, 0x00BB00AA, msgCONN); // msgCONN je definícia z INC hore bez prípony _CZ / _SK Namiesto SendClientMessage použijete SCM a namiesto textu použijete definíciu z includov lang_SK a lang_CZ bez prípony _SK / _CZ - tak ako je uvedené v príklade Ako ďalšie si ukážeme SendClientMessageToAll. Je to veľmi primitívna funkcia, pretože spočíva len v tom, že spustíme cyklus pre každého hráča a využijeme už definovanú funkciu SCM. #define SCMTA(%0,%1); \ for(new i=0;i<=GetPlayerPoolSize();i++) { if(IsPlayerConnected(i)) { SCM(i, %0, %1); } } SCMTA(0x00BB00AA, msgCONNAll); // Použitie rovnaké ako pri SCM, len nám odpadá parameter playerid Ďalšia zaujímavá funkcia je formSCM - takže formátovaná správa. Upozorním že v includoch lang_SK a CZ je nutné definovať aj počet znakov! #define formSCM(%0,%1,%2,%3); \ if(GetPlayerLang(%0) == 0) {new str[%2_size_SK]; format(str, sizeof(str), %2_SK, %3); SendClientMessage(%0,%1,str);} \ else if(GetPlayerLang(%0) == 1) {new str[%2_size_CZ]; format(str, sizeof(str), %2_CZ, %3); SendClientMessage(%0,%1,str);} #define formSCMTA(%0,%1,%2); \ for(new i=0;i<=GetPlayerPoolSize();i++) { if(IsPlayerConnected(i)) { formSCM(i,%0,%1,%2); } } // táto funkcia funguje na princípe klasického formátovania a odslania správy //%0 - playerid, %1 farba, %2 definícia textu, %3 parametre - môžete zadať aj viac parametrov // new str - vytvorí textový reťazec ktorý budeme formátovať // %2_size_SK - definícia počtu znakov, tz. ak máme definiciu textu formMSG_SK tak definícia počtu znakov bude formMSG_size_SK // následne sa naformátuje text podľa zadaných parametrov // potom sa už len odošle správa // fungovanie je veĺmi podobné SCM len s tým rozdielom, že sa text pred odoslaním naformátuje // formSCMTA funguje rovnako ako SCMTA formSCMTA(0x00BB00AA, formMSG, playerid, playerid); formSCM(playerid, 0x00BB00AA, formMSG, playerid, playerid); // Tu je príklad použitia // Použitie je veľmi podobné ako pri SCM a SCMTA, len s tým rozdielom, že pribudli parametre formátovania Úplne na záver Vám sem pridám príkaz na zmenu jazyka. if (strcmp("/lang", cmdtext, true, 4) == 0) { SetPlayerLang(playerid, GetPlayerLang(playerid)+1); if(GetPlayerLang(playerid) == MAX_LANG) SetPlayerLang(playerid, 0); SCM(playerid, 0x00BB00AA, msgLangCHG); return true; } 4. Záver Na záver by som chcel poďakovať za prečítanie môjho návodu a dúfam že pomôže novým pawnerom s ich módmi. Dúfam že som všetko napísal zrozumiteľne a pochopiteľne. V prípade otázok alebo kritiky neváhajte zanechať komentár. lang_CZ.inc lang_SK.inc new.pwn 1 4 Link to comment Share on other sites More sharing options...
Guyy 14 Odesláno: 3. Únor, 2018 Share Odesláno: 3. Únor, 2018 Hm.. Zaujímavý návod.. Veľa návodov čo som videl bolo v príkaze že ked pLang == 0 tak mu pošle správu v tom jazyku, else pLang == 1 tak mu pošle tiež v inom Ja som chcel tiež urobiť Multi Lang GM ale nechcelo sa mi stým if pLang blabla babrať Toto je lepšie, možno využijem Dobrý návod. Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 4. Únor, 2018 Hlavní moderátor Share Odesláno: 4. Únor, 2018 Jsem rád, že jednou za čas přibude dobrý návod. Díky ti za to. A taky za to, že dokážeš, na rozdíl od mnoha jiných, dodržet předepsanou šablonu. Link to comment Share on other sites More sharing options...
IllidanS4 65 Odesláno: 5. Únor, 2018 Share Odesláno: 5. Únor, 2018 Hezké použití definic. Doporučuji do formSCM použít nějakou existující variantu SendClientMessageFormat, pokud má lepší správu bufferu; nebude aspoň potřeba _size. Taky by bylo hezké, kdyby SCM podporovalo klasický idiom return SendClientMessage(...);, ale to se dá zařídit: stock USE_VALUE(val) return val; #define SCM(%0,%1,%2) USE_VALUE(GetPlayerLang(%0) == 0 ? SendClientMessage(%0, %1, %2_SK) : GetPlayerLang(%0) == 1 ? SendClientMessage(%0, %1, %2_CZ) : 0) Něco podobného jsem taky udělal, akorát místo definic to používá funkce a kontroluje adresu řetězce v paměti při zjišťování překladu. Link to comment Share on other sites More sharing options...
DNLS 31 Odesláno: 6. Únor, 2018 Share Odesláno: 6. Únor, 2018 +1 Zajímavý styl. Ušetří to více místa.. Link to comment Share on other sites More sharing options...
rEf 53 Odesláno: 7. Únor, 2018 Share Odesláno: 7. Únor, 2018 (upraveno) Proč nepoužít new? Např. new Language[2][2][] = { // [0 = Čeština, 1 = Angličtina][počet řádků] { "Vítej %s", "Auto" }, { "Welcome %s", "Car" // nebo do includu např. #include <languages/en.pwn> s obsahem "Welcome %s", "Car" } }; Použití např. nastavíme Jazyk: new lang[MAX_PLAYERS]; default bude 0 tudíž Čeština nastavíme Jazyk lang[playerid] = 0; // nebo 1 což je Angličtina a použití bude Language[lang[playerid]][0] // pochopitelně 0 je řádek Vítej, Welcome Language[lang[playerid]][1] // 1 je řádek Auto, Car např. format(cesta, sizeof(cesta), Language[lang[playerid]][0], PlayerName(playerid)); Zkouška: Edited 7. Únor, 2018 by rEf Link to comment Share on other sites More sharing options...
Quiter 99 Odesláno: 7. Únor, 2018 Author Share Odesláno: 7. Únor, 2018 (upraveno) před 5 hodinami, rEf said: Proč nepoužít new? Např. new Language[2][2][] = { // [0 = Čeština, 1 = Angličtina][počet řádků] { "Vítej %s", "Auto" }, { "Welcome %s", "Car" // nebo do includu např. #include <languages/en.pwn> s obsahem "Welcome %s", "Car" } }; Použití např. nastavíme Jazyk: new lang[MAX_PLAYERS]; default bude 0 tudíž Čeština nastavíme Jazyk lang[playerid] = 0; // nebo 1 což je Angličtina a použití bude Language[lang[playerid]][0] // pochopitelně 0 je řádek Vítej, Welcome Language[lang[playerid]][1] // 1 je řádek Auto, Car např. format(cesta, sizeof(cesta), Language[lang[playerid]][0], PlayerName(playerid)); Zkouška: Ano, pri 10 textových reťazcoch o dĺžke 25 znakov možno... Ale čo keď bude v móde 100 000 textov o dĺžke 500-10000 znakov (hovorím teraz o dialogoch) nemyslím že by to bolo lepšie Edited 7. Únor, 2018 by Quiter Link to comment Share on other sites More sharing options...
Tanga 131 Odesláno: 7. Únor, 2018 Share Odesláno: 7. Únor, 2018 Podľa mňa by sa dal ten návod zlepšiť. Rozhodne by som kód nedával do spoileru, ale do code, takto sa to zle číta. Link to comment Share on other sites More sharing options...
rEf 53 Odesláno: 7. Únor, 2018 Share Odesláno: 7. Únor, 2018 Quiter, tak 10 000 znaku na řádek nehrozí a 100 000 řádků taky jen tak nehrozí pokud tam nemáš *** ... :-D A i kdyby samozřejmě s přiměřeným stringem který to pobere jak by se to chovalo ti teď neřeknu ještě jsem to nezkusil. No až budu mít čas tak to vyzkouším. Link to comment Share on other sites More sharing options...
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