1 /* 2 * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <Language.h> 8 9 #include <iostream> 10 11 #include <Catalog.h> 12 #include <Locale.h> 13 #include <LocaleRoster.h> 14 #include <Path.h> 15 #include <String.h> 16 #include <FindDirectory.h> 17 18 #include <stdlib.h> 19 #include <stdio.h> 20 #include <string.h> 21 #include <ctype.h> 22 23 #include <ICUWrapper.h> 24 25 #include <unicode/locid.h> 26 27 28 static const char *gBuiltInStrings[] = { 29 "Yesterday", 30 "Today", 31 "Tomorrow", 32 "Future", 33 34 "Sunday", 35 "Monday", 36 "Tuesday", 37 "Wednesday", 38 "Thursday", 39 "Friday", 40 "Saturday", 41 42 "Sun", 43 "Mon", 44 "Tue", 45 "Wed", 46 "Thu", 47 "Fri", 48 "Sat", 49 50 "January", 51 "February", 52 "March", 53 "April", 54 "May", 55 "June", 56 "July", 57 "August", 58 "September", 59 "October", 60 "November", 61 "December", 62 63 "Jan", 64 "Feb", 65 "Mar", 66 "Apr", 67 "May", 68 "Jun", 69 "Jul", 70 "Aug", 71 "Sep", 72 "Oct", 73 "Nov", 74 "Dec", 75 76 "^[yY]", 77 "^[nN]", 78 "yes", 79 "no" 80 }; 81 82 83 BLanguage::BLanguage(const char* language) 84 : 85 fDirection(B_LEFT_TO_RIGHT) 86 { 87 fICULocale = new icu_4_2::Locale(language); 88 89 for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;) 90 fStrings[i] = NULL; 91 } 92 93 94 BLanguage::~BLanguage() 95 { 96 delete fICULocale; 97 98 for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;) 99 free(fStrings[i]); 100 } 101 102 103 void 104 BLanguage::Default() 105 { 106 fICULocale = new icu_4_2::Locale("en"); 107 fDirection = B_LEFT_TO_RIGHT; 108 109 for (int32 i = B_NUM_LANGUAGE_STRINGS;i-- > 0;) { 110 free(fStrings[i]); 111 fStrings[i] = strdup(gBuiltInStrings[i]); 112 } 113 } 114 115 116 uint8 117 BLanguage::Direction() const 118 { 119 return fDirection; 120 } 121 122 123 const char* 124 BLanguage::GetString(uint32 id) const 125 { 126 if (id < B_LANGUAGE_STRINGS_BASE 127 || id > B_LANGUAGE_STRINGS_BASE + B_NUM_LANGUAGE_STRINGS) 128 return NULL; 129 130 return fStrings[id - B_LANGUAGE_STRINGS_BASE]; 131 } 132 133 134 status_t 135 BLanguage::GetName(BString& name) const 136 { 137 UnicodeString string; 138 fICULocale->getDisplayName(*fICULocale, string); 139 140 name.Truncate(0); 141 BStringByteSink converter(&name); 142 string.toUTF8(converter); 143 144 return B_OK; 145 } 146 147 148 status_t 149 BLanguage::GetTranslatedName(BString& name) const 150 { 151 BMessage preferredLanguage; 152 be_locale_roster->GetPreferredLanguages(&preferredLanguage); 153 154 BString appLanguage; 155 preferredLanguage.FindString("language", 0, &appLanguage); 156 157 UnicodeString string; 158 fICULocale->getDisplayName(Locale(appLanguage), string); 159 160 name.Truncate(0); 161 BStringByteSink converter(&name); 162 string.toUTF8(converter); 163 164 return B_OK; 165 } 166 167 168 const char* 169 BLanguage::Code() const 170 { 171 return fICULocale->getLanguage(); 172 } 173 174 175 const char* 176 BLanguage::Country() const 177 { 178 const char* country = fICULocale->getCountry(); 179 if (country == NULL || country[0] == '\0') 180 return NULL; 181 182 return country; 183 } 184 185 186 const char* 187 BLanguage::Variant() const 188 { 189 const char* variant = fICULocale->getVariant(); 190 if (variant == NULL || variant[0] == '\0') 191 return NULL; 192 193 return variant; 194 } 195 196 197 const char* 198 BLanguage::ID() const 199 { 200 return fICULocale->getName(); 201 } 202 203 204 bool 205 BLanguage::IsCountrySpecific() const 206 { 207 return Country() != NULL; 208 } 209 210 211 bool 212 BLanguage::IsVariant() const 213 { 214 return Variant() != NULL; 215 } 216