2013-02-14 12 views
5

Sto creando un'app HTML5 mobile che funziona su tutte e 3 le piattaforme mobili (Android, iOS a, d Windows Mobile 8). Sto usando javascript per la localizzazione (https://github.com/eligrey/l10n.js/#readme).Localizzazione app mobile HTML5 con javascript e PhoneGap

L'app funziona correttamente sul browser. Ma quando lo distribuisco sull'emulatore mobile la localizzazione non funziona.

Penso che il problema è che javascript ottiene le informazioni sulla lingua dal browser, ma nel cellulare eseguiamo l'HTML5 utilizzando PhoneGap.

Esiste un modo per abilitare la localizzazione utilizzando javascript in PhoeGap.

+3

Se stai utilizzando PhoneGap, assicurati di leggere la cultura tramite [globalization.getLocaleName()] (http://docs.phonegap.com/en/2.2 .0/cordova_globalization_globalization.md.html # globalization.getLocaleName) o 'globalization.getPreferredLanguage()' e __not__ l'oggetto navigatore del browser, questo è sempre impostato su "en" su Android per la mia esperienza. Inoltre, vedi il mio post qui sotto per quanto riguarda il trattino/underscore matching pitfall – Philzen

+0

Date un'occhiata qui: https://github.com/EffEPi/localize – Fabrizio

risposta

2

Ho appena risolto lo stesso tipo di problema creando un plug-in personalizzato PhoneGap per ogni piattaforma che restituisce solo le impostazioni locali dell'utente.

per esempio, su Android, il plugin controlla solo:

var message = Locale.getDefault().getLanguage();

e poi in JavaScript lato, quando hai quel nome lingua indietro, ad esempio. en, si utilizzerà l'oggetto JSON che ha chiamato dopo quella lingua. L'esempio di oggetto JSON sarebbe simile a questa:

MyApp.Language = en: { 
    'Player' : 'Player', 
    'Players' : 'Players', 
    'Not Set' : 'Not Set' 
}, 
fi: { 
    'Player' : 'Pelaaja', 
    'Players' : 'Pelaajat', 
    'Not Set' : 'Ei määritetty' 
} 

Il plugin per Android è semplice come questo:

file di

JS

window.localizeMe = { 
    getDefaultLocale: function(callback) { 
     cordova.exec(
      callback, 
      function(err) { 
       callback('Error: ' + err.code); 
      }, 
      "LocalizeMe", 
      "getDefaultLocale", 
      []); 
    } 
} 

file di Java

public class LocalizeMe extends CordovaPlugin { 
    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
     if (action.equals("getDefaultLocale")) { 
      String message = Locale.getDefault().getLanguage(); 
      this.getDefaultLocale(message, callbackContext); 
      return true; 
     } 
     return false; 
    } 

    private void getDefaultLocale(String message, CallbackContext callbackContext) { 
     if (message != null && message.length() > 0) { 
      callbackContext.success(message); 
     } else { 
      callbackContext.error("Expected one non-empty string argument."); 
     } 
    } 

} 

E, infine, nel file JS principale, è possibile impostare la lingua del vostro app:

window.localizeMe.getDefaultLocale(function(result) { 
    if (result != null && result.length > 0) { 
     if (result.toLowerCase().indexOf('fi') !== -1) { 
      MyApp.Lang = MyApp.Language.fi; 
     } else { 
      MyApp.Lang = MyApp.Language.en; 
     } 
    } 
}); 
3

È possibile scrivere il proprio codice JavaScript per utilizzare la lingua di localizzazione. Questa è esattamente la stessa risposta che ho scritto altrove qui.

In generale, il JavaScript window.navigator.language di solito funziona per iOS e Android più recenti, ma versioni precedenti di Android lo hanno codificato su en.

Per gli androidi precedenti, suggerisco di estrarre il parametro della lingua dalla stringa UserAgent (sì sniffing!), Ad es.

if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) { 
    lang = androidLang[1]; 
} 

Qui, lingua potrebbe anche contenere il codice del paese (ad esempio 'en-IE') in modo da potrebbe essere necessario rimuovere anche che:

if (lang.indexOf('-') != -1) lang = lang.substring(0, lang.indexOf('-')); 

Questo è quello che ho usato in una recente app, usando HTML5 e PhoneGap, e funziona perfettamente.

+0

Sul mio Android 4.4.4 'window.navigator.language' produce' zz-ZZ'. –

1

C'è un errore comune con la localizzazione, forse questo è il problema:
Molti dispositivi segnalano locali sotto forma di de_DE, en_GB , ecc ... - nota il carattere di sottolineatura .

l10n (o nel mio caso, globalize.js) utilizzare un trattino per separare lingua e il paese - quindi nessuna cultura corrispondente viene trovato e si tratta con il fallback predefinito.

Inserisci un console.log nella tua app per scaricare la stringa locale che stai ricevendo, quindi vai alla console e verifica con adb logcat se questo potrebbe essere il caso sul tuo dispositivo. Quindi modifica semplicemente la stringa per consentire la corrispondenza (ad esempio locale.value.replace('_', '-'))