Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1362)

Unified Diff: lib/i18n/message_format.dart

Issue 10494005: Updated message formatting to be more compatible with Dart string interpolation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Merged up to head, and wasn't that fun Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/i18n/message_format.dart
diff --git a/lib/i18n/message_format.dart b/lib/i18n/message_format.dart
index 0dba3688ef2e588360114654748b2e8c33cb7c8d..bdb3a995500368882aebffd21c6667bc4af70b97 100644
--- a/lib/i18n/message_format.dart
+++ b/lib/i18n/message_format.dart
@@ -5,50 +5,48 @@
*
* Message/plural format library with locale support.
*
- * Message format grammar:
+ * Messages are written as functions with either one parameter (which can omitted).
Emily Fortuna 2012/06/07 18:42:23 80 char
Alan Knight 2012/06/07 21:19:39 Done.
+ * The function name serves as an identifier for the message, and is customarily
+ * given a unique prefix such as intl_ to distinguish it from application functions.
+ * The function is expected to return a single interpolated string, based on the
+ * parameter (which can be a Map or a complex object).
*
- * messageFormatPattern := string ( "{" messageFormatElement "}" string )*
- * messageFormatElement := argumentIndex [ "," elementFormat ]
- * elementFormat := "plural" "," pluralStyle
- * | "select" "," selectStyle
- * pluralStyle := pluralFormatPattern
- * selectStyle := selectFormatPattern
- * pluralFormatPattern := \\[ "offset" ":" offsetIndex ] pluralForms*
- * selectFormatPattern := pluralForms*
- * pluralForms := stringKey "{" ( "{" messageFormatElement "}"|string )* "}"
+ * For example
+ * intl_helloWorld () => "Hello world";
+ * intl_oneValue (waiting) => "There are $waiting jobs waiting";
+ * intl_dict (dict) => "Hello ${dict['name']}, your waiting time is ${dict['minutes']} minutes";
Emily Fortuna 2012/06/07 18:42:23 80 char
Alan Knight 2012/06/07 21:19:39 Done.
*
+ * More complex formatting can make use of the Intl object and associated message format.
+ * Here is a more complete example of usage with complex formatting
+ * var intl = new Intl();
+ * intl_howManyPeopleAreHere (NUM)
+ * //@desc Lists how many people are here
Emily Fortuna 2012/06/07 18:42:23 //@desc? Guess we can ignore this for now since it
Alan Knight 2012/06/07 21:19:39 Done.
+ * => "There ${intl.plural(NUM,{'0': 'are', '1': 'is', 'other': 'are'})} "
+ * "$NUM other ${intl.plural(NUM, {'1':'person', 'other': 'people'})} here.";
Emily Fortuna 2012/06/07 18:42:23 no tabs! :-( here and below!
Alan Knight 2012/06/07 21:19:39 Done.
+ * var msg_format = new MessageFormat(intl_howManyPeopleAreHere);
+ * msg_format.format(2);
*
- * Message example:
- *
- * I see {NUM_PEOPLE, plural, offset:1
- * =0 {no one at all}
- * =1 {{WHO}}
- * one {{WHO} and one other person}
- * other {{WHO} and # other people}}
- * in {PLACE}.
- *
- * Calling format({'NUM_PEOPLE': 2, 'WHO': 'Mark', 'PLACE': 'Athens'}) would
- * produce "I see Mark and one other person in Athens." as output.
- *
- * See tests/message_format_test.dart for more examples.
+ * See tests/message_format_test.dart for more comprehensive examples.
*/
#library('MessageFormat');
+#import('intl.dart');
class MessageFormat {
/**
- * String that is used to determin the particular case and gender needed to be
+ * String that is used to determine the particular case and gender needed to be
Emily Fortuna 2012/06/07 18:42:23 80 char
Alan Knight 2012/06/07 21:19:39 Done.
* returned. The format of this string follows the same pattern as in Closure,
* Java, and C++. This pattern is described at the beginning of this class
* definition. See tests/message_format_test.dart for more examples.
*/
- final String _messageFunction;
+ final Function _messageFunction;
/**
* String indicating a language code with which the message is to be
* formatted (such as en-US).
*/
+
final String _locale;
/**
@@ -63,26 +61,40 @@ class MessageFormat {
* can infer from the browser).
*/
//TODO(efortuna): _locale is not currently inferred.
- const MessageFormat(this._messageFunction, [this._locale = 'en-US']);
+ const MessageFormat([this._messageFunction, this._locale = 'en-US']);
/**
- * Formats a message. By default, we treat '#' with special meaning
- * representing the number (plural_variable - plural_offset). If [ignorePound]
- * is true, then we do not treat '#' as a special character, and it is just
- * treated literally. [namedParameters] is a map of String keys to String or
- * int values to influence the formatting of the message or data in the
- * message. For example, example, in the call to
- * msg_formatter.format({'NUM_PEOPLE': 5, 'NAME': 'Angela'}),
- * object \{'NUM_PEOPLE': 5, 'NAME': 'Angela'\} holds positional parameters.
- * 1st parameter could mean 5 people, which could influence plural format,
- * and 2nd parameter is just relevant data to be printed out in the proper
- * position in the message.
- * Returns the correctly formatted message in the desired language.
+ * Formats the _messageFunction message and returns the correctly
+ * formatted message in the language of the current locale.
+ *
+ * The variable [messageParameters] can be null, in which case the message
+ * function is called with no arguments. Otherwise, it is called with
+ * [messageParameters] as the single argument. If the message function
+ * requires more than one variable, then messageParameters can be a
+ * map with the values in it.
*/
- String format(Map<String, dynamic> messageParameters,
- [bool ignorePound=false]) {
- // TODO(efortuna): actually perform the translation here. For now, I'm just
- // returning a description of the message to be returned.
- return _messageDescription;
+ String format(var messageParameters) {
+ return _messageFunction(messageParameters);
+ }
+
+ /**
+ * Formats the [messageFunction] argument and returns the correctly
+ * formatted message in the language of the current locale.
+ *
+ * The variable [messageParameters] can be null, in which case the message
+ * function is called with no arguments. Otherwise, it is called with
+ * messageParameters as the single argument. If the message function
+ * requires more than one variable, then messageParameters can be a
+ * map with the values in it.
+ *
+ * This differs from format only in that the message is passed as an argument
+ */
Emily Fortuna 2012/06/07 18:42:23 add extra space back here.
Alan Knight 2012/06/07 21:19:39 Done.
+
Emily Fortuna 2012/06/07 18:42:23 extra whitespace
Alan Knight 2012/06/07 21:19:39 Done.
+ String formatMessage(Function messageFunction,var messageParameters) {
+ if (messageParameters == null) {
+ return messageFunction();
+ } else {
+ return messageFunction(messageParameters);
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698