Kirjoittaja: jutti
Kirjoitettu: 16.11.2005 – 16.11.2005
Tagit: koodi näytille, vinkki
Tein luokan, jolla käsittelen ohjelman monikielistä käyttäjäliittymää. Testasin sitä yhteen projektiini, ja se näyttäisi täyttävän ainakin omat tarpeeni. En ole tehnyt mitään hienosäätöä siihen ja jotkut jutut ovat aika kökköjä siinä, mutta se toimii. Luokka ei tee muuta kuin tallentaa merkkijonoja vector<string> -tyyppisiin tietueisiin. Luokan nimi on languige ja käytän sitä seuraavaan tapaan.
Esimerkki 1:ssä muodostan objektin nimeltä guis. Sitten lisään objektiin merkkijonoja. Jokainen lisäys koostuu yhdestä sanasta kaikilla lielillä (esimerkissä kolme kieltä). Samalla määrittelen makroja (gui_pelaa, gui_avaa jne).
Luokan jäsenellä get() haen std::string -tyyppisen merkkijonon, getc() palauttaa c-tyyppisen merkkijonon (char*).
Esimerkissä 2 on pari Allegro-tyyppistä riviä. Ekalla rivillä haetaan asetuksista kieli. Seuraavalla rivillä herjataan tekstillä, joka haetaan guis-objektista avaimilla gui_valmistaudu ja lang.
rautalankaosasto: lan-gui-ge. GUI, ymmärrättekste?
Esimerkki 1
#include "languige.h" // ... languige *guis = new languige(3); #define gui_pelaa 0 guis->add("Pelaa", "Starta", "Start"); #define gui_avaa 1 guis->add("Avaa", "Öppna", "Open"); #define gui_editori 2 guis->add("Editori", "Editor", "Editor"); #define gui_asetukset 3 guis->add("Asetukset", "Inställningar", "Settings"); #define gui_valmistaudu 4 guis->add("Valmistaudu seuraavaan tasoon", "Förbered dig på följande nivå", "Prepare for next level");
Esimerkki 2
lang = get_config_int("settings", "language", 0); alert(guis->getc(gui_valmistaudu, lang), "", "", "Ok", NULL, -1, -1);
languige.h
#ifndef LANGUIGEH #define LANGUIGEH #include <vector> #include <string> using namespace std; class languige { vector <vector<string> > the_strings; int n_of_lang; int n_of_items; public: languige(int n); void add(char *str, ...); string get(int item, int language); const char *getc(int item, int language); }; #endif
languige.cpp
#include <string> #include <vector> #include <stdarg.h> #include "languige.h" using namespace std; languige::languige(int n) : n_of_lang(n) { } void languige::add(char *str, ...) { va_list params; va_start(params, str); vector <string>adder; adder.push_back(string(str)); for (int i = 1; i < n_of_lang; i++) { adder.push_back(string(va_arg(params, char*))); } the_strings.push_back(adder); n_of_items++; va_end(params); } string languige::get(int item, int language) { return the_strings[item][language]; } const char *languige::getc(int item, int language) { return the_strings[item][language].c_str(); }
Ihan kiva, mut toi pelaa on enkuks play ja start on käynnistä...
Start -> Aloita...
Onnistuukos ihan tuolla tavalla, jos haluaa vaikka mandariinikiinan tuohon kieleksi? Eli miten on UTF-8:n laita?