Chromium Code Reviews| Index: lib/i18n/intl.dart |
| =================================================================== |
| --- lib/i18n/intl.dart (revision 8515) |
| +++ lib/i18n/intl.dart (working copy) |
| @@ -18,7 +18,7 @@ |
| * String indicating the locale code with which the message is to be |
| * formatted (such as en-CA). |
| */ |
| - String _locale; |
| + static String _locale; |
| IntlMessage intlMsg; |
| @@ -30,7 +30,9 @@ |
| * Dart is running on the client, we can infer from the browser/client |
| * preferences). |
| */ |
| - Intl([this._locale]) { |
| + Intl([a_locale]) { |
| + _locale = a_locale; |
| + if (_locale == null) _locale = _getDefaultLocale(); |
| intlMsg = new IntlMessage(_locale); |
| date = new DateFormat(_locale); |
| } |
| @@ -41,15 +43,17 @@ |
| * based on one or more variables, a [desc] providing a description of usage |
| * for the [message_str], and a map of [examples] for each data element to be |
| * substituted into the message. For example, if message="Hello, $name", then |
| - * examples = {'name': 'Sparky'}. The values of [desc] and [examples] are |
| - * not used at run-time but are only made available to the translators, so |
| - * they MUST be simple Strings available at compile time: no String |
| - * interpolation or concatenation. |
| + * examples = {'name': 'Sparky'}. If not using the user's default locale, or |
| + * if the locale is not easily detectable, explicitly pass [locale]. |
| + * The values of [desc] and [examples] are not used at run-time but are only |
| + * made available to the translators, so they MUST be simple Strings available |
| + * at compile time: no String interpolation or concatenation. |
| * The expected usage of this is inside a function that takes as parameters |
| - * the variables used in the interpolated string. |
| + * the variables used in the interpolated string, and additionally also a |
| + * locale (optional). |
| */ |
| - String message(String message_str, [final String desc='', |
| - final Map examples=const {}]) { |
| + static String message(String message_str, [final String desc='', |
| + final Map examples=const {}, String locale='']) { |
| return message_str; |
| } |
| @@ -59,12 +63,25 @@ |
| */ |
| static String plural(var howMany, Map cases, [num offset=0]) { |
| // TODO(efortuna): Deal with "few" and "many" cases, offset, and others! |
| - // TODO(alanknight): Should we have instance methods instead/as well? |
| - // Or have the others as statics? |
| return select(howMany.toString(), cases); |
| } |
| /** |
| + * Format the given function with a specific [locale], given a [msg_function] |
| + * that takes no parameters and returns a String. |
| + */ |
| + static String withLocale(String locale, Function msg_function) { |
| + // We have to do this silliness because Locale is not known at compile time, |
| + // but must be a static variable. |
| + if (_locale == null) _locale = _getDefaultLocale(); |
| + var oldLocale = _locale; |
| + _locale = locale; |
| + var result = msg_function(); |
| + _locale = oldLocale; |
| + return result; |
|
Alan Knight
2012/06/13 00:52:32
If I set the locale here temporarily, how does the
Emily Fortuna
2012/06/13 01:27:48
This is where the we take advantage of the fact th
|
| + } |
| + |
| + /** |
| * Support method for message formatting. Select the correct exact (gender, |
| * usually) form from [cases] given the user [choice]. |
| */ |
| @@ -77,4 +94,13 @@ |
| return ''; |
| } |
| } |
| + |
| + /** |
| + * Helper to detect the locale as defined at runtime. |
| + */ |
| + static String _getDefaultLocale() { |
| + // TODO(efortuna): Detect the default locale given the user preferences. |
| + // Yay, hard-coding for now! |
| + return 'en-US'; |
| + } |
| } |