1/* 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 * 19 */ 20 21#include "config.h" 22#include "TextBreakIteratorInternalICU.h" 23 24#include <wtf/RetainPtr.h> 25 26namespace WebCore { 27 28static const int maxLocaleStringLength = 32; 29 30static inline RetainPtr<CFStringRef> textBreakLocalePreference() 31{ 32 RetainPtr<CFPropertyListRef> locale(AdoptCF, CFPreferencesCopyValue(CFSTR("AppleTextBreakLocale"), 33 kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)); 34 if (!locale || CFGetTypeID(locale.get()) != CFStringGetTypeID()) 35 return 0; 36 return static_cast<CFStringRef>(locale.get()); 37} 38 39static RetainPtr<CFStringRef> topLanguagePreference() 40{ 41 NSArray *languagesArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 42 if (!languagesArray) 43 return 0; 44 if ([languagesArray count] < 1) 45 return 0; 46 NSString *value = [languagesArray objectAtIndex:0]; 47 if (![value isKindOfClass:[NSString class]]) 48 return 0; 49 return reinterpret_cast<CFStringRef>(value); 50} 51 52static RetainPtr<CFStringRef> canonicalLanguageIdentifier(CFStringRef locale) 53{ 54 if (!locale) 55 return 0; 56 RetainPtr<CFStringRef> canonicalLocale(AdoptCF, 57 CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale)); 58 if (!canonicalLocale) 59 return locale; 60 return canonicalLocale; 61} 62 63static void getLocale(CFStringRef locale, char localeStringBuffer[maxLocaleStringLength]) 64{ 65 // Empty string means "root locale", and that is what we use if we can't get a preference. 66 localeStringBuffer[0] = 0; 67 if (!locale) 68 return; 69 CFStringGetCString(locale, localeStringBuffer, maxLocaleStringLength, kCFStringEncodingASCII); 70} 71 72static void getSearchLocale(char localeStringBuffer[maxLocaleStringLength]) 73{ 74 getLocale(canonicalLanguageIdentifier(topLanguagePreference().get()).get(), localeStringBuffer); 75} 76 77const char* currentSearchLocaleID() 78{ 79 static char localeStringBuffer[maxLocaleStringLength]; 80 static bool gotSearchLocale = false; 81 if (!gotSearchLocale) { 82 getSearchLocale(localeStringBuffer); 83 gotSearchLocale = true; 84 } 85 return localeStringBuffer; 86} 87 88static void getTextBreakLocale(char localeStringBuffer[maxLocaleStringLength]) 89{ 90 // If there is no text break locale, use the top language preference. 91 RetainPtr<CFStringRef> locale = textBreakLocalePreference(); 92 if (!locale) 93 locale = topLanguagePreference(); 94 getLocale(canonicalLanguageIdentifier(locale.get()).get(), localeStringBuffer); 95} 96 97const char* currentTextBreakLocaleID() 98{ 99 static char localeStringBuffer[maxLocaleStringLength]; 100 static bool gotTextBreakLocale = false; 101 if (!gotTextBreakLocale) { 102 getTextBreakLocale(localeStringBuffer); 103 gotTextBreakLocale = true; 104 } 105 return localeStringBuffer; 106} 107 108} 109