Autore Topic: problema multilingua html in /assets  (Letto 1461 volte)

Offline pajehali

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
problema multilingua html in /assets
« il: 25 Febbraio 2013, 11:12:46 CET »
0
Buongiorno,
come da titolo chiedo aiuto per la gestione del multilingua dei file in assets.
Mentre per le stringhe in re/values basta rinominare la cartella ed il gioco è fatto, per i file nella cartella assets (nello specifico un solo file .html) pensavi di duplicare il file per ogni lingua e poi aprire il file a seconda della lingua impostata sul device.
Quindi, ad esempio, se il device è impostato in italiano allora deve aprire file_html_ITA.html, se invece il device è impostato in inglese deve aprire file_html_ENG.html.
Quello che vi chiedo è come fare, via codice, per "leggere" la lingua impostate e quindi far partire un banale else if??
grazie!

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:problema multilingua html in /assets
« Risposta #1 il: 25 Febbraio 2013, 11:19:15 CET »
0
ti da la classica nomenclatura con le due lettere (esempio Italiano ---> it)

Codice (Java): [Seleziona]
Locale.getDefault().getLanguage();

Offline pajehali

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:problema multilingua html in /assets
« Risposta #2 il: 25 Febbraio 2013, 11:46:26 CET »
0
perfetto!!

ho creato i due file:

Codice: [Seleziona]
it_file.html
en_file.html

quindi ho dato

Codice (Java): [Seleziona]
 String country =  Locale.getDefault().getLanguage();
 myWebView.loadUrl("file:///android_asset/"+country+"_file.html");

