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

Side by Side Diff: chrome/common/plural_formatter.h

Issue 6736003: This adds a formatter for plurals that works for all locales. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: upload after rebase Created 9 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « chrome/chrome_tests.gypi ('k') | chrome/common/plural_formatter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_COMMON_PLURAL_FORMATTER_H_
6 #define CHROME_COMMON_PLURAL_FORMATTER_H_
7 #pragma once
8
9 // This file defines a method to format a plural value properly as a
10 // string for multiple locales.
11
12 #include <string>
13
14 #include "base/gtest_prod_util.h"
15 #include "base/string16.h"
16
17 // This class returns appropriate plural string for the locale:
18 // e.g. singular: "Your hovercraft has 1 eel." versus plural: "Your
19 // hovercraft has 42 eels." If you never have a particular value of
20 // something (e.g. if you never have "1 eel" in your hovercraft), you
21 // still need to specify a message for that value: plural rules in
22 // other languages are very different from English, and, for instance,
23 // the ONE message may be used for all numbers ending in one, not just
24 // a literal "1".
25 //
26 // Note that this class will ONLY format a string with zero or one
27 // integer "#" fields in it.
28 //
29 // NOTE: See the file plural_formatter_example.grd for an example of
30 // the messages you need to create to use this class. Please use that
31 // form, and don't invent your own: there's logic in there.
32 //
33 // For the example messages, the English strings would be "Your
34 // hovercraft has 1 eel." and "Your hovercraft has 42 eels." Other
35 // translations will be created for each other locale, based on how
36 // they handle plurals.
37 //
38 // For cases where your string doesn't make sense (i.e. there can never
39 // be zero eels in your hovercraft), you may leave out that string, and
40 // pass "-1" for the message ID when creating the PluralFormatter.
41 //
42 // Don't expect the "few" and "many" cases to be used for English: they
43 // won't be. Only ONE and DEFAULT are used for English.
44 //
45 // The messages would be handed to the PluralFormatter as follows:
46 //
47 // ===
48 // PluralFormatter formatter(IDS_EELS_ZERO,
49 // IDS_EEL_ONE,
50 // IDS_EELS_TWO,
51 // IDS_EELS_FEW,
52 // IDS_EELS_MANY,
53 // IDS_EELS_DEFAULT);
54 //
55 // // Result is "Your hovercraft has 1 eel."
56 // string16 result = formatter.GetPluralString(1);
57 //
58 // // Result is "Your hovercraft has 42 eels."
59 // string16 result = formatter.GetPluralString(42);
60 // ===
61 //
62 // When you create these strings in the main string file, please leave
63 // the descriptions intact (well, obviously, change the part that says
64 // "Describes the number of eels in a hovercraft."!) so that they
65 // serve as a guide for the translators to help reduce translation
66 // errors.
67
68 class PluralFormatter {
69 public:
70 typedef std::string (*StringSourceFunction)(int);
71
72 PluralFormatter();
73 ~PluralFormatter();
74
75 // There must be exactly six message ids, in increasing cardinality:
76 // zero, one, two, few, many, default.
77 bool Init(const int message_ids[]);
78 bool Init(int zero_message_id,
79 int one_message_id,
80 int two_message_id,
81 int few_message_id,
82 int many_message_id,
83 int default_message_id);
84
85 string16 GetPluralString(int number) const;
86 private:
87 // The tests use SetStringSource(), SetOverrideLocale()
88 friend class PluralFormatterTest;
89 FRIEND_TEST_ALL_PREFIXES(PluralFormatterTest, Basic);
90 FRIEND_TEST_ALL_PREFIXES(PluralFormatterTest, TestLocales);
91
92 // Used by unit test to override resource string fetching function.
93 static void SetStringSource(StringSourceFunction string_source);
94
95 // Used by unit test to cycle through locales. Set to NULL to reset
96 // to default. Must be set before creating the PluralFormatter
97 // object that will use it.
98 static void SetOverrideLocale(const char* override_locale);
99
100 class PluralFormatterImpl;
101
102 PluralFormatterImpl* impl_;
103 };
104
105 #endif // CHROME_COMMON_PLURAL_FORMATTER_H_
OLDNEW
« no previous file with comments | « chrome/chrome_tests.gypi ('k') | chrome/common/plural_formatter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698