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(CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale)); 57 if (!canonicalLocale) 58 return locale; 59 return canonicalLocale; 60} 61 62static void getLocale(CFStringRef locale, char localeStringBuffer[maxLocaleStringLength]) 63{ 64 // Empty string means "root locale", and that is what we use if we can't get a preference. 65 localeStringBuffer[0] = 0; 66 if (!locale) 67 return; 68 CFStringGetCString(locale, localeStringBuffer, maxLocaleStringLength, kCFStringEncodingASCII); 69} 70 71static void getSearchLocale(char localeStringBuffer[maxLocaleStringLength]) 72{ 73 getLocale(canonicalLanguageIdentifier(topLanguagePreference().get()).get(), localeStringBuffer); 74} 75 76const char* currentSearchLocaleID() 77{ 78 static char localeStringBuffer[maxLocaleStringLength]; 79 static bool gotSearchLocale = false; 80 if (!gotSearchLocale) { 81 getSearchLocale(localeStringBuffer); 82 gotSearchLocale = true; 83 } 84 return localeStringBuffer; 85} 86 87static void getTextBreakLocale(char localeStringBuffer[maxLocaleStringLength]) 88{ 89 // If there is no text break locale, use the top language preference. 90 RetainPtr<CFStringRef> locale = textBreakLocalePreference(); 91 if (!locale) 92 locale = topLanguagePreference(); 93 getLocale(canonicalLanguageIdentifier(locale.get()).get(), localeStringBuffer); 94} 95 96const char* currentTextBreakLocaleID() 97{ 98 static char localeStringBuffer[maxLocaleStringLength]; 99 static bool gotTextBreakLocale = false; 100 if (!gotTextBreakLocale) { 101 getTextBreakLocale(localeStringBuffer); 102 gotTextBreakLocale = true; 103 } 104 return localeStringBuffer; 105} 106 107} 108