Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios swift中的本地化。如何在运行时更改应用程序语言_Ios_Swift_Localization_Internationalization_Ios9 - Fatal编程技术网

ios swift中的本地化。如何在运行时更改应用程序语言

ios swift中的本地化。如何在运行时更改应用程序语言,ios,swift,localization,internationalization,ios9,Ios,Swift,Localization,Internationalization,Ios9,我正在ios swift中创建应用程序。现在我想使应用程序在双语言,所以从编辑器菜单,我只是导出和导入本地化。它为我创建了两个文件 现在我想把两个按钮放在我的应用程序的第一页上。当用户按下按钮1时,我想加载英语。如果用户按下按钮2,我想加载土耳其语。那么如何在swift中实现这一点呢?不要使用NSLocalizedString方法来本地化应用程序,而是根据所选语言加载可本地化字符串并从代码中使用它 从捆绑包加载数据: // Exemple with english language if let

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


现在我想把两个按钮放在我的应用程序的第一页上。当用户按下按钮1时,我想加载英语。如果用户按下按钮2,我想加载土耳其语。那么如何在swift中实现这一点呢?

不要使用
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)
    }
}
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)
    }
}
替换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)
    }
}
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)
    }
}

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

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

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


如果默认情况下每个应用程序都有一个语言切换器,那么为每个应用程序选择语言切换器将是一种非常麻烦的体验。这就是为什么本地化API的结构是这样的;如果您使用系统语言回退,那么一切都将按其应有的方式运行。

用户可以稍后在应用程序中更改语言,还是仅在开始时更改语言?仅在开始时更改start@MichaëlAzevedowhile在这一行NSNotificationCenter.defaultCenter().postNotificationName中添加类似SetLanguage(“Turkish_tr”)的语言时抛出错误(kNotificationLanguageChanged,object:nil)嗨,我在寻找你得到的错误。你复制了它吗?我很乐意提供帮助:)实际上是我的错,我在错误的地方调用了函数,但我解决了,现在它工作得很好谢谢你的反馈,我随时准备根据用户体验修复项目中的一些错误。更改本地化词典不会解决RTL(从右到左)语言的问题。我正在寻找一个解决方案,不仅将显示新的语言字符串,但也切换屏幕从LTR到RTL。有什么想法吗?我看到了一些帖子,但即使在重启应用程序后,也没有一篇能起作用。这些应用程序大多是用设备语言运行的,但我已经遇到了一个案例,即客户端希望根据远程服务器切换语言。然后我创建了这个本地化类。再一次,这是不推荐的,仍然会令人困惑。让你的客户重新考虑一下,不要给他们的用户带来混乱的体验,这是非常值得的。设置->常规->语言&Region@wakachamo在我看来,你的做法是家长式的。如果用户希望应用程序使用设备语言以外的其他语言,你应该假设他/她知道原因。我真的不同意这个答案。你的回答就像是懒得做这项工作。这不是这个问题的答案