/ 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