Skip to content

Localizzare un’applicazione XojoWeb

Come personalizzare la localizzazione per gli utenti web, personalizzando testi e formati in base alle scelte dell’utente e non solo

Un’applicazione XojoWeb mostra i testi che decidiamo di pubblicare.

Se vogliamo avere un’applicazione multilingue possiamo facilmente adottare le costanti dinamiche di Xojo che ci permettono di visualizzarle in base alle impostazioni del browser dell’utente.

Certo dobbiamo prevedere la lingua dell’utente e in ogni caso prevedere un caso di default per le lingue che non supportiamo.

Però abbiamo il problema dei formati. Lingue simili mostrano i dati (formato dei numeri o delle date o ore) in modo differente.

Vediamo come gestire tutti questi casi.

Localizzare i testi

Per i testi, come detto, è semplice: basta utilizzare delle costanti, buona pratica in ogni caso per avere un riferimento unico dei testi utilizzati, è attivare il flag “dynamic”. In questo modo possiamo indicare per ognuna delle lingue che supportiamo il relativo testo.

Non dobbiamo necessariamente avere subito tutte le lingue. Possiamo inizialmente utilizzare solo l’italiano, esportare le costanti e poi tramite l’applicazione Lingua (scaricabile dal sito Xojo) tradurre e reimportarle nel progetto.

La scelta sul browser della lingua avviene tramite la proprietà LanguageCode dell’oggetto Session che viene inizializzata dal valore prescelto dall’utente.

Ovviamente bisogna gestire questa opportunità evitando di impostare il LanguageCode per una lingua che non abbiamo a disposizione.

Poniamo come esempio di aver previsto come lingue l’italiano e l’inglese. Come possiamo gestire un utente che ha il browser impostato su tedesco?

Un metodo semplice può essere inserire nell’evento Open dell’oggetto Session:

select case LanguageCode
    case "it", "en"
        //Non fare nulla
    else
        LanguageCode="it"
end select

In questo modo l’utente con il browser impostato sul tedesco vedrà l’applicazione in italiano.

Però l’utente potrebbe preferire l’inglese all’italiano. Come risolvere il problema?

Il browser invia le informazioni sulla localizzazione tramite un l’header:Accept-Language. Questo header avrà nell’ordine scelto dall’utente tutte le lingue desiderate e le varianti locali; questi valori sono separati da , e quindi il nostro codice può diventare:

//Definiamo l'impostazione di default nel caso in cui non supportiamo le lingue scelte
LanguageCode="it" //Il sito di default sarà in italiano
 
dim vLangs() as string=Session.Header("Accept-Language").split(",")
for i as integer=0 to vLangs.ubound
    //I parametri di Accept-Language possono avere informazioni sul peso della lingua
    //questo valore è separato dal codice di lingua dal carattere ;
    dim cLangInfos() as string=vLangs(i).split(";")
    //I codici di lingua possono essere nella forma lingua-variante
    //ora ci occupiamo solo della lingua
    dim cLangs() as string=cLangInfos(0).split("-")
    select case cLangs(0)
        case "it", "en"
            LanguageCode=cLangs(0)
            exit
    end select
next

Ora il nostro utente tedesco che comprende l’inglese può accedere al sito in inglese automaticamente.

Localizzare i formati

Identificata la lingua, possiamo anche identificare i formati per i numeri e le date. Infatti per la stessa lingua base possiamo avere formati nazionali diversi.

Con lo stesso meccanismo introdotto identifichiamo anche il formato che l’utente preferisce.

Per fare questo introduciamo una proprietà all’oggetto Session: LanguageLocale as Xojo.Core.Locale

//Definiamo l'impostazione di default nel caso in cui non supportiamo le lingue scelte
LanguageCode="it" //Il sito di default sarà in italiano
LanguageLocale=new Xojo.Core.Locale("it_IT") //I formati di default saranno in italiano
 
dim vLangs() as string=Session.Header("Accept-Language").split(",")
for i as integer=0 to vLangs.ubound
    //I parametri di Accept-Language possono avere informazioni sul peso della lingua
    //questo valore è separato dal codice di lingua dal carattere ;
    dim cLangInfos() as string=vLangs(i).split(";")
    //I codici di lingua possono essere nella forma lingua-variante
    //ora ci occupiamo solo della lingua
    dim cLangs() as string=cLangInfos(0).split("-")
    select case cLangs(0)
        case "it", "en"
            LanguageCode=cLangs(0)
            if cLangs.ubound=1 then
                //Il codice è nella forma lingua variante quindi possiamo utilizzarlo
                //il separatore di formato è _ e non -
                //Locale prevede un text per cui dobbiamo definire l'encoding e trasformarlo
                LanguageLocale=new Xojo.Core.Locale(cLangInfos(0).Replace("-", "_").DefineEncoding(Encodings.UTF8).ToText)
            else
                //Abbiamo solo il codice di lingua e per conformità lo impostiamo nello stesso modo
                dim aCode as string=cLangs(0).Lowercase+"_"+ cLangs(0).Uppercase
                LanguageLocale=new Xojo.Core.Locale(aCode.DefineEncoding(Encodings.UTF8).ToText)
            end if
            exit
    end select
next

Ora abbiamo anche i formati localizzati e possiamo utilizzarli in questo modo:

dim numero as double=1234.56
dim giorno as Xojo.Core.Date=Xojo.Core.Date.Now
//Label1 è una label in cui vogliamo mostrare il numero
Label1.text=numero.ToText(Session.LanguageLocale, "#,##0.00")
//Label2 è una label in cui vogliamo mostrare la date completa
Label2.text=giorno.ToText(Session.cLang, Xojo.Core.Date.FormatStyles.Full, Xojo.Core.Date.FormatStyles.Full)

Ad esempio, accettando come lingua anche il francese, per un utente francese avremo:

1 234,56
mercredi 12 juillet 2017 16:06:08 heure d’été d’Europe centrale

Invece per un utente belga di lingua francese avremo:

1.234,56
mercredi 12 juillet 2017 16 h 06 min 08 s heure d’été d’Europe centrale

La lingua è la stessa ma i formati sono differenti.

Nelle applicazioni desktop o iOS questo non è necessario
L’utente a livello di sistema può scegliere l’ordine delle lingue desiderate per cui queste saranno utilizzate, se possibile, nell’ordine altrimenti si utilizza la lingua che è stata definita di default nel progetto