1 /* 2 ****************************************************************************** 3 * 4 * Copyright (C) 1996-2007, International Business Machines Corporation 5 * and others. All Rights Reserved. 6 * 7 ****************************************************************************** 8 * 9 * File resbund.h 10 * 11 * CREATED BY 12 * Richard Gillam 13 * 14 * Modification History: 15 * 16 * Date Name Description 17 * 2/5/97 aliu Added scanForLocaleInFile. Added 18 * constructor which attempts to read resource bundle 19 * from a specific file, without searching other files. 20 * 2/11/97 aliu Added UErrorCode return values to constructors. Fixed 21 * infinite loops in scanForFile and scanForLocale. 22 * Modified getRawResourceData to not delete storage 23 * in localeData and resourceData which it doesn't own. 24 * Added Mac compatibility #ifdefs for tellp() and 25 * ios::nocreate. 26 * 2/18/97 helena Updated with 100% documentation coverage. 27 * 3/13/97 aliu Rewrote to load in entire resource bundle and store 28 * it as a Hashtable of ResourceBundleData objects. 29 * Added state table to govern parsing of files. 30 * Modified to load locale index out of new file 31 * distinct from default.txt. 32 * 3/25/97 aliu Modified to support 2-d arrays, needed for timezone 33 * data. Added support for custom file suffixes. Again, 34 * needed to support timezone data. 35 * 4/7/97 aliu Cleaned up. 36 * 03/02/99 stephen Removed dependency on FILE*. 37 * 03/29/99 helena Merged Bertrand and Stephen's changes. 38 * 06/11/99 stephen Removed parsing of .txt files. 39 * Reworked to use new binary format. 40 * Cleaned up. 41 * 06/14/99 stephen Removed methods taking a filename suffix. 42 * 11/09/99 weiv Added getLocale(), fRealLocale, removed fRealLocaleID 43 ****************************************************************************** 44 */ 45 46 #ifndef RESBUND_H 47 #define RESBUND_H 48 49 #include "unicode/utypes.h" 50 #include "unicode/uobject.h" 51 #include "unicode/ures.h" 52 #include "unicode/unistr.h" 53 #include "unicode/locid.h" 54 55 /** 56 * \file 57 * \brief C++ API: Resource Bundle 58 */ 59 60 U_NAMESPACE_BEGIN 61 62 /** 63 * A class representing a collection of resource information pertaining to a given 64 * locale. A resource bundle provides a way of accessing locale- specfic information in 65 * a data file. You create a resource bundle that manages the resources for a given 66 * locale and then ask it for individual resources. 67 * <P> 68 * Resource bundles in ICU4C are currently defined using text files which conform to the following 69 * <a href="http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt">BNF definition</a>. 70 * More on resource bundle concepts and syntax can be found in the 71 * <a href="http://icu-project.org/userguide/ResourceManagement.html">Users Guide</a>. 72 * <P> 73 * 74 * The ResourceBundle class is not suitable for subclassing. 75 * 76 * @stable ICU 2.0 77 */ 78 class U_COMMON_API ResourceBundle : public UObject { 79 public: 80 /** 81 * Constructor 82 * 83 * @param packageName The packageName and locale together point to an ICU udata object, 84 * as defined by <code> udata_open( packageName, "res", locale, err) </code> 85 * or equivalent. Typically, packageName will refer to a (.dat) file, or to 86 * a package registered with udata_setAppData(). Using a full file or directory 87 * pathname for packageName is deprecated. 88 * @param locale This is the locale this resource bundle is for. To get resources 89 * for the French locale, for example, you would create a 90 * ResourceBundle passing Locale::FRENCH for the "locale" parameter, 91 * and all subsequent calls to that resource bundle will return 92 * resources that pertain to the French locale. If the caller doesn't 93 * pass a locale parameter, the default locale for the system (as 94 * returned by Locale::getDefault()) will be used. 95 * @param err The Error Code. 96 * The UErrorCode& err parameter is used to return status information to the user. To 97 * check whether the construction succeeded or not, you should check the value of 98 * U_SUCCESS(err). If you wish more detailed information, you can check for 99 * informational error results which still indicate success. U_USING_FALLBACK_WARNING 100 * indicates that a fall back locale was used. For example, 'de_CH' was requested, 101 * but nothing was found there, so 'de' was used. U_USING_DEFAULT_WARNING indicates that 102 * the default locale data was used; neither the requested locale nor any of its 103 * fall back locales could be found. 104 * @stable ICU 2.0 105 */ 106 ResourceBundle(const UnicodeString& packageName, 107 const Locale& locale, 108 UErrorCode& err); 109 110 /** 111 * Construct a resource bundle for the default bundle in the specified package. 112 * 113 * @param packageName The packageName and locale together point to an ICU udata object, 114 * as defined by <code> udata_open( packageName, "res", locale, err) </code> 115 * or equivalent. Typically, packageName will refer to a (.dat) file, or to 116 * a package registered with udata_setAppData(). Using a full file or directory 117 * pathname for packageName is deprecated. 118 * @param err A UErrorCode value 119 * @stable ICU 2.0 120 */ 121 ResourceBundle(const UnicodeString& packageName, 122 UErrorCode& err); 123 124 /** 125 * Construct a resource bundle for the ICU default bundle. 126 * 127 * @param err A UErrorCode value 128 * @stable ICU 2.0 129 */ 130 ResourceBundle(UErrorCode &err); 131 132 /** 133 * Standard constructor, onstructs a resource bundle for the locale-specific 134 * bundle in the specified package. 135 * 136 * @param packageName The packageName and locale together point to an ICU udata object, 137 * as defined by <code> udata_open( packageName, "res", locale, err) </code> 138 * or equivalent. Typically, packageName will refer to a (.dat) file, or to 139 * a package registered with udata_setAppData(). Using a full file or directory 140 * pathname for packageName is deprecated. 141 * NULL is used to refer to ICU data. 142 * @param locale The locale for which to open a resource bundle. 143 * @param err A UErrorCode value 144 * @stable ICU 2.0 145 */ 146 ResourceBundle(const char* packageName, 147 const Locale& locale, 148 UErrorCode& err); 149 150 /** 151 * Copy constructor. 152 * 153 * @param original The resource bundle to copy. 154 * @stable ICU 2.0 155 */ 156 ResourceBundle(const ResourceBundle &original); 157 158 /** 159 * Constructor from a C UResourceBundle. The resource bundle is 160 * copied and not adopted. ures_close will still need to be used on the 161 * original resource bundle. 162 * 163 * @param res A pointer to the C resource bundle. 164 * @param status A UErrorCode value. 165 * @stable ICU 2.0 166 */ 167 ResourceBundle(UResourceBundle *res, 168 UErrorCode &status); 169 170 /** 171 * Assignment operator. 172 * 173 * @param other The resource bundle to copy. 174 * @stable ICU 2.0 175 */ 176 ResourceBundle& 177 operator=(const ResourceBundle& other); 178 179 /** Destructor. 180 * @stable ICU 2.0 181 */ 182 virtual ~ResourceBundle(); 183 184 /** 185 * Clone this object. 186 * Clones can be used concurrently in multiple threads. 187 * If an error occurs, then NULL is returned. 188 * The caller must delete the clone. 189 * 190 * @return a clone of this object 191 * 192 * @see getDynamicClassID 193 * @stable ICU 2.8 194 */ 195 ResourceBundle *clone() const; 196 197 /** 198 * Returns the size of a resource. Size for scalar types is always 1, and for vector/table types is 199 * the number of child resources. 200 * @warning Integer array is treated as a scalar type. There are no 201 * APIs to access individual members of an integer array. It 202 * is always returned as a whole. 203 * 204 * @return number of resources in a given resource. 205 * @stable ICU 2.0 206 */ 207 int32_t 208 getSize(void) const; 209 210 /** 211 * returns a string from a string resource type 212 * 213 * @param status fills in the outgoing error code 214 * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found 215 * could be a warning 216 * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> 217 * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. 218 * @stable ICU 2.0 219 */ 220 UnicodeString 221 getString(UErrorCode& status) const; 222 223 /** 224 * returns a binary data from a resource. Can be used at most primitive resource types (binaries, 225 * strings, ints) 226 * 227 * @param len fills in the length of resulting byte chunk 228 * @param status fills in the outgoing error code 229 * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found 230 * could be a warning 231 * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> 232 * @return a pointer to a chunk of unsigned bytes which live in a memory mapped/DLL file. 233 * @stable ICU 2.0 234 */ 235 const uint8_t* 236 getBinary(int32_t& len, UErrorCode& status) const; 237 238 239 /** 240 * returns an integer vector from a resource. 241 * 242 * @param len fills in the length of resulting integer vector 243 * @param status fills in the outgoing error code 244 * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found 245 * could be a warning 246 * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> 247 * @return a pointer to a vector of integers that lives in a memory mapped/DLL file. 248 * @stable ICU 2.0 249 */ 250 const int32_t* 251 getIntVector(int32_t& len, UErrorCode& status) const; 252 253 /** 254 * returns an unsigned integer from a resource. 255 * This integer is originally 28 bits. 256 * 257 * @param status fills in the outgoing error code 258 * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found 259 * could be a warning 260 * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> 261 * @return an unsigned integer value 262 * @stable ICU 2.0 263 */ 264 uint32_t 265 getUInt(UErrorCode& status) const; 266 267 /** 268 * returns a signed integer from a resource. 269 * This integer is originally 28 bit and the sign gets propagated. 270 * 271 * @param status fills in the outgoing error code 272 * could be <TT>U_MISSING_RESOURCE_ERROR</TT> if the key is not found 273 * could be a warning 274 * e.g.: <TT>U_USING_FALLBACK_WARNING</TT>,<TT>U_USING_DEFAULT_WARNING </TT> 275 * @return a signed integer value 276 * @stable ICU 2.0 277 */ 278 int32_t 279 getInt(UErrorCode& status) const; 280 281 /** 282 * Checks whether the resource has another element to iterate over. 283 * 284 * @return TRUE if there are more elements, FALSE if there is no more elements 285 * @stable ICU 2.0 286 */ 287 UBool 288 hasNext(void) const; 289 290 /** 291 * Resets the internal context of a resource so that iteration starts from the first element. 292 * 293 * @stable ICU 2.0 294 */ 295 void 296 resetIterator(void); 297 298 /** 299 * Returns the key associated with this resource. Not all the resources have a key - only 300 * those that are members of a table. 301 * 302 * @return a key associated to this resource, or NULL if it doesn't have a key 303 * @stable ICU 2.0 304 */ 305 const char* 306 getKey(void) const; 307 308 /** 309 * Gets the locale ID of the resource bundle as a string. 310 * Same as getLocale().getName() . 311 * 312 * @return the locale ID of the resource bundle as a string 313 * @stable ICU 2.0 314 */ 315 const char* 316 getName(void) const; 317 318 319 /** 320 * Returns the type of a resource. Available types are defined in enum UResType 321 * 322 * @return type of the given resource. 323 * @stable ICU 2.0 324 */ 325 UResType 326 getType(void) const; 327 328 /** 329 * Returns the next resource in a given resource or NULL if there are no more resources 330 * 331 * @param status fills in the outgoing error code 332 * @return ResourceBundle object. 333 * @stable ICU 2.0 334 */ 335 ResourceBundle 336 getNext(UErrorCode& status); 337 338 /** 339 * Returns the next string in a resource or NULL if there are no more resources 340 * to iterate over. 341 * 342 * @param status fills in the outgoing error code 343 * @return an UnicodeString object. 344 * @stable ICU 2.0 345 */ 346 UnicodeString 347 getNextString(UErrorCode& status); 348 349 /** 350 * Returns the next string in a resource or NULL if there are no more resources 351 * to iterate over. 352 * 353 * @param key fill in for key associated with this string 354 * @param status fills in the outgoing error code 355 * @return an UnicodeString object. 356 * @stable ICU 2.0 357 */ 358 UnicodeString 359 getNextString(const char ** key, 360 UErrorCode& status); 361 362 /** 363 * Returns the resource in a resource at the specified index. 364 * 365 * @param index an index to the wanted resource. 366 * @param status fills in the outgoing error code 367 * @return ResourceBundle object. If there is an error, resource is invalid. 368 * @stable ICU 2.0 369 */ 370 ResourceBundle 371 get(int32_t index, 372 UErrorCode& status) const; 373 374 /** 375 * Returns the string in a given resource at the specified index. 376 * 377 * @param index an index to the wanted string. 378 * @param status fills in the outgoing error code 379 * @return an UnicodeString object. If there is an error, string is bogus 380 * @stable ICU 2.0 381 */ 382 UnicodeString 383 getStringEx(int32_t index, 384 UErrorCode& status) const; 385 386 /** 387 * Returns a resource in a resource that has a given key. This procedure works only with table 388 * resources. 389 * 390 * @param key a key associated with the wanted resource 391 * @param status fills in the outgoing error code. 392 * @return ResourceBundle object. If there is an error, resource is invalid. 393 * @stable ICU 2.0 394 */ 395 ResourceBundle 396 get(const char* key, 397 UErrorCode& status) const; 398 399 /** 400 * Returns a string in a resource that has a given key. This procedure works only with table 401 * resources. 402 * 403 * @param key a key associated with the wanted string 404 * @param status fills in the outgoing error code 405 * @return an UnicodeString object. If there is an error, string is bogus 406 * @stable ICU 2.0 407 */ 408 UnicodeString 409 getStringEx(const char* key, 410 UErrorCode& status) const; 411 412 /** 413 * Return the version number associated with this ResourceBundle as a string. Please 414 * use getVersion, as this method is going to be deprecated. 415 * 416 * @return A version number string as specified in the resource bundle or its parent. 417 * The caller does not own this string. 418 * @see getVersion 419 * @deprecated ICU 2.8 Use getVersion instead. 420 */ 421 const char* 422 getVersionNumber(void) const; 423 424 /** 425 * Return the version number associated with this ResourceBundle as a UVersionInfo array. 426 * 427 * @param versionInfo A UVersionInfo array that is filled with the version number 428 * as specified in the resource bundle or its parent. 429 * @stable ICU 2.0 430 */ 431 void 432 getVersion(UVersionInfo versionInfo) const; 433 434 /** 435 * Return the Locale associated with this ResourceBundle. 436 * 437 * @return a Locale object 438 * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. 439 */ 440 const Locale& 441 getLocale(void) const; 442 443 /** 444 * Return the Locale associated with this ResourceBundle. 445 * @param type You can choose between requested, valid and actual 446 * locale. For description see the definition of 447 * ULocDataLocaleType in uloc.h 448 * @param status just for catching illegal arguments 449 * 450 * @return a Locale object 451 * @stable ICU 2.8 452 */ 453 const Locale 454 getLocale(ULocDataLocaleType type, UErrorCode &status) const; 455 /** 456 * This API implements multilevel fallback 457 * @internal 458 */ 459 ResourceBundle 460 getWithFallback(const char* key, UErrorCode& status); 461 /** 462 * ICU "poor man's RTTI", returns a UClassID for the actual class. 463 * 464 * @stable ICU 2.2 465 */ 466 virtual UClassID getDynamicClassID() const; 467 468 /** 469 * ICU "poor man's RTTI", returns a UClassID for this class. 470 * 471 * @stable ICU 2.2 472 */ 473 static UClassID U_EXPORT2 getStaticClassID(); 474 475 private: 476 ResourceBundle(); // default constructor not implemented 477 478 UResourceBundle *fResource; 479 void constructForLocale(const UnicodeString& path, const Locale& locale, UErrorCode& error); 480 Locale *fLocale; 481 482 }; 483 484 U_NAMESPACE_END 485 #endif 486