Настройка "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
.