2010-08-02 15 views
5

Vorrei cambiare la lingua (impostazioni internazionali dell'applicazione) a livello di programmazione.Localizzazione Android e menu

Il problema principale per me è l'aggiornamento delle etichette dei menu.

ho provato il seguente metodo:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeMenuLabels) { 
     for (int i = 0; i < menu.size(); i++) { 
      MenuItem menuItem = menu.getItem(i); 
      switch (menuItem.getItemId()) { 
       case R.id.menu_main_about: 
        menuItem.setTitle(R.string.menu_about); 
        break; 
       case R.id.menu_main_preferences: 
        menuItem.setTitle(R.string.menu_prefs); 
        break; 
      } 
     } 
     shouldChangeMenuLabels = false; 
    } 

ma sono sicuro che cattiva idea. Voglio evitare di usare l'istruzione switch-case in quanto questo non è un metodo universale (non posso semplicemente eseguire il port di snipped ad altre attività/non posso fare una classe astratta che lo faccia).


BTW, tutti i menu sono stati descritti in file XML di menu/*. Quindi non voglio duplicare il codice. Qualcuno ha idee?

Preoccupato per prima risposta: ho cambiato Hae locale con il seguente codice:

  Locale locale = new Locale((String)newValue); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getApplication().getResources().updateConfiguration(config, getApplication().getResources().getDisplayMetrics()); 

Ma come voglio controllare rotante per ogni attività, non sono mai finito. Forse ho fatto qualcosa di sbagliato?

risposta

5

non so è una buona idea, ma ho trovato modo seguente:

@Override 
public boolean onMenuOpened(int featureId, Menu menu) { 
    if (shouldChangeLocale) { 
     menu.clear(); 
     MenuInflater inflater = getMenuInflater(); // -->onCreateMenu (Menu) 
     inflater.inflate(R.menu.menu_main, menu); ///
     shouldChangeLocale=false; 
    } 

    return super.onMenuOpened(featureId, menu); 
} 

ho bisogno del vostro consiglio, devo fare questo modo?

0

Hai letto la documentazione su Android Localization? Generalmente si crea un file di stringhe diverso per ogni lingua/locale che si desidera supportare. Nel tuo file menu.xml puoi fare riferimento agli id ​​della stringa e il valore corretto verrà selezionato in base alle impostazioni locali correnti.

+0

L'ho fatto. (Intendo valori -xx/string.xml e valori/string.xml). Vuoi creare menu-xx/mymenu.xml? – davs

+0

Quindi hai valori -xx/string.xml con una stringa, menu_about e valori -yy/string.xml con una stringa, menu_about. Si imposta la locale del proprio telefono su quella di yy e il valore della stringa non cambia in yy? Con quali impostazioni locali stai testando? http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch parla di come decide quale valore usare, potresti non avere la tua locale configurata correttamente. –

+0

Sto testando con en/ru locales. Ma poiché non ho distrutto le attività, il menu non è stato aggiornato. Quindi, ho deciso di svuotare il menu e crearlo da zero – davs

0

menu.add (0, MENU_ABOUT, 0, _mContext.getResources() getString (R.string.mymenu).) SetIcon (R.drawable.ic_menu).;

Durante la creazione del menu, inserire la stringa e localizzarla.

+0

Come so menu crea solo quelli per ogni attività a causa del suo ciclo di vita. Non ho problemi con la localizzazione dovuta alla creazione ..Ho un problema quando il menu è stato creato, quindi ho cambiato la localizzazione dell'applicazione e voglio ricaricare il menu (magari distruggerlo e crearlo di nuovo, ma non so come distruggerlo) – davs

+0

puoi usare preferenze condivise e cambiarlo su ogni selezione della voce di menu \t \t se (preferences.getBoolean ("Sound", true)) \t \t { \t \t \t \t \t menu.add (0, MENU_SOUND, 0, "Sound") .setIcon (R.drawable.on); \t \t} \t \t altro \t \t { \t \t menu.add (0, MENU_SOUND, 0, "Suono") setIcon (R.drawable.off).; \t \t \t \t \t} – Eby

+0

Non voglio creare menù modo credo che la sua una cattiva pratica – davs

Problemi correlati