【问题标题】:Swift NSLocale programming constantsSwift NSLocale 编程常量
【发布时间】:2017-12-17 16:44:34
【问题描述】:

有没有更好的编码方式而不使用魔法“en”、“es”字符串?

 let pre = Locale.preferredLanguages[0]
 if pre == "en"
    ....
  else if pre == "es"
    ....
  else if pre == "xx"
    ....

我正在考虑得到编译时错误,而不是犯错误这样会更好

 let pre = Locale.preferredLanguages[0]
 if pre == NSLocale.something.ENGLISH
    ....
  else if pre == NSLocale.something.SPANISH
    ....
  else if pre == //and so on
    ....

但我找不到任何东西。

这是正确的编码方式吗?

【问题讨论】:

  • 你可以自己制作一组常量。
  • 扩展语言环境并使用您的语言常量名称设置语言。

标签: ios swift internationalization


【解决方案1】:

对于您计划在您的应用中支持的语言,创建一个将preferredLanguages 映射到枚举案例的枚举。下面的片段添加了英语和西班牙语的案例。

// Create an enum that maps known language "Strings" to a case statement.
public enum LanguageMap : String{
    // Add a case for all the languages you app will support
    case English = "en"
    case Spanish = "es"
}

扩展 Locale 以添加将返回 [LanguageMap] 对象而不是 [String] 的属性。

// Extend the Locale class to return

extension Locale{
    public static var preferredLanguageMap : [LanguageMap] {
        let langMap = Locale.preferredLanguages.flatMap({return LanguageMap.init(rawValue: $0) })
        return langMap
    }
}

在您的应用程序中,将 if-else 语句替换为 switch case 语句。

// Your application Logic.

switch Locale.preferredLanguageMap.first! {

case .English :
    print("Do Something the English Way")

case .Spanish :
    print("Do Something the Spanish Way")

default:
    print("Do Anything... Throw an error/Default Handling.")
    // Note : Locale.availableIdentifiers has 789 language identifiers till date.
    // This could also change in the future.
    // Ensure you have some default logic for all 'other languages' here.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多