Chromium Code Reviews| Index: pkg/intl/lib/intl.dart |
| =================================================================== |
| --- pkg/intl/lib/intl.dart (revision 13446) |
| +++ pkg/intl/lib/intl.dart (working copy) |
| @@ -40,13 +40,13 @@ |
| * 'other': '$num_people other people'})} in $place.'''' |
| * |
| * Usage examples: |
| - * today(date) => intl.message( |
| + * today(date) => Intl.message( |
|
Emily Fortuna
2012/10/09 23:37:55
good catch.
|
| * "Today's date is $date", |
| * desc: 'Indicate the current date', |
| * examples: {'date' : 'June 8, 2012'}); |
| * print(today(new Date.now()); |
| * |
| - * msg(num_people, place) => intl.message( |
| + * msg({num_people, place}) => Intl.message( |
| * '''I see ${Intl.plural(num_people, |
| * {'0': 'no one at all', |
| * '1': 'one other person', |
| @@ -55,8 +55,12 @@ |
| * examples: {'num_people': 3, 'place': 'London'}); |
| * |
| * Calling `msg({'num_people': 2, 'place': 'Athens'});` would |
| - * produce "I see 2 other people in Athens." as output. |
| + * produce "I see 2 other people in Athens." as output in the default locale. |
| * |
| + * To use a locale other than the default, use the `withLocale` function. |
| + * var todayString = new DateFormat("pt_BR").format(new Date.now()); |
| + * print(withLocale("pt_BR", () => today(todayString)); |
| + * |
| * See `tests/message_format_test.dart` for more examples. |
| */ |
| //TODO(efortuna): documentation example involving the offset parameter? |
| @@ -154,21 +158,34 @@ |
| * Note that null is interpreted as meaning the default locale, so if |
| * [newLocale] is null it will be returned. |
| */ |
| - static String verifiedLocale(String newLocale) { |
| - // TODO(alanknight): This is specific to DateFormat, and only used there |
| - // now. This should be moved, renamed, or generalized. |
| + static String verifiedLocale(String newLocale, bool localeExists(String), |
| + [Function onFailure = _throwLocaleError]) { |
| + // TODO(alanknight): Previously we kept a single verified locale on the Intl |
| + // object, but with different verification for different uses, that's more |
| + // difficult. As a result, we call this more often. Consider keeping |
| + // verified locales for each purpose if it turns out to be a performance |
| + // issue. |
| if (newLocale == null) return systemLocale; |
| - if (_localeExists(newLocale)) { |
| + if (localeExists(newLocale)) { |
| return newLocale; |
| } |
| - for (var each in [canonicalizedLocale(newLocale), _shortLocale(newLocale)]) { |
| - if (_localeExists(each)) { |
| + for (var each in |
| + [canonicalizedLocale(newLocale), _shortLocale(newLocale)]) { |
| + if (localeExists(each)) { |
| return each; |
| } |
| } |
| - throw new ArgumentError("Invalid locale '$newLocale'"); |
| + return onFailure(newLocale); |
| } |
| + /** |
| + * The default action if a locale isn't found in verifiedLocale. Throw |
| + * an exception indicating the locale isn't correct. |
| + */ |
| + static String _throwLocaleError(String localeName) { |
| + throw new ArgumentError("Invalid locale '$localeName'"); |
| + } |
| + |
| /** Return the short version of a locale name, e.g. 'en_US' => 'en' */ |
| static String _shortLocale(String aLocale) { |
| if (aLocale.length < 2) return aLocale; |
| @@ -205,17 +222,24 @@ |
| /** |
| * Format the given function with a specific [locale], given a |
| - * [msg_function] that takes no parameters and returns a String. We |
| - * basically delay calling the message function proper until after the proper |
| - * locale has been set. |
| + * [message_function] that takes no parameters. The [message_function] can be |
| + * a simple message function that just returns the result of `Intl.message()` |
| + * it can be a wrapper around a message function that takes aerguments, or it |
|
Emily Fortuna
2012/10/09 23:37:55
typo: arguments
|
| + * can be something more complex that manipulates multiple message |
| + * functions. |
| + * |
| + * In either case, the purpose of this is to delay calling [message_function] |
| + * until the proper locale has been set. This returns the result of calling |
| + * [msg_function], which could be of an arbitrary type. |
| */ |
| - static String withLocale(String locale, Function msg_function) { |
| + static dynamic withLocale(String locale, message_function()) { |
| // We have to do this silliness because Locale is not known at compile time, |
| - // but must be a static variable. |
| + // but must be a static variable in order to be visible to the Intl.message |
| + // invocation. |
| if (_defaultLocale == null) _defaultLocale = systemLocale; |
| var oldLocale = _defaultLocale; |
| _defaultLocale = locale; |
| - var result = msg_function(); |
| + var result = message_function(); |
| _defaultLocale = oldLocale; |
| return result; |
| } |