grazie!
« Ultima modifica: 25 Febbraio 2013, 15:35:37 CET da Ricky` »

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:problema multilingua html in /assets
« Risposta #3 il: 25 Febbraio 2013, 11:58:55 CET »
0
Se ti interessa c'è un modo un'pò più furbo (e leggermente più complesso) che ti permette di utilizzare gli stessi meccanismi di localization permessi da Androd, la stessa logica dei re/values-<lenguage>.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:problema multilingua html in /assets
« Risposta #4 il: 25 Febbraio 2013, 13:19:17 CET »
0
perfetto!!

ho creato i due file:

it_file.html
en_file.html

quindi ho dato

 String country =  Locale.getDefault().getLanguage();
 myWebView.loadUrl("file:///android_asset/"+country+"_file.html");


grazie!

Ottimo cmq ti consiglio di fare prima un if control sulla variabile country nel caso uscisse una lingua che tu non hai tra i file e magari fai sputare in automatico la versione inglese

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:problema multilingua html in /assets
« Risposta #5 il: 25 Febbraio 2013, 14:27:56 CET »
0
Di seguito una soluzione che ti permette di sfruttare il meccanismo di localization proprio di Android. Questa soluzione risulta più sicura e flessibile della gestione manuale.

L'idea è quella di sfruttare un file html vuoto, una webview con javascript e dei file raw che verranno automaticamente gestiti da Android.

Primo passo creare sotto la cartella assets una directory html (non è obbligatorio ma serve per strutturare meglio il progetto).
In questa cartella inserire un file html (per esempio index.html) vuoto. Di seguito la struttura del file.

Codice (html): [Seleziona]
<html>
<head>
<title>Multilanguage Assets</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
</body>
</html>

A questo punto aggiungere nella cartella res/raw un file (per esempio index) contenente il codice html da visualizzare all'interno del file html precedentemente creato vuoto. Ricordo che il file presente nella cartella res/raw rappresenta la lingua di default (generalmente l'inglese). Successivamente creare i corrispettivi files nelle altre lingue ed inserirli nelle rispettive directories. Per esempio creare il file index per l'italiano e inserirlo nella cartella res/raw-it.

Di seguito un esempio del contenuto del file res/raw-it.

Codice: [Seleziona]
<img src="file:///android_asset/images/banner.png"></img></td>
<p>
<b>Lingua: Italiano</b>
<br><br>
Inserisci qui il tuo testo in italiano.
<ol>
        <li>Puoi usare tutti i tags html.</li>
        <li>Questo &egrave; solo un esempio.</li>
        <li>Attenzione alle lettere accentate, vanno inserite nella codifica html.</li>
</ol>

Come si può vedere nel file index ho inserito anche un link ad un immagine. Per far questo ho inserito l'immagine banner.png negli assets dentro la cartella images.

A questo punto creiamo la classe HelpActivity con il seguente codice:

Codice (Java): [Seleziona]
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public final class HelpActivity extends Activity {

        private static final String TAG = HelpActivity.class.getSimpleName();

        // Use this key and one of the values below when launching this activity via
        // intent. If not
        // present, the default page will be loaded.
       
        public static final String REQUESTED_PAGE_KEY = "requested_page_key";
        public static final String DEFAULT_PAGE = "index.html";

        private static final String BASE_URL = "file:///android_asset/html/";
        private static final String WEBVIEW_STATE_PRESENT = "webview_state_present";

        private WebView webView;

        private final Button.OnClickListener doneListener = new Button.OnClickListener() {
                public void onClick(View view) {
                        finish();
                }
        };

        @Override
        protected void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                setContentView(R.layout.help);

                webView = (WebView) findViewById(R.id.help_contents);
                webView.setWebViewClient(new HelpClient());
                webView.getSettings().setJavaScriptEnabled(true);

                // Froyo has a bug with calling onCreate() twice in a row, which causes
                // the What's New page
                // that's auto-loaded on first run to appear blank. As a workaround we
                // only call restoreState()
                // if a valid URL was loaded at the time the previous activity was torn
                // down.
               
                Intent intent = getIntent();
                if (icicle != null && icicle.getBoolean(WEBVIEW_STATE_PRESENT, false)) {
                        webView.restoreState(icicle);
                } else if (intent != null) {
                        String page = intent.getStringExtra(REQUESTED_PAGE_KEY);
                        if (page != null && page.length() > 0) {
                                webView.loadUrl(BASE_URL + page);
                        } else {
                                webView.loadUrl(BASE_URL + DEFAULT_PAGE);
                        }
                } else {
                        webView.loadUrl(BASE_URL + DEFAULT_PAGE);
                }

                View doneButton = findViewById(R.id.done_button);
                doneButton.setOnClickListener(doneListener);

        }

        @Override
        protected void onSaveInstanceState(Bundle state) {
                String url = webView.getUrl();
                if (url != null && url.length() > 0) {
                        webView.saveState(state);
                        state.putBoolean(WEBVIEW_STATE_PRESENT, true);
                }
        }

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                        if (webView.canGoBack()) {
                                webView.goBack();
                                return true;
                        }
                }
                return super.onKeyDown(keyCode, event);
        }

        private String readTextFromResource(int resourceID) {
                String result = "";
                InputStream raw = getResources().openRawResource(resourceID);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                int i;
                try {
                        i = raw.read();
                        while (i != -1) {
                                stream.write(i);
                                i = raw.read();
                        }
                        raw.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                result = stream.toString().replace("\r\n", "").replace("\n", "").replace("\t", "");
                return result;
        }

        private final class HelpClient extends WebViewClient {
                @Override
                public void onPageFinished(WebView view, String url) {
                        String page = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
                        Log.v(TAG, "Load page" + page);
                        int res = R.raw.index;
                        String htmlPageSrc = readTextFromResource(res);
                        webView.loadUrl("javascript:(function() { " + "document.getElementsByTagName('body')[0].innerHTML='" + htmlPageSrc + "'; " + "})()");
                        super.onPageFinished(view, url);
                }

                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        if (url.startsWith("file")) {
                                // Keep local assets in this WebView.
                                return false;
                        } else {
                                // Open external URLs in Browser.
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                                return true;
                        }
                }
        }

}

A questo punto il gioco è fatto!

In allegato l'intero progetto di prova, spero di non aver dimenticato nulla!  :-)
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline pajehali

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:problema multilingua html in /assets
« Risposta #6 il: 25 Febbraio 2013, 15:08:22 CET »
0
Denper ti ringrazio infinitamente per la disponibilità, terrò sicuramente a mente la tua soluzione nei miei prossimi progetti.
Per quanto riguarda il progetto in questione invece ho optato per l'utilizzo del metodo locale in quanto devo semplicemente gestire un solo file html con due immagini che rappresenta la guida della mia applicazione.
A tal proposito se possibile vorrei qualche delucidazione in più sulla dritta di agenio sull'uso del if control e cioè se va bene quello che scrivo sotto (di getto senza test) o se c'è una soluzione più sintetica:


String country =  Locale.getDefault().getLanguage();

      
Codice: [Seleziona]
if (country.equals("en")){
myWebView.loadUrl("file:///android_asset/en_file.html");
}
                               
if (item.equals("it")){
myWebView.loadUrl("file:///android_asset/it_file.html");
}

else {
myWebView.loadUrl("file:///android_asset/en_file.html");
}
« Ultima modifica: 25 Febbraio 2013, 15:35:56 CET da Ricky` »

Offline denper

  • Utente normale
  • ***
  • Post: 290
  • Respect: +60
    • Mostra profilo
    • Anddenper
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    denper
  • Sistema operativo:
    Window 7, Windows XP
Re:problema multilingua html in /assets
« Risposta #7 il: 25 Febbraio 2013, 15:35:51 CET »
0
Direi che il primo if non serve a nulla. Basta il secondo, se è it allora carico il file it_file.html altrimenti il file en_file.html.
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. [A.Einstein]

Proteggi la tua privacy! Utilizza GhostPhone! https://play.google.com/store/apps/details?id=com.denper.gp
Giochi a Winforlife e Superenalotto e sei stanco di controllare le tue schedine manualmente? Prova Checkwin: https://play.google.com/store/apps/details?id=com.denper.checkwintrial

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:problema multilingua html in /assets
« Risposta #8 il: 25 Febbraio 2013, 15:37:26 CET »
0
Tutto si può riassumere con

Codice (Java): [Seleziona]
myWebView.loadUrl("file:///android_asset/"+ item.equals("it") ? "it":"en"+"_file.html");