2015-06-10 5 views
6

Sto tentando di implementare una funzione che può modificare il linguaggio delle app.
ho cercato di impostare in questo modo:L'impostazione "AppleLanguages" non cambia la lingua delle app

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("de", forKey: "AppleLanguages") 

E dopo il riavvio lingua app è ancora 'di default del sistema'.
Ora provo diverse lingue impostando Scheme > Application Language > language.
Ma è possibile fare clic su un pulsante e dopo il riavvio per vedere la lingua selezionata?

Inoltre, quale è il modo corretto di farlo per evitare di cambiare lingua al riavvio?

risposta

3

Sì, è possibile cambiare la lingua app immediatamente come,

var language = "de" 
let path = NSBundle.mainBundle().pathForResource(language, ofType: "lproj") 
let bundle = NSBundle(path: path!) 
let string = bundle?.localizedStringForKey("key", value: nil, table: nil) 

usare il tuo valore NSUserDefaults al linguaggio.

+0

Ho provato questo in delegato app e non cambia nulla – 1110

+0

Hai controllato che NSUserDefaults contiene il valore che hai salvato? – Paddy

+0

Scusa il tuo codice funziona Non ho capito il punto di questo. Ciò significa che quando l'utente cambia lingua, devo salvarlo (codice della lingua) in qualche modo in userdefaults e scaricarlo in ogni traduzione. Ho ragione? – 1110

0

È seguito potrebbero provato in AppDelegate.swift -

NSUserDefaults.standardUserDefaults().removeObjectForKey("AppleLanguages") 
NSUserDefaults.standardUserDefaults().setObject("de", forKey: "AppleLanguages" 
NSUserDefaults.standardUserDefaults().synchronize() 
+0

Questo non funziona anche. Non accade nulla. – 1110

1

Se media per scopo di test, basta cambiare la lingua nell'app delle impostazioni del simulatore.
Se si sta tentando di impostare una sorta di selettore di lingua nella propria app, è piuttosto painful e, a mio parere, non si dovrebbe.
L'app legge la lingua e le impostazioni internazionali dal dispositivo e modifica l'interfaccia utente di conseguenza.
Ignorare questo comportamento è difficile e non cambierai mai completamente la lingua, ad esempio se provi a visualizzare una mappa nell'app e la lingua del tuo dispositivo è lo spagnolo, ma la lingua dell'app è inglese, vedrai le indicazioni della mappa scritte in spagnolo.
Here un progetto che potrebbe aiutare.

+0

Ma se decido di procedere nel modo più duro, ciò significa che ho bisogno di ottenere valori localizzati in ogni visualizzazione nel modo in cui @Paddy ha scritto nella sua risposta. Ho ragione? – 1110

+0

Il modo in cui Paddy ha spiegato costringe il sistema a cercare la stringa localizzata in una specifica directory della lingua del progetto. È un modo non l'unico. Se cerchi su google troverai molti esperimenti anche se sono in obj-c concetti dietro sono ancora validi. – Andrea

4

Ecco come si modifica la lingua prima del lancio in swift -

Diciamo che voglio forzare Hebrew localizzazione:

1. Creare la propria classe Main.swift

import Foundation 
import UIKit 

// Your initialization code here 
let langCultureCode: String = "he_IL" 
let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject([langCultureCode], forKey: "AppleLanguages") 
defaults.synchronize() 

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate)) 

2. Rimuovere la responsabilità "principale" AppDelegate.swift

//@UIApplicationMain <-- COMMENT THIS OUT 
class AppDelegate: UIResponder, UIApplicationDelegate 

Questo renderà la vostra applicazione costretto ad un locale senza bisogno di alcun lancio

+0

Ho creato il file Main.swift e quindi sotto quale funzione o nome di funzione ho bisogno di scrivere il codice che ti viene fornito nel primo punto della tua risposta ?? – iDevAmit

+0

@iDeveloper nessuna funzione, ecco come appare il file 'Main.swift'. – royherma

+1

questo purtroppo non funziona più per me ... anche in caso di problemi con swift 3 xcode 7+? – royherma

1

È necessario impostare la chiave AppleLanguages con una serie, non una stringa:

UserDefaults.standard.set(["de"], forKey: "AppleLanguages") 
+0

Questo è corretto, poiché una stringa non funziona. – Leon

+0

No, non è così. 'synchronize()' non è raccomandato l'uso più, secondo la documentazione di Apple: https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize – hujunfeng

+0

Grazie .... per chiarimenti –