1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2007-2013, International Business Machines Corporation and 5*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved. 6*0e209d39SAndroid Build Coastguard Worker ******************************************************************************** 7*0e209d39SAndroid Build Coastguard Worker * 8*0e209d39SAndroid Build Coastguard Worker * File MSGFMT.H 9*0e209d39SAndroid Build Coastguard Worker * 10*0e209d39SAndroid Build Coastguard Worker * Modification History: 11*0e209d39SAndroid Build Coastguard Worker * 12*0e209d39SAndroid Build Coastguard Worker * Date Name Description 13*0e209d39SAndroid Build Coastguard Worker * 02/19/97 aliu Converted from java. 14*0e209d39SAndroid Build Coastguard Worker * 03/20/97 helena Finished first cut of implementation. 15*0e209d39SAndroid Build Coastguard Worker * 07/22/98 stephen Removed operator!= (defined in Format) 16*0e209d39SAndroid Build Coastguard Worker * 08/19/2002 srl Removing Javaisms 17*0e209d39SAndroid Build Coastguard Worker *******************************************************************************/ 18*0e209d39SAndroid Build Coastguard Worker 19*0e209d39SAndroid Build Coastguard Worker #ifndef MSGFMT_H 20*0e209d39SAndroid Build Coastguard Worker #define MSGFMT_H 21*0e209d39SAndroid Build Coastguard Worker 22*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 23*0e209d39SAndroid Build Coastguard Worker 24*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 25*0e209d39SAndroid Build Coastguard Worker 26*0e209d39SAndroid Build Coastguard Worker /** 27*0e209d39SAndroid Build Coastguard Worker * \file 28*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Formats messages in a language-neutral way. 29*0e209d39SAndroid Build Coastguard Worker */ 30*0e209d39SAndroid Build Coastguard Worker 31*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 32*0e209d39SAndroid Build Coastguard Worker 33*0e209d39SAndroid Build Coastguard Worker #include "unicode/format.h" 34*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h" 35*0e209d39SAndroid Build Coastguard Worker #include "unicode/messagepattern.h" 36*0e209d39SAndroid Build Coastguard Worker #include "unicode/parseerr.h" 37*0e209d39SAndroid Build Coastguard Worker #include "unicode/plurfmt.h" 38*0e209d39SAndroid Build Coastguard Worker #include "unicode/plurrule.h" 39*0e209d39SAndroid Build Coastguard Worker 40*0e209d39SAndroid Build Coastguard Worker U_CDECL_BEGIN 41*0e209d39SAndroid Build Coastguard Worker // Forward declaration. 42*0e209d39SAndroid Build Coastguard Worker struct UHashtable; 43*0e209d39SAndroid Build Coastguard Worker typedef struct UHashtable UHashtable; /**< @internal */ 44*0e209d39SAndroid Build Coastguard Worker U_CDECL_END 45*0e209d39SAndroid Build Coastguard Worker 46*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 47*0e209d39SAndroid Build Coastguard Worker 48*0e209d39SAndroid Build Coastguard Worker class AppendableWrapper; 49*0e209d39SAndroid Build Coastguard Worker class DateFormat; 50*0e209d39SAndroid Build Coastguard Worker class NumberFormat; 51*0e209d39SAndroid Build Coastguard Worker 52*0e209d39SAndroid Build Coastguard Worker /** 53*0e209d39SAndroid Build Coastguard Worker * <p>MessageFormat prepares strings for display to users, 54*0e209d39SAndroid Build Coastguard Worker * with optional arguments (variables/placeholders). 55*0e209d39SAndroid Build Coastguard Worker * The arguments can occur in any order, which is necessary for translation 56*0e209d39SAndroid Build Coastguard Worker * into languages with different grammars. 57*0e209d39SAndroid Build Coastguard Worker * 58*0e209d39SAndroid Build Coastguard Worker * <p>A MessageFormat is constructed from a <em>pattern</em> string 59*0e209d39SAndroid Build Coastguard Worker * with arguments in {curly braces} which will be replaced by formatted values. 60*0e209d39SAndroid Build Coastguard Worker * 61*0e209d39SAndroid Build Coastguard Worker * <p><code>MessageFormat</code> differs from the other <code>Format</code> 62*0e209d39SAndroid Build Coastguard Worker * classes in that you create a <code>MessageFormat</code> object with one 63*0e209d39SAndroid Build Coastguard Worker * of its constructors (not with a <code>createInstance</code> style factory 64*0e209d39SAndroid Build Coastguard Worker * method). Factory methods aren't necessary because <code>MessageFormat</code> 65*0e209d39SAndroid Build Coastguard Worker * itself doesn't implement locale-specific behavior. Any locale-specific 66*0e209d39SAndroid Build Coastguard Worker * behavior is defined by the pattern that you provide and the 67*0e209d39SAndroid Build Coastguard Worker * subformats used for inserted arguments. 68*0e209d39SAndroid Build Coastguard Worker * 69*0e209d39SAndroid Build Coastguard Worker * <p>Arguments can be named (using identifiers) or numbered (using small ASCII-digit integers). 70*0e209d39SAndroid Build Coastguard Worker * Some of the API methods work only with argument numbers and throw an exception 71*0e209d39SAndroid Build Coastguard Worker * if the pattern has named arguments (see {@link #usesNamedArguments()}). 72*0e209d39SAndroid Build Coastguard Worker * 73*0e209d39SAndroid Build Coastguard Worker * <p>An argument might not specify any format type. In this case, 74*0e209d39SAndroid Build Coastguard Worker * a numeric value is formatted with a default (for the locale) NumberFormat, 75*0e209d39SAndroid Build Coastguard Worker * and a date/time value is formatted with a default (for the locale) DateFormat. 76*0e209d39SAndroid Build Coastguard Worker * 77*0e209d39SAndroid Build Coastguard Worker * <p>An argument might specify a "simple" type for which the specified 78*0e209d39SAndroid Build Coastguard Worker * Format object is created, cached and used. 79*0e209d39SAndroid Build Coastguard Worker * 80*0e209d39SAndroid Build Coastguard Worker * <p>An argument might have a "complex" type with nested MessageFormat sub-patterns. 81*0e209d39SAndroid Build Coastguard Worker * During formatting, one of these sub-messages is selected according to the argument value 82*0e209d39SAndroid Build Coastguard Worker * and recursively formatted. 83*0e209d39SAndroid Build Coastguard Worker * 84*0e209d39SAndroid Build Coastguard Worker * <p>After construction, a custom Format object can be set for 85*0e209d39SAndroid Build Coastguard Worker * a top-level argument, overriding the default formatting and parsing behavior 86*0e209d39SAndroid Build Coastguard Worker * for that argument. 87*0e209d39SAndroid Build Coastguard Worker * However, custom formatting can be achieved more simply by writing 88*0e209d39SAndroid Build Coastguard Worker * a typeless argument in the pattern string 89*0e209d39SAndroid Build Coastguard Worker * and supplying it with a preformatted string value. 90*0e209d39SAndroid Build Coastguard Worker * 91*0e209d39SAndroid Build Coastguard Worker * <p>When formatting, MessageFormat takes a collection of argument values 92*0e209d39SAndroid Build Coastguard Worker * and writes an output string. 93*0e209d39SAndroid Build Coastguard Worker * The argument values may be passed as an array 94*0e209d39SAndroid Build Coastguard Worker * (when the pattern contains only numbered arguments) 95*0e209d39SAndroid Build Coastguard Worker * or as an array of names and and an array of arguments (which works for both named 96*0e209d39SAndroid Build Coastguard Worker * and numbered arguments). 97*0e209d39SAndroid Build Coastguard Worker * 98*0e209d39SAndroid Build Coastguard Worker * <p>Each argument is matched with one of the input values by array index or argument name 99*0e209d39SAndroid Build Coastguard Worker * and formatted according to its pattern specification 100*0e209d39SAndroid Build Coastguard Worker * (or using a custom Format object if one was set). 101*0e209d39SAndroid Build Coastguard Worker * A numbered pattern argument is matched with an argument name that contains that number 102*0e209d39SAndroid Build Coastguard Worker * as an ASCII-decimal-digit string (without leading zero). 103*0e209d39SAndroid Build Coastguard Worker * 104*0e209d39SAndroid Build Coastguard Worker * <h4><a name="patterns">Patterns and Their Interpretation</a></h4> 105*0e209d39SAndroid Build Coastguard Worker * 106*0e209d39SAndroid Build Coastguard Worker * <code>MessageFormat</code> uses patterns of the following form: 107*0e209d39SAndroid Build Coastguard Worker * <pre> 108*0e209d39SAndroid Build Coastguard Worker * message = messageText (argument messageText)* 109*0e209d39SAndroid Build Coastguard Worker * argument = noneArg | simpleArg | complexArg 110*0e209d39SAndroid Build Coastguard Worker * complexArg = choiceArg | pluralArg | selectArg | selectordinalArg 111*0e209d39SAndroid Build Coastguard Worker * 112*0e209d39SAndroid Build Coastguard Worker * noneArg = '{' argNameOrNumber '}' 113*0e209d39SAndroid Build Coastguard Worker * simpleArg = '{' argNameOrNumber ',' argType [',' argStyle] '}' 114*0e209d39SAndroid Build Coastguard Worker * choiceArg = '{' argNameOrNumber ',' "choice" ',' choiceStyle '}' 115*0e209d39SAndroid Build Coastguard Worker * pluralArg = '{' argNameOrNumber ',' "plural" ',' pluralStyle '}' 116*0e209d39SAndroid Build Coastguard Worker * selectArg = '{' argNameOrNumber ',' "select" ',' selectStyle '}' 117*0e209d39SAndroid Build Coastguard Worker * selectordinalArg = '{' argNameOrNumber ',' "selectordinal" ',' pluralStyle '}' 118*0e209d39SAndroid Build Coastguard Worker * 119*0e209d39SAndroid Build Coastguard Worker * choiceStyle: see {@link ChoiceFormat} 120*0e209d39SAndroid Build Coastguard Worker * pluralStyle: see {@link PluralFormat} 121*0e209d39SAndroid Build Coastguard Worker * selectStyle: see {@link SelectFormat} 122*0e209d39SAndroid Build Coastguard Worker * 123*0e209d39SAndroid Build Coastguard Worker * argNameOrNumber = argName | argNumber 124*0e209d39SAndroid Build Coastguard Worker * argName = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+ 125*0e209d39SAndroid Build Coastguard Worker * argNumber = '0' | ('1'..'9' ('0'..'9')*) 126*0e209d39SAndroid Build Coastguard Worker * 127*0e209d39SAndroid Build Coastguard Worker * argType = "number" | "date" | "time" | "spellout" | "ordinal" | "duration" 128*0e209d39SAndroid Build Coastguard Worker * argStyle = "short" | "medium" | "long" | "full" | "integer" | "currency" | "percent" | argStyleText | "::" argSkeletonText 129*0e209d39SAndroid Build Coastguard Worker * </pre> 130*0e209d39SAndroid Build Coastguard Worker * 131*0e209d39SAndroid Build Coastguard Worker * <ul> 132*0e209d39SAndroid Build Coastguard Worker * <li>messageText can contain quoted literal strings including syntax characters. 133*0e209d39SAndroid Build Coastguard Worker * A quoted literal string begins with an ASCII apostrophe and a syntax character 134*0e209d39SAndroid Build Coastguard Worker * (usually a {curly brace}) and continues until the next single apostrophe. 135*0e209d39SAndroid Build Coastguard Worker * A double ASCII apostrophe inside or outside of a quoted string represents 136*0e209d39SAndroid Build Coastguard Worker * one literal apostrophe. 137*0e209d39SAndroid Build Coastguard Worker * <li>Quotable syntax characters are the {curly braces} in all messageText parts, 138*0e209d39SAndroid Build Coastguard Worker * plus the '#' sign in a messageText immediately inside a pluralStyle, 139*0e209d39SAndroid Build Coastguard Worker * and the '|' symbol in a messageText immediately inside a choiceStyle. 140*0e209d39SAndroid Build Coastguard Worker * <li>See also {@link #UMessagePatternApostropheMode} 141*0e209d39SAndroid Build Coastguard Worker * <li>In argStyleText, every single ASCII apostrophe begins and ends quoted literal text, 142*0e209d39SAndroid Build Coastguard Worker * and unquoted {curly braces} must occur in matched pairs. 143*0e209d39SAndroid Build Coastguard Worker * </ul> 144*0e209d39SAndroid Build Coastguard Worker * 145*0e209d39SAndroid Build Coastguard Worker * <p>Recommendation: Use the real apostrophe (single quote) character 146*0e209d39SAndroid Build Coastguard Worker * \htmlonly’\endhtmlonly (U+2019) for 147*0e209d39SAndroid Build Coastguard Worker * human-readable text, and use the ASCII apostrophe ' (U+0027) 148*0e209d39SAndroid Build Coastguard Worker * only in program syntax, like quoting in MessageFormat. 149*0e209d39SAndroid Build Coastguard Worker * See the annotations for U+0027 Apostrophe in The Unicode Standard. 150*0e209d39SAndroid Build Coastguard Worker * 151*0e209d39SAndroid Build Coastguard Worker * <p>The <code>choice</code> argument type is deprecated. 152*0e209d39SAndroid Build Coastguard Worker * Use <code>plural</code> arguments for proper plural selection, 153*0e209d39SAndroid Build Coastguard Worker * and <code>select</code> arguments for simple selection among a fixed set of choices. 154*0e209d39SAndroid Build Coastguard Worker * 155*0e209d39SAndroid Build Coastguard Worker * <p>The <code>argType</code> and <code>argStyle</code> values are used to create 156*0e209d39SAndroid Build Coastguard Worker * a <code>Format</code> instance for the format element. The following 157*0e209d39SAndroid Build Coastguard Worker * table shows how the values map to Format instances. Combinations not 158*0e209d39SAndroid Build Coastguard Worker * shown in the table are illegal. Any <code>argStyleText</code> must 159*0e209d39SAndroid Build Coastguard Worker * be a valid pattern string for the Format subclass used. 160*0e209d39SAndroid Build Coastguard Worker * 161*0e209d39SAndroid Build Coastguard Worker * <p><table border=1> 162*0e209d39SAndroid Build Coastguard Worker * <tr> 163*0e209d39SAndroid Build Coastguard Worker * <th>argType 164*0e209d39SAndroid Build Coastguard Worker * <th>argStyle 165*0e209d39SAndroid Build Coastguard Worker * <th>resulting Format object 166*0e209d39SAndroid Build Coastguard Worker * <tr> 167*0e209d39SAndroid Build Coastguard Worker * <td colspan=2><i>(none)</i> 168*0e209d39SAndroid Build Coastguard Worker * <td><code>null</code> 169*0e209d39SAndroid Build Coastguard Worker * <tr> 170*0e209d39SAndroid Build Coastguard Worker * <td rowspan=6><code>number</code> 171*0e209d39SAndroid Build Coastguard Worker * <td><i>(none)</i> 172*0e209d39SAndroid Build Coastguard Worker * <td><code>NumberFormat.createInstance(getLocale(), status)</code> 173*0e209d39SAndroid Build Coastguard Worker * <tr> 174*0e209d39SAndroid Build Coastguard Worker * <td><code>integer</code> 175*0e209d39SAndroid Build Coastguard Worker * <td><code>NumberFormat.createInstance(getLocale(), kNumberStyle, status)</code> 176*0e209d39SAndroid Build Coastguard Worker * <tr> 177*0e209d39SAndroid Build Coastguard Worker * <td><code>currency</code> 178*0e209d39SAndroid Build Coastguard Worker * <td><code>NumberFormat.createCurrencyInstance(getLocale(), status)</code> 179*0e209d39SAndroid Build Coastguard Worker * <tr> 180*0e209d39SAndroid Build Coastguard Worker * <td><code>percent</code> 181*0e209d39SAndroid Build Coastguard Worker * <td><code>NumberFormat.createPercentInstance(getLocale(), status)</code> 182*0e209d39SAndroid Build Coastguard Worker * <tr> 183*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText</i> 184*0e209d39SAndroid Build Coastguard Worker * <td><code>new DecimalFormat(argStyleText, new DecimalFormatSymbols(getLocale(), status), status)</code> 185*0e209d39SAndroid Build Coastguard Worker * <tr> 186*0e209d39SAndroid Build Coastguard Worker * <td><i>argSkeletonText</i> 187*0e209d39SAndroid Build Coastguard Worker * <td><code>NumberFormatter::forSkeleton(argSkeletonText, status).locale(getLocale()).toFormat(status)</code> 188*0e209d39SAndroid Build Coastguard Worker * <tr> 189*0e209d39SAndroid Build Coastguard Worker * <td rowspan=7><code>date</code> 190*0e209d39SAndroid Build Coastguard Worker * <td><i>(none)</i> 191*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code> 192*0e209d39SAndroid Build Coastguard Worker * <tr> 193*0e209d39SAndroid Build Coastguard Worker * <td><code>short</code> 194*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createDateInstance(kShort, getLocale(), status)</code> 195*0e209d39SAndroid Build Coastguard Worker * <tr> 196*0e209d39SAndroid Build Coastguard Worker * <td><code>medium</code> 197*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code> 198*0e209d39SAndroid Build Coastguard Worker * <tr> 199*0e209d39SAndroid Build Coastguard Worker * <td><code>long</code> 200*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createDateInstance(kLong, getLocale(), status)</code> 201*0e209d39SAndroid Build Coastguard Worker * <tr> 202*0e209d39SAndroid Build Coastguard Worker * <td><code>full</code> 203*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createDateInstance(kFull, getLocale(), status)</code> 204*0e209d39SAndroid Build Coastguard Worker * <tr> 205*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText</i> 206*0e209d39SAndroid Build Coastguard Worker * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code> 207*0e209d39SAndroid Build Coastguard Worker * <tr> 208*0e209d39SAndroid Build Coastguard Worker * <td><i>argSkeletonText</i> 209*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat::createInstanceForSkeleton(argSkeletonText, getLocale(), status)</code> 210*0e209d39SAndroid Build Coastguard Worker * <tr> 211*0e209d39SAndroid Build Coastguard Worker * <td rowspan=6><code>time</code> 212*0e209d39SAndroid Build Coastguard Worker * <td><i>(none)</i> 213*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code> 214*0e209d39SAndroid Build Coastguard Worker * <tr> 215*0e209d39SAndroid Build Coastguard Worker * <td><code>short</code> 216*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createTimeInstance(kShort, getLocale(), status)</code> 217*0e209d39SAndroid Build Coastguard Worker * <tr> 218*0e209d39SAndroid Build Coastguard Worker * <td><code>medium</code> 219*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code> 220*0e209d39SAndroid Build Coastguard Worker * <tr> 221*0e209d39SAndroid Build Coastguard Worker * <td><code>long</code> 222*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createTimeInstance(kLong, getLocale(), status)</code> 223*0e209d39SAndroid Build Coastguard Worker * <tr> 224*0e209d39SAndroid Build Coastguard Worker * <td><code>full</code> 225*0e209d39SAndroid Build Coastguard Worker * <td><code>DateFormat.createTimeInstance(kFull, getLocale(), status)</code> 226*0e209d39SAndroid Build Coastguard Worker * <tr> 227*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText</i> 228*0e209d39SAndroid Build Coastguard Worker * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code> 229*0e209d39SAndroid Build Coastguard Worker * <tr> 230*0e209d39SAndroid Build Coastguard Worker * <td><code>spellout</code> 231*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText (optional)</i> 232*0e209d39SAndroid Build Coastguard Worker * <td><code>new RuleBasedNumberFormat(URBNF_SPELLOUT, getLocale(), status) 233*0e209d39SAndroid Build Coastguard Worker * <br/> .setDefaultRuleset(argStyleText, status);</code> 234*0e209d39SAndroid Build Coastguard Worker * <tr> 235*0e209d39SAndroid Build Coastguard Worker * <td><code>ordinal</code> 236*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText (optional)</i> 237*0e209d39SAndroid Build Coastguard Worker * <td><code>new RuleBasedNumberFormat(URBNF_ORDINAL, getLocale(), status) 238*0e209d39SAndroid Build Coastguard Worker * <br/> .setDefaultRuleset(argStyleText, status);</code> 239*0e209d39SAndroid Build Coastguard Worker * <tr> 240*0e209d39SAndroid Build Coastguard Worker * <td><code>duration</code> 241*0e209d39SAndroid Build Coastguard Worker * <td><i>argStyleText (optional)</i> 242*0e209d39SAndroid Build Coastguard Worker * <td><code>new RuleBasedNumberFormat(URBNF_DURATION, getLocale(), status) 243*0e209d39SAndroid Build Coastguard Worker * <br/> .setDefaultRuleset(argStyleText, status);</code> 244*0e209d39SAndroid Build Coastguard Worker * </table> 245*0e209d39SAndroid Build Coastguard Worker * <p> 246*0e209d39SAndroid Build Coastguard Worker * 247*0e209d39SAndroid Build Coastguard Worker * <h4>Argument formatting</h4> 248*0e209d39SAndroid Build Coastguard Worker * 249*0e209d39SAndroid Build Coastguard Worker * <p>Arguments are formatted according to their type, using the default 250*0e209d39SAndroid Build Coastguard Worker * ICU formatters for those types, unless otherwise specified.</p> 251*0e209d39SAndroid Build Coastguard Worker * 252*0e209d39SAndroid Build Coastguard Worker * <p>There are also several ways to control the formatting.</p> 253*0e209d39SAndroid Build Coastguard Worker * 254*0e209d39SAndroid Build Coastguard Worker * <p>We recommend you use default styles, predefined style values, skeletons, 255*0e209d39SAndroid Build Coastguard Worker * or preformatted values, but not pattern strings or custom format objects.</p> 256*0e209d39SAndroid Build Coastguard Worker * 257*0e209d39SAndroid Build Coastguard Worker * <p>For more details, see the 258*0e209d39SAndroid Build Coastguard Worker * <a href="https://unicode-org.github.io/icu/userguide/format_parse/messages">ICU User Guide</a>.</p> 259*0e209d39SAndroid Build Coastguard Worker * 260*0e209d39SAndroid Build Coastguard Worker * <h4>Usage Information</h4> 261*0e209d39SAndroid Build Coastguard Worker * 262*0e209d39SAndroid Build Coastguard Worker * <p>Here are some examples of usage: 263*0e209d39SAndroid Build Coastguard Worker * Example 1: 264*0e209d39SAndroid Build Coastguard Worker * 265*0e209d39SAndroid Build Coastguard Worker * <pre> 266*0e209d39SAndroid Build Coastguard Worker * \code 267*0e209d39SAndroid Build Coastguard Worker * UErrorCode success = U_ZERO_ERROR; 268*0e209d39SAndroid Build Coastguard Worker * GregorianCalendar cal(success); 269*0e209d39SAndroid Build Coastguard Worker * Formattable arguments[] = { 270*0e209d39SAndroid Build Coastguard Worker * 7L, 271*0e209d39SAndroid Build Coastguard Worker * Formattable( (Date) cal.getTime(success), Formattable::kIsDate), 272*0e209d39SAndroid Build Coastguard Worker * "a disturbance in the Force" 273*0e209d39SAndroid Build Coastguard Worker * }; 274*0e209d39SAndroid Build Coastguard Worker * 275*0e209d39SAndroid Build Coastguard Worker * UnicodeString result; 276*0e209d39SAndroid Build Coastguard Worker * MessageFormat::format( 277*0e209d39SAndroid Build Coastguard Worker * "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {0,number}.", 278*0e209d39SAndroid Build Coastguard Worker * arguments, 3, result, success ); 279*0e209d39SAndroid Build Coastguard Worker * 280*0e209d39SAndroid Build Coastguard Worker * cout << "result: " << result << endl; 281*0e209d39SAndroid Build Coastguard Worker * //<output>: At 4:34 PM on March 23, there was a disturbance 282*0e209d39SAndroid Build Coastguard Worker * // in the Force on planet 7. 283*0e209d39SAndroid Build Coastguard Worker * \endcode 284*0e209d39SAndroid Build Coastguard Worker * </pre> 285*0e209d39SAndroid Build Coastguard Worker * 286*0e209d39SAndroid Build Coastguard Worker * Typically, the message format will come from resources, and the 287*0e209d39SAndroid Build Coastguard Worker * arguments will be dynamically set at runtime. 288*0e209d39SAndroid Build Coastguard Worker * 289*0e209d39SAndroid Build Coastguard Worker * <p>Example 2: 290*0e209d39SAndroid Build Coastguard Worker * 291*0e209d39SAndroid Build Coastguard Worker * <pre> 292*0e209d39SAndroid Build Coastguard Worker * \code 293*0e209d39SAndroid Build Coastguard Worker * success = U_ZERO_ERROR; 294*0e209d39SAndroid Build Coastguard Worker * Formattable testArgs[] = {3L, "MyDisk"}; 295*0e209d39SAndroid Build Coastguard Worker * 296*0e209d39SAndroid Build Coastguard Worker * MessageFormat form( 297*0e209d39SAndroid Build Coastguard Worker * "The disk \"{1}\" contains {0} file(s).", success ); 298*0e209d39SAndroid Build Coastguard Worker * 299*0e209d39SAndroid Build Coastguard Worker * UnicodeString string; 300*0e209d39SAndroid Build Coastguard Worker * FieldPosition fpos = 0; 301*0e209d39SAndroid Build Coastguard Worker * cout << "format: " << form.format(testArgs, 2, string, fpos, success ) << endl; 302*0e209d39SAndroid Build Coastguard Worker * 303*0e209d39SAndroid Build Coastguard Worker * // output, with different testArgs: 304*0e209d39SAndroid Build Coastguard Worker * // output: The disk "MyDisk" contains 0 file(s). 305*0e209d39SAndroid Build Coastguard Worker * // output: The disk "MyDisk" contains 1 file(s). 306*0e209d39SAndroid Build Coastguard Worker * // output: The disk "MyDisk" contains 1,273 file(s). 307*0e209d39SAndroid Build Coastguard Worker * \endcode 308*0e209d39SAndroid Build Coastguard Worker * </pre> 309*0e209d39SAndroid Build Coastguard Worker * 310*0e209d39SAndroid Build Coastguard Worker * 311*0e209d39SAndroid Build Coastguard Worker * <p>For messages that include plural forms, you can use a plural argument: 312*0e209d39SAndroid Build Coastguard Worker * <pre> 313*0e209d39SAndroid Build Coastguard Worker * \code 314*0e209d39SAndroid Build Coastguard Worker * success = U_ZERO_ERROR; 315*0e209d39SAndroid Build Coastguard Worker * MessageFormat msgFmt( 316*0e209d39SAndroid Build Coastguard Worker * "{num_files, plural, " 317*0e209d39SAndroid Build Coastguard Worker * "=0{There are no files on disk \"{disk_name}\".}" 318*0e209d39SAndroid Build Coastguard Worker * "=1{There is one file on disk \"{disk_name}\".}" 319*0e209d39SAndroid Build Coastguard Worker * "other{There are # files on disk \"{disk_name}\".}}", 320*0e209d39SAndroid Build Coastguard Worker * Locale("en"), 321*0e209d39SAndroid Build Coastguard Worker * success); 322*0e209d39SAndroid Build Coastguard Worker * FieldPosition fpos = 0; 323*0e209d39SAndroid Build Coastguard Worker * Formattable testArgs[] = {0L, "MyDisk"}; 324*0e209d39SAndroid Build Coastguard Worker * UnicodeString testArgsNames[] = {"num_files", "disk_name"}; 325*0e209d39SAndroid Build Coastguard Worker * UnicodeString result; 326*0e209d39SAndroid Build Coastguard Worker * cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success); 327*0e209d39SAndroid Build Coastguard Worker * testArgs[0] = 3L; 328*0e209d39SAndroid Build Coastguard Worker * cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success); 329*0e209d39SAndroid Build Coastguard Worker * \endcode 330*0e209d39SAndroid Build Coastguard Worker * <em>output</em>: 331*0e209d39SAndroid Build Coastguard Worker * There are no files on disk "MyDisk". 332*0e209d39SAndroid Build Coastguard Worker * There are 3 files on "MyDisk". 333*0e209d39SAndroid Build Coastguard Worker * </pre> 334*0e209d39SAndroid Build Coastguard Worker * See {@link PluralFormat} and {@link PluralRules} for details. 335*0e209d39SAndroid Build Coastguard Worker * 336*0e209d39SAndroid Build Coastguard Worker * <h4><a name="synchronization">Synchronization</a></h4> 337*0e209d39SAndroid Build Coastguard Worker * 338*0e209d39SAndroid Build Coastguard Worker * <p>MessageFormats are not synchronized. 339*0e209d39SAndroid Build Coastguard Worker * It is recommended to create separate format instances for each thread. 340*0e209d39SAndroid Build Coastguard Worker * If multiple threads access a format concurrently, it must be synchronized 341*0e209d39SAndroid Build Coastguard Worker * externally. 342*0e209d39SAndroid Build Coastguard Worker * 343*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 344*0e209d39SAndroid Build Coastguard Worker */ 345*0e209d39SAndroid Build Coastguard Worker class U_I18N_API MessageFormat : public Format { 346*0e209d39SAndroid Build Coastguard Worker public: 347*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_OBSOLETE_API 348*0e209d39SAndroid Build Coastguard Worker /** 349*0e209d39SAndroid Build Coastguard Worker * Enum type for kMaxFormat. 350*0e209d39SAndroid Build Coastguard Worker * @obsolete ICU 3.0. The 10-argument limit was removed as of ICU 2.6, 351*0e209d39SAndroid Build Coastguard Worker * rendering this enum type obsolete. 352*0e209d39SAndroid Build Coastguard Worker */ 353*0e209d39SAndroid Build Coastguard Worker enum EFormatNumber { 354*0e209d39SAndroid Build Coastguard Worker /** 355*0e209d39SAndroid Build Coastguard Worker * The maximum number of arguments. 356*0e209d39SAndroid Build Coastguard Worker * @obsolete ICU 3.0. The 10-argument limit was removed as of ICU 2.6, 357*0e209d39SAndroid Build Coastguard Worker * rendering this constant obsolete. 358*0e209d39SAndroid Build Coastguard Worker */ 359*0e209d39SAndroid Build Coastguard Worker kMaxFormat = 10 360*0e209d39SAndroid Build Coastguard Worker }; 361*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_OBSOLETE_API */ 362*0e209d39SAndroid Build Coastguard Worker 363*0e209d39SAndroid Build Coastguard Worker /** 364*0e209d39SAndroid Build Coastguard Worker * Constructs a new MessageFormat using the given pattern and the 365*0e209d39SAndroid Build Coastguard Worker * default locale. 366*0e209d39SAndroid Build Coastguard Worker * 367*0e209d39SAndroid Build Coastguard Worker * @param pattern Pattern used to construct object. 368*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 369*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 370*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 371*0e209d39SAndroid Build Coastguard Worker */ 372*0e209d39SAndroid Build Coastguard Worker MessageFormat(const UnicodeString& pattern, 373*0e209d39SAndroid Build Coastguard Worker UErrorCode &status); 374*0e209d39SAndroid Build Coastguard Worker 375*0e209d39SAndroid Build Coastguard Worker /** 376*0e209d39SAndroid Build Coastguard Worker * Constructs a new MessageFormat using the given pattern and locale. 377*0e209d39SAndroid Build Coastguard Worker * @param pattern Pattern used to construct object. 378*0e209d39SAndroid Build Coastguard Worker * @param newLocale The locale to use for formatting dates and numbers. 379*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 380*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 381*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 382*0e209d39SAndroid Build Coastguard Worker */ 383*0e209d39SAndroid Build Coastguard Worker MessageFormat(const UnicodeString& pattern, 384*0e209d39SAndroid Build Coastguard Worker const Locale& newLocale, 385*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 386*0e209d39SAndroid Build Coastguard Worker /** 387*0e209d39SAndroid Build Coastguard Worker * Constructs a new MessageFormat using the given pattern and locale. 388*0e209d39SAndroid Build Coastguard Worker * @param pattern Pattern used to construct object. 389*0e209d39SAndroid Build Coastguard Worker * @param newLocale The locale to use for formatting dates and numbers. 390*0e209d39SAndroid Build Coastguard Worker * @param parseError Struct to receive information on the position 391*0e209d39SAndroid Build Coastguard Worker * of an error within the pattern. 392*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 393*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 394*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 395*0e209d39SAndroid Build Coastguard Worker */ 396*0e209d39SAndroid Build Coastguard Worker MessageFormat(const UnicodeString& pattern, 397*0e209d39SAndroid Build Coastguard Worker const Locale& newLocale, 398*0e209d39SAndroid Build Coastguard Worker UParseError& parseError, 399*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 400*0e209d39SAndroid Build Coastguard Worker /** 401*0e209d39SAndroid Build Coastguard Worker * Constructs a new MessageFormat from an existing one. 402*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 403*0e209d39SAndroid Build Coastguard Worker */ 404*0e209d39SAndroid Build Coastguard Worker MessageFormat(const MessageFormat&); 405*0e209d39SAndroid Build Coastguard Worker 406*0e209d39SAndroid Build Coastguard Worker /** 407*0e209d39SAndroid Build Coastguard Worker * Assignment operator. 408*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 409*0e209d39SAndroid Build Coastguard Worker */ 410*0e209d39SAndroid Build Coastguard Worker const MessageFormat& operator=(const MessageFormat&); 411*0e209d39SAndroid Build Coastguard Worker 412*0e209d39SAndroid Build Coastguard Worker /** 413*0e209d39SAndroid Build Coastguard Worker * Destructor. 414*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 415*0e209d39SAndroid Build Coastguard Worker */ 416*0e209d39SAndroid Build Coastguard Worker virtual ~MessageFormat(); 417*0e209d39SAndroid Build Coastguard Worker 418*0e209d39SAndroid Build Coastguard Worker /** 419*0e209d39SAndroid Build Coastguard Worker * Clones this Format object polymorphically. The caller owns the 420*0e209d39SAndroid Build Coastguard Worker * result and should delete it when done. 421*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 422*0e209d39SAndroid Build Coastguard Worker */ 423*0e209d39SAndroid Build Coastguard Worker virtual MessageFormat* clone() const override; 424*0e209d39SAndroid Build Coastguard Worker 425*0e209d39SAndroid Build Coastguard Worker /** 426*0e209d39SAndroid Build Coastguard Worker * Returns true if the given Format objects are semantically equal. 427*0e209d39SAndroid Build Coastguard Worker * Objects of different subclasses are considered unequal. 428*0e209d39SAndroid Build Coastguard Worker * @param other the object to be compared with. 429*0e209d39SAndroid Build Coastguard Worker * @return true if the given Format objects are semantically equal. 430*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 431*0e209d39SAndroid Build Coastguard Worker */ 432*0e209d39SAndroid Build Coastguard Worker virtual bool operator==(const Format& other) const override; 433*0e209d39SAndroid Build Coastguard Worker 434*0e209d39SAndroid Build Coastguard Worker /** 435*0e209d39SAndroid Build Coastguard Worker * Sets the locale to be used for creating argument Format objects. 436*0e209d39SAndroid Build Coastguard Worker * @param theLocale the new locale value to be set. 437*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 438*0e209d39SAndroid Build Coastguard Worker */ 439*0e209d39SAndroid Build Coastguard Worker virtual void setLocale(const Locale& theLocale); 440*0e209d39SAndroid Build Coastguard Worker 441*0e209d39SAndroid Build Coastguard Worker /** 442*0e209d39SAndroid Build Coastguard Worker * Gets the locale used for creating argument Format objects. 443*0e209d39SAndroid Build Coastguard Worker * format information. 444*0e209d39SAndroid Build Coastguard Worker * @return the locale of the object. 445*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 446*0e209d39SAndroid Build Coastguard Worker */ 447*0e209d39SAndroid Build Coastguard Worker virtual const Locale& getLocale() const; 448*0e209d39SAndroid Build Coastguard Worker 449*0e209d39SAndroid Build Coastguard Worker /** 450*0e209d39SAndroid Build Coastguard Worker * Applies the given pattern string to this message format. 451*0e209d39SAndroid Build Coastguard Worker * 452*0e209d39SAndroid Build Coastguard Worker * @param pattern The pattern to be applied. 453*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 454*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 455*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 456*0e209d39SAndroid Build Coastguard Worker */ 457*0e209d39SAndroid Build Coastguard Worker virtual void applyPattern(const UnicodeString& pattern, 458*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 459*0e209d39SAndroid Build Coastguard Worker /** 460*0e209d39SAndroid Build Coastguard Worker * Applies the given pattern string to this message format. 461*0e209d39SAndroid Build Coastguard Worker * 462*0e209d39SAndroid Build Coastguard Worker * @param pattern The pattern to be applied. 463*0e209d39SAndroid Build Coastguard Worker * @param parseError Struct to receive information on the position 464*0e209d39SAndroid Build Coastguard Worker * of an error within the pattern. 465*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 466*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 467*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 468*0e209d39SAndroid Build Coastguard Worker */ 469*0e209d39SAndroid Build Coastguard Worker virtual void applyPattern(const UnicodeString& pattern, 470*0e209d39SAndroid Build Coastguard Worker UParseError& parseError, 471*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 472*0e209d39SAndroid Build Coastguard Worker 473*0e209d39SAndroid Build Coastguard Worker /** 474*0e209d39SAndroid Build Coastguard Worker * Sets the UMessagePatternApostropheMode and the pattern used by this message format. 475*0e209d39SAndroid Build Coastguard Worker * Parses the pattern and caches Format objects for simple argument types. 476*0e209d39SAndroid Build Coastguard Worker * Patterns and their interpretation are specified in the 477*0e209d39SAndroid Build Coastguard Worker * <a href="#patterns">class description</a>. 478*0e209d39SAndroid Build Coastguard Worker * <p> 479*0e209d39SAndroid Build Coastguard Worker * This method is best used only once on a given object to avoid confusion about the mode, 480*0e209d39SAndroid Build Coastguard Worker * and after constructing the object with an empty pattern string to minimize overhead. 481*0e209d39SAndroid Build Coastguard Worker * 482*0e209d39SAndroid Build Coastguard Worker * @param pattern The pattern to be applied. 483*0e209d39SAndroid Build Coastguard Worker * @param aposMode The new apostrophe mode. 484*0e209d39SAndroid Build Coastguard Worker * @param parseError Struct to receive information on the position 485*0e209d39SAndroid Build Coastguard Worker * of an error within the pattern. 486*0e209d39SAndroid Build Coastguard Worker * Can be nullptr. 487*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 488*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 489*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.8 490*0e209d39SAndroid Build Coastguard Worker */ 491*0e209d39SAndroid Build Coastguard Worker virtual void applyPattern(const UnicodeString& pattern, 492*0e209d39SAndroid Build Coastguard Worker UMessagePatternApostropheMode aposMode, 493*0e209d39SAndroid Build Coastguard Worker UParseError* parseError, 494*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 495*0e209d39SAndroid Build Coastguard Worker 496*0e209d39SAndroid Build Coastguard Worker /** 497*0e209d39SAndroid Build Coastguard Worker * @return this instance's UMessagePatternApostropheMode. 498*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.8 499*0e209d39SAndroid Build Coastguard Worker */ getApostropheMode()500*0e209d39SAndroid Build Coastguard Worker UMessagePatternApostropheMode getApostropheMode() const { 501*0e209d39SAndroid Build Coastguard Worker return msgPattern.getApostropheMode(); 502*0e209d39SAndroid Build Coastguard Worker } 503*0e209d39SAndroid Build Coastguard Worker 504*0e209d39SAndroid Build Coastguard Worker /** 505*0e209d39SAndroid Build Coastguard Worker * Returns a pattern that can be used to recreate this object. 506*0e209d39SAndroid Build Coastguard Worker * 507*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive the pattern. 508*0e209d39SAndroid Build Coastguard Worker * Result is appended to existing contents. 509*0e209d39SAndroid Build Coastguard Worker * @return Reference to 'appendTo' parameter. 510*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 511*0e209d39SAndroid Build Coastguard Worker */ 512*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& toPattern(UnicodeString& appendTo) const; 513*0e209d39SAndroid Build Coastguard Worker 514*0e209d39SAndroid Build Coastguard Worker /** 515*0e209d39SAndroid Build Coastguard Worker * Sets subformats. 516*0e209d39SAndroid Build Coastguard Worker * See the class description about format numbering. 517*0e209d39SAndroid Build Coastguard Worker * The caller should not delete the Format objects after this call. 518*0e209d39SAndroid Build Coastguard Worker * <EM>The array formatsToAdopt is not itself adopted.</EM> Its 519*0e209d39SAndroid Build Coastguard Worker * ownership is retained by the caller. If the call fails because 520*0e209d39SAndroid Build Coastguard Worker * memory cannot be allocated, then the formats will be deleted 521*0e209d39SAndroid Build Coastguard Worker * by this method, and this object will remain unchanged. 522*0e209d39SAndroid Build Coastguard Worker * 523*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, the new formats are discarded 524*0e209d39SAndroid Build Coastguard Worker * and this format remains unchanged. 525*0e209d39SAndroid Build Coastguard Worker * 526*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 527*0e209d39SAndroid Build Coastguard Worker * @param formatsToAdopt the format to be adopted. 528*0e209d39SAndroid Build Coastguard Worker * @param count the size of the array. 529*0e209d39SAndroid Build Coastguard Worker */ 530*0e209d39SAndroid Build Coastguard Worker virtual void adoptFormats(Format** formatsToAdopt, int32_t count); 531*0e209d39SAndroid Build Coastguard Worker 532*0e209d39SAndroid Build Coastguard Worker /** 533*0e209d39SAndroid Build Coastguard Worker * Sets subformats. 534*0e209d39SAndroid Build Coastguard Worker * See the class description about format numbering. 535*0e209d39SAndroid Build Coastguard Worker * Each item in the array is cloned into the internal array. 536*0e209d39SAndroid Build Coastguard Worker * If the call fails because memory cannot be allocated, then this 537*0e209d39SAndroid Build Coastguard Worker * object will remain unchanged. 538*0e209d39SAndroid Build Coastguard Worker * 539*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, the new formats are discarded 540*0e209d39SAndroid Build Coastguard Worker * and this format remains unchanged. 541*0e209d39SAndroid Build Coastguard Worker * 542*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 543*0e209d39SAndroid Build Coastguard Worker * @param newFormats the new format to be set. 544*0e209d39SAndroid Build Coastguard Worker * @param cnt the size of the array. 545*0e209d39SAndroid Build Coastguard Worker */ 546*0e209d39SAndroid Build Coastguard Worker virtual void setFormats(const Format** newFormats, int32_t cnt); 547*0e209d39SAndroid Build Coastguard Worker 548*0e209d39SAndroid Build Coastguard Worker 549*0e209d39SAndroid Build Coastguard Worker /** 550*0e209d39SAndroid Build Coastguard Worker * Sets one subformat. 551*0e209d39SAndroid Build Coastguard Worker * See the class description about format numbering. 552*0e209d39SAndroid Build Coastguard Worker * The caller should not delete the Format object after this call. 553*0e209d39SAndroid Build Coastguard Worker * If the number is over the number of formats already set, 554*0e209d39SAndroid Build Coastguard Worker * the item will be deleted and ignored. 555*0e209d39SAndroid Build Coastguard Worker * 556*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, the new format is discarded 557*0e209d39SAndroid Build Coastguard Worker * and this format remains unchanged. 558*0e209d39SAndroid Build Coastguard Worker * 559*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 560*0e209d39SAndroid Build Coastguard Worker * @param formatNumber index of the subformat. 561*0e209d39SAndroid Build Coastguard Worker * @param formatToAdopt the format to be adopted. 562*0e209d39SAndroid Build Coastguard Worker */ 563*0e209d39SAndroid Build Coastguard Worker virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt); 564*0e209d39SAndroid Build Coastguard Worker 565*0e209d39SAndroid Build Coastguard Worker /** 566*0e209d39SAndroid Build Coastguard Worker * Sets one subformat. 567*0e209d39SAndroid Build Coastguard Worker * See the class description about format numbering. 568*0e209d39SAndroid Build Coastguard Worker * If the number is over the number of formats already set, 569*0e209d39SAndroid Build Coastguard Worker * the item will be ignored. 570*0e209d39SAndroid Build Coastguard Worker * @param formatNumber index of the subformat. 571*0e209d39SAndroid Build Coastguard Worker * @param format the format to be set. 572*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 573*0e209d39SAndroid Build Coastguard Worker */ 574*0e209d39SAndroid Build Coastguard Worker virtual void setFormat(int32_t formatNumber, const Format& format); 575*0e209d39SAndroid Build Coastguard Worker 576*0e209d39SAndroid Build Coastguard Worker /** 577*0e209d39SAndroid Build Coastguard Worker * Gets format names. This function returns formatNames in StringEnumerations 578*0e209d39SAndroid Build Coastguard Worker * which can be used with getFormat() and setFormat() to export formattable 579*0e209d39SAndroid Build Coastguard Worker * array from current MessageFormat to another. It is the caller's responsibility 580*0e209d39SAndroid Build Coastguard Worker * to delete the returned formatNames. 581*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code. 582*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 583*0e209d39SAndroid Build Coastguard Worker */ 584*0e209d39SAndroid Build Coastguard Worker virtual StringEnumeration* getFormatNames(UErrorCode& status); 585*0e209d39SAndroid Build Coastguard Worker 586*0e209d39SAndroid Build Coastguard Worker /** 587*0e209d39SAndroid Build Coastguard Worker * Gets subformat pointer for given format name. 588*0e209d39SAndroid Build Coastguard Worker * This function supports both named and numbered 589*0e209d39SAndroid Build Coastguard Worker * arguments. If numbered, the formatName is the 590*0e209d39SAndroid Build Coastguard Worker * corresponding UnicodeStrings (e.g. "0", "1", "2"...). 591*0e209d39SAndroid Build Coastguard Worker * The returned Format object should not be deleted by the caller, 592*0e209d39SAndroid Build Coastguard Worker * nor should the pointer of other object . The pointer and its 593*0e209d39SAndroid Build Coastguard Worker * contents remain valid only until the next call to any method 594*0e209d39SAndroid Build Coastguard Worker * of this class is made with this object. 595*0e209d39SAndroid Build Coastguard Worker * @param formatName the name or number specifying a format 596*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code. 597*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 598*0e209d39SAndroid Build Coastguard Worker */ 599*0e209d39SAndroid Build Coastguard Worker virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status); 600*0e209d39SAndroid Build Coastguard Worker 601*0e209d39SAndroid Build Coastguard Worker /** 602*0e209d39SAndroid Build Coastguard Worker * Sets one subformat for given format name. 603*0e209d39SAndroid Build Coastguard Worker * See the class description about format name. 604*0e209d39SAndroid Build Coastguard Worker * This function supports both named and numbered 605*0e209d39SAndroid Build Coastguard Worker * arguments-- if numbered, the formatName is the 606*0e209d39SAndroid Build Coastguard Worker * corresponding UnicodeStrings (e.g. "0", "1", "2"...). 607*0e209d39SAndroid Build Coastguard Worker * If there is no matched formatName or wrong type, 608*0e209d39SAndroid Build Coastguard Worker * the item will be ignored. 609*0e209d39SAndroid Build Coastguard Worker * @param formatName Name of the subformat. 610*0e209d39SAndroid Build Coastguard Worker * @param format the format to be set. 611*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code. 612*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 613*0e209d39SAndroid Build Coastguard Worker */ 614*0e209d39SAndroid Build Coastguard Worker virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status); 615*0e209d39SAndroid Build Coastguard Worker 616*0e209d39SAndroid Build Coastguard Worker /** 617*0e209d39SAndroid Build Coastguard Worker * Sets one subformat for given format name. 618*0e209d39SAndroid Build Coastguard Worker * See the class description about format name. 619*0e209d39SAndroid Build Coastguard Worker * This function supports both named and numbered 620*0e209d39SAndroid Build Coastguard Worker * arguments-- if numbered, the formatName is the 621*0e209d39SAndroid Build Coastguard Worker * corresponding UnicodeStrings (e.g. "0", "1", "2"...). 622*0e209d39SAndroid Build Coastguard Worker * If there is no matched formatName or wrong type, 623*0e209d39SAndroid Build Coastguard Worker * the item will be ignored. 624*0e209d39SAndroid Build Coastguard Worker * The caller should not delete the Format object after this call. 625*0e209d39SAndroid Build Coastguard Worker * @param formatName Name of the subformat. 626*0e209d39SAndroid Build Coastguard Worker * @param formatToAdopt Format to be adopted. 627*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code. 628*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 629*0e209d39SAndroid Build Coastguard Worker */ 630*0e209d39SAndroid Build Coastguard Worker virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status); 631*0e209d39SAndroid Build Coastguard Worker 632*0e209d39SAndroid Build Coastguard Worker /** 633*0e209d39SAndroid Build Coastguard Worker * Gets an array of subformats of this object. The returned array 634*0e209d39SAndroid Build Coastguard Worker * should not be deleted by the caller, nor should the pointers 635*0e209d39SAndroid Build Coastguard Worker * within the array. The array and its contents remain valid only 636*0e209d39SAndroid Build Coastguard Worker * until the next call to this format. See the class description 637*0e209d39SAndroid Build Coastguard Worker * about format numbering. 638*0e209d39SAndroid Build Coastguard Worker * 639*0e209d39SAndroid Build Coastguard Worker * @param count output parameter to receive the size of the array 640*0e209d39SAndroid Build Coastguard Worker * @return an array of count Format* objects, or nullptr if out of 641*0e209d39SAndroid Build Coastguard Worker * memory. Any or all of the array elements may be nullptr. 642*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 643*0e209d39SAndroid Build Coastguard Worker */ 644*0e209d39SAndroid Build Coastguard Worker virtual const Format** getFormats(int32_t& count) const; 645*0e209d39SAndroid Build Coastguard Worker 646*0e209d39SAndroid Build Coastguard Worker 647*0e209d39SAndroid Build Coastguard Worker using Format::format; 648*0e209d39SAndroid Build Coastguard Worker 649*0e209d39SAndroid Build Coastguard Worker /** 650*0e209d39SAndroid Build Coastguard Worker * Formats the given array of arguments into a user-readable string. 651*0e209d39SAndroid Build Coastguard Worker * Does not take ownership of the Formattable* array or its contents. 652*0e209d39SAndroid Build Coastguard Worker * 653*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, appendTo is unchanged and 654*0e209d39SAndroid Build Coastguard Worker * status is set to U_ILLEGAL_ARGUMENT_ERROR. 655*0e209d39SAndroid Build Coastguard Worker * 656*0e209d39SAndroid Build Coastguard Worker * @param source An array of objects to be formatted. 657*0e209d39SAndroid Build Coastguard Worker * @param count The number of elements of 'source'. 658*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive result. 659*0e209d39SAndroid Build Coastguard Worker * Result is appended to existing contents. 660*0e209d39SAndroid Build Coastguard Worker * @param ignore Not used; inherited from base class API. 661*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 662*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 663*0e209d39SAndroid Build Coastguard Worker * @return Reference to 'appendTo' parameter. 664*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 665*0e209d39SAndroid Build Coastguard Worker */ 666*0e209d39SAndroid Build Coastguard Worker UnicodeString& format(const Formattable* source, 667*0e209d39SAndroid Build Coastguard Worker int32_t count, 668*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 669*0e209d39SAndroid Build Coastguard Worker FieldPosition& ignore, 670*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 671*0e209d39SAndroid Build Coastguard Worker 672*0e209d39SAndroid Build Coastguard Worker /** 673*0e209d39SAndroid Build Coastguard Worker * Formats the given array of arguments into a user-readable string 674*0e209d39SAndroid Build Coastguard Worker * using the given pattern. 675*0e209d39SAndroid Build Coastguard Worker * 676*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, appendTo is unchanged and 677*0e209d39SAndroid Build Coastguard Worker * status is set to U_ILLEGAL_ARGUMENT_ERROR. 678*0e209d39SAndroid Build Coastguard Worker * 679*0e209d39SAndroid Build Coastguard Worker * @param pattern The pattern. 680*0e209d39SAndroid Build Coastguard Worker * @param arguments An array of objects to be formatted. 681*0e209d39SAndroid Build Coastguard Worker * @param count The number of elements of 'source'. 682*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive result. 683*0e209d39SAndroid Build Coastguard Worker * Result is appended to existing contents. 684*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 685*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 686*0e209d39SAndroid Build Coastguard Worker * @return Reference to 'appendTo' parameter. 687*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 688*0e209d39SAndroid Build Coastguard Worker */ 689*0e209d39SAndroid Build Coastguard Worker static UnicodeString& format(const UnicodeString& pattern, 690*0e209d39SAndroid Build Coastguard Worker const Formattable* arguments, 691*0e209d39SAndroid Build Coastguard Worker int32_t count, 692*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 693*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 694*0e209d39SAndroid Build Coastguard Worker 695*0e209d39SAndroid Build Coastguard Worker /** 696*0e209d39SAndroid Build Coastguard Worker * Formats the given array of arguments into a user-readable 697*0e209d39SAndroid Build Coastguard Worker * string. The array must be stored within a single Formattable 698*0e209d39SAndroid Build Coastguard Worker * object of type kArray. If the Formattable object type is not of 699*0e209d39SAndroid Build Coastguard Worker * type kArray, then returns a failing UErrorCode. 700*0e209d39SAndroid Build Coastguard Worker * 701*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, appendTo is unchanged and 702*0e209d39SAndroid Build Coastguard Worker * status is set to U_ILLEGAL_ARGUMENT_ERROR. 703*0e209d39SAndroid Build Coastguard Worker * 704*0e209d39SAndroid Build Coastguard Worker * @param obj A Formattable of type kArray containing 705*0e209d39SAndroid Build Coastguard Worker * arguments to be formatted. 706*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive result. 707*0e209d39SAndroid Build Coastguard Worker * Result is appended to existing contents. 708*0e209d39SAndroid Build Coastguard Worker * @param pos On input: an alignment field, if desired. 709*0e209d39SAndroid Build Coastguard Worker * On output: the offsets of the alignment field. 710*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 711*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 712*0e209d39SAndroid Build Coastguard Worker * @return Reference to 'appendTo' parameter. 713*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 714*0e209d39SAndroid Build Coastguard Worker */ 715*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& format(const Formattable& obj, 716*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 717*0e209d39SAndroid Build Coastguard Worker FieldPosition& pos, 718*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const override; 719*0e209d39SAndroid Build Coastguard Worker 720*0e209d39SAndroid Build Coastguard Worker /** 721*0e209d39SAndroid Build Coastguard Worker * Formats the given array of arguments into a user-defined argument name 722*0e209d39SAndroid Build Coastguard Worker * array. This function supports both named and numbered 723*0e209d39SAndroid Build Coastguard Worker * arguments-- if numbered, the formatName is the 724*0e209d39SAndroid Build Coastguard Worker * corresponding UnicodeStrings (e.g. "0", "1", "2"...). 725*0e209d39SAndroid Build Coastguard Worker * 726*0e209d39SAndroid Build Coastguard Worker * @param argumentNames argument name array 727*0e209d39SAndroid Build Coastguard Worker * @param arguments An array of objects to be formatted. 728*0e209d39SAndroid Build Coastguard Worker * @param count The number of elements of 'argumentNames' and 729*0e209d39SAndroid Build Coastguard Worker * arguments. The number of argumentNames and arguments 730*0e209d39SAndroid Build Coastguard Worker * must be the same. 731*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive result. 732*0e209d39SAndroid Build Coastguard Worker * Result is appended to existing contents. 733*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 734*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 735*0e209d39SAndroid Build Coastguard Worker * @return Reference to 'appendTo' parameter. 736*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 737*0e209d39SAndroid Build Coastguard Worker */ 738*0e209d39SAndroid Build Coastguard Worker UnicodeString& format(const UnicodeString* argumentNames, 739*0e209d39SAndroid Build Coastguard Worker const Formattable* arguments, 740*0e209d39SAndroid Build Coastguard Worker int32_t count, 741*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 742*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 743*0e209d39SAndroid Build Coastguard Worker /** 744*0e209d39SAndroid Build Coastguard Worker * Parses the given string into an array of output arguments. 745*0e209d39SAndroid Build Coastguard Worker * 746*0e209d39SAndroid Build Coastguard Worker * @param source String to be parsed. 747*0e209d39SAndroid Build Coastguard Worker * @param pos On input, starting position for parse. On output, 748*0e209d39SAndroid Build Coastguard Worker * final position after parse. Unchanged if parse 749*0e209d39SAndroid Build Coastguard Worker * fails. 750*0e209d39SAndroid Build Coastguard Worker * @param count Output parameter to receive the number of arguments 751*0e209d39SAndroid Build Coastguard Worker * parsed. 752*0e209d39SAndroid Build Coastguard Worker * @return an array of parsed arguments. The caller owns both 753*0e209d39SAndroid Build Coastguard Worker * the array and its contents. 754*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 755*0e209d39SAndroid Build Coastguard Worker */ 756*0e209d39SAndroid Build Coastguard Worker virtual Formattable* parse(const UnicodeString& source, 757*0e209d39SAndroid Build Coastguard Worker ParsePosition& pos, 758*0e209d39SAndroid Build Coastguard Worker int32_t& count) const; 759*0e209d39SAndroid Build Coastguard Worker 760*0e209d39SAndroid Build Coastguard Worker /** 761*0e209d39SAndroid Build Coastguard Worker * Parses the given string into an array of output arguments. 762*0e209d39SAndroid Build Coastguard Worker * 763*0e209d39SAndroid Build Coastguard Worker * <p>If this format uses named arguments, status is set to 764*0e209d39SAndroid Build Coastguard Worker * U_ARGUMENT_TYPE_MISMATCH. 765*0e209d39SAndroid Build Coastguard Worker * 766*0e209d39SAndroid Build Coastguard Worker * @param source String to be parsed. 767*0e209d39SAndroid Build Coastguard Worker * @param count Output param to receive size of returned array. 768*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the 769*0e209d39SAndroid Build Coastguard Worker * pattern cannot be parsed, set to failure code. 770*0e209d39SAndroid Build Coastguard Worker * @return an array of parsed arguments. The caller owns both 771*0e209d39SAndroid Build Coastguard Worker * the array and its contents. Returns nullptr if status is not U_ZERO_ERROR. 772*0e209d39SAndroid Build Coastguard Worker * 773*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 774*0e209d39SAndroid Build Coastguard Worker */ 775*0e209d39SAndroid Build Coastguard Worker virtual Formattable* parse(const UnicodeString& source, 776*0e209d39SAndroid Build Coastguard Worker int32_t& count, 777*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 778*0e209d39SAndroid Build Coastguard Worker 779*0e209d39SAndroid Build Coastguard Worker /** 780*0e209d39SAndroid Build Coastguard Worker * Parses the given string into an array of output arguments 781*0e209d39SAndroid Build Coastguard Worker * stored within a single Formattable of type kArray. 782*0e209d39SAndroid Build Coastguard Worker * 783*0e209d39SAndroid Build Coastguard Worker * @param source The string to be parsed into an object. 784*0e209d39SAndroid Build Coastguard Worker * @param result Formattable to be set to the parse result. 785*0e209d39SAndroid Build Coastguard Worker * If parse fails, return contents are undefined. 786*0e209d39SAndroid Build Coastguard Worker * @param pos On input, starting position for parse. On output, 787*0e209d39SAndroid Build Coastguard Worker * final position after parse. Unchanged if parse 788*0e209d39SAndroid Build Coastguard Worker * fails. 789*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 790*0e209d39SAndroid Build Coastguard Worker */ 791*0e209d39SAndroid Build Coastguard Worker virtual void parseObject(const UnicodeString& source, 792*0e209d39SAndroid Build Coastguard Worker Formattable& result, 793*0e209d39SAndroid Build Coastguard Worker ParsePosition& pos) const override; 794*0e209d39SAndroid Build Coastguard Worker 795*0e209d39SAndroid Build Coastguard Worker /** 796*0e209d39SAndroid Build Coastguard Worker * Convert an 'apostrophe-friendly' pattern into a standard 797*0e209d39SAndroid Build Coastguard Worker * pattern. Standard patterns treat all apostrophes as 798*0e209d39SAndroid Build Coastguard Worker * quotes, which is problematic in some languages, e.g. 799*0e209d39SAndroid Build Coastguard Worker * French, where apostrophe is commonly used. This utility 800*0e209d39SAndroid Build Coastguard Worker * assumes that only an unpaired apostrophe immediately before 801*0e209d39SAndroid Build Coastguard Worker * a brace is a true quote. Other unpaired apostrophes are paired, 802*0e209d39SAndroid Build Coastguard Worker * and the resulting standard pattern string is returned. 803*0e209d39SAndroid Build Coastguard Worker * 804*0e209d39SAndroid Build Coastguard Worker * <p><b>Note</b> it is not guaranteed that the returned pattern 805*0e209d39SAndroid Build Coastguard Worker * is indeed a valid pattern. The only effect is to convert 806*0e209d39SAndroid Build Coastguard Worker * between patterns having different quoting semantics. 807*0e209d39SAndroid Build Coastguard Worker * 808*0e209d39SAndroid Build Coastguard Worker * @param pattern the 'apostrophe-friendly' patttern to convert 809*0e209d39SAndroid Build Coastguard Worker * @param status Input/output error code. If the pattern 810*0e209d39SAndroid Build Coastguard Worker * cannot be parsed, the failure code is set. 811*0e209d39SAndroid Build Coastguard Worker * @return the standard equivalent of the original pattern 812*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.4 813*0e209d39SAndroid Build Coastguard Worker */ 814*0e209d39SAndroid Build Coastguard Worker static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern, 815*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 816*0e209d39SAndroid Build Coastguard Worker 817*0e209d39SAndroid Build Coastguard Worker 818*0e209d39SAndroid Build Coastguard Worker /** 819*0e209d39SAndroid Build Coastguard Worker * Returns true if this MessageFormat uses named arguments, 820*0e209d39SAndroid Build Coastguard Worker * and false otherwise. See class description. 821*0e209d39SAndroid Build Coastguard Worker * 822*0e209d39SAndroid Build Coastguard Worker * @return true if named arguments are used. 823*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.0 824*0e209d39SAndroid Build Coastguard Worker */ 825*0e209d39SAndroid Build Coastguard Worker UBool usesNamedArguments() const; 826*0e209d39SAndroid Build Coastguard Worker 827*0e209d39SAndroid Build Coastguard Worker 828*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API 829*0e209d39SAndroid Build Coastguard Worker /** 830*0e209d39SAndroid Build Coastguard Worker * This API is for ICU internal use only. 831*0e209d39SAndroid Build Coastguard Worker * Please do not use it. 832*0e209d39SAndroid Build Coastguard Worker * 833*0e209d39SAndroid Build Coastguard Worker * Returns argument types count in the parsed pattern. 834*0e209d39SAndroid Build Coastguard Worker * Used to distinguish pattern "{0} d" and "d". 835*0e209d39SAndroid Build Coastguard Worker * 836*0e209d39SAndroid Build Coastguard Worker * @return The number of formattable types in the pattern 837*0e209d39SAndroid Build Coastguard Worker * @internal 838*0e209d39SAndroid Build Coastguard Worker */ 839*0e209d39SAndroid Build Coastguard Worker int32_t getArgTypeCount() const; 840*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */ 841*0e209d39SAndroid Build Coastguard Worker 842*0e209d39SAndroid Build Coastguard Worker /** 843*0e209d39SAndroid Build Coastguard Worker * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. 844*0e209d39SAndroid Build Coastguard Worker * This method is to implement a simple version of RTTI, since not all 845*0e209d39SAndroid Build Coastguard Worker * C++ compilers support genuine RTTI. Polymorphic operator==() and 846*0e209d39SAndroid Build Coastguard Worker * clone() methods call this method. 847*0e209d39SAndroid Build Coastguard Worker * 848*0e209d39SAndroid Build Coastguard Worker * @return The class ID for this object. All objects of a 849*0e209d39SAndroid Build Coastguard Worker * given class have the same class ID. Objects of 850*0e209d39SAndroid Build Coastguard Worker * other classes have different class IDs. 851*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 852*0e209d39SAndroid Build Coastguard Worker */ 853*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 854*0e209d39SAndroid Build Coastguard Worker 855*0e209d39SAndroid Build Coastguard Worker /** 856*0e209d39SAndroid Build Coastguard Worker * Return the class ID for this class. This is useful only for 857*0e209d39SAndroid Build Coastguard Worker * comparing to a return value from getDynamicClassID(). For example: 858*0e209d39SAndroid Build Coastguard Worker * <pre> 859*0e209d39SAndroid Build Coastguard Worker * . Base* polymorphic_pointer = createPolymorphicObject(); 860*0e209d39SAndroid Build Coastguard Worker * . if (polymorphic_pointer->getDynamicClassID() == 861*0e209d39SAndroid Build Coastguard Worker * . Derived::getStaticClassID()) ... 862*0e209d39SAndroid Build Coastguard Worker * </pre> 863*0e209d39SAndroid Build Coastguard Worker * @return The class ID for all objects of this class. 864*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0 865*0e209d39SAndroid Build Coastguard Worker */ 866*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 867*0e209d39SAndroid Build Coastguard Worker 868*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API 869*0e209d39SAndroid Build Coastguard Worker /** 870*0e209d39SAndroid Build Coastguard Worker * Compares two Format objects. This is used for constructing the hash 871*0e209d39SAndroid Build Coastguard Worker * tables. 872*0e209d39SAndroid Build Coastguard Worker * 873*0e209d39SAndroid Build Coastguard Worker * @param left pointer to a Format object. Must not be nullptr. 874*0e209d39SAndroid Build Coastguard Worker * @param right pointer to a Format object. Must not be nullptr. 875*0e209d39SAndroid Build Coastguard Worker * 876*0e209d39SAndroid Build Coastguard Worker * @return whether the two objects are the same 877*0e209d39SAndroid Build Coastguard Worker * @internal 878*0e209d39SAndroid Build Coastguard Worker */ 879*0e209d39SAndroid Build Coastguard Worker static UBool equalFormats(const void* left, const void* right); 880*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */ 881*0e209d39SAndroid Build Coastguard Worker 882*0e209d39SAndroid Build Coastguard Worker private: 883*0e209d39SAndroid Build Coastguard Worker 884*0e209d39SAndroid Build Coastguard Worker Locale fLocale; 885*0e209d39SAndroid Build Coastguard Worker MessagePattern msgPattern; 886*0e209d39SAndroid Build Coastguard Worker Format** formatAliases; // see getFormats 887*0e209d39SAndroid Build Coastguard Worker int32_t formatAliasesCapacity; 888*0e209d39SAndroid Build Coastguard Worker 889*0e209d39SAndroid Build Coastguard Worker MessageFormat() = delete; // default constructor not implemented 890*0e209d39SAndroid Build Coastguard Worker 891*0e209d39SAndroid Build Coastguard Worker /** 892*0e209d39SAndroid Build Coastguard Worker * This provider helps defer instantiation of a PluralRules object 893*0e209d39SAndroid Build Coastguard Worker * until we actually need to select a keyword. 894*0e209d39SAndroid Build Coastguard Worker * For example, if the number matches an explicit-value selector like "=1" 895*0e209d39SAndroid Build Coastguard Worker * we do not need any PluralRules. 896*0e209d39SAndroid Build Coastguard Worker */ 897*0e209d39SAndroid Build Coastguard Worker class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector { 898*0e209d39SAndroid Build Coastguard Worker public: 899*0e209d39SAndroid Build Coastguard Worker PluralSelectorProvider(const MessageFormat &mf, UPluralType type); 900*0e209d39SAndroid Build Coastguard Worker virtual ~PluralSelectorProvider(); 901*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const override; 902*0e209d39SAndroid Build Coastguard Worker 903*0e209d39SAndroid Build Coastguard Worker void reset(); 904*0e209d39SAndroid Build Coastguard Worker private: 905*0e209d39SAndroid Build Coastguard Worker const MessageFormat &msgFormat; 906*0e209d39SAndroid Build Coastguard Worker PluralRules* rules; 907*0e209d39SAndroid Build Coastguard Worker UPluralType type; 908*0e209d39SAndroid Build Coastguard Worker }; 909*0e209d39SAndroid Build Coastguard Worker 910*0e209d39SAndroid Build Coastguard Worker /** 911*0e209d39SAndroid Build Coastguard Worker * A MessageFormat formats an array of arguments. Each argument 912*0e209d39SAndroid Build Coastguard Worker * has an expected type, based on the pattern. For example, if 913*0e209d39SAndroid Build Coastguard Worker * the pattern contains the subformat "{3,number,integer}", then 914*0e209d39SAndroid Build Coastguard Worker * we expect argument 3 to have type Formattable::kLong. This 915*0e209d39SAndroid Build Coastguard Worker * array needs to grow dynamically if the MessageFormat is 916*0e209d39SAndroid Build Coastguard Worker * modified. 917*0e209d39SAndroid Build Coastguard Worker */ 918*0e209d39SAndroid Build Coastguard Worker Formattable::Type* argTypes; 919*0e209d39SAndroid Build Coastguard Worker int32_t argTypeCount; 920*0e209d39SAndroid Build Coastguard Worker int32_t argTypeCapacity; 921*0e209d39SAndroid Build Coastguard Worker 922*0e209d39SAndroid Build Coastguard Worker /** 923*0e209d39SAndroid Build Coastguard Worker * true if there are different argTypes for the same argument. 924*0e209d39SAndroid Build Coastguard Worker * This only matters when the MessageFormat is used in the plain C (umsg_xxx) API 925*0e209d39SAndroid Build Coastguard Worker * where the pattern argTypes determine how the va_arg list is read. 926*0e209d39SAndroid Build Coastguard Worker */ 927*0e209d39SAndroid Build Coastguard Worker UBool hasArgTypeConflicts; 928*0e209d39SAndroid Build Coastguard Worker 929*0e209d39SAndroid Build Coastguard Worker // Variable-size array management 930*0e209d39SAndroid Build Coastguard Worker UBool allocateArgTypes(int32_t capacity, UErrorCode& status); 931*0e209d39SAndroid Build Coastguard Worker 932*0e209d39SAndroid Build Coastguard Worker /** 933*0e209d39SAndroid Build Coastguard Worker * Default Format objects used when no format is specified and a 934*0e209d39SAndroid Build Coastguard Worker * numeric or date argument is formatted. These are volatile 935*0e209d39SAndroid Build Coastguard Worker * cache objects maintained only for performance. They do not 936*0e209d39SAndroid Build Coastguard Worker * participate in operator=(), copy constructor(), nor 937*0e209d39SAndroid Build Coastguard Worker * operator==(). 938*0e209d39SAndroid Build Coastguard Worker */ 939*0e209d39SAndroid Build Coastguard Worker NumberFormat* defaultNumberFormat; 940*0e209d39SAndroid Build Coastguard Worker DateFormat* defaultDateFormat; 941*0e209d39SAndroid Build Coastguard Worker 942*0e209d39SAndroid Build Coastguard Worker UHashtable* cachedFormatters; 943*0e209d39SAndroid Build Coastguard Worker UHashtable* customFormatArgStarts; 944*0e209d39SAndroid Build Coastguard Worker 945*0e209d39SAndroid Build Coastguard Worker PluralSelectorProvider pluralProvider; 946*0e209d39SAndroid Build Coastguard Worker PluralSelectorProvider ordinalProvider; 947*0e209d39SAndroid Build Coastguard Worker 948*0e209d39SAndroid Build Coastguard Worker /** 949*0e209d39SAndroid Build Coastguard Worker * Method to retrieve default formats (or nullptr on failure). 950*0e209d39SAndroid Build Coastguard Worker * These are semantically const, but may modify *this. 951*0e209d39SAndroid Build Coastguard Worker */ 952*0e209d39SAndroid Build Coastguard Worker const NumberFormat* getDefaultNumberFormat(UErrorCode&) const; 953*0e209d39SAndroid Build Coastguard Worker const DateFormat* getDefaultDateFormat(UErrorCode&) const; 954*0e209d39SAndroid Build Coastguard Worker 955*0e209d39SAndroid Build Coastguard Worker /** 956*0e209d39SAndroid Build Coastguard Worker * Finds the word s, in the keyword list and returns the located index. 957*0e209d39SAndroid Build Coastguard Worker * @param s the keyword to be searched for. 958*0e209d39SAndroid Build Coastguard Worker * @param list the list of keywords to be searched with. 959*0e209d39SAndroid Build Coastguard Worker * @return the index of the list which matches the keyword s. 960*0e209d39SAndroid Build Coastguard Worker */ 961*0e209d39SAndroid Build Coastguard Worker static int32_t findKeyword( const UnicodeString& s, 962*0e209d39SAndroid Build Coastguard Worker const char16_t * const *list); 963*0e209d39SAndroid Build Coastguard Worker 964*0e209d39SAndroid Build Coastguard Worker /** 965*0e209d39SAndroid Build Coastguard Worker * Thin wrapper around the format(... AppendableWrapper ...) variant. 966*0e209d39SAndroid Build Coastguard Worker * Wraps the destination UnicodeString into an AppendableWrapper and 967*0e209d39SAndroid Build Coastguard Worker * supplies default values for some other parameters. 968*0e209d39SAndroid Build Coastguard Worker */ 969*0e209d39SAndroid Build Coastguard Worker UnicodeString& format(const Formattable* arguments, 970*0e209d39SAndroid Build Coastguard Worker const UnicodeString *argumentNames, 971*0e209d39SAndroid Build Coastguard Worker int32_t cnt, 972*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 973*0e209d39SAndroid Build Coastguard Worker FieldPosition* pos, 974*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 975*0e209d39SAndroid Build Coastguard Worker 976*0e209d39SAndroid Build Coastguard Worker /** 977*0e209d39SAndroid Build Coastguard Worker * Formats the arguments and writes the result into the 978*0e209d39SAndroid Build Coastguard Worker * AppendableWrapper, updates the field position. 979*0e209d39SAndroid Build Coastguard Worker * 980*0e209d39SAndroid Build Coastguard Worker * @param msgStart Index to msgPattern part to start formatting from. 981*0e209d39SAndroid Build Coastguard Worker * @param plNumber nullptr except when formatting a plural argument sub-message 982*0e209d39SAndroid Build Coastguard Worker * where a '#' is replaced by the format string for this number. 983*0e209d39SAndroid Build Coastguard Worker * @param arguments The formattable objects array. (Must not be nullptr.) 984*0e209d39SAndroid Build Coastguard Worker * @param argumentNames nullptr if numbered values are used. Otherwise the same 985*0e209d39SAndroid Build Coastguard Worker * length as "arguments", and each entry is the name of the 986*0e209d39SAndroid Build Coastguard Worker * corresponding argument in "arguments". 987*0e209d39SAndroid Build Coastguard Worker * @param cnt The length of arguments (and of argumentNames if that is not nullptr). 988*0e209d39SAndroid Build Coastguard Worker * @param appendTo Output parameter to receive the result. 989*0e209d39SAndroid Build Coastguard Worker * The result string is appended to existing contents. 990*0e209d39SAndroid Build Coastguard Worker * @param pos Field position status. 991*0e209d39SAndroid Build Coastguard Worker * @param success The error code status. 992*0e209d39SAndroid Build Coastguard Worker */ 993*0e209d39SAndroid Build Coastguard Worker void format(int32_t msgStart, 994*0e209d39SAndroid Build Coastguard Worker const void *plNumber, 995*0e209d39SAndroid Build Coastguard Worker const Formattable* arguments, 996*0e209d39SAndroid Build Coastguard Worker const UnicodeString *argumentNames, 997*0e209d39SAndroid Build Coastguard Worker int32_t cnt, 998*0e209d39SAndroid Build Coastguard Worker AppendableWrapper& appendTo, 999*0e209d39SAndroid Build Coastguard Worker FieldPosition* pos, 1000*0e209d39SAndroid Build Coastguard Worker UErrorCode& success) const; 1001*0e209d39SAndroid Build Coastguard Worker 1002*0e209d39SAndroid Build Coastguard Worker UnicodeString getArgName(int32_t partIndex); 1003*0e209d39SAndroid Build Coastguard Worker 1004*0e209d39SAndroid Build Coastguard Worker void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 1005*0e209d39SAndroid Build Coastguard Worker 1006*0e209d39SAndroid Build Coastguard Worker void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status); 1007*0e209d39SAndroid Build Coastguard Worker 1008*0e209d39SAndroid Build Coastguard Worker int32_t nextTopLevelArgStart(int32_t partIndex) const; 1009*0e209d39SAndroid Build Coastguard Worker 1010*0e209d39SAndroid Build Coastguard Worker UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber); 1011*0e209d39SAndroid Build Coastguard Worker 1012*0e209d39SAndroid Build Coastguard Worker void cacheExplicitFormats(UErrorCode& status); 1013*0e209d39SAndroid Build Coastguard Worker 1014*0e209d39SAndroid Build Coastguard Worker Format* createAppropriateFormat(UnicodeString& type, 1015*0e209d39SAndroid Build Coastguard Worker UnicodeString& style, 1016*0e209d39SAndroid Build Coastguard Worker Formattable::Type& formattableType, 1017*0e209d39SAndroid Build Coastguard Worker UParseError& parseError, 1018*0e209d39SAndroid Build Coastguard Worker UErrorCode& ec); 1019*0e209d39SAndroid Build Coastguard Worker 1020*0e209d39SAndroid Build Coastguard Worker const Formattable* getArgFromListByName(const Formattable* arguments, 1021*0e209d39SAndroid Build Coastguard Worker const UnicodeString *argumentNames, 1022*0e209d39SAndroid Build Coastguard Worker int32_t cnt, UnicodeString& name) const; 1023*0e209d39SAndroid Build Coastguard Worker 1024*0e209d39SAndroid Build Coastguard Worker Formattable* parse(int32_t msgStart, 1025*0e209d39SAndroid Build Coastguard Worker const UnicodeString& source, 1026*0e209d39SAndroid Build Coastguard Worker ParsePosition& pos, 1027*0e209d39SAndroid Build Coastguard Worker int32_t& count, 1028*0e209d39SAndroid Build Coastguard Worker UErrorCode& ec) const; 1029*0e209d39SAndroid Build Coastguard Worker 1030*0e209d39SAndroid Build Coastguard Worker FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength, 1031*0e209d39SAndroid Build Coastguard Worker FieldPosition* fp, const Formattable* argId) const; 1032*0e209d39SAndroid Build Coastguard Worker 1033*0e209d39SAndroid Build Coastguard Worker /** 1034*0e209d39SAndroid Build Coastguard Worker * Finds the "other" sub-message. 1035*0e209d39SAndroid Build Coastguard Worker * @param partIndex the index of the first PluralFormat argument style part. 1036*0e209d39SAndroid Build Coastguard Worker * @return the "other" sub-message start part index. 1037*0e209d39SAndroid Build Coastguard Worker */ 1038*0e209d39SAndroid Build Coastguard Worker int32_t findOtherSubMessage(int32_t partIndex) const; 1039*0e209d39SAndroid Build Coastguard Worker 1040*0e209d39SAndroid Build Coastguard Worker /** 1041*0e209d39SAndroid Build Coastguard Worker * Returns the ARG_START index of the first occurrence of the plural number in a sub-message. 1042*0e209d39SAndroid Build Coastguard Worker * Returns -1 if it is a REPLACE_NUMBER. 1043*0e209d39SAndroid Build Coastguard Worker * Returns 0 if there is neither. 1044*0e209d39SAndroid Build Coastguard Worker */ 1045*0e209d39SAndroid Build Coastguard Worker int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const; 1046*0e209d39SAndroid Build Coastguard Worker 1047*0e209d39SAndroid Build Coastguard Worker Format* getCachedFormatter(int32_t argumentNumber) const; 1048*0e209d39SAndroid Build Coastguard Worker 1049*0e209d39SAndroid Build Coastguard Worker UnicodeString getLiteralStringUntilNextArgument(int32_t from) const; 1050*0e209d39SAndroid Build Coastguard Worker 1051*0e209d39SAndroid Build Coastguard Worker void copyObjects(const MessageFormat& that, UErrorCode& ec); 1052*0e209d39SAndroid Build Coastguard Worker 1053*0e209d39SAndroid Build Coastguard Worker void formatComplexSubMessage(int32_t msgStart, 1054*0e209d39SAndroid Build Coastguard Worker const void *plNumber, 1055*0e209d39SAndroid Build Coastguard Worker const Formattable* arguments, 1056*0e209d39SAndroid Build Coastguard Worker const UnicodeString *argumentNames, 1057*0e209d39SAndroid Build Coastguard Worker int32_t cnt, 1058*0e209d39SAndroid Build Coastguard Worker AppendableWrapper& appendTo, 1059*0e209d39SAndroid Build Coastguard Worker UErrorCode& success) const; 1060*0e209d39SAndroid Build Coastguard Worker 1061*0e209d39SAndroid Build Coastguard Worker /** 1062*0e209d39SAndroid Build Coastguard Worker * Convenience method that ought to be in NumberFormat 1063*0e209d39SAndroid Build Coastguard Worker */ 1064*0e209d39SAndroid Build Coastguard Worker NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const; 1065*0e209d39SAndroid Build Coastguard Worker 1066*0e209d39SAndroid Build Coastguard Worker /** 1067*0e209d39SAndroid Build Coastguard Worker * Returns array of argument types in the parsed pattern 1068*0e209d39SAndroid Build Coastguard Worker * for use in C API. Only for the use of umsg_vformat(). Not 1069*0e209d39SAndroid Build Coastguard Worker * for public consumption. 1070*0e209d39SAndroid Build Coastguard Worker * @param listCount Output parameter to receive the size of array 1071*0e209d39SAndroid Build Coastguard Worker * @return The array of formattable types in the pattern 1072*0e209d39SAndroid Build Coastguard Worker */ getArgTypeList(int32_t & listCount)1073*0e209d39SAndroid Build Coastguard Worker const Formattable::Type* getArgTypeList(int32_t& listCount) const { 1074*0e209d39SAndroid Build Coastguard Worker listCount = argTypeCount; 1075*0e209d39SAndroid Build Coastguard Worker return argTypes; 1076*0e209d39SAndroid Build Coastguard Worker } 1077*0e209d39SAndroid Build Coastguard Worker 1078*0e209d39SAndroid Build Coastguard Worker /** 1079*0e209d39SAndroid Build Coastguard Worker * Resets the internal MessagePattern, and other associated caches. 1080*0e209d39SAndroid Build Coastguard Worker */ 1081*0e209d39SAndroid Build Coastguard Worker void resetPattern(); 1082*0e209d39SAndroid Build Coastguard Worker 1083*0e209d39SAndroid Build Coastguard Worker /** 1084*0e209d39SAndroid Build Coastguard Worker * A DummyFormatter that we use solely to store a nullptr value. UHash does 1085*0e209d39SAndroid Build Coastguard Worker * not support storing nullptr values. 1086*0e209d39SAndroid Build Coastguard Worker */ 1087*0e209d39SAndroid Build Coastguard Worker class U_I18N_API DummyFormat : public Format { 1088*0e209d39SAndroid Build Coastguard Worker public: 1089*0e209d39SAndroid Build Coastguard Worker virtual bool operator==(const Format&) const override; 1090*0e209d39SAndroid Build Coastguard Worker virtual DummyFormat* clone() const override; 1091*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& format(const Formattable& obj, 1092*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 1093*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 1094*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& format(const Formattable&, 1095*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 1096*0e209d39SAndroid Build Coastguard Worker FieldPosition&, 1097*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const override; 1098*0e209d39SAndroid Build Coastguard Worker virtual UnicodeString& format(const Formattable& obj, 1099*0e209d39SAndroid Build Coastguard Worker UnicodeString& appendTo, 1100*0e209d39SAndroid Build Coastguard Worker FieldPositionIterator* posIter, 1101*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const override; 1102*0e209d39SAndroid Build Coastguard Worker virtual void parseObject(const UnicodeString&, 1103*0e209d39SAndroid Build Coastguard Worker Formattable&, 1104*0e209d39SAndroid Build Coastguard Worker ParsePosition&) const override; 1105*0e209d39SAndroid Build Coastguard Worker }; 1106*0e209d39SAndroid Build Coastguard Worker 1107*0e209d39SAndroid Build Coastguard Worker friend class MessageFormatAdapter; // getFormatTypeList() access 1108*0e209d39SAndroid Build Coastguard Worker }; 1109*0e209d39SAndroid Build Coastguard Worker 1110*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 1111*0e209d39SAndroid Build Coastguard Worker 1112*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 1113*0e209d39SAndroid Build Coastguard Worker 1114*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 1115*0e209d39SAndroid Build Coastguard Worker 1116*0e209d39SAndroid Build Coastguard Worker #endif // _MSGFMT 1117*0e209d39SAndroid Build Coastguard Worker //eof 1118