【问题标题】:localization in ios swift. how can i change application language at run timeios swift中的本地化。如何在运行时更改应用程序语言
【发布时间】:2016-02-16 06:58:17
【问题描述】:

我正在 ios swift 中创建应用程序。现在我想用双语制作应用程序,所以我只需从编辑器菜单中导出和导入以进行本地化。它为我创建了两个文件。

现在我想在我的应用程序的第一页上放置两个按钮。当用户按下按钮 1 我想加载英语。如果用户按下按钮 2 我想加载土耳其语。那么我怎样才能快速做到这一点呢?

【问题讨论】:

  • 用户可以稍后在应用程序中更改语言还是在启动时更改语言?
  • 刚开始@MichaëlAzevedo

标签: ios swift localization internationalization ios9


【解决方案1】:

不要使用NSLocalizedString方法来本地化您的应用程序,而是根据选择的语言加载可本地化的字符串并从您的代码中使用它。

从包中加载数据:

// Exemple with english language
if let path = NSBundle(forClass:object_getClass(self)).URLForResource("Localizable", withExtension: "strings", subdirectory: nil, localization: "en")?.path {
    if NSFileManager.defaultManager().fileExistsAtPath(path)     {
        // Keep a reference to this dictionary
        dicoLocalisation = NSDictionary(contentsOfFile: path)
    }
}

替换 NSLocalizedString :

func localizedStringForKey(key:String) -> String { 
    // First we check if the dictionary exists       
    if let dico = dicoLocalisation {

        if let localizedString = dico[key] as? String {
            // If the localization exists, return it
            return localizedString
        }  else {
            // Returns the key if no String was found
            return key
        }
    } else {
        // If not, we can use the NSLocalizedString function
        return NSLocalizedString(key, comment: key)
    }
}

如果您想快速处理此问题,我在 Github 上提供了一个自定义本地化器类,它允许您从应用程序的任何位置切换语言,甚至可以保存以供进一步启动应用程序。实现与我解释的几乎相同。

【讨论】:

  • 在添加像 SetLanguage("Turkish_tr") 这样的语言时,它在这一行 NSNotificationCenter.defaultCenter().postNotificationName(kNotificationLanguageChanged, object: nil) 中抛出错误
  • 嗨,我正在寻找您遇到的错误。你重现了吗?否则我很乐意提供帮助:)
  • 实际上是我的错,我在错误的地方调用了函数,但我解决了现在它工作得很好
  • 感谢您的反馈,我随时准备根据用户体验修复项目中的一些错误。
  • 更改本地化字典并不能解决 RTL(从右到左)语言的问题。我正在寻找一种解决方案,它不仅可以以新语言显示字符串,还可以将屏幕从 LTR 切换到 RTL。任何的想法?我看到了一些帖子,但即使重新启动应用程序也没有效果
【解决方案2】:

请不要这样做。这会导致非常混乱的用户体验;人们希望他们的应用以他们选择的系统语言运行。

当涉及到您无法控制的 UI 和字符串时,您也会遇到问题,例如系统视图控制器(例如共享文件)和日期、数字、数量等的格式化程序。

如果每个应用程序默认都有一个语言切换器,那么为每个应用程序选择它将是一个非常麻烦的体验。这就是本地化 API 以这种方式构建的原因;如果您使用系统语言后备,那么一切都会按应有的方式工作。

【讨论】:

  • 这些应用程序大多是使用设备语言运行的,但我已经遇到过客户端想要根据远程服务器切换语言的情况。然后我创建了这个本地化类。
  • 再一次不推荐这样做,并且仍然会令人困惑。让您的客户重新考虑不要给他们的用户带来令人困惑的体验,这是非常值得的。
  • 设置 -> 常规 -> 语言和地区
  • @wakachamo 在我看来,您的做法是家长式的。如果用户希望应用使用设备语言以外的其他语言,您应该假设他/她知道原因。
  • 我真的不同意这个答案。你的回答只是懒惰做这项工作。这不是这个问题的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2016-10-14
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多