在iOS / Swift中首次启动应用程序之前设置默认语言

时间:2017-12-02 06:56:33

标签: ios swift localization internationalization

我想在应用首次启动时将另一种语言设置为默认语言。 iOS没有这种语言作为界面语言,所以我唯一的方法是手动设置它。我已经在SO上找到了几十个解决方案,那些有效的解决方案只能在模拟器中工作而不能在真实设备上工作。这是我尝试过的:

首先,设置应用程序语言的方法是:

UserDefaults.standard.set(["xx-XX", "yy-YY"], forKey: "AppleLanguages")

问题是,这需要重新启动应用,而我希望第一次启动应用时设置。我也试过了:

UserDefaults.standard.register(defaults: ["AppleLanguages": ["xx-XX", "yy-YY"]])

甚至调用UserDefaults.standard.synchronize(),在大多数情况下根本不需要。

我试过这些代码的地方:

  1. 应用(中:didFinishLaunchingWithOptions:)
  2. application init:|
  3. UIApplication进行子类化,创建main.swift并添加 以上代码作为顶级声明
  4. info.plist

    1. Localization native development region设为xx-XX
    2. Localizations的第一个元素设置为xx-XX
    3. 顺便说一下,此时实施自定义本地化不是一种选择。

      最令我困惑的是,为什么这样的功能在模拟器中工作而不是真正的设备。

      修改 我甚至删除了默认的英语语言,然后再次添加English (World),以便旁边没有Development Language标签。仍然没有奏效。

3 个答案:

答案 0 :(得分:2)

在开始停止按钮旁边的Xcode上,你可以按" projectName" - >编辑方案... - >运行 - >应用程序语言中的选项和更改

enter image description here

答案 1 :(得分:0)

嗯,没有一种合法的方法可以做到这一点。所以我不得不使用一个讨厌的技巧。

  1. 添加了我们未使用的语言(在本例中为struct WeatherData { var temp: String var climate: String var date: String } extension WeatherData: Decodable { enum RootKey: String, CodingKey { case query enum ResultsKey: String, CodingKey { case results, count, lang, created enum ChannelKey: String, CodingKey { case channel enum ItemKey: String, CodingKey { case item enum ConditionKey: String, CodingKey { case condition enum WeatherConditions: String, CodingKey { case temp case text case date } } } } } } init(from decoder: Decoder) throws { let query = try decoder.container(keyedBy: RootKey.self) let results = try query.nestedContainer(keyedBy: RootKey.ResultsKey.self, forKey: .query) let channel = try results.nestedContainer(keyedBy: RootKey.ResultsKey.ChannelKey.self, forKey: .results) var itemContainerUnidentified = try channel.nestedUnkeyedContainer(forKey: .channel) let itemContainerIdentified = try itemContainerUnidentified.nestedContainer(keyedBy: RootKey.ResultsKey.ChannelKey.ItemKey.self) let condition = try itemContainerIdentified.nestedContainer(keyedBy: RootKey.ResultsKey.ChannelKey.ItemKey.ConditionKey.self, forKey: .item) let weather = try condition.nestedContainer(keyedBy: RootKey.ResultsKey.ChannelKey.ItemKey.ConditionKey.WeatherConditions.self, forKey: .condition) temp = try weather.decode(String.self, forKey: .temp) date = try weather.decode(String.self, forKey: .date) climate = try weather.decode(String.self, forKey: .text) enter image description here
  2. 在创作过程中,选择英语(yy-YY,如我的问题)作为参考语言(这样我就不必再进行任何翻译/本地化) enter image description here
  3. 此时,我的开发语言开始了,xx-XX(在本例中为fa-IR)是我的默认语言。你知道其余的,设置fr用户默认值。

    同样,这不是最好和最干净的方法,如果您在开发过程的早期阶段,请使用本地化您的应用的自定义实现,或使用L10n-Swift。当然,如果你不能坚持iOS根据用户选择的设备区域设置为你选择的东西。

答案 2 :(得分:0)

要使默认语言成为一种特定的语言,以下代码的工作原理就像一种魅力。(Swift 4.2)

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")