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

Side by Side Diff: ui/base/l10n/formatter.cc

Issue 1049513002: Use the ICU syntax message for plural formatting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ios whitelist update Created 5 years, 8 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 unified diff | Download patch
« no previous file with comments | « ui/base/l10n/formatter.h ('k') | ui/base/l10n/l10n_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/base/l10n/formatter.h" 5 #include "ui/base/l10n/formatter.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "third_party/icu/source/common/unicode/unistr.h" 10 #include "third_party/icu/source/common/unicode/unistr.h"
11 #include "third_party/icu/source/i18n/unicode/msgfmt.h"
12 #include "ui/base/l10n/l10n_util.h"
11 #include "ui/base/l10n/l10n_util_plurals.h" 13 #include "ui/base/l10n/l10n_util_plurals.h"
12 #include "ui/strings/grit/ui_strings.h" 14 #include "ui/strings/grit/ui_strings.h"
13 15
14 namespace ui { 16 namespace ui {
15 17
16 UI_BASE_EXPORT bool formatter_force_fallback = false; 18 UI_BASE_EXPORT bool formatter_force_fallback = false;
17 19
18 static const size_t kNumberPluralities = 6;
19 struct Pluralities { 20 struct Pluralities {
20 int ids[kNumberPluralities]; 21 int id;
21 const char* fallback_one; 22 const char* fallback_one;
22 const char* fallback_other; 23 const char* fallback_other;
23 }; 24 };
24 25
25 static const Pluralities IDS_ELAPSED_SHORT_SEC = { 26 static const Pluralities IDS_ELAPSED_SHORT_SEC = {
26 { IDS_TIME_ELAPSED_SECS_DEFAULT, IDS_TIME_ELAPSED_SECS_SINGULAR, 27 IDS_TIME_ELAPSED_SECS,
27 IDS_TIME_ELAPSED_SECS_ZERO, IDS_TIME_ELAPSED_SECS_TWO,
28 IDS_TIME_ELAPSED_SECS_FEW, IDS_TIME_ELAPSED_SECS_MANY },
29 "one{# sec ago}", 28 "one{# sec ago}",
30 " other{# secs ago}" 29 " other{# secs ago}"
31 }; 30 };
32 static const Pluralities IDS_ELAPSED_SHORT_MIN = { 31 static const Pluralities IDS_ELAPSED_SHORT_MIN = {
33 { IDS_TIME_ELAPSED_MINS_DEFAULT, IDS_TIME_ELAPSED_MINS_SINGULAR, 32 IDS_TIME_ELAPSED_MINS,
34 IDS_TIME_ELAPSED_MINS_ZERO, IDS_TIME_ELAPSED_MINS_TWO,
35 IDS_TIME_ELAPSED_MINS_FEW, IDS_TIME_ELAPSED_MINS_MANY },
36 "one{# min ago}", 33 "one{# min ago}",
37 " other{# mins ago}" 34 " other{# mins ago}"
38 }; 35 };
39 static const Pluralities IDS_ELAPSED_HOUR = { 36 static const Pluralities IDS_ELAPSED_HOUR = {
40 { IDS_TIME_ELAPSED_HOURS_DEFAULT, IDS_TIME_ELAPSED_HOURS_SINGULAR, 37 IDS_TIME_ELAPSED_HOURS,
41 IDS_TIME_ELAPSED_HOURS_ZERO, IDS_TIME_ELAPSED_HOURS_TWO,
42 IDS_TIME_ELAPSED_HOURS_FEW, IDS_TIME_ELAPSED_HOURS_MANY },
43 "one{# hour ago}", 38 "one{# hour ago}",
44 " other{# hours ago}" 39 " other{# hours ago}"
45 }; 40 };
46 static const Pluralities IDS_ELAPSED_DAY = { 41 static const Pluralities IDS_ELAPSED_DAY = {
47 { IDS_TIME_ELAPSED_DAYS_DEFAULT, IDS_TIME_ELAPSED_DAYS_SINGULAR, 42 IDS_TIME_ELAPSED_DAYS,
48 IDS_TIME_ELAPSED_DAYS_ZERO, IDS_TIME_ELAPSED_DAYS_TWO,
49 IDS_TIME_ELAPSED_DAYS_FEW, IDS_TIME_ELAPSED_DAYS_MANY },
50 "one{# day ago}", 43 "one{# day ago}",
51 " other{# days ago}" 44 " other{# days ago}"
52 }; 45 };
53 46
54 static const Pluralities IDS_REMAINING_SHORT_SEC = { 47 static const Pluralities IDS_REMAINING_SHORT_SEC = {
55 { IDS_TIME_REMAINING_SECS_DEFAULT, IDS_TIME_REMAINING_SECS_SINGULAR, 48 IDS_TIME_REMAINING_SECS,
56 IDS_TIME_REMAINING_SECS_ZERO, IDS_TIME_REMAINING_SECS_TWO,
57 IDS_TIME_REMAINING_SECS_FEW, IDS_TIME_REMAINING_SECS_MANY },
58 "one{# sec left}", 49 "one{# sec left}",
59 " other{# secs left}" 50 " other{# secs left}"
60 }; 51 };
61 static const Pluralities IDS_REMAINING_SHORT_MIN = { 52 static const Pluralities IDS_REMAINING_SHORT_MIN = {
62 { IDS_TIME_REMAINING_MINS_DEFAULT, IDS_TIME_REMAINING_MINS_SINGULAR, 53 IDS_TIME_REMAINING_MINS,
63 IDS_TIME_REMAINING_MINS_ZERO, IDS_TIME_REMAINING_MINS_TWO,
64 IDS_TIME_REMAINING_MINS_FEW, IDS_TIME_REMAINING_MINS_MANY },
65 "one{# min left}", 54 "one{# min left}",
66 " other{# mins left}" 55 " other{# mins left}"
67 }; 56 };
68 57
69 static const Pluralities IDS_REMAINING_LONG_SEC = { 58 static const Pluralities IDS_REMAINING_LONG_SEC = {
70 { IDS_TIME_REMAINING_LONG_SECS_DEFAULT, IDS_TIME_REMAINING_LONG_SECS_SINGULAR, 59 IDS_TIME_REMAINING_LONG_SECS,
71 IDS_TIME_REMAINING_LONG_SECS_ZERO, IDS_TIME_REMAINING_LONG_SECS_TWO,
72 IDS_TIME_REMAINING_LONG_SECS_FEW, IDS_TIME_REMAINING_LONG_SECS_MANY },
73 "one{# second left}", 60 "one{# second left}",
74 " other{# seconds left}" 61 " other{# seconds left}"
75 }; 62 };
76 static const Pluralities IDS_REMAINING_LONG_MIN = { 63 static const Pluralities IDS_REMAINING_LONG_MIN = {
77 { IDS_TIME_REMAINING_LONG_MINS_DEFAULT, IDS_TIME_REMAINING_LONG_MINS_SINGULAR, 64 IDS_TIME_REMAINING_LONG_MINS,
78 IDS_TIME_REMAINING_LONG_MINS_ZERO, IDS_TIME_REMAINING_LONG_MINS_TWO,
79 IDS_TIME_REMAINING_LONG_MINS_FEW, IDS_TIME_REMAINING_LONG_MINS_MANY },
80 "one{# minute left}", 65 "one{# minute left}",
81 " other{# minutes left}" 66 " other{# minutes left}"
82 }; 67 };
83 static const Pluralities IDS_REMAINING_HOUR = { 68 static const Pluralities IDS_REMAINING_HOUR = {
84 { IDS_TIME_REMAINING_HOURS_DEFAULT, IDS_TIME_REMAINING_HOURS_SINGULAR, 69 IDS_TIME_REMAINING_HOURS,
85 IDS_TIME_REMAINING_HOURS_ZERO, IDS_TIME_REMAINING_HOURS_TWO,
86 IDS_TIME_REMAINING_HOURS_FEW, IDS_TIME_REMAINING_HOURS_MANY },
87 "one{# hour left}", 70 "one{# hour left}",
88 " other{# hours left}" 71 " other{# hours left}"
89 }; 72 };
90 static const Pluralities IDS_REMAINING_DAY = { 73 static const Pluralities IDS_REMAINING_DAY = {
91 { IDS_TIME_REMAINING_DAYS_DEFAULT, IDS_TIME_REMAINING_DAYS_SINGULAR, 74 IDS_TIME_REMAINING_DAYS,
92 IDS_TIME_REMAINING_DAYS_ZERO, IDS_TIME_REMAINING_DAYS_TWO,
93 IDS_TIME_REMAINING_DAYS_FEW, IDS_TIME_REMAINING_DAYS_MANY },
94 "one{# day left}", 75 "one{# day left}",
95 " other{# days left}" 76 " other{# days left}"
96 }; 77 };
97 78
98 static const Pluralities IDS_DURATION_SHORT_SEC = { 79 static const Pluralities IDS_DURATION_SHORT_SEC = {
99 { IDS_TIME_SECS_DEFAULT, IDS_TIME_SECS_SINGULAR, IDS_TIME_SECS_ZERO, 80 IDS_TIME_SECS,
100 IDS_TIME_SECS_TWO, IDS_TIME_SECS_FEW, IDS_TIME_SECS_MANY },
101 "one{# sec}", 81 "one{# sec}",
102 " other{# secs}" 82 " other{# secs}"
103 }; 83 };
104 static const Pluralities IDS_DURATION_SHORT_MIN = { 84 static const Pluralities IDS_DURATION_SHORT_MIN = {
105 { IDS_TIME_MINS_DEFAULT, IDS_TIME_MINS_SINGULAR, IDS_TIME_MINS_ZERO, 85 IDS_TIME_MINS,
106 IDS_TIME_MINS_TWO, IDS_TIME_MINS_FEW, IDS_TIME_MINS_MANY },
107 "one{# min}", 86 "one{# min}",
108 " other{# mins}" 87 " other{# mins}"
109 }; 88 };
110 89
111 static const Pluralities IDS_LONG_SEC = { 90 static const Pluralities IDS_LONG_SEC = {
112 { IDS_TIME_LONG_SECS_DEFAULT, IDS_TIME_LONG_SECS_SINGULAR, 91 IDS_TIME_LONG_SECS,
113 IDS_TIME_LONG_SECS_ZERO, IDS_TIME_LONG_SECS_TWO,
114 IDS_TIME_LONG_SECS_FEW, IDS_TIME_LONG_SECS_MANY },
115 "one{# second}", 92 "one{# second}",
116 " other{# seconds}" 93 " other{# seconds}"
117 }; 94 };
118 static const Pluralities IDS_LONG_MIN = { 95 static const Pluralities IDS_LONG_MIN = {
119 { IDS_TIME_LONG_MINS_DEFAULT, IDS_TIME_LONG_MINS_SINGULAR, 96 IDS_TIME_LONG_MINS,
120 IDS_TIME_LONG_MINS_ZERO, IDS_TIME_LONG_MINS_TWO,
121 IDS_TIME_LONG_MINS_FEW, IDS_TIME_LONG_MINS_MANY },
122 "one{# minute}", 97 "one{# minute}",
123 " other{# minutes}" 98 " other{# minutes}"
124 }; 99 };
125 static const Pluralities IDS_DURATION_HOUR = { 100 static const Pluralities IDS_DURATION_HOUR = {
126 { IDS_TIME_HOURS_DEFAULT, IDS_TIME_HOURS_SINGULAR, IDS_TIME_HOURS_ZERO, 101 IDS_TIME_HOURS,
127 IDS_TIME_HOURS_TWO, IDS_TIME_HOURS_FEW, IDS_TIME_HOURS_MANY },
128 "one{# hour}", 102 "one{# hour}",
129 " other{# hours}" 103 " other{# hours}"
130 }; 104 };
131 static const Pluralities IDS_DURATION_DAY = { 105 static const Pluralities IDS_DURATION_DAY = {
132 { IDS_TIME_DAYS_DEFAULT, IDS_TIME_DAYS_SINGULAR, IDS_TIME_DAYS_ZERO, 106 IDS_TIME_DAYS,
133 IDS_TIME_DAYS_TWO, IDS_TIME_DAYS_FEW, IDS_TIME_DAYS_MANY },
134 "one{# day}", 107 "one{# day}",
135 " other{# days}" 108 " other{# days}"
136 }; 109 };
137 110
138 static const Pluralities IDS_LONG_MIN_1ST = { 111 static const Pluralities IDS_LONG_MIN_1ST = {
139 { IDS_TIME_LONG_MINS_1ST_DEFAULT, IDS_TIME_LONG_MINS_1ST_SINGULAR, 112 IDS_TIME_LONG_MINS_1ST,
140 IDS_TIME_LONG_MINS_1ST_ZERO, IDS_TIME_LONG_MINS_1ST_TWO, 113 "one{# minute and }",
141 IDS_TIME_LONG_MINS_1ST_FEW, IDS_TIME_LONG_MINS_1ST_MANY }, 114 " other{# minutes and }"
142 "one{# minute }",
143 " other{# minutes }"
144 }; 115 };
145 static const Pluralities IDS_LONG_SEC_2ND = { 116 static const Pluralities IDS_LONG_SEC_2ND = {
146 { IDS_TIME_LONG_SECS_2ND_DEFAULT, IDS_TIME_LONG_SECS_2ND_SINGULAR, 117 IDS_TIME_LONG_SECS_2ND,
147 IDS_TIME_LONG_SECS_2ND_ZERO, IDS_TIME_LONG_SECS_2ND_TWO,
148 IDS_TIME_LONG_SECS_2ND_FEW, IDS_TIME_LONG_SECS_2ND_MANY },
149 "one{# second}", 118 "one{# second}",
150 " other{# seconds}" 119 " other{# seconds}"
151 }; 120 };
152 static const Pluralities IDS_DURATION_HOUR_1ST = { 121 static const Pluralities IDS_DURATION_HOUR_1ST = {
153 { IDS_TIME_HOURS_1ST_DEFAULT, IDS_TIME_HOURS_1ST_SINGULAR, 122 IDS_TIME_HOURS_1ST,
154 IDS_TIME_HOURS_1ST_ZERO, IDS_TIME_HOURS_1ST_TWO, 123 "one{# hour and }",
155 IDS_TIME_HOURS_1ST_FEW, IDS_TIME_HOURS_1ST_MANY }, 124 " other{# hours and }"
156 "one{# hour }",
157 " other{# hours }"
158 }; 125 };
159 static const Pluralities IDS_LONG_MIN_2ND = { 126 static const Pluralities IDS_LONG_MIN_2ND = {
160 { IDS_TIME_LONG_MINS_2ND_DEFAULT, IDS_TIME_LONG_MINS_2ND_SINGULAR, 127 IDS_TIME_LONG_MINS_2ND,
161 IDS_TIME_LONG_MINS_2ND_ZERO, IDS_TIME_LONG_MINS_2ND_TWO,
162 IDS_TIME_LONG_MINS_2ND_FEW, IDS_TIME_LONG_MINS_2ND_MANY },
163 "one{# minute}", 128 "one{# minute}",
164 " other{# minutes}" 129 " other{# minutes}"
165 }; 130 };
166 static const Pluralities IDS_DURATION_DAY_1ST = { 131 static const Pluralities IDS_DURATION_DAY_1ST = {
167 { IDS_TIME_DAYS_1ST_DEFAULT, IDS_TIME_DAYS_1ST_SINGULAR, 132 IDS_TIME_DAYS_1ST,
168 IDS_TIME_DAYS_1ST_ZERO, IDS_TIME_DAYS_1ST_TWO, 133 "one{# day and }",
169 IDS_TIME_DAYS_1ST_FEW, IDS_TIME_DAYS_1ST_MANY }, 134 " other{# days and }"
170 "one{# day }",
171 " other{# days }"
172 }; 135 };
173 static const Pluralities IDS_DURATION_HOUR_2ND = { 136 static const Pluralities IDS_DURATION_HOUR_2ND = {
174 { IDS_TIME_HOURS_2ND_DEFAULT, IDS_TIME_HOURS_2ND_SINGULAR, 137 IDS_TIME_HOURS_2ND,
175 IDS_TIME_HOURS_2ND_ZERO, IDS_TIME_HOURS_2ND_TWO,
176 IDS_TIME_HOURS_2ND_FEW, IDS_TIME_HOURS_2ND_MANY },
177 "one{# hour}", 138 "one{# hour}",
178 " other{# hours}" 139 " other{# hours}"
179 }; 140 };
180 141
181 Formatter::Formatter(const Pluralities& sec_pluralities, 142 Formatter::Formatter(const Pluralities& sec_pluralities,
182 const Pluralities& min_pluralities, 143 const Pluralities& min_pluralities,
183 const Pluralities& hour_pluralities, 144 const Pluralities& hour_pluralities,
184 const Pluralities& day_pluralities) { 145 const Pluralities& day_pluralities) {
185 simple_format_[UNIT_SEC] = InitFormat(sec_pluralities); 146 simple_format_[UNIT_SEC] = InitFormat(sec_pluralities);
186 simple_format_[UNIT_MIN] = InitFormat(min_pluralities); 147 simple_format_[UNIT_MIN] = InitFormat(min_pluralities);
(...skipping 18 matching lines...) Expand all
205 detailed_format_[TWO_UNITS_MIN_SEC][0] = InitFormat(min_sec_pluralities1); 166 detailed_format_[TWO_UNITS_MIN_SEC][0] = InitFormat(min_sec_pluralities1);
206 detailed_format_[TWO_UNITS_MIN_SEC][1] = InitFormat(min_sec_pluralities2); 167 detailed_format_[TWO_UNITS_MIN_SEC][1] = InitFormat(min_sec_pluralities2);
207 detailed_format_[TWO_UNITS_HOUR_MIN][0] = InitFormat(hour_min_pluralities1); 168 detailed_format_[TWO_UNITS_HOUR_MIN][0] = InitFormat(hour_min_pluralities1);
208 detailed_format_[TWO_UNITS_HOUR_MIN][1] = InitFormat(hour_min_pluralities2); 169 detailed_format_[TWO_UNITS_HOUR_MIN][1] = InitFormat(hour_min_pluralities2);
209 detailed_format_[TWO_UNITS_DAY_HOUR][0] = InitFormat(day_hour_pluralities1); 170 detailed_format_[TWO_UNITS_DAY_HOUR][0] = InitFormat(day_hour_pluralities1);
210 detailed_format_[TWO_UNITS_DAY_HOUR][1] = InitFormat(day_hour_pluralities2); 171 detailed_format_[TWO_UNITS_DAY_HOUR][1] = InitFormat(day_hour_pluralities2);
211 } 172 }
212 173
213 void Formatter::Format(Unit unit, 174 void Formatter::Format(Unit unit,
214 int value, 175 int value,
215 icu::UnicodeString& formatted_string) const { 176 icu::UnicodeString* formatted_string) const {
216 DCHECK(simple_format_[unit]); 177 DCHECK(simple_format_[unit]);
178 DCHECK(formatted_string->isEmpty() == TRUE);
217 UErrorCode error = U_ZERO_ERROR; 179 UErrorCode error = U_ZERO_ERROR;
218 formatted_string = simple_format_[unit]->format(value, error); 180 l10n_util::FormatNumberInPlural(*simple_format_[unit],
181 value, formatted_string, &error);
219 DCHECK(U_SUCCESS(error)) << "Error in icu::PluralFormat::format()."; 182 DCHECK(U_SUCCESS(error)) << "Error in icu::PluralFormat::format().";
220 return; 183 return;
221 } 184 }
222 185
223 void Formatter::Format(TwoUnits units, 186 void Formatter::Format(TwoUnits units,
224 int value_1, 187 int value_1,
225 int value_2, 188 int value_2,
226 icu::UnicodeString& formatted_string) const { 189 icu::UnicodeString* formatted_string) const {
227 DCHECK(detailed_format_[units][0]) 190 DCHECK(detailed_format_[units][0])
228 << "Detailed() not implemented for your (format, length) combination!"; 191 << "Detailed() not implemented for your (format, length) combination!";
229 DCHECK(detailed_format_[units][1]) 192 DCHECK(detailed_format_[units][1])
230 << "Detailed() not implemented for your (format, length) combination!"; 193 << "Detailed() not implemented for your (format, length) combination!";
194 DCHECK(formatted_string->isEmpty() == TRUE);
231 UErrorCode error = U_ZERO_ERROR; 195 UErrorCode error = U_ZERO_ERROR;
232 formatted_string = detailed_format_[units][0]->format(value_1, error); 196 l10n_util::FormatNumberInPlural(*detailed_format_[units][0], value_1,
197 formatted_string, &error);
233 DCHECK(U_SUCCESS(error)); 198 DCHECK(U_SUCCESS(error));
234 formatted_string += detailed_format_[units][1]->format(value_2, error); 199 l10n_util::FormatNumberInPlural(*detailed_format_[units][1], value_2,
200 formatted_string, &error);
235 DCHECK(U_SUCCESS(error)); 201 DCHECK(U_SUCCESS(error));
236 return; 202 return;
237 } 203 }
238 204
239 scoped_ptr<icu::PluralFormat> Formatter::CreateFallbackFormat( 205 scoped_ptr<icu::MessageFormat> Formatter::CreateFallbackFormat(
240 const icu::PluralRules& rules, 206 const icu::PluralRules& rules,
241 const Pluralities& pluralities) const { 207 const Pluralities& pluralities) const {
242 icu::UnicodeString pattern; 208 icu::UnicodeString pattern("{NUMBER, plural, ");
243 if (rules.isKeyword(UNICODE_STRING_SIMPLE("one"))) 209 if (rules.isKeyword(UNICODE_STRING_SIMPLE("one")))
244 pattern += icu::UnicodeString(pluralities.fallback_one); 210 pattern += icu::UnicodeString(pluralities.fallback_one);
245 pattern += icu::UnicodeString(pluralities.fallback_other); 211 pattern += icu::UnicodeString(pluralities.fallback_other);
212 pattern.append(UChar(0x7du)); // "}" = U+007D
246 213
247 UErrorCode error = U_ZERO_ERROR; 214 UErrorCode error = U_ZERO_ERROR;
248 scoped_ptr<icu::PluralFormat> format( 215 scoped_ptr<icu::MessageFormat> format(
249 new icu::PluralFormat(rules, pattern, error)); 216 new icu::MessageFormat(pattern, error));
250 DCHECK(U_SUCCESS(error)); 217 DCHECK(U_SUCCESS(error));
251 return format.Pass(); 218 return format.Pass();
252 } 219 }
253 220
254 scoped_ptr<icu::PluralFormat> Formatter::InitFormat( 221 scoped_ptr<icu::MessageFormat> Formatter::InitFormat(
255 const Pluralities& pluralities) { 222 const Pluralities& pluralities) {
256 if (!formatter_force_fallback) { 223 if (!formatter_force_fallback) {
257 icu::UnicodeString pattern; 224 base::string16 pattern = l10n_util::GetStringUTF16(pluralities.id);
258 std::vector<int> ids; 225 UErrorCode error = U_ZERO_ERROR;
259 for (size_t j = 0; j < kNumberPluralities; ++j) 226 scoped_ptr<icu::MessageFormat> format(new icu::MessageFormat(
260 ids.push_back(pluralities.ids[j]); 227 icu::UnicodeString(FALSE, pattern.data(), pattern.length()), error));
261 scoped_ptr<icu::PluralFormat> format = l10n_util::BuildPluralFormat(ids); 228 DCHECK(U_SUCCESS(error));
262 if (format.get()) 229 if (format.get())
263 return format.Pass(); 230 return format.Pass();
264 } 231 }
265 232
266 scoped_ptr<icu::PluralRules> rules(l10n_util::BuildPluralRules()); 233 scoped_ptr<icu::PluralRules> rules(l10n_util::BuildPluralRules());
267 return CreateFallbackFormat(*rules, pluralities); 234 return CreateFallbackFormat(*rules, pluralities);
268 } 235 }
269 236
270 const Formatter* FormatterContainer::Get(TimeFormat::Format format, 237 const Formatter* FormatterContainer::Get(TimeFormat::Format format,
271 TimeFormat::Length length) const { 238 TimeFormat::Length length) const {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 285
319 void FormatterContainer::Shutdown() { 286 void FormatterContainer::Shutdown() {
320 for (int format = 0; format < TimeFormat::FORMAT_COUNT; ++format) { 287 for (int format = 0; format < TimeFormat::FORMAT_COUNT; ++format) {
321 for (int length = 0; length < TimeFormat::LENGTH_COUNT; ++length) { 288 for (int length = 0; length < TimeFormat::LENGTH_COUNT; ++length) {
322 formatter_[format][length].reset(); 289 formatter_[format][length].reset();
323 } 290 }
324 } 291 }
325 } 292 }
326 293
327 } // namespace ui 294 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/l10n/formatter.h ('k') | ui/base/l10n/l10n_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698