2015-06-10 4 views
6

Ich versuche, eine Funktion zu implementieren, die App-Sprache ändern kann.
Ich habe versucht, es so zu setzen:Einstellung "AppleLanguages" ändert nicht die Sprache der App

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

Und nach ca. Neustart Sprache noch ‚Systemstandard‘ ist.
Jetzt teste ich verschiedene Sprachen durch Einstellung Scheme > Application Language > language.
Aber ist es möglich, Benutzer klicken Sie auf eine Schaltfläche und nach dem Neustart, um ausgewählte Sprache zu sehen?

Auch, was ist der richtige Weg, dies zu tun, um Sprachwechsel beim Neustart zu vermeiden?

Antwort

3

Ja, Sie können die App Sprache sofort ändern wie,

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) 

Ihre NSUserDefaults Wert Sprache verwenden.

+0

Ich habe dies in App Delegate versucht und es ändert nichts – 1110

+0

Haben Sie überprüft, hält Ihre NSUserDefaults den Wert, den Sie gespeichert haben? – Paddy

+0

Sorry, dein Code funktioniert Ich habe das nicht verstanden. Das bedeutet, wenn der Benutzer die Sprache wechselt, muss ich ihn (Sprachcode) irgendwie in Benutzerdefaults speichern und bekomme es bei jeder Übersetzung. Habe ich Recht? – 1110

0

Sie unten in AppDelegate.swift versucht kann -

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

Dies auch nicht funktioniert. Nichts passiert. – 1110

1

Wenn für Testzwecke Mittel, ändern Sie einfach die Sprache in Simulatoreinstellungen App.
Wenn Sie versuchen, eine Art Sprachauswahl in Ihrer App zu machen, ist es ziemlich painful und meiner Meinung nach sollten Sie nicht.
Ihre App liest die Sprach- und Gebietsschemaeinstellungen vom Gerät und ändert die Benutzeroberfläche entsprechend.
Dieses Verhalten zu übersteuern ist schwierig und Sie werden niemals eine vollständige Änderung der Sprache vornehmen. Wenn Sie beispielsweise eine Karte in Ihrer App anzeigen und Ihre Gerätesprache Spanisch ist, aber die App-Sprache Englisch ist, werden die Kartenangaben angezeigt in Spanisch.
Here ein Projekt, das helfen könnte.

+0

Aber wenn ich mich entscheide, auf die harte Tour zu gehen, dann bedeutet das, dass ich in jeder Hinsicht lokalisierte Werte bekommen muss, wie @Paddy in seiner Antwort geschrieben hat. Habe ich recht? – 1110

+0

Die von Paddy erklärte Methode zwingt das System, nach lokalisierten Strings in einem angegebenen Projektsprachenverzeichnis zu suchen. Es ist ein Weg, nicht der einzige. Wenn Sie auf Google suchen, finden Sie eine Menge von Experimenten, auch wenn sie in Obj-c-Konzepte sind immer noch gültig. – Andrea

4

Hier ist, wie Sie die Sprache ändern, bevor Sie starten in swift -

Lets sagen, ich Hebrew Lokalisierung erzwingen wollen:

1. Erstellen Sie Ihre eigenen Main.swift Klasse

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. Entfernen Sie die "Haupt" -AppDelegate.swift-Verantwortlichkeit

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

Dies wird Ihre App zu einem locale gezwungen, ohne

jede Einführung zu benötigen
+0

Ich habe Main.swift Datei erstellt und dann unter welcher Funktion oder Funktionsname muss ich den Code schreiben, der von Ihnen im ersten Punkt Ihrer Antwort bereitgestellt wird ?? – iDevAmit

+0

@iDeveloper keine Funktion, so sieht die 'Main.swift' Datei genau aus. – royherma

+1

das funktioniert leider nicht mehr für mich ... hat auch jemand Probleme mit swift 3 xcode 7+? – royherma

1

Sie haben die AppleLanguages Schlüssel mit einem Array zu setzen, nicht eine Zeichenfolge:

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

Das ist richtig, als String funktioniert es nicht. – Leon

+0

Nein, tut es nicht. 'synchronize()' wird nicht mehr empfohlen, entsprechend der Apple-Dokumentation: https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize – hujunfeng

+0

Danke .... zur Verdeutlichung –