+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
/*
-* Copyright (C) 2007-2012, International Business Machines Corporation and
+* Copyright (C) 2007-2013, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************************
*
#include "unicode/utypes.h"
+#if U_SHOW_CPLUSPLUS_API
+
/**
* \file
* \brief C++ API: Formats messages in a language-neutral way.
U_CDECL_BEGIN
// Forward declaration.
struct UHashtable;
-typedef struct UHashtable UHashtable;
+typedef struct UHashtable UHashtable; /**< @internal */
U_CDECL_END
U_NAMESPACE_BEGIN
* if the pattern has named arguments (see {@link #usesNamedArguments()}).
*
* <p>An argument might not specify any format type. In this case,
- * a Number value is formatted with a default (for the locale) NumberFormat,
- * a Date value is formatted with a default (for the locale) DateFormat,
- * and for any other value its toString() value is used.
+ * a numeric value is formatted with a default (for the locale) NumberFormat,
+ * and a date/time value is formatted with a default (for the locale) DateFormat.
*
* <p>An argument might specify a "simple" type for which the specified
* Format object is created, cached and used.
* argNumber = '0' | ('1'..'9' ('0'..'9')*)
*
* argType = "number" | "date" | "time" | "spellout" | "ordinal" | "duration"
- * argStyle = "short" | "medium" | "long" | "full" | "integer" | "currency" | "percent" | argStyleText
+ * argStyle = "short" | "medium" | "long" | "full" | "integer" | "currency" | "percent" | argStyleText | "::" argSkeletonText
* </pre>
*
* <ul>
* <td colspan=2><i>(none)</i>
* <td><code>null</code>
* <tr>
- * <td rowspan=5><code>number</code>
+ * <td rowspan=6><code>number</code>
* <td><i>(none)</i>
* <td><code>NumberFormat.createInstance(getLocale(), status)</code>
* <tr>
* <td><i>argStyleText</i>
* <td><code>new DecimalFormat(argStyleText, new DecimalFormatSymbols(getLocale(), status), status)</code>
* <tr>
- * <td rowspan=6><code>date</code>
+ * <td><i>argSkeletonText</i>
+ * <td><code>NumberFormatter::forSkeleton(argSkeletonText, status).locale(getLocale()).toFormat(status)</code>
+ * <tr>
+ * <td rowspan=7><code>date</code>
* <td><i>(none)</i>
* <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
* <tr>
* <td><code>DateFormat.createDateInstance(kFull, getLocale(), status)</code>
* <tr>
* <td><i>argStyleText</i>
- * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)
+ * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code>
+ * <tr>
+ * <td><i>argSkeletonText</i>
+ * <td><code>DateFormat::createInstanceForSkeleton(argSkeletonText, getLocale(), status)</code>
* <tr>
* <td rowspan=6><code>time</code>
* <td><i>(none)</i>
* <td><code>DateFormat.createTimeInstance(kFull, getLocale(), status)</code>
* <tr>
* <td><i>argStyleText</i>
- * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)
+ * <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code>
* <tr>
* <td><code>spellout</code>
* <td><i>argStyleText (optional)</i>
* </table>
* <p>
*
+ * <h4>Argument formatting</h4>
+ *
+ * <p>Arguments are formatted according to their type, using the default
+ * ICU formatters for those types, unless otherwise specified.</p>
+ *
+ * <p>There are also several ways to control the formatting.</p>
+ *
+ * <p>We recommend you use default styles, predefined style values, skeletons,
+ * or preformatted values, but not pattern strings or custom format objects.</p>
+ *
+ * <p>For more details, see the
+ * <a href="http://userguide.icu-project.org/formatparse/messages">ICU User Guide</a>.</p>
+ *
* <h4>Usage Information</h4>
*
* <p>Here are some examples of usage:
*
* UnicodeString result;
* MessageFormat::format(
- * "At {1,time} on {1,date}, there was {2} on planet {0,number}.",
+ * "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {0,number}.",
* arguments, 3, result, success );
*
* cout << "result: " << result << endl;
- * //<output>: At 4:34:20 PM on 23-Mar-98, there was a disturbance
+ * //<output>: At 4:34 PM on March 23, there was a disturbance
* // in the Force on planet 7.
* \endcode
* </pre>
* result and should delete it when done.
* @stable ICU 2.0
*/
- virtual Format* clone(void) const;
+ virtual MessageFormat* clone() const;
/**
* Returns true if the given Format objects are semantically equal.
FieldPosition& pos,
UErrorCode& status) const;
- /**
- * Formats the given array of arguments into a user-readable
- * string. The array must be stored within a single Formattable
- * object of type kArray. If the Formattable object type is not of
- * type kArray, then returns a failing UErrorCode.
- *
- * @param obj The object to format
- * @param appendTo Output parameter to receive result.
- * Result is appended to existing contents.
- * @param status Input/output error code. If the
- * pattern cannot be parsed, set to failure code.
- * @return Reference to 'appendTo' parameter.
- * @stable ICU 2.0
- */
- UnicodeString& format(const Formattable& obj,
- UnicodeString& appendTo,
- UErrorCode& status) const;
-
-
/**
* Formats the given array of arguments into a user-defined argument name
* array. This function supports both named and numbered
*/
class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
public:
- PluralSelectorProvider(const Locale* loc, UPluralType type);
+ PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
virtual ~PluralSelectorProvider();
- virtual UnicodeString select(double number, UErrorCode& ec) const;
+ virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const;
- void reset(const Locale* loc);
+ void reset();
private:
- const Locale* locale;
+ const MessageFormat &msgFormat;
PluralRules* rules;
UPluralType type;
};
* @return the index of the list which matches the keyword s.
*/
static int32_t findKeyword( const UnicodeString& s,
- const UChar * const *list);
+ const char16_t * const *list);
/**
* Thin wrapper around the format(... AppendableWrapper ...) variant.
* AppendableWrapper, updates the field position.
*
* @param msgStart Index to msgPattern part to start formatting from.
- * @param pluralNumber Zero except when formatting a plural argument sub-message
+ * @param plNumber NULL except when formatting a plural argument sub-message
* where a '#' is replaced by the format string for this number.
* @param arguments The formattable objects array. (Must not be NULL.)
* @param argumentNames NULL if numbered values are used. Otherwise the same
* @param success The error code status.
*/
void format(int32_t msgStart,
- double pluralNumber,
+ const void *plNumber,
const Formattable* arguments,
const UnicodeString *argumentNames,
int32_t cnt,
void cacheExplicitFormats(UErrorCode& status);
+ int32_t skipLeadingSpaces(UnicodeString& style);
+
Format* createAppropriateFormat(UnicodeString& type,
UnicodeString& style,
Formattable::Type& formattableType,
FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
FieldPosition* fp, const Formattable* argId) const;
+ /**
+ * Finds the "other" sub-message.
+ * @param partIndex the index of the first PluralFormat argument style part.
+ * @return the "other" sub-message start part index.
+ */
+ int32_t findOtherSubMessage(int32_t partIndex) const;
+
+ /**
+ * Returns the ARG_START index of the first occurrence of the plural number in a sub-message.
+ * Returns -1 if it is a REPLACE_NUMBER.
+ * Returns 0 if there is neither.
+ */
+ int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
+
Format* getCachedFormatter(int32_t argumentNumber) const;
UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
void copyObjects(const MessageFormat& that, UErrorCode& ec);
void formatComplexSubMessage(int32_t msgStart,
- double pluralNumber,
+ const void *plNumber,
const Formattable* arguments,
const UnicodeString *argumentNames,
int32_t cnt,
* for public consumption.
* @param listCount Output parameter to receive the size of array
* @return The array of formattable types in the pattern
- * @internal
*/
const Formattable::Type* getArgTypeList(int32_t& listCount) const {
listCount = argTypeCount;
/**
* A DummyFormatter that we use solely to store a NULL value. UHash does
* not support storing NULL values.
- * @internal
*/
class U_I18N_API DummyFormat : public Format {
public:
virtual UBool operator==(const Format&) const;
- virtual Format* clone() const;
+ virtual DummyFormat* clone() const;
virtual UnicodeString& format(const Formattable& obj,
UnicodeString& appendTo,
UErrorCode& status) const;
friend class MessageFormatAdapter; // getFormatTypeList() access
};
-inline UnicodeString&
-MessageFormat::format(const Formattable& obj,
- UnicodeString& appendTo,
- UErrorCode& status) const {
- return Format::format(obj, appendTo, status);
-}
-
-
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
+#endif /* U_SHOW_CPLUSPLUS_API */
+
#endif // _MSGFMT
//eof