iOS 获取特定语言的本地化字符串版本

15

我正在开发一款iOS应用程序,将提供英语和法语两种语言。我已阅读了一些有关国际化的教程,并对其工作原理和我需要做什么有了了解。

我的问题是,有一个特定情况,我想为英语用户加载法语字符串。

我知道可以为整个应用程序设置语言,但需要在应用程序重新启动之前才能生效。我希望避免这种情况,而是能够根据需要选择加载法语或英语字符串。

是否可以通过编程方式从.strings文件中加载特定语言的字符串?


相关:链接 - Sergey Kalinichenko
@dasblinkenlight 看起来是个不错的解决方案,谢谢。 - raydowe
2个回答

11

是的,这是可能的,但要完成并不容易。

我有一个情况,需要为 GAI(iOS 的 Google Analytics)发送一个 ViewController 的相同名称(适用于所有语言)。

先决条件:

1)我使用此处的 NSBundle 扩展 https://dev59.com/LnI-5IYBdhLWcg3wy70d#20257557 - 也许首先在那里查找是个好主意。 (说实话,这非常聪明)

2)我正在使用 Swift 2

这里有一个相当简单的代码示例来说明我的想法:

func getFrenchString(forKey key: String) -> String {
    if let currentLanguage = (NSUserDefaults.standardUserDefaults().arrayForKey(AppleLanguages)?.first as? String) {
        if currentLanguage == "fr" {
            return NSLocalizedString(key, comment: "")
        }
        else {
            //the application is not currently on `fr`
            //change application to `fr`
            NSBundle.setLanguage("fr")

            //get the localized string on `fr`
            let frString = NSLocalizedString(key, comment: "")

            //return the application to the old language
            NSBundle.setLanguage(currentLanguage)

            return frString
        }
    }

    return ""
}

此外,您的项目中应该有“fr.lproj”文件夹,并且其中包含本地化字符串。


这难道不违反应用商店的指南吗? - Alec von Barnekow
到目前为止,我在提交应用程序到应用商店方面与本地化相关的问题都没有遇到过。您考虑的是指南的哪一点?@AlecvonBarnekow - dvp.petrov

10
我用这个方法扩展了字符串,你可以通过这种方式获取应用程序中任何区域设置的本地化字符串。
extension String {
    func localized(forLanguageCode lanCode: String) -> String {
        guard
            let bundlePath = Bundle.main.path(forResource: lanCode, ofType: "lproj"),
            let bundle = Bundle(path: bundlePath)
        else { return "" }
        
        return NSLocalizedString(
            self,
            bundle: bundle,
            value: " ",
            comment: ""
        )
    }
}

例如(当系统语言为英语时,获取乌克兰语的本地化字符串):

"settings_choose_language".localized(forLanguageCode: "uk")

你不需要使用宏来获取字符串。你也可以使用return bundle.localizedString(forKey: self, value: nil, table: nil)来获取。 - Gerry Shaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接