Skip to content

Commit 161ab81

Browse files
authored
Merge pull request swiftlang#1474 from pvieito/locale-briding-fix
2 parents c76e152 + 9336661 commit 161ab81

File tree

3 files changed

+32
-44
lines changed

3 files changed

+32
-44
lines changed

CoreFoundation/Locale.subproj/CFLocale.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,7 @@ _CFLocaleCalendarDirection _CFLocaleGetCalendarDirection(void) {
10801080
#endif
10811081
}
10821082

1083-
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_WINDOWS
1083+
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX
10841084
static CFArrayRef _CFLocaleCopyPreferredLanguagesFromPrefs(CFArrayRef languagesArray) {
10851085
CFMutableArrayRef newArray = CFArrayCreateMutable(kCFAllocatorSystemDefault, 0, &kCFTypeArrayCallBacks);
10861086
if (languagesArray && (CFArrayGetTypeID() == CFGetTypeID(languagesArray))) {
@@ -1100,7 +1100,7 @@ static CFArrayRef _CFLocaleCopyPreferredLanguagesFromPrefs(CFArrayRef languagesA
11001100
#endif
11011101

11021102
CFArrayRef CFLocaleCopyPreferredLanguages(void) {
1103-
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_WINDOWS
1103+
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_WINDOWS || DEPLOYMENT_TARGET_LINUX
11041104
CFArrayRef languagesArray = (CFArrayRef)CFPreferencesCopyAppValue(CFSTR("AppleLanguages"), kCFPreferencesCurrentApplication);
11051105
CFArrayRef result = _CFLocaleCopyPreferredLanguagesFromPrefs(languagesArray);
11061106
if (languagesArray) CFRelease(languagesArray);

Foundation/NSLocale.swift

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -99,62 +99,31 @@ extension NSLocale {
9999
}
100100

101101
open class var availableLocaleIdentifiers: [String] {
102-
var identifiers = Array<String>()
103-
for obj in CFLocaleCopyAvailableLocaleIdentifiers()._nsObject {
104-
identifiers.append(obj as! String)
105-
}
106-
return identifiers
102+
return _SwiftValue.fetch(CFLocaleCopyAvailableLocaleIdentifiers()) as? [String] ?? []
107103
}
108104

109105
open class var isoLanguageCodes: [String] {
110-
var identifiers = Array<String>()
111-
for obj in CFLocaleCopyISOLanguageCodes()._nsObject {
112-
identifiers.append((obj as! NSString)._swiftObject)
113-
}
114-
return identifiers
106+
return _SwiftValue.fetch(CFLocaleCopyISOLanguageCodes()) as? [String] ?? []
115107
}
116108

117109
open class var isoCountryCodes: [String] {
118-
var identifiers = Array<String>()
119-
for obj in CFLocaleCopyISOCountryCodes()._nsObject {
120-
identifiers.append((obj as! NSString)._swiftObject)
121-
}
122-
return identifiers
110+
return _SwiftValue.fetch(CFLocaleCopyISOCountryCodes()) as? [String] ?? []
123111
}
124112

125113
open class var isoCurrencyCodes: [String] {
126-
var identifiers = Array<String>()
127-
for obj in CFLocaleCopyISOCurrencyCodes()._nsObject {
128-
identifiers.append((obj as! NSString)._swiftObject)
129-
}
130-
return identifiers
114+
return _SwiftValue.fetch(CFLocaleCopyISOCurrencyCodes()) as? [String] ?? []
131115
}
132116

133117
open class var commonISOCurrencyCodes: [String] {
134-
var identifiers = Array<String>()
135-
for obj in CFLocaleCopyCommonISOCurrencyCodes()._nsObject {
136-
identifiers.append((obj as! NSString)._swiftObject)
137-
}
138-
return identifiers
118+
return _SwiftValue.fetch(CFLocaleCopyCommonISOCurrencyCodes()) as? [String] ?? []
139119
}
140120

141121
open class var preferredLanguages: [String] {
142-
var identifiers = Array<String>()
143-
for obj in CFLocaleCopyPreferredLanguages()._nsObject {
144-
identifiers.append((obj as! NSString)._swiftObject)
145-
}
146-
return identifiers
122+
return _SwiftValue.fetch(CFLocaleCopyPreferredLanguages()) as? [String] ?? []
147123
}
148124

149125
open class func components(fromLocaleIdentifier string: String) -> [String : String] {
150-
var comps = Dictionary<String, String>()
151-
let values = CFLocaleCreateComponentsFromLocaleIdentifier(kCFAllocatorSystemDefault, string._cfObject)._nsObject
152-
values.enumerateKeysAndObjects(options: []) { (k, v, stop) in
153-
let key = (k as! NSString)._swiftObject
154-
let value = (v as! NSString)._swiftObject
155-
comps[key] = value
156-
}
157-
return comps
126+
return _SwiftValue.fetch(CFLocaleCreateComponentsFromLocaleIdentifier(kCFAllocatorSystemDefault, string._cfObject)) as? [String : String] ?? [:]
158127
}
159128

160129
open class func localeIdentifier(fromComponents dict: [String : String]) -> String {

TestFoundation/TestNSLocale.swift

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class TestNSLocale : XCTestCase {
2121
("test_constants", test_constants),
2222
("test_Identifier", test_Identifier),
2323
("test_copy", test_copy),
24-
("test_availableIdentifiers", test_availableIdentifiers),
24+
("test_staticProperties", test_staticProperties),
2525
("test_localeProperties", test_localeProperties),
2626
]
2727
}
@@ -110,10 +110,29 @@ class TestNSLocale : XCTestCase {
110110
XCTAssertTrue(locale == localeCopy)
111111
}
112112

113-
func test_availableIdentifiers() {
114-
XCTAssertNoThrow(Locale.availableIdentifiers)
113+
func test_staticProperties() {
114+
let euroCurrencyCode = "EUR"
115+
let spainRegionCode = "ES"
116+
let galicianLanguageCode = "gl"
117+
let galicianLocaleIdentifier = Locale.identifier(fromComponents: [NSLocale.Key.languageCode.rawValue: galicianLanguageCode,
118+
NSLocale.Key.countryCode.rawValue: spainRegionCode])
119+
120+
XCTAssertTrue(galicianLocaleIdentifier == "\(galicianLanguageCode)_\(spainRegionCode)")
121+
122+
let components = Locale.components(fromIdentifier: galicianLocaleIdentifier)
123+
124+
XCTAssertTrue(components[NSLocale.Key.languageCode.rawValue] == galicianLanguageCode)
125+
XCTAssertTrue(components[NSLocale.Key.countryCode.rawValue] == spainRegionCode)
126+
127+
XCTAssertTrue(Locale.availableIdentifiers.contains(galicianLocaleIdentifier))
128+
XCTAssertTrue(Locale.commonISOCurrencyCodes.contains(euroCurrencyCode))
129+
XCTAssertTrue(Locale.isoCurrencyCodes.contains(euroCurrencyCode))
130+
XCTAssertTrue(Locale.isoRegionCodes.contains(spainRegionCode))
131+
XCTAssertTrue(Locale.isoLanguageCodes.contains(galicianLanguageCode))
132+
133+
XCTAssertTrue(Locale.preferredLanguages.count == UserDefaults.standard.array(forKey: "AppleLanguages")?.count ?? 0)
115134
}
116-
135+
117136
func test_localeProperties(){
118137
#if os(Android)
119138
XCTFail("Locale lookup unavailable on Android")

0 commit comments

Comments
 (0)