我可以将我的 iOS 应用程序本地化为西班牙语或德语,同时将手机的其余部分保持为英语吗?

Posted

技术标签:

【中文标题】我可以将我的 iOS 应用程序本地化为西班牙语或德语,同时将手机的其余部分保持为英语吗?【英文标题】:can I localize my iOS app to Spanish or German while keeping the rest of the phone in English? 【发布时间】:2018-07-31 04:08:37 【问题描述】:

用户希望我们的 ios 应用程序语言设置与用户的 iPhone 语言完全分开。基本上,在应用程序本身内部,用户选择应用程序的语言,然后应用程序的 UI 和文本全部更改为所选语言。这比 Apple 的本地化标准更灵活,他们没有解决这种情况。关于如何做到这一点,是否有一些公认的最佳实践?

具体来说,用户可能希望应用程序的界面是西班牙语,但手机的其余部分仍然是英语。

谢谢!

【问题讨论】:

在产品|方案中,您可以修改现有方案或创建副本。在“运行/选项”页面中,您可以指定“应用程序语言”和“应用程序区域”,可用于启动具有特定设置的应用程序,而无需修改设备设置 谢谢,但用户可以通过 UI 访问此设置吗?我正在寻找“应用内语言选择”。默认的“正确”方式是应用程序遵循手机的语言。 我不知道要在应用程序中进行,但这并不意味着它不能完成 【参考方案1】:

像在 iOS 中进行默认本地化一样创建 Localizable.strings。然后用这段代码在应用中实现语言切换。

extension String 

    func localized() -> String 

       let selectedLanguage = UserDefaults.standard.string(forKey:) CURRENT_LANGUAGE) 

            guard let path = Bundle.main.path(forResource: selectedLanguage == "en" ? "Base" : selectedLanguage, ofType: "lproj") else 

                if let basePath = Bundle.main.path(forResource: "Base", ofType: "lproj")

                    return Bundle(path: basePath)?.localizedString(forKey: self, value: "", table: nil) ?? self
                

                return self
            

            return Bundle(path: path)?.localizedString(forKey: self, value: "", table: nil) ?? self


    

您可以通过调用 let text = "LOGIN_SCREEN_TITLE".localized() 访问本地化字符串,其中 LOGIN_SCREEN_TITLE 已添加到本地化文件中。

enum LanguagesSupported: String 

    case English = "en"
    case French  = "fr"


UserDefaults.standard.set(LanguagesSupported.French.rawValue, forKey: CURRENT_LANGUAGE)

【讨论】:

不要使用value(forKey:)UserDefaults获取数据。在这种情况下使用string(forKey:) 哦,是的,谢谢@rmaddy。使用它我们可以删除强制转换吗? 是的,string(forKey:) 不需要演员表。 value(forKey:) 仅在需要键值编码时使用。您还需要删除synchronize() 的使用。它不是必需的,实际上已被标记为已过时。【参考方案2】:

首先创建一个这样的语言代码和语言名称字典

let applicationLanguages = ["de":"German","es":"Spanish"]

然后当用户可以选择特定的语言然后点击任何按钮后调用此函数并终止应用程序。

func setLanguage(languageCode: String)
        let languageArray = NSArray(objects: languageCode)
        UserDefaults.standard.set(languageArray, forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()
        UserDefaults.standard.set(true, forKey: "changedLanguage")
        UserDefaults.standard.set(languageCode, forKey: "AppLanguage")

    

然后显示所选语言的警报,然后单击确定杀死应用程序。

 func endBackgroundTask() 
     exit(0)
  

【讨论】:

这个答案很危险,可能会导致您的应用被拒绝(第 2.1 节)> developer.apple.com/app-store/review/guidelines

以上是关于我可以将我的 iOS 应用程序本地化为西班牙语或德语,同时将手机的其余部分保持为英语吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用西班牙语本地化作为加泰罗尼亚语本地化

静态 UIView 在本地化为法语时更改宽度

iOS 应用程序本地化在模拟器上工作,但在手机上不工作

我们如何正确本地化钱包通行证的 strip.png?

iOS 本地化 - 无法识别 es-US 与 es-MX

iOS 二进制本地化