Настройка "AppleLanguages" не меняет язык приложения

Я пытаюсь реализовать функцию, которая может изменить язык приложения.
Я попытался установить его так:

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

И после того, как язык перезагрузки приложений по-прежнему остается "системным дефолтом".
Теперь я тестирую разные языки, установив Scheme > Application Language > language.
Но возможно ли пользователю нажать кнопку и после перезагрузки увидеть выбранный язык?

Также, как это сделать, чтобы избежать изменения языка при перезагрузке?

Ответ 1

Да, вы можете сразу изменить язык приложения, например,

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)

используйте значение NSUserDefaults для языка.

Ответ 2

Вы должны установить ключ AppleLanguages с помощью массива, а не строки:

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

Ответ 3

Вот как вы меняете язык перед запуском в swift -

Предположим, что я хочу заставить локализацию Hebrew:

1. Создайте свой собственный класс 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. Удалите свою "главную" ответственность AppDelegate.swift

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

Это приведет к тому, что ваше приложение будет принудительно привязано к языку БЕЗ любого запуска

Ответ 4

Если это означает для целей тестирования, просто измените язык в приложении настроек симулятора.
Если вы пытаетесь сделать своего рода языковой селектор в своем приложении, это "довольно болезненный, и, на мой взгляд, вы не должны. Ваше приложение читает параметры языка и локали с устройства и соответственно изменяет пользовательский интерфейс.
Переопределить это поведение очень сложно, и вы никогда не сможете полностью изменить язык, например, если вы попытаетесь отобразить карту в своем приложении и вашем устройстве язык - испанский, но язык приложения - английский, вы увидите указания на карте, написанные на испанском языке.
Здесь проект, который может помочь.

Ответ 5

Вы можете попробовать ниже в AppDelegate.swift, хотя изменения появятся не сразу, а после того, как вы убьете и перезапустите свое приложение. -

NSUserDefaults.standardUserDefaults().removeObjectForKey("AppleLanguages")
NSUserDefaults.standardUserDefaults().setObject(["de"], forKey: "AppleLanguages"   
NSUserDefaults.standardUserDefaults().synchronize()

Ответ 6

Обновлен синтаксис main.swift файла main.swift упомянутого в ответе @royherma:

import Foundation
import UIKit

// Your initialization code here
let langCultureCode: String = "LANGUAGE_CODE"

UserDefaults.standard.set([langCultureCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

в сочетании с удалением @UIApplicationMain в файле AppDelegate.swift.