PDA

Visualizza la versione completa : [C/C++]: Cambio lingua


Zenon
06-09-2006, 11:06
Buongiorno a tutti quelli che mi leggeranno.
Ho bisogno di un aiuto e spero sinceramente sia una cagata quella che chiedo!

Sto sviluppando un sistema nel quale ho un box di controllo: l'utente deve compiere spostamenti mediante tastierina/telecomando
E' un oggetto che andrà esportato quindi utilizzeremo più lingue oltre all'italiano; per ora mi sbatto solo con l'inglese.
Qual è il metodo più semplice per caricare le due versioni? la scelta l'ho già inserita, ora devo dirgli di caricare la lingua dovuta

Fino ad ora le mie scritte sono in un file "ldc.h"
#define LCD_ASPETTA "attendere per favore"
#define LCD_PREMI_1 "premere 1"
...

ed ho già pronti i
#define LCD_ASPETTA "wait please"
#define LCD_PREMI_1 "push 1"
....

Se qualcuno mi viene in soccorso, grazie mille!!!
Marco

andbin
06-09-2006, 11:20
Originariamente inviato da Zenon
E' un oggetto che andrà esportato quindi utilizzeremo più lingue oltre all'italiano; per ora mi sbatto solo con l'inglese.
Qual è il metodo più semplice per caricare le due versioni? la scelta l'ho già inserita, ora devo dirgli di caricare la lingua dovuta La questione della "localizzazione" non è banale, anche perché la si può fare in diversi modi e che, tra l'altro, dipendono anche dal sistema operativo usato.

Ci sono diversi "scenari":

A) Decidi la lingua a tempo di compilazione (tramite una define). Il tuo eseguibile quindi conterrà le stringhe di testo solo per 1 lingua. In pratica dovrai generare più eseguibili uno per ogni lingua.

B) Il tuo eseguibile contiene le stringhe di testo per tutte le lingue supportate. La scelta della lingua viene fatta a run-time dall'utente tramite una opzione, un menù, una configurazione (o altre cose del genere).

C) Il tuo eseguibile non contiene le stringhe di testo ma si appoggia a file esterni (di testo o binari in qualche formato) per leggere le stringhe di testo localizzate. (questo è quello che succede su linux, per esempio).

metal_prog
06-09-2006, 11:30
Presupponendo la soluzione B) di andbin è facile costruire un sistema abbastanza rapido:

Hai una funzione che inizializza la lingua precedentemente impostata dall'utente, sapendo che tu hai già scritto #define contenete il testo di ogni lingua, dovrai creare altrettante variabili (non il nummero delle frasi di tutte e due le lingue :zizi: ) che la funzione di inizializzazione appunto inizializzerà inserendo la frase corrispondente della lingua selezionata.

Spero che hai capito qualche cosa! :zizi:

Zenon
06-09-2006, 11:31
allora, cerco di farti capire:
nel software del box ho messo la scelta della lingua: entri nel menu, scegli la voce "linguaggio" e scorri le opzioni (per ora solo "italiano" e "inglese", poi metteremo altre)

La mia intenzione era partire sempre con l'italiano che è nel "lcd.h"; poi ne momento in cui l'utente vuole l'inglese, cambia l'impostazione (quindi una qualsiasi variabile, credo) e il C (che è sotto windows) vorrei mi caricasse le voci inglesi anzichè italiane; per come è adesso, volevo mettere entrambe le righe in "lcd.h".

Il main chiama la funzione
LcdPrint (LCD_ASPETTA);

LCD_ASPETTA è in lcd.h
#define LCD_ASPETTA "Aspetta"
#define LCD_ASPETTA "Wait"

e se l'impostazione è italiana prende "Aspetta", mentre se fosse inglese prende "Wait"
Come faccio a dirgli di scegliere una o l'altra? con un #ifdef o cose del genere?
Non ho dimestichezza con questa voce; se mi puoi fare un esempio...
Grazie

metal_prog
06-09-2006, 11:48
Io suggerivo come segue:



#include <cstdlib>
#include <iostream>

using namespace std;

#define i_aspetta "Aspetta"
#define e_aspetta "Wait"

char* aspetta;

int main()
{
int scelta;
cout<<"Inserire 1 per inglese, 2 per italiano\n";
cin>>scelta;
if(scelta==1)aspetta=i_aspetta;
else aspetta=e_aspetta;
cout<<endl<<aspetta<<endl;
system("PAUSE");
return 0;
}


Questo è per Dev-C++ ma il procedimanto è semplice! Spero che abbia capito :)

Zenon
06-09-2006, 11:56
cambiando il nome a tutte le variabili è più facile....
Ok, grazie per le risposte istantanee!

andbin
06-09-2006, 12:25
Si può anche pensare di fare una cosa del tipo:


#define LANG_ITALIANO 0
#define LANG_ENGLISH 1

typedef struct
{
char *aspetta;
char *premi_un_tasto;
} STR_LANG;


STR_LANG strLang[2] =
{
{
"Aspetta",
"Premi un tasto"
},
{
"Wait",
"Press a key"
}
};

Quando l'utente ha scelto italiano o inglese, basta impostare una variabile (es. idxLang) a 0 oppure 1. A quel punto basta prendere strLang[idxLang].aspetta per avere la stringa. E così per tutte le altre. http://img383.imageshack.us/img383/4245/iconwink5sx.gif


EDIT: C'è anche un'altra possibilita: invece di usare un array, usare un puntatore.


typedef struct
{
char *aspetta;
char *premi_un_tasto;
} STR_LANG;


STR_LANG strLang_Italiano =
{
"Aspetta",
"Premi un tasto"
};

STR_LANG strLang_English =
{
"Wait",
"Press a key"
};


STR_LANG *strLang;
Quando l'utente sceglie la lingua fai:

strLang = &strLang_Italiano;
oppure
strLang = &strLang_English;

e poi usi sempre strLang->aspetta per accedere alla stringa.

Scegli quella che ti piace di più.

Loading