Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    304

    [Android] cambio lingua a livello di applicazione

    Salve a tutti.
    Avrei bisogno di trovare un modo per cambiare la lingua a livello dell'intera applicazione Android ovvero creare un metodo (magari proprio nella classe dell'applicazione) che vada a reimpostare le risorse in modo che tutti i fragment vadano automaticamente a pescare le stringhe nel string.xml appropriato (it, en, fr e così via)
    Si può fare?
    Io ho provato a mettere questo codice (in Kotlin ma l'ho ricavato da un esempio in java) nell'activity

    codice:
    val res: Resources = applicationContext.getResources()
    val dm: DisplayMetrics = res.getDisplayMetrics()
    val conf: Configuration = res.getConfiguration()
    conf.setLocale(Locale(language.toLowerCase()))
    res.updateConfiguration(conf, dm)
    ma sembra che vada a modificare la lingua solo negli elementi caricati nel fragment corrente, se apro un altro fragment mi ritrovo la precedente lingua.
    E in un pop-up mi ha cambiato la lingua nel messaggio ma non sui bottoni.
    C'è qualche soluzione?

    Grazie in anticipo

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,187
    Premesso che non l'ho mai fatto, pare che quel codice sia corretto, ma che debba essere incluso in ogni Activity (e, di conseguenza, in ogni Fragment).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    304
    Grazie della risposta.
    Sto provando ma non riesco a farlo funzionare.
    Nell'app c'è un BaseFragment in cui viene definito un metodo initResources() che viene richiamato in tutti i Fragment.

    La funzione del cambio risorse è questa:

    codice:
    fun setLocaleLanguage(context: Context, language: String): Configuration? {
        val locale = Locale(language.lowercase())
        Locale.setDefault(locale)
    
        val res: Resources = context.getResources()
        val dm: DisplayMetrics = res.getDisplayMetrics()
        val conf: Configuration = res.getConfiguration()
        conf.setLocale(locale) // API 17+ only.
    res.updateConfiguration(conf, dm)
    
        return conf
    }
    Nel BaseFragment ho impostato il seguente codice:

    codice:
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
    }
    
    
    protected open fun initResources() {
        DeviceInfo.userLanguage?.run {
    MyLog.d(reqTag, "$reqTag: Aggiorno la lingua con quella settata dall'utente $this")
            val newConfig = LocaleHelper.setLocaleLanguage(requireActivity().applicationContext, this)
            newConfig?.run {
    onConfigurationChanged(this)
            }
        }
    
    }
    E nel Fragment derivato da BaseFragment

    codice:
    override fun initResources() {
        reqTag = "UserAccess"
    super.initResources()
    
        //text
    binding.title.text = getString(R.string.ua_title)
        binding.description.text = getString(R.string.ua_description)
    
    }
    dove title e description sono delle TextView presenti nel layout del Fragment.
    Nel blocco di codice del cambio lingua entra (super.initResources()) ma la lingua non viene cambiata

  4. #4
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,651
    Che ricordi io, se l'intento è quello di adeguare l'applicazione alla lingua corrente del dispositivo, non serve tutto ciò.
    E' sufficiente creare le risorse per ogni lingua nel giusto formato/nome e sarà il dispositivo a scegliere quelle coerenti con la lingua impostata (esattamente come avviene per le risorse per risoluzione del display).
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,187
    Quel initResources() dove viene chiamato?
    Perchè leggendo in giro pare che quel codice debba essere richiamato all'inizio ( nel onCreate() ).

    Vedi questa discussione in cui l'approccio usato è lo stesso tuo: una classe base da cui derivano le altre. Il codice è stato richiamato nel onCreate() della classe base.

    In questa, invece, parlano di un approccio diverso a causa del metodo Resources.updateConfiguration che è stato deprecato.


    @Misterxxx: io avevo inteso che volesse permettere all'utente di modificare la lingua dell'app, quindi di dover applicare un cambio programmaticamente. Se l'app deve, invece, adeguarsi alla lingua del dispositivo, allora effettivamente tutto sto casino non serve a nulla.


    Ciao.
    Ultima modifica di LeleFT; 13-05-2021 a 16:07
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    304
    Quote Originariamente inviata da Misterxxx Visualizza il messaggio
    Che ricordi io, se l'intento è quello di adeguare l'applicazione alla lingua corrente del dispositivo, non serve tutto ciò.
    E' sufficiente creare le risorse per ogni lingua nel giusto formato/nome e sarà il dispositivo a scegliere quelle coerenti con la lingua impostata (esattamente come avviene per le risorse per risoluzione del display).
    La mia necessità è quello di fare un cambio programmatico della lingua. ovvero l'app parte in italiano, clicco su un bottone dell'app e voglio che la lingua diventi inglese senza doverla chiudere.

  7. #7
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,651
    Quote Originariamente inviata da DarthSandr Visualizza il messaggio
    La mia necessità è quello di fare un cambio programmatico della lingua. ovvero l'app parte in italiano, clicco su un bottone dell'app e voglio che la lingua diventi inglese senza doverla chiudere.
    ok
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    304
    Ho visto gli esempi che hai linkato ma fanno tutti riferimento alla onCreate di un'activity, ho provato quella del Fragment ma non mi sta funzionando

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,187
    A quanto leggo, i Fragment vanno refreshati (staccati e riattaccati) affinché le modifiche abbiano effetto:

    https://stackoverflow.com/questions/...-for-fragments

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    304
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    A quanto leggo, i Fragment vanno refreshati (staccati e riattaccati) affinché le modifiche abbiano effetto:

    https://stackoverflow.com/questions/...-for-fragments

    Ciao.
    Grazie!
    Provo questa soluzione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.