对于es-419

时间:2017-03-24 19:27:45

标签: ios swift swift3

----更新2017年3月28日----

当您通过Xcode中的“编辑方案”设置应用的语言和区域时,您将获得es-419_MX的组合区域设置标识符。但是,当您通过进入设置更改设备/模拟器的实际语言和区域时,您将获得“正确”的区域设置标识es_MX,同时保持es-419的语言代码,从而有效地解决几乎每个用例的问题。

// After setting language and region in Edit Scheme from Xcode
print(Bundle.main.preferredLocalizations) // ["es-419", "es"]
print(Locale.current) // es-419_MX (current)

// After setting the language and region from Settings
print(Bundle.main.preferredLocalizations) // ["es-419", "es"]
print(Locale.current) // es_MX (current)

---- /更新----

我正在将我的应用本地化为拉丁美洲西班牙语(es-419)。当我尝试使用NumberFormatter显示本地化货币时,iOS会返回一个圣甲虫¤而不是一个美元符号$

例如,如果用户的区域是墨西哥,则他们将拥有区域代码es-419_MX。以下代码返回$

,而不是返回¤
let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "es-419_MX")
formatter.numberStyle = .currency
formatter.currencySymbol // ¤

如果我删除“419”,我会得到正确的货币符号:

let formatter = NumberFormatter()
formatter.locale = Locale(identifier: "es_MX")
formatter.numberStyle = .currency
formatter.currencySymbol // $

Locale.current返回es-419_MX时是否可以获得正确的货币符号?或者我将不得不求助于从语言环境代码中删除419实例的黑客攻击?

实际代码:

func localizedCurrency(value: Double) -> String {
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.locale = Locale.current
    return formatter.string(from: NSNumber(value: value)) ?? "$\(value)"
}

1 个答案:

答案 0 :(得分:3)

你必须做黑客攻击,否则你必须具体针对每个国家。

由于es_419是所有拉丁美洲国家的通用规范,因此无法猜测"您希望$显示。

es_419区域"父母"下的不同国家/地区有不同的货币特征标准。例如,玻利维亚的货币符号为Bs

ICU Locale “Spanish (Bolivia)” (es_BO)