2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
8 /** @file table/strgen_tables.h Tables of commands for strgen */
10 #include "../core/enum_type.hpp"
13 C_NONE
= 0x0, ///< Nothing special about this command
14 C_DONTCOUNT
= 0x1, ///< These commands aren't counted for comparison
15 C_CASE
= 0x2, ///< These commands support cases
16 C_GENDER
= 0x4, ///< These commands support genders
18 DECLARE_ENUM_AS_BIT_SET(CmdFlags
)
21 typedef void (*ParseCmdProc
)(Buffer
*buffer
, char *buf
, int value
);
28 int8_t default_plural_offset
;
32 extern void EmitSingleChar(Buffer
*buffer
, char *buf
, int value
);
33 extern void EmitPlural(Buffer
*buffer
, char *buf
, int value
);
34 extern void EmitGender(Buffer
*buffer
, char *buf
, int value
);
36 static const CmdStruct _cmd_structs
[] = {
38 {"NORMAL_FONT", EmitSingleChar
, SCC_NORMALFONT
, 0, -1, C_NONE
},
39 {"TINY_FONT", EmitSingleChar
, SCC_TINYFONT
, 0, -1, C_NONE
},
40 {"BIG_FONT", EmitSingleChar
, SCC_BIGFONT
, 0, -1, C_NONE
},
41 {"MONO_FONT", EmitSingleChar
, SCC_MONOFONT
, 0, -1, C_NONE
},
44 {"BLUE", EmitSingleChar
, SCC_BLUE
, 0, -1, C_DONTCOUNT
},
45 {"SILVER", EmitSingleChar
, SCC_SILVER
, 0, -1, C_DONTCOUNT
},
46 {"GOLD", EmitSingleChar
, SCC_GOLD
, 0, -1, C_DONTCOUNT
},
47 {"RED", EmitSingleChar
, SCC_RED
, 0, -1, C_DONTCOUNT
},
48 {"PURPLE", EmitSingleChar
, SCC_PURPLE
, 0, -1, C_DONTCOUNT
},
49 {"LTBROWN", EmitSingleChar
, SCC_LTBROWN
, 0, -1, C_DONTCOUNT
},
50 {"ORANGE", EmitSingleChar
, SCC_ORANGE
, 0, -1, C_DONTCOUNT
},
51 {"GREEN", EmitSingleChar
, SCC_GREEN
, 0, -1, C_DONTCOUNT
},
52 {"YELLOW", EmitSingleChar
, SCC_YELLOW
, 0, -1, C_DONTCOUNT
},
53 {"DKGREEN", EmitSingleChar
, SCC_DKGREEN
, 0, -1, C_DONTCOUNT
},
54 {"CREAM", EmitSingleChar
, SCC_CREAM
, 0, -1, C_DONTCOUNT
},
55 {"BROWN", EmitSingleChar
, SCC_BROWN
, 0, -1, C_DONTCOUNT
},
56 {"WHITE", EmitSingleChar
, SCC_WHITE
, 0, -1, C_DONTCOUNT
},
57 {"LTBLUE", EmitSingleChar
, SCC_LTBLUE
, 0, -1, C_DONTCOUNT
},
58 {"GRAY", EmitSingleChar
, SCC_GRAY
, 0, -1, C_DONTCOUNT
},
59 {"DKBLUE", EmitSingleChar
, SCC_DKBLUE
, 0, -1, C_DONTCOUNT
},
60 {"BLACK", EmitSingleChar
, SCC_BLACK
, 0, -1, C_DONTCOUNT
},
61 {"COLOUR", EmitSingleChar
, SCC_COLOUR
, 1, -1, C_NONE
},
62 {"PUSH_COLOUR", EmitSingleChar
, SCC_PUSH_COLOUR
, 0, -1, C_DONTCOUNT
},
63 {"POP_COLOUR", EmitSingleChar
, SCC_POP_COLOUR
, 0, -1, C_DONTCOUNT
},
65 {"REV", EmitSingleChar
, SCC_REVISION
, 0, -1, C_NONE
}, // openttd revision string
67 {"STRING1", EmitSingleChar
, SCC_STRING1
, 2, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and ONE argument
68 {"STRING2", EmitSingleChar
, SCC_STRING2
, 3, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and TWO arguments
69 {"STRING3", EmitSingleChar
, SCC_STRING3
, 4, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and THREE arguments
70 {"STRING4", EmitSingleChar
, SCC_STRING4
, 5, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and FOUR arguments
71 {"STRING5", EmitSingleChar
, SCC_STRING5
, 6, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and FIVE arguments
72 {"STRING6", EmitSingleChar
, SCC_STRING6
, 7, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and SIX arguments
73 {"STRING7", EmitSingleChar
, SCC_STRING7
, 8, -1, C_CASE
| C_GENDER
}, // included string that consumes the string id and SEVEN arguments
75 {"STATION_FEATURES", EmitSingleChar
, SCC_STATION_FEATURES
, 1, -1, C_NONE
}, // station features string, icons of the features
76 {"INDUSTRY", EmitSingleChar
, SCC_INDUSTRY_NAME
, 1, -1, C_CASE
| C_GENDER
}, // industry, takes an industry #, can have cases
77 {"CARGO_LONG", EmitSingleChar
, SCC_CARGO_LONG
, 2, 1, C_NONE
| C_GENDER
},
78 {"CARGO_SHORT", EmitSingleChar
, SCC_CARGO_SHORT
, 2, 1, C_NONE
| C_GENDER
}, // short cargo description, only ### tons, or ### litres
79 {"CARGO_TINY", EmitSingleChar
, SCC_CARGO_TINY
, 2, 1, C_NONE
}, // tiny cargo description with only the amount, not a specifier for the amount or the actual cargo name
80 {"CARGO_LIST", EmitSingleChar
, SCC_CARGO_LIST
, 1, -1, C_CASE
},
81 {"POWER", EmitSingleChar
, SCC_POWER
, 1, 0, C_NONE
},
82 {"POWER_TO_WEIGHT", EmitSingleChar
, SCC_POWER_TO_WEIGHT
, 1, 0, C_NONE
},
83 {"VOLUME_LONG", EmitSingleChar
, SCC_VOLUME_LONG
, 1, 0, C_NONE
},
84 {"VOLUME_SHORT", EmitSingleChar
, SCC_VOLUME_SHORT
, 1, 0, C_NONE
},
85 {"WEIGHT_LONG", EmitSingleChar
, SCC_WEIGHT_LONG
, 1, 0, C_NONE
},
86 {"WEIGHT_SHORT", EmitSingleChar
, SCC_WEIGHT_SHORT
, 1, 0, C_NONE
},
87 {"FORCE", EmitSingleChar
, SCC_FORCE
, 1, 0, C_NONE
},
88 {"VELOCITY", EmitSingleChar
, SCC_VELOCITY
, 1, 0, C_NONE
},
89 {"HEIGHT", EmitSingleChar
, SCC_HEIGHT
, 1, 0, C_NONE
},
91 {"UNITS_DAYS_OR_SECONDS", EmitSingleChar
, SCC_UNITS_DAYS_OR_SECONDS
, 1, 0, C_GENDER
},
92 {"UNITS_MONTHS_OR_MINUTES", EmitSingleChar
, SCC_UNITS_MONTHS_OR_MINUTES
, 1, 0, C_GENDER
},
93 {"UNITS_YEARS_OR_PERIODS", EmitSingleChar
, SCC_UNITS_YEARS_OR_PERIODS
, 1, 0, C_GENDER
},
94 {"UNITS_YEARS_OR_MINUTES", EmitSingleChar
, SCC_UNITS_YEARS_OR_MINUTES
, 1, 0, C_GENDER
},
96 {"P", EmitPlural
, 0, 0, -1, C_DONTCOUNT
}, // plural specifier
97 {"G", EmitGender
, 0, 0, -1, C_DONTCOUNT
}, // gender specifier
99 {"DATE_TINY", EmitSingleChar
, SCC_DATE_TINY
, 1, -1, C_NONE
},
100 {"DATE_SHORT", EmitSingleChar
, SCC_DATE_SHORT
, 1, -1, C_CASE
},
101 {"DATE_LONG", EmitSingleChar
, SCC_DATE_LONG
, 1, -1, C_CASE
},
102 {"DATE_ISO", EmitSingleChar
, SCC_DATE_ISO
, 1, -1, C_NONE
},
104 {"STRING", EmitSingleChar
, SCC_STRING
, 1, -1, C_CASE
| C_GENDER
},
105 {"RAW_STRING", EmitSingleChar
, SCC_RAW_STRING_POINTER
, 1, -1, C_NONE
| C_GENDER
},
108 {"COMMA", EmitSingleChar
, SCC_COMMA
, 1, 0, C_NONE
}, // Number with comma
109 {"DECIMAL", EmitSingleChar
, SCC_DECIMAL
, 2, 0, C_NONE
}, // Number with comma and fractional part. Second parameter is number of fractional digits, first parameter is number times 10**(second parameter).
110 {"NUM", EmitSingleChar
, SCC_NUM
, 1, 0, C_NONE
}, // Signed number
111 {"ZEROFILL_NUM", EmitSingleChar
, SCC_ZEROFILL_NUM
, 2, 0, C_NONE
}, // Unsigned number with zero fill, e.g. "02". First parameter is number, second minimum length
112 {"BYTES", EmitSingleChar
, SCC_BYTES
, 1, 0, C_NONE
}, // Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB"
113 {"HEX", EmitSingleChar
, SCC_HEX
, 1, 0, C_NONE
}, // Hexadecimally printed number
115 {"CURRENCY_LONG", EmitSingleChar
, SCC_CURRENCY_LONG
, 1, 0, C_NONE
},
116 {"CURRENCY_SHORT", EmitSingleChar
, SCC_CURRENCY_SHORT
, 1, 0, C_NONE
}, // compact currency
118 {"WAYPOINT", EmitSingleChar
, SCC_WAYPOINT_NAME
, 1, -1, C_NONE
| C_GENDER
}, // waypoint name
119 {"STATION", EmitSingleChar
, SCC_STATION_NAME
, 1, -1, C_NONE
| C_GENDER
},
120 {"DEPOT", EmitSingleChar
, SCC_DEPOT_NAME
, 2, -1, C_NONE
| C_GENDER
},
121 {"TOWN", EmitSingleChar
, SCC_TOWN_NAME
, 1, -1, C_NONE
| C_GENDER
},
122 {"GROUP", EmitSingleChar
, SCC_GROUP_NAME
, 1, -1, C_NONE
| C_GENDER
},
123 {"SIGN", EmitSingleChar
, SCC_SIGN_NAME
, 1, -1, C_NONE
| C_GENDER
},
124 {"ENGINE", EmitSingleChar
, SCC_ENGINE_NAME
, 1, -1, C_NONE
| C_GENDER
},
125 {"VEHICLE", EmitSingleChar
, SCC_VEHICLE_NAME
, 1, -1, C_NONE
| C_GENDER
},
126 {"COMPANY", EmitSingleChar
, SCC_COMPANY_NAME
, 1, -1, C_NONE
| C_GENDER
},
127 {"COMPANY_NUM", EmitSingleChar
, SCC_COMPANY_NUM
, 1, -1, C_NONE
},
128 {"PRESIDENT_NAME", EmitSingleChar
, SCC_PRESIDENT_NAME
, 1, -1, C_NONE
| C_GENDER
},
130 {"SPACE", EmitSingleChar
, ' ', 0, -1, C_DONTCOUNT
},
131 {"", EmitSingleChar
, '\n', 0, -1, C_DONTCOUNT
},
132 {"{", EmitSingleChar
, '{', 0, -1, C_DONTCOUNT
},
133 {"UP_ARROW", EmitSingleChar
, SCC_UP_ARROW
, 0, -1, C_DONTCOUNT
},
134 {"SMALL_UP_ARROW", EmitSingleChar
, SCC_SMALL_UP_ARROW
, 0, -1, C_DONTCOUNT
},
135 {"SMALL_DOWN_ARROW", EmitSingleChar
, SCC_SMALL_DOWN_ARROW
, 0, -1, C_DONTCOUNT
},
136 {"TRAIN", EmitSingleChar
, SCC_TRAIN
, 0, -1, C_DONTCOUNT
},
137 {"LORRY", EmitSingleChar
, SCC_LORRY
, 0, -1, C_DONTCOUNT
},
138 {"BUS", EmitSingleChar
, SCC_BUS
, 0, -1, C_DONTCOUNT
},
139 {"PLANE", EmitSingleChar
, SCC_PLANE
, 0, -1, C_DONTCOUNT
},
140 {"SHIP", EmitSingleChar
, SCC_SHIP
, 0, -1, C_DONTCOUNT
},
141 {"NBSP", EmitSingleChar
, 0xA0, 0, -1, C_DONTCOUNT
},
142 {"COPYRIGHT", EmitSingleChar
, 0xA9, 0, -1, C_DONTCOUNT
},
143 {"DOWN_ARROW", EmitSingleChar
, SCC_DOWN_ARROW
, 0, -1, C_DONTCOUNT
},
144 {"CHECKMARK", EmitSingleChar
, SCC_CHECKMARK
, 0, -1, C_DONTCOUNT
},
145 {"CROSS", EmitSingleChar
, SCC_CROSS
, 0, -1, C_DONTCOUNT
},
146 {"RIGHT_ARROW", EmitSingleChar
, SCC_RIGHT_ARROW
, 0, -1, C_DONTCOUNT
},
147 {"SMALL_LEFT_ARROW", EmitSingleChar
, SCC_LESS_THAN
, 0, -1, C_DONTCOUNT
},
148 {"SMALL_RIGHT_ARROW", EmitSingleChar
, SCC_GREATER_THAN
, 0, -1, C_DONTCOUNT
},
150 /* The following are directional formatting codes used to get the RTL strings right:
151 * http://www.unicode.org/unicode/reports/tr9/#Directional_Formatting_Codes */
152 {"LRM", EmitSingleChar
, CHAR_TD_LRM
, 0, -1, C_DONTCOUNT
},
153 {"RLM", EmitSingleChar
, CHAR_TD_RLM
, 0, -1, C_DONTCOUNT
},
154 {"LRE", EmitSingleChar
, CHAR_TD_LRE
, 0, -1, C_DONTCOUNT
},
155 {"RLE", EmitSingleChar
, CHAR_TD_RLE
, 0, -1, C_DONTCOUNT
},
156 {"LRO", EmitSingleChar
, CHAR_TD_LRO
, 0, -1, C_DONTCOUNT
},
157 {"RLO", EmitSingleChar
, CHAR_TD_RLO
, 0, -1, C_DONTCOUNT
},
158 {"PDF", EmitSingleChar
, CHAR_TD_PDF
, 0, -1, C_DONTCOUNT
},
161 /** Description of a plural form */
163 int plural_count
; ///< The number of plural forms
164 const char *description
; ///< Human readable description of the form
165 const char *names
; ///< Plural names
168 /** The maximum number of plurals. */
169 static const int MAX_PLURALS
= 5;
171 /** All plural forms used */
172 static const PluralForm _plural_forms
[] = {
173 { 2, "Two forms: special case for 1.", "\"1\" \"other\"" },
174 { 1, "Only one form.", "\"other\"" },
175 { 2, "Two forms: special case for 0 to 1.", "\"0..1\" \"other\"" },
176 { 3, "Three forms: special cases for 0, and numbers ending in 1 except when ending in 11.", "\"1,21,31,...\" \"other\" \"0\"" },
177 { 5, "Five forms: special cases for 1, 2, 3 to 6, and 7 to 10.", "\"1\" \"2\" \"3..6\" \"7..10\" \"other\"" },
178 { 3, "Three forms: special cases for numbers ending in 1 except when ending in 11, and 2 to 9 except when ending in 12 to 19.", "\"1,21,31,...\" \"2..9,22..29,32..39,...\" \"other\"" },
179 { 3, "Three forms: special cases for numbers ending in 1 except when ending in 11, and 2 to 4 except when ending in 12 to 14.", "\"1,21,31,...\" \"2..4,22..24,32..34,...\" \"other\"" },
180 { 3, "Three forms: special cases for 1, and numbers ending in 2 to 4 except when ending in 12 to 14.", "\"1\" \"2..4,22..24,32..34,...\" \"other\"" },
181 { 4, "Four forms: special cases for numbers ending in 01, 02, and 03 to 04.", "\"1,101,201,...\" \"2,102,202,...\" \"3..4,103..104,203..204,...\" \"other\"" },
182 { 2, "Two forms: special case for numbers ending in 1 except when ending in 11.", "\"1,21,31,...\" \"other\"" },
183 { 3, "Three forms: special cases for 1, and 2 to 4.", "\"1\" \"2..4\" \"other\"" },
184 { 2, "Two forms: cases for numbers ending with a consonant, and with a vowel.", "\"yeong,il,sam,yuk,chil,pal\" \"i,sa,o,gu\"" },
185 { 4, "Four forms: special cases for 1, 0 and numbers ending in 02 to 10, and numbers ending in 11 to 19.", "\"1\" \"0,2..10,102..110,202..210,...\" \"11..19,111..119,211..219,...\" \"other\"" },
186 { 4, "Four forms: special cases for 1 and 11, 2 and 12, 3..10 and 13..19.", "\"1,11\" \"2,12\" \"3..10,13..19\" \"other\"" },
187 { 3, "Three forms: special cases for 1, 0 and numbers ending in 01 to 19.", "\"1\" \"0,2..19,101..119,201..219,...\" \"other\"" },
192 * t = translator editable
195 * d = separator char (replace spaces with {NBSP})
196 * x1 = hexadecimal number of 1 byte
197 * x2 = hexadecimal number of 2 bytes
200 * a = array, i.e. list of strings
202 /** All pragmas used */
203 static const char * const _pragmas
[][4] = {
204 /* name flags default description */
205 { "name", "0", "", "English name for the language" },
206 { "ownname", "t", "", "Localised name for the language" },
207 { "isocode", "0", "", "ISO code for the language" },
208 { "plural", "tp", "0", "Plural form to use" },
209 { "textdir", "tl", "ltr", "Text direction. Either ltr (left-to-right) or rtl (right-to-left)" },
210 { "digitsep", "td", ",", "Digit grouping separator for non-currency numbers" },
211 { "digitsepcur", "td", ",", "Digit grouping separator for currency numbers" },
212 { "decimalsep", "td", ".", "Decimal separator" },
213 { "winlangid", "x2", "0x0000", "Language ID for Windows" },
214 { "grflangid", "x1", "0x00", "Language ID for NewGRFs" },
215 { "gender", "tag", "", "List of genders" },
216 { "case", "tac", "", "List of cases" },