/ NSLocale.m
NSLocale.m
1 // 2 // NSLocale.m 3 // CoreFoundation 4 // 5 // Copyright (c) 2014 Apportable. All rights reserved. 6 // 7 8 #import <Foundation/NSLocale.h> 9 10 #import <Foundation/NSArray.h> 11 #import <Foundation/NSDictionary.h> 12 #import "NSObjectInternal.h" 13 #import "ForFoundationOnly.h" 14 15 CF_PRIVATE 16 @interface __NSCFLocale : NSLocale 17 @end 18 19 NSString *const NSCurrentLocaleDidChangeNotification = @"kCFLocaleCurrentLocaleDidChangeNotification"; 20 NSString *const NSLocaleIdentifier = @"kCFLocaleIdentifierKey"; 21 NSString *const NSLocaleLanguageCode = @"kCFLocaleLanguageCodeKey"; 22 NSString *const NSLocaleCountryCode = @"kCFLocaleCountryCodeKey"; 23 NSString *const NSLocaleScriptCode = @"kCFLocaleScriptCodeKey"; 24 NSString *const NSLocaleVariantCode = @"kCFLocaleVariantCodeKey"; 25 NSString *const NSLocaleExemplarCharacterSet = @"kCFLocaleExemplarCharacterSetKey"; 26 NSString *const NSLocaleCalendar = @"kCFLocaleCalendarKey"; 27 NSString *const NSLocaleCollationIdentifier = @"collation"; 28 NSString *const NSLocaleUsesMetricSystem = @"kCFLocaleUsesMetricSystemKey"; 29 NSString *const NSLocaleMeasurementSystem = @"kCFLocaleMeasurementSystemKey"; 30 NSString *const NSLocaleDecimalSeparator = @"kCFLocaleDecimalSeparatorKey"; 31 NSString *const NSLocaleGroupingSeparator = @"kCFLocaleGroupingSeparatorKey"; 32 NSString *const NSLocaleCurrencySymbol = @"kCFLocaleCurrencySymbolKey"; 33 NSString *const NSLocaleCurrencyCode = @"currency"; 34 NSString *const NSLocaleCollatorIdentifier = @"kCFLocaleCollatorIdentifierKey"; 35 NSString *const NSLocaleQuotationBeginDelimiterKey = @"kCFLocaleQuotationBeginDelimiterKey"; 36 NSString *const NSLocaleQuotationEndDelimiterKey = @"kCFLocaleQuotationEndDelimiterKey"; 37 NSString *const NSLocaleAlternateQuotationBeginDelimiterKey = @"kCFLocaleAlternateQuotationBeginDelimiterKey"; 38 NSString *const NSLocaleAlternateQuotationEndDelimiterKey = @"kCFLocaleAlternateQuotationEndDelimiterKey"; 39 NSString *const NSGregorianCalendar = @"gregorian"; 40 NSString *const NSBuddhistCalendar = @"buddhist"; 41 NSString *const NSChineseCalendar = @"chinese"; 42 NSString *const NSHebrewCalendar = @"hebrew"; 43 NSString *const NSIslamicCalendar = @"islamic"; 44 NSString *const NSIslamicCivilCalendar = @"islamic-civil"; 45 NSString *const NSJapaneseCalendar = @"japanese"; 46 NSString *const NSRepublicOfChinaCalendar = @"roc"; 47 NSString *const NSPersianCalendar = @"persian"; 48 NSString *const NSIndianCalendar = @"indian"; 49 NSString *const NSISO8601Calendar = @"iso8601"; 50 51 NSString *const NSLocaleCalendarIdentifierKey = @"calendar"; 52 NSString *const NSLocaleCalendarKey = @"kCFLocaleCalendarKey"; 53 NSString *const NSLocaleCollationIdentifierKey = @"collation"; 54 NSString *const NSLocaleCollatorIdentifierKey = @"kCFLocaleCollatorIdentifierKey"; 55 NSString *const NSLocaleCountryCodeKey = @"kCFLocaleCountryCodeKey"; 56 NSString *const NSLocaleCurrencyCodeKey = @"currency"; 57 NSString *const NSLocaleCurrencySymbolKey = @"kCFLocaleCurrencySymbolKey"; 58 NSString *const NSLocaleDecimalSeparatorKey = @"kCFLocaleDecimalSeparatorKey"; 59 NSString *const NSLocaleExemplarCharacterSetKey = @"kCFLocaleExemplarCharacterSetKey"; 60 NSString *const NSLocaleGroupingSeparatorKey = @"kCFLocaleGroupingSeparatorKey"; 61 NSString *const NSLocaleIdentifierKey = @"kCFLocaleIdentifierKey"; 62 NSString *const NSLocaleLanguageCodeKey = @"kCFLocaleLanguageCodeKey"; 63 NSString *const NSLocaleMeasurementSystemKey = @"kCFLocaleMeasurementSystemKey"; 64 NSString *const NSLocaleScriptCodeKey = @"kCFLocaleScriptCodeKey"; 65 NSString *const NSLocaleUsesMetricSystemKey = @"kCFLocaleUsesMetricSystemKey"; 66 NSString *const NSLocaleVariantCodeKey = @"kCFLocaleVariantCodeKey"; 67 68 @implementation NSLocale 69 70 + (id)internetServicesRegion 71 { 72 // huh wha? ok... 73 return nil; 74 } 75 76 + (NSLocaleLanguageDirection)lineDirectionForLanguage:(NSString *)isoLangCode 77 { 78 return (NSLocaleLanguageDirection)CFLocaleGetLanguageLineDirection((CFStringRef)isoLangCode); 79 } 80 81 + (NSLocaleLanguageDirection)characterDirectionForLanguage:(NSString *)isoLangCode 82 { 83 return (NSLocaleLanguageDirection)CFLocaleGetLanguageCharacterDirection((CFStringRef)isoLangCode); 84 } 85 86 + (uint32_t)windowsLocaleCodeFromLocaleIdentifier:(NSString *)localeIdentifier 87 { 88 return CFLocaleGetWindowsLocaleCodeFromLocaleIdentifier((CFStringRef)localeIdentifier); 89 } 90 91 + (NSString *)localeIdentifierFromWindowsLocaleCode:(uint32_t)lcid 92 { 93 return [(NSString *)CFLocaleCreateLocaleIdentifierFromWindowsLocaleCode(kCFAllocatorDefault, lcid) autorelease]; 94 } 95 96 + (NSString *)canonicalLanguageIdentifierFromString:(NSString *)string 97 { 98 return [(NSString *)CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, (CFStringRef)string) autorelease]; 99 } 100 101 + (NSString *)canonicalLocaleIdentifierFromString:(NSString *)string 102 { 103 return [(NSString *)CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, (CFStringRef)string) autorelease]; 104 } 105 106 + (NSString *)localeIdentifierFromComponents:(NSDictionary *)dict 107 { 108 return [(NSString *)CFLocaleCreateLocaleIdentifierFromComponents(kCFAllocatorDefault, (CFDictionaryRef)dict) autorelease]; 109 } 110 111 + (NSDictionary *)componentsFromLocaleIdentifier:(NSString *)string 112 { 113 return [(NSDictionary *)CFLocaleCreateComponentsFromLocaleIdentifier(kCFAllocatorDefault, (CFStringRef)string) autorelease]; 114 } 115 116 + (NSArray *)preferredLanguages 117 { 118 return [(NSArray *)CFLocaleCopyPreferredLanguages() autorelease]; 119 } 120 121 + (NSArray *)commonISOCurrencyCodes 122 { 123 return [(NSArray *)CFLocaleCopyCommonISOCurrencyCodes() autorelease]; 124 } 125 126 + (NSArray *)ISOCurrencyCodes 127 { 128 return [(NSArray *)CFLocaleCopyISOCurrencyCodes() autorelease]; 129 } 130 131 + (NSArray *)ISOCountryCodes 132 { 133 return [(NSArray *)CFLocaleCopyISOCountryCodes() autorelease]; 134 } 135 136 + (NSArray *)ISOLanguageCodes 137 { 138 return [(NSArray *)CFLocaleCopyISOLanguageCodes() autorelease]; 139 } 140 141 + (NSArray *)availableLocaleIdentifiers 142 { 143 return [(NSArray *)CFLocaleCopyAvailableLocaleIdentifiers() autorelease]; 144 } 145 146 + (id)localeWithLocaleIdentifier:(NSString *)identifier 147 { 148 return [(NSLocale *)CFLocaleCreate(kCFAllocatorDefault, (CFStringRef)identifier) autorelease]; 149 } 150 151 + (id)currentLocale 152 { 153 return [(NSLocale *)CFLocaleCopyCurrent() autorelease]; 154 } 155 156 + (id)systemLocale 157 { 158 return (NSLocale *)CFLocaleGetSystem(); 159 } 160 161 + (BOOL)supportsSecureCoding 162 { 163 return NO; 164 } 165 166 + (id)allocWithZone:(NSZone *)zone 167 { 168 if (self == [NSLocale class]) 169 { 170 static __NSCFLocale *placeholderLocale = nil; 171 static dispatch_once_t once = 0L; 172 dispatch_once(&once, ^{ 173 placeholderLocale = ___CFAllocateObject([__NSCFLocale class]); 174 }); 175 return placeholderLocale; 176 } 177 else 178 { 179 return [super allocWithZone:zone]; 180 } 181 } 182 183 - (id)_prefs 184 { 185 return nil; 186 } 187 188 - (id)_copyDisplayNameForKey:(id)key value:(id)value 189 { 190 return [[self displayNameForKey:key value:value] retain]; 191 } 192 193 - (id)initWithLocaleIdentifier:(NSString *)identifier 194 { 195 NSRequestConcreteImplementation(); 196 [self release]; 197 return nil; 198 } 199 200 - (id)identifier 201 { 202 return [self localeIdentifier]; 203 } 204 205 - (id)localeIdentifier 206 { 207 return [self objectForKey:NSLocaleIdentifier]; 208 } 209 210 - (void)encodeWithCoder:(NSCoder *)coder 211 { 212 return; 213 } 214 215 - (id)initWithCoder:(NSCoder *)aDecoder 216 { 217 [self release]; 218 return nil; 219 } 220 221 - (id)copyWithZone:(NSZone *)zone 222 { 223 return [self retain]; 224 } 225 226 - (BOOL)isEqual:(id)other 227 { 228 return [other isKindOfClass:[NSLocale class]] && [[self localeIdentifier] isEqual:[other localeIdentifier]]; 229 } 230 231 - (NSUInteger)hash 232 { 233 return [[self localeIdentifier] hash]; 234 } 235 236 - (CFTypeID)_cfTypeID 237 { 238 return CFLocaleGetTypeID(); 239 } 240 241 - (id)objectForKey:(id)key 242 { 243 NSRequestConcreteImplementation(); 244 return nil; 245 } 246 247 - (NSString *)displayNameForKey:(id)key value:(id)value 248 { 249 NSRequestConcreteImplementation(); 250 return nil; 251 } 252 253 @end 254 255 @implementation __NSCFLocale 256 257 + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 258 { 259 return NO; 260 } 261 262 - (id)_prefs 263 { 264 extern CFDictionaryRef __CFLocaleGetPrefs(CFLocaleRef locale); 265 return (id)__CFLocaleGetPrefs((CFLocaleRef)self); 266 } 267 268 - (id)initWithLocaleIdentifier:(NSString *)identifier 269 { 270 return (id)CFLocaleCreate(kCFAllocatorDefault, (CFStringRef)identifier); 271 } 272 273 - (NSString *)displayNameForKey:(id)key value:(id)value 274 { 275 return [(NSString *)CFLocaleCopyDisplayNameForPropertyValue((CFLocaleRef)self, (CFStringRef)key, (CFStringRef)value) autorelease]; 276 } 277 278 - (id)objectForKey:(id)key 279 { 280 return CFLocaleGetValue((CFLocaleRef)self, (CFStringRef)key); 281 } 282 283 - (NSUInteger)retainCount 284 { 285 return CFGetRetainCount((CFTypeRef)self); 286 } 287 288 - (BOOL)_isDeallocating 289 { 290 return _CFIsDeallocating((CFTypeRef)self); 291 } 292 293 - (BOOL)_tryRetain 294 { 295 return _CFTryRetain((CFTypeRef)self) != NULL; 296 } 297 298 - (oneway void)release 299 { 300 CFRelease((CFTypeRef)self); 301 } 302 303 - (id)retain 304 { 305 return (id)CFRetain((CFTypeRef)self); 306 } 307 308 - (NSUInteger)hash 309 { 310 return CFHash((CFTypeRef)self); 311 } 312 313 - (BOOL)isEqual:(id)other 314 { 315 if (other == nil) 316 { 317 return NO; 318 } 319 return CFEqual((CFTypeRef)self, (CFTypeRef)other); 320 } 321 322 - (NSString *)localizedStringForLocaleIdentifier:(NSString *)identifier 323 { 324 return [self displayNameForKey:NSLocaleIdentifier value:identifier]; 325 } 326 327 @end