1 /*
2  * This file is part of the Colobot: Gold Edition source code
3  * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam
4  * http://epsitec.ch; http://colobot.info; http://github.com/colobot
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see http://gnu.org/licenses
18  */
19 
20 
21 #include "common/restext.h"
22 
23 #include "CBot/CBot.h"
24 
25 #include "app/input.h"
26 
27 #include "common/error.h"
28 #include "common/event.h"
29 #include "common/logger.h"
30 #include "common/stringutils.h"
31 
32 #include "object/object_type.h"
33 
34 #include <libintl.h>
35 #include <SDL_keyboard.h>
36 #include <boost/regex.hpp>
37 
38 const char* stringsText[RT_MAX]         = { nullptr };
39 const char* stringsEvent[EVENT_STD_MAX] = { nullptr };
40 const char* stringsObject[OBJECT_MAX]   = { nullptr };
41 const char* stringsErr[ERR_MAX]         = { nullptr };
42 const char* stringsCbot[CBot::CBotErrMAX]         = { nullptr };
43 
44 /* Macro to mark which texts are translatable by gettext
45  * It doesn't do anything at compile-time, as all texts represented here are used later
46  * in explicit call to gettext(), but it is used by xgettext executable to filter extracted
47  * texts from this file.
48  */
49 #define TR(x) x
50 
51 /* Please run `cmake --build <path_to_build_folder> --target update-pot`
52  * after changing this file in order to update translation files. Thank you.
53  */
54 
InitializeRestext()55 void InitializeRestext()
56 {
57     stringsText[RT_WINDOW_MAXIMIZED] = TR("Maximize");
58     stringsText[RT_WINDOW_MINIMIZED] = TR("Minimize");
59     stringsText[RT_WINDOW_STANDARD]  = TR("Normal size");
60     stringsText[RT_WINDOW_CLOSE]     = TR("Close");
61 
62     stringsText[RT_STUDIO_TITLE]     = TR("Program editor");
63     stringsText[RT_SCRIPT_NEW]       = TR("New");
64     stringsText[RT_NAME_DEFAULT]     = TR("Player");
65     stringsText[RT_IO_NEW]           = TR("New ...");
66     stringsText[RT_KEY_OR]           = TR(" or ");
67 
68     stringsText[RT_TITLE_APPNAME]    = TR("Colobot: Gold Edition");
69     stringsText[RT_TITLE_TRAINER]    = TR("Programming exercises");
70     stringsText[RT_TITLE_DEFI]       = TR("Challenges");
71     stringsText[RT_TITLE_MISSION]    = TR("Missions");
72     stringsText[RT_TITLE_FREE]       = TR("Free game");
73     stringsText[RT_TITLE_USER]       = TR("User levels");
74     stringsText[RT_TITLE_CODE_BATTLES] = TR("Code battles");
75     stringsText[RT_TITLE_SETUP]      = TR("Options");
76     stringsText[RT_TITLE_NAME]       = TR("Player's name");
77     stringsText[RT_TITLE_PERSO]      = TR("Customize your appearance");
78     stringsText[RT_TITLE_WRITE]      = TR("Save the current mission");
79     stringsText[RT_TITLE_READ]       = TR("Load a saved mission");
80     stringsText[RT_TITLE_PLUS]       = TR("Missions+");
81     stringsText[RT_TITLE_MODS]       = TR("Mods");
82 
83     stringsText[RT_PLAY_CHAP_CHAPTERS]   = TR("Chapters:");
84     stringsText[RT_PLAY_CHAP_PLANETS]    = TR("Planets:");
85     stringsText[RT_PLAY_CHAP_USERLVL]    = TR("Custom levels:");
86     stringsText[RT_PLAY_LIST_LEVELS]     = TR("Levels in this chapter:");
87     stringsText[RT_PLAY_LIST_EXERCISES]  = TR("Exercises in the chapter:");
88     stringsText[RT_PLAY_LIST_CHALLENGES] = TR("Challenges in the chapter:");
89     stringsText[RT_PLAY_LIST_MISSIONS]   = TR("Missions on this planet:");
90     stringsText[RT_PLAY_LIST_FREEGAME]   = TR("Free game on this planet:");
91     stringsText[RT_PLAY_RESUME]          = TR("Summary:");
92 
93     stringsText[RT_SETUP_MODE]       = TR("Resolution:");
94     stringsText[RT_SETUP_KEY1]       = TR("1) First click on the key you want to redefine.");
95     stringsText[RT_SETUP_KEY2]       = TR("2) Then press the key you want to use instead.");
96 
97     stringsText[RT_PERSO_FACE]       = TR("Face type:");
98     stringsText[RT_PERSO_GLASSES]    = TR("Eyeglasses:");
99     stringsText[RT_PERSO_HAIR]       = TR("Hair color:");
100     stringsText[RT_PERSO_COMBI]      = TR("Suit color:");
101     stringsText[RT_PERSO_BAND]       = TR("Strip color:");
102 
103     stringsText[RT_DIALOG_ABORT]     = TR("Abort\\Abort the current mission");
104     stringsText[RT_DIALOG_CONTINUE]  = TR("Continue\\Continue the current mission");
105     stringsText[RT_DIALOG_DELOBJ]    = TR("Do you really want to destroy the selected building?");
106     stringsText[RT_DIALOG_DELGAME]   = TR("Do you want to delete %s's saved games?");
107     stringsText[RT_DIALOG_YES]       = TR("Yes");
108     stringsText[RT_DIALOG_NO]        = TR("No");
109     stringsText[RT_DIALOG_LOADING]   = TR("LOADING");
110     stringsText[RT_DIALOG_OK]        = TR("OK");
111     stringsText[RT_DIALOG_NOUSRLVL_TITLE] = TR("No userlevels installed!");
112     stringsText[RT_DIALOG_NOUSRLVL_TEXT]  = TR("This menu is for userlevels from mods, but you didn't install any");
113     stringsText[RT_DIALOG_OPEN_PATH_FAILED_TITLE] = TR("Could not open the file explorer!");
114     stringsText[RT_DIALOG_OPEN_PATH_FAILED_TEXT] = TR("The path %s could not be opened in a file explorer.");
115     stringsText[RT_DIALOG_OPEN_WEBSITE_FAILED_TITLE] = TR("Could not open the web browser!");
116     stringsText[RT_DIALOG_OPEN_WEBSITE_FAILED_TEXT] = TR("The address %s could not be opened in a web browser.");
117     stringsText[RT_DIALOG_CHANGES_QUESTION] = TR("There are unsaved changes. Do you want to save them before leaving?");
118 
119     stringsText[RT_STUDIO_LISTTT]    = TR("Keyword help(\\key cbot;)");
120     stringsText[RT_STUDIO_COMPOK]    = TR("Compilation ok (0 errors)");
121     stringsText[RT_STUDIO_PROGSTOP]  = TR("Program finished");
122     stringsText[RT_STUDIO_CLONED]    = TR("Program cloned");
123 
124     stringsText[RT_PROGRAM_READONLY] = TR("This program is read-only, clone it to edit");
125     stringsText[RT_PROGRAM_EXAMPLE]  = TR("This is example code that cannot be run directly");
126 
127     stringsText[RT_IO_OPEN]          = TR("Open");
128     stringsText[RT_IO_SAVE]          = TR("Save");
129     stringsText[RT_IO_LIST]          = TR("Folder: %s");
130     stringsText[RT_IO_NAME]          = TR("Name:");
131     stringsText[RT_IO_DIR]           = TR("Folder:");
132     stringsText[RT_IO_PRIVATE]       = TR("Private\\Private folder");
133     stringsText[RT_IO_PUBLIC]        = TR("Public\\Common folder");
134     stringsText[RT_IO_REPLACE]       = TR("Overwrite existing file?");
135     stringsText[RT_IO_SELECT_DIR]    = TR("Select Folder");
136 
137     stringsText[RT_GENERIC_DEV1]     = TR("Original game developed by:");
138     stringsText[RT_GENERIC_DEV2]     = TR("epsitec.com");
139     stringsText[RT_GENERIC_EDIT1]    = TR("Gold Edition development by:");
140     stringsText[RT_GENERIC_EDIT2]    = TR("colobot.info");
141 
142     stringsText[RT_INTERFACE_REC]    = TR("Recorder");
143 
144     stringsText[RT_LOADING_INIT]           = TR("Starting...");
145     stringsText[RT_LOADING_PROCESSING]     = TR("Processing level file");
146     stringsText[RT_LOADING_LEVEL_SETTINGS] = TR("Loading basic level settings");
147     stringsText[RT_LOADING_MUSIC]          = TR("Loading music");
148     stringsText[RT_LOADING_TERRAIN]        = TR("Loading terrain");
149     stringsText[RT_LOADING_OBJECTS]        = TR("Loading objects");
150     stringsText[RT_LOADING_OBJECTS_SAVED]  = TR("Restoring saved objects");
151     stringsText[RT_LOADING_CBOT_SAVE]      = TR("Restoring CBot execution state");
152     stringsText[RT_LOADING_FINISHED]       = TR("Loading finished!");
153     stringsText[RT_LOADING_TERRAIN_RELIEF] = TR("Terrain relief");
154     stringsText[RT_LOADING_TERRAIN_RES]    = TR("Resources");
155     stringsText[RT_LOADING_TERRAIN_TEX]    = TR("Textures");
156     stringsText[RT_LOADING_TERRAIN_GEN]    = TR("Generating");
157 
158     stringsText[RT_SCOREBOARD_RESULTS]     = TR("Results");
159     stringsText[RT_SCOREBOARD_RESULTS_TEXT]= TR("The battle has ended");
160     stringsText[RT_SCOREBOARD_RESULTS_TIME]= TR("Time: %s");
161     stringsText[RT_SCOREBOARD_RESULTS_LINE]= TR("%s: %d pts");
162 
163     stringsText[RT_MOD_LIST]               = TR("Mods:");
164     stringsText[RT_MOD_DETAILS]            = TR("Information:");
165     stringsText[RT_MOD_SUMMARY]            = TR("Description:");
166     stringsText[RT_MOD_ENABLE]             = TR("Enable\\Enable the selected mod");
167     stringsText[RT_MOD_DISABLE]            = TR("Disable\\Disable the selected mod");
168     stringsText[RT_MOD_UNKNOWN_AUTHOR]     = TR("Unknown author");
169     stringsText[RT_MOD_AUTHOR_FIELD_NAME]  = TR("by");
170     stringsText[RT_MOD_VERSION_FIELD_NAME] = TR("Version");
171     stringsText[RT_MOD_WEBSITE_FIELD_NAME] = TR("Website");
172     stringsText[RT_MOD_CHANGES_FIELD_NAME] = TR("Changes");
173     stringsText[RT_MOD_NO_SUMMARY]         = TR("No description.");
174     stringsText[RT_MOD_NO_CHANGES]         = TR("No changes.");
175 
176     stringsEvent[EVENT_LABEL_CODE_BATTLE]   = TR("Code battle");
177 
178     stringsEvent[EVENT_BUTTON_OK]           = TR("OK");
179     stringsEvent[EVENT_BUTTON_CANCEL]       = TR("Cancel");
180     stringsEvent[EVENT_BUTTON_NEXT]         = TR("Next");
181     stringsEvent[EVENT_BUTTON_PREV]         = TR("Previous");
182 
183     stringsEvent[EVENT_DIALOG_OK]           = TR("OK");
184     stringsEvent[EVENT_DIALOG_CANCEL]       = TR("Cancel");
185     stringsEvent[EVENT_DIALOG_NEWDIR]       = TR("New Folder");
186 
187     stringsEvent[EVENT_INTERFACE_TRAINER]   = TR("Exercises\\Programming exercises");
188     stringsEvent[EVENT_INTERFACE_DEFI]      = TR("Challenges\\Programming challenges");
189     stringsEvent[EVENT_INTERFACE_MISSION]   = TR("Missions\\Select mission");
190     stringsEvent[EVENT_INTERFACE_FREE]      = TR("Free game\\Free game without a specific goal");
191     stringsEvent[EVENT_INTERFACE_CODE_BATTLES] = TR("Code battles\\Program your robot to be the best of them all!");
192     stringsEvent[EVENT_INTERFACE_USER]      = TR("Custom levels\\Levels from mods created by the users");
193     stringsEvent[EVENT_INTERFACE_SATCOM]    = TR("SatCom");
194     stringsEvent[EVENT_INTERFACE_MODS]      = TR("Mods\\Mod manager");
195     stringsEvent[EVENT_INTERFACE_NAME]      = TR("Change player\\Change player");
196     stringsEvent[EVENT_INTERFACE_SETUP]     = TR("Options\\Preferences");
197     stringsEvent[EVENT_INTERFACE_AGAIN]     = TR("Restart\\Restart the mission from the beginning");
198     stringsEvent[EVENT_INTERFACE_WRITE]     = TR("Save\\Save the current mission");
199     stringsEvent[EVENT_INTERFACE_READ]      = TR("Load\\Load a saved mission");
200     stringsEvent[EVENT_INTERFACE_ABORT]     = TR("\\Return to Colobot: Gold Edition");
201     stringsEvent[EVENT_INTERFACE_QUIT]      = TR("Quit\\Quit Colobot: Gold Edition");
202     stringsEvent[EVENT_INTERFACE_BACK]      = TR("<<  Back  \\Back to the previous screen");
203     stringsEvent[EVENT_INTERFACE_PLUS]      = TR("+\\Missions with bonus content and optional challenges");
204     stringsEvent[EVENT_INTERFACE_PLAY]      = TR("Play\\Start mission!");
205     stringsEvent[EVENT_INTERFACE_WORKSHOP]  = TR("Workshop\\Open the workshop to search for mods");
206     stringsEvent[EVENT_INTERFACE_MODS_DIR]  = TR("Open Directory\\Open the mods directory");
207     stringsEvent[EVENT_INTERFACE_MODS_APPLY] = TR("Apply\\Apply the current mod configuration");
208     stringsEvent[EVENT_INTERFACE_MOD_MOVE_UP] = TR("Up\\Move the selected mod up so it's loaded sooner (mods may overwrite files from the mods above them)");
209     stringsEvent[EVENT_INTERFACE_MOD_MOVE_DOWN] = TR("Down\\Move the selected mod down so it's loaded later (mods may overwrite files from the mods above them)");
210     stringsEvent[EVENT_INTERFACE_MODS_REFRESH] = TR("Refresh\\Refresh the list of currently installed mods");
211     stringsEvent[EVENT_INTERFACE_SETUPd]    = TR("Device\\Driver and resolution settings");
212     stringsEvent[EVENT_INTERFACE_SETUPg]    = TR("Graphics\\Graphics settings");
213     stringsEvent[EVENT_INTERFACE_SETUPp]    = TR("Game\\Game settings");
214     stringsEvent[EVENT_INTERFACE_SETUPc]    = TR("Controls\\Keyboard, joystick and mouse settings");
215     stringsEvent[EVENT_INTERFACE_SETUPs]    = TR("Sound\\Music and game sound volume");
216     stringsEvent[EVENT_INTERFACE_DEVICE]    = TR("Unit");
217     stringsEvent[EVENT_INTERFACE_RESOL]     = TR("Resolution");
218     stringsEvent[EVENT_INTERFACE_FULL]      = TR("Full screen\\Full screen or window mode");
219     stringsEvent[EVENT_INTERFACE_APPLY]     = TR("Apply changes\\Activates the changed settings");
220 
221     stringsEvent[EVENT_INTERFACE_DIRTY]     = TR("Dust\\Dust and dirt on bots and buildings");
222     stringsEvent[EVENT_INTERFACE_FOG]       = TR("Fog\\Fog");
223     stringsEvent[EVENT_INTERFACE_LIGHT]     = TR("Dynamic lighting\\Mobile light sources");
224     stringsEvent[EVENT_INTERFACE_PARTI]     = TR("Number of particles\\Explosions, dust, reflections, etc.");
225     stringsEvent[EVENT_INTERFACE_CLIP]      = TR("Render distance\\Maximum visibility");
226     stringsEvent[EVENT_INTERFACE_PAUSE_BLUR]= TR("Pause blur\\Blur the background on the pause screen");
227     stringsEvent[EVENT_INTERFACE_RAIN]      = TR("Particles in the interface\\Steam clouds and sparks in the interface");
228     stringsEvent[EVENT_INTERFACE_GLINT]     = TR("Reflections on the buttons \\Shiny buttons");
229     stringsEvent[EVENT_INTERFACE_TOOLTIP]   = TR("Help balloons\\Explain the function of the buttons");
230     stringsEvent[EVENT_INTERFACE_MOVIES]    = TR("Film sequences\\Films before and after the missions");
231     stringsEvent[EVENT_INTERFACE_SCROLL]    = TR("Camera border scrolling\\Scrolling when the mouse touches right or left border");
232     stringsEvent[EVENT_INTERFACE_INVERTX]   = TR("Mouse inversion X\\Inversion of the scrolling direction on the X axis");
233     stringsEvent[EVENT_INTERFACE_INVERTY]   = TR("Mouse inversion Y\\Inversion of the scrolling direction on the Y axis");
234     stringsEvent[EVENT_INTERFACE_EFFECT]    = TR("Quake at explosions\\The screen shakes at explosions");
235     stringsEvent[EVENT_INTERFACE_BGPAUSE]   = TR("Pause in background\\Pause the game when the window is unfocused");
236     stringsEvent[EVENT_INTERFACE_BGMUTE]    = TR("Mute sounds in background\\Mute all game sounds when the window is unfocused");
237     stringsEvent[EVENT_INTERFACE_EDITMODE]  = TR("Automatic indent\\When program editing");
238     stringsEvent[EVENT_INTERFACE_EDITVALUE] = TR("Big indent\\Indent 2 or 4 spaces per level defined by braces");
239     stringsEvent[EVENT_INTERFACE_SOLUCE4]   = TR("Access to solutions\\Show program \"4: Solution\" in the exercises");
240     stringsEvent[EVENT_INTERFACE_BLOOD]     = TR("Blood\\Display blood when the astronaut is hit");
241     stringsEvent[EVENT_INTERFACE_AUTOSAVE_ENABLE]   = TR("Autosave\\Enables autosave");
242     stringsEvent[EVENT_INTERFACE_AUTOSAVE_INTERVAL] = TR("Autosave interval\\How often your game will autosave");
243     stringsEvent[EVENT_INTERFACE_AUTOSAVE_SLOTS]    = TR("Autosave slots\\How many autosave slots you'll have");
244     stringsEvent[EVENT_INTERFACE_TEXTURE_FILTER]    = TR("Texture filtering\\Texture filtering");
245     stringsEvent[EVENT_INTERFACE_TEXTURE_MIPMAP]    = TR("Mipmap level\\Mipmap level");
246     stringsEvent[EVENT_INTERFACE_TEXTURE_ANISOTROPY]= TR("Anisotropy level\\Anisotropy level");
247     stringsEvent[EVENT_INTERFACE_MSAA]              = TR("MSAA\\Multisample anti-aliasing");
248     stringsEvent[EVENT_INTERFACE_SHADOW_SPOTS]      = TR("Simple shadows\\Shadows spots on the ground");
249     stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING]    = TR("Dynamic shadows\\Beautiful shadows!");
250     stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_QUALITY]= TR("Dynamic shadows ++\\Dynamic shadows + self shadowing");
251     stringsEvent[EVENT_INTERFACE_SHADOW_MAPPING_BUFFER] = TR("Shadow resolution\\Higher means better range and quality, but slower");
252     stringsEvent[EVENT_INTERFACE_VSYNC]     = TR("Vertical Synchronization\\Limits the number of frames per second to display frequency");
253 
254     stringsEvent[EVENT_INTERFACE_KDEF]      = TR("Standard controls\\Standard key functions");
255     assert(INPUT_SLOT_MAX < EVENT_INTERFACE_KEY_END-EVENT_INTERFACE_KEY);
256     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_LEFT]        = TR("Turn left\\turns the bot to the left");
257     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_RIGHT]       = TR("Turn right\\turns the bot to the right");
258     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_UP]          = TR("Forward\\Moves forward");
259     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_DOWN]        = TR("Backward\\Moves backward");
260     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_GUP]         = TR("Climb\\Increases the power of the jet");
261     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_GDOWN]       = TR("Descend\\Reduces the power of the jet");
262     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAMERA]      = TR("Change camera\\Switches between onboard camera and following camera");
263     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_DESEL]       = TR("Previous object\\Selects the previous object");
264     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_ACTION]      = TR("Standard action\\Standard action of the bot (take/grab, shoot, sniff, etc)");
265     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_LEFT]    = TR("Camera left\\Turns the camera left");
266     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_RIGHT]   = TR("Camera right\\Turns the camera right");
267     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_UP]      = TR("Camera up\\Turns the camera up");
268     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_DOWN]    = TR("Camera down\\Turns the camera down");
269     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_NEAR]    = TR("Camera closer\\Moves the camera forward");
270     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_AWAY]    = TR("Camera back\\Moves the camera backward");
271     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAM_ALT]     = TR("Alternative camera mode\\Move sideways instead of rotating (in free camera)");
272     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_NEXT]        = TR("Next object\\Selects the next object");
273     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_HUMAN]       = TR("Select the astronaut\\Selects the astronaut");
274     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_QUIT]        = TR("Quit\\Quit the current mission or exercise");
275     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_HELP]        = TR("Instructions\\Shows the instructions for the current mission");
276     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_PROG]        = TR("Programming help\\Gives more detailed help with programming");
277     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_VISIT]       = TR("Origin of last message\\Shows where the last message was sent from");
278     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED_DEC]   = TR("Lower speed\\Decrease speed by half");
279     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED_RESET] = TR("Standard speed\\Reset speed to normal");
280     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_SPEED_INC]   = TR("Higher speed\\Doubles speed");
281     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_QUICKSAVE]   = TR("Quick save\\Immediately save game");
282     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_QUICKLOAD]   = TR("Quick load\\Immediately load game");
283     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_PAUSE]       = TR("Pause\\Pause the game without opening menu");
284     stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CMDLINE]     = TR("Cheat console\\Show cheat console");
285 
286     stringsEvent[EVENT_INTERFACE_VOLSOUND]  = TR("Sound effects:\\Volume of engines, voice, shooting, etc.");
287     stringsEvent[EVENT_INTERFACE_VOLMUSIC]  = TR("Background sound:\\Volume of audio tracks");
288 
289     stringsEvent[EVENT_INTERFACE_MIN]       = TR("Lowest\\Minimum graphic quality (highest frame rate)");
290     stringsEvent[EVENT_INTERFACE_NORM]      = TR("Normal\\Normal graphic quality");
291     stringsEvent[EVENT_INTERFACE_MAX]       = TR("Highest\\Highest graphic quality (lowest frame rate)");
292 
293     stringsEvent[EVENT_INTERFACE_SILENT]    = TR("Mute\\No sound");
294     stringsEvent[EVENT_INTERFACE_NOISY]     = TR("Normal\\Normal sound volume");
295 
296     stringsEvent[EVENT_INTERFACE_SOLUCE]    = TR("Access to solution\\Shows the solution (detailed instructions for missions)");
297     stringsEvent[EVENT_INTERFACE_JOYSTICK_X_INVERT] = TR("Invert\\Invert values on this axis");
298     stringsEvent[EVENT_INTERFACE_JOYSTICK_Y_INVERT] = TR("Invert\\Invert values on this axis");
299     stringsEvent[EVENT_INTERFACE_JOYSTICK_Z_INVERT] = TR("Invert\\Invert values on this axis");
300     stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_X_INVERT] = TR("Invert\\Invert values on this axis");
301     stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT] = TR("Invert\\Invert values on this axis");
302     stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT] = TR("Invert\\Invert values on this axis");
303 
304     stringsEvent[EVENT_INTERFACE_PLUS_TRAINER]  = TR("Space Programmer\\Disables radio-control");
305     stringsEvent[EVENT_INTERFACE_PLUS_RESEARCH] = TR("Space Researcher\\Disables using all previously researched technologies");
306     stringsEvent[EVENT_INTERFACE_PLUS_EXPLORER] = TR("Space Explorer\\Disables astronaut abilities");
307 
308     stringsEvent[EVENT_INTERFACE_NEDIT]     = TR("\\New player name");
309     stringsEvent[EVENT_INTERFACE_NOK]       = TR("OK\\Choose the selected player");
310     stringsEvent[EVENT_INTERFACE_NDELETE]   = TR("Delete player\\Deletes the player from the list");
311     stringsEvent[EVENT_INTERFACE_NLABEL]    = TR("Player name");
312 
313     stringsEvent[EVENT_INTERFACE_IOWRITE]   = TR("Save\\Saves the current mission");
314     stringsEvent[EVENT_INTERFACE_IOREAD]    = TR("Load\\Loads the selected mission");
315     stringsEvent[EVENT_INTERFACE_IOLIST]    = TR("List of saved missions");
316     stringsEvent[EVENT_INTERFACE_IOLABEL]   = TR("Filename:");
317     stringsEvent[EVENT_INTERFACE_IONAME]    = TR("Mission name");
318     stringsEvent[EVENT_INTERFACE_IOIMAGE]   = TR("Photography");
319     stringsEvent[EVENT_INTERFACE_IODELETE]  = TR("Delete\\Deletes the selected file");
320 
321     stringsEvent[EVENT_INTERFACE_PERSO]     = TR("Appearance\\Choose your appearance");
322     stringsEvent[EVENT_INTERFACE_POK]       = TR("OK");
323     stringsEvent[EVENT_INTERFACE_PCANCEL]   = TR("Cancel");
324     stringsEvent[EVENT_INTERFACE_PDEF]      = TR("Standard\\Standard appearance settings");
325     stringsEvent[EVENT_INTERFACE_PHEAD]     = TR("Head\\Face and hair");
326     stringsEvent[EVENT_INTERFACE_PBODY]     = TR("Suit\\Astronaut suit");
327     stringsEvent[EVENT_INTERFACE_PLROT]     = TR("\\Turn left");
328     stringsEvent[EVENT_INTERFACE_PRROT]     = TR("\\Turn right");
329     stringsEvent[EVENT_INTERFACE_PCRa]      = TR("Red");
330     stringsEvent[EVENT_INTERFACE_PCGa]      = TR("Green");
331     stringsEvent[EVENT_INTERFACE_PCBa]      = TR("Blue");
332     stringsEvent[EVENT_INTERFACE_PCRb]      = TR("Red");
333     stringsEvent[EVENT_INTERFACE_PCGb]      = TR("Green");
334     stringsEvent[EVENT_INTERFACE_PCBb]      = TR("Blue");
335     stringsEvent[EVENT_INTERFACE_PFACE1]    = TR("\\Face 1");
336     stringsEvent[EVENT_INTERFACE_PFACE2]    = TR("\\Face 2");
337     stringsEvent[EVENT_INTERFACE_PFACE3]    = TR("\\Face 3");
338     stringsEvent[EVENT_INTERFACE_PFACE4]    = TR("\\Face 4");
339     stringsEvent[EVENT_INTERFACE_PGLASS0]   = TR("\\No eyeglasses");
340     stringsEvent[EVENT_INTERFACE_PGLASS1]   = TR("\\Eyeglasses 1");
341     stringsEvent[EVENT_INTERFACE_PGLASS2]   = TR("\\Eyeglasses 2");
342     stringsEvent[EVENT_INTERFACE_PGLASS3]   = TR("\\Eyeglasses 3");
343     stringsEvent[EVENT_INTERFACE_PGLASS4]   = TR("\\Eyeglasses 4");
344     stringsEvent[EVENT_INTERFACE_PGLASS5]   = TR("\\Eyeglasses 5");
345 
346     stringsEvent[EVENT_OBJECT_DESELECT]     = TR("Previous selection (\\key desel;)");
347     stringsEvent[EVENT_OBJECT_LEFT]         = TR("Turn left (\\key left;)");
348     stringsEvent[EVENT_OBJECT_RIGHT]        = TR("Turn right (\\key right;)");
349     stringsEvent[EVENT_OBJECT_UP]           = TR("Forward (\\key up;)");
350     stringsEvent[EVENT_OBJECT_DOWN]         = TR("Backward (\\key down;)");
351     stringsEvent[EVENT_OBJECT_GASUP]        = TR("Up (\\key gup;)");
352     stringsEvent[EVENT_OBJECT_GASDOWN]      = TR("Down (\\key gdown;)");
353     stringsEvent[EVENT_OBJECT_HTAKE]        = TR("Grab or drop (\\key action;)");
354     stringsEvent[EVENT_OBJECT_MTAKE]        = TR("Grab or drop (\\key action;)");
355     stringsEvent[EVENT_OBJECT_MFRONT]       = TR("..in front");
356     stringsEvent[EVENT_OBJECT_MBACK]        = TR("..behind");
357     stringsEvent[EVENT_OBJECT_MPOWER]       = TR("..power cell");
358     stringsEvent[EVENT_OBJECT_BHELP]        = TR("Instructions for the mission (\\key help;)");
359     stringsEvent[EVENT_OBJECT_BTAKEOFF]     = TR("Take off to finish the mission");
360     stringsEvent[EVENT_OBJECT_BDESTROY]     = TR("Destroy");
361     stringsEvent[EVENT_OBJECT_BDERRICK]     = TR("Build a derrick");
362     stringsEvent[EVENT_OBJECT_BSTATION]     = TR("Build a power station");
363     stringsEvent[EVENT_OBJECT_BFACTORY]     = TR("Build a bot factory");
364     stringsEvent[EVENT_OBJECT_BREPAIR]      = TR("Build a repair center");
365     stringsEvent[EVENT_OBJECT_BCONVERT]     = TR("Build a converter");
366     stringsEvent[EVENT_OBJECT_BTOWER]       = TR("Build a defense tower");
367     stringsEvent[EVENT_OBJECT_BRESEARCH]    = TR("Build a research center");
368     stringsEvent[EVENT_OBJECT_BRADAR]       = TR("Build a radar station");
369     stringsEvent[EVENT_OBJECT_BENERGY]      = TR("Build a power cell factory");
370     stringsEvent[EVENT_OBJECT_BLABO]        = TR("Build an autolab");
371     stringsEvent[EVENT_OBJECT_BNUCLEAR]     = TR("Build a nuclear power plant");
372     stringsEvent[EVENT_OBJECT_BPARA]        = TR("Build a lightning conductor");
373     stringsEvent[EVENT_OBJECT_BINFO]        = TR("Build a exchange post");
374     stringsEvent[EVENT_OBJECT_BSAFE]        = TR("Build a vault");
375     stringsEvent[EVENT_OBJECT_GFLAT]        = TR("Show if the ground is flat");
376     stringsEvent[EVENT_OBJECT_FCREATE]      = TR("Plant a flag");
377     stringsEvent[EVENT_OBJECT_FDELETE]      = TR("Remove a flag");
378     stringsEvent[EVENT_OBJECT_FCOLORb]      = TR("\\Blue flags");
379     stringsEvent[EVENT_OBJECT_FCOLORr]      = TR("\\Red flags");
380     stringsEvent[EVENT_OBJECT_FCOLORg]      = TR("\\Green flags");
381     stringsEvent[EVENT_OBJECT_FCOLORy]      = TR("\\Yellow flags");
382     stringsEvent[EVENT_OBJECT_FCOLORv]      = TR("\\Violet flags");
383     stringsEvent[EVENT_OBJECT_FACTORYfa]    = TR("Build a winged grabber");
384     stringsEvent[EVENT_OBJECT_FACTORYta]    = TR("Build a tracked grabber");
385     stringsEvent[EVENT_OBJECT_FACTORYwa]    = TR("Build a wheeled grabber");
386     stringsEvent[EVENT_OBJECT_FACTORYia]    = TR("Build a legged grabber");
387     stringsEvent[EVENT_OBJECT_FACTORYfc]    = TR("Build a winged shooter");
388     stringsEvent[EVENT_OBJECT_FACTORYtc]    = TR("Build a tracked shooter");
389     stringsEvent[EVENT_OBJECT_FACTORYwc]    = TR("Build a wheeled shooter");
390     stringsEvent[EVENT_OBJECT_FACTORYic]    = TR("Build a legged shooter");
391     stringsEvent[EVENT_OBJECT_FACTORYfi]    = TR("Build a winged orga shooter");
392     stringsEvent[EVENT_OBJECT_FACTORYti]    = TR("Build a tracked orga shooter");
393     stringsEvent[EVENT_OBJECT_FACTORYwi]    = TR("Build a wheeled orga shooter");
394     stringsEvent[EVENT_OBJECT_FACTORYii]    = TR("Build a legged orga shooter");
395     stringsEvent[EVENT_OBJECT_FACTORYfs]    = TR("Build a winged sniffer");
396     stringsEvent[EVENT_OBJECT_FACTORYts]    = TR("Build a tracked sniffer");
397     stringsEvent[EVENT_OBJECT_FACTORYws]    = TR("Build a wheeled sniffer");
398     stringsEvent[EVENT_OBJECT_FACTORYis]    = TR("Build a legged sniffer");
399     stringsEvent[EVENT_OBJECT_FACTORYfb]    = TR("Build a winged builder");
400     stringsEvent[EVENT_OBJECT_FACTORYtb]    = TR("Build a tracked builder");
401     stringsEvent[EVENT_OBJECT_FACTORYwb]    = TR("Build a wheeled builder");
402     stringsEvent[EVENT_OBJECT_FACTORYib]    = TR("Build a legged builder");
403     stringsEvent[EVENT_OBJECT_FACTORYrt]    = TR("Build a thumper");
404     stringsEvent[EVENT_OBJECT_FACTORYrc]    = TR("Build a phazer shooter");
405     stringsEvent[EVENT_OBJECT_FACTORYrr]    = TR("Build a recycler");
406     stringsEvent[EVENT_OBJECT_FACTORYrs]    = TR("Build a shielder");
407     stringsEvent[EVENT_OBJECT_FACTORYsa]    = TR("Build a subber");
408     stringsEvent[EVENT_OBJECT_FACTORYtg]    = TR("Build a target bot");
409     stringsEvent[EVENT_OBJECT_RTANK]        = TR("Run research program for tracked bots");
410     stringsEvent[EVENT_OBJECT_RFLY]         = TR("Run research program for winged bots");
411     stringsEvent[EVENT_OBJECT_RTHUMP]       = TR("Run research program for thumper");
412     stringsEvent[EVENT_OBJECT_RCANON]       = TR("Run research program for shooter");
413     stringsEvent[EVENT_OBJECT_RTOWER]       = TR("Run research program for defense tower");
414     stringsEvent[EVENT_OBJECT_RPHAZER]      = TR("Run research program for phazer shooter");
415     stringsEvent[EVENT_OBJECT_RSHIELD]      = TR("Run research program for shielder");
416     stringsEvent[EVENT_OBJECT_RATOMIC]      = TR("Run research program for nuclear power");
417     stringsEvent[EVENT_OBJECT_RiPAW]        = TR("Run research program for legged bots");
418     stringsEvent[EVENT_OBJECT_RiGUN]        = TR("Run research program for orga shooter");
419     stringsEvent[EVENT_OBJECT_RBUILDER]     = TR("Run research program for builder");
420     stringsEvent[EVENT_OBJECT_RTARGET]      = TR("Run research program for target bot");
421     stringsEvent[EVENT_OBJECT_RESET]        = TR("Return to start");
422     stringsEvent[EVENT_OBJECT_SEARCH]       = TR("Sniff (\\key action;)");
423     stringsEvent[EVENT_OBJECT_TERRAFORM]    = TR("Thump (\\key action;)");
424     stringsEvent[EVENT_OBJECT_FIRE]         = TR("Shoot (\\key action;)");
425     stringsEvent[EVENT_OBJECT_SPIDEREXPLO]  = TR("Explode (\\key action;)");
426     stringsEvent[EVENT_OBJECT_BUILD]        = TR("Build (\\key action;)");
427     stringsEvent[EVENT_OBJECT_RECOVER]      = TR("Recycle (\\key action;)");
428     stringsEvent[EVENT_OBJECT_BEGSHIELD]    = TR("Extend shield (\\key action;)");
429     stringsEvent[EVENT_OBJECT_ENDSHIELD]    = TR("Withdraw shield (\\key action;)");
430     stringsEvent[EVENT_OBJECT_DIMSHIELD]    = TR("Shield radius");
431     stringsEvent[EVENT_OBJECT_DELSEARCH]    = TR("Delete mark");
432     stringsEvent[EVENT_OBJECT_PROGRUN]      = TR("Execute the selected program");
433     stringsEvent[EVENT_OBJECT_PROGEDIT]     = TR("Edit the selected program");
434     stringsEvent[EVENT_OBJECT_PROGADD]      = TR("Add new program");
435     stringsEvent[EVENT_OBJECT_PROGREMOVE]   = TR("Remove selected program");
436     stringsEvent[EVENT_OBJECT_PROGCLONE]    = TR("Clone selected program");
437     stringsEvent[EVENT_OBJECT_PROGMOVEUP]   = TR("Move selected program up");
438     stringsEvent[EVENT_OBJECT_PROGMOVEDOWN] = TR("Move selected program down");
439     stringsEvent[EVENT_OBJECT_INFOOK]       = TR("\\SatCom on standby");
440     stringsEvent[EVENT_OBJECT_DELETE]       = TR("Destroy the building");
441     stringsEvent[EVENT_OBJECT_GENERGY]      = TR("Energy level");
442     stringsEvent[EVENT_OBJECT_GSHIELD]      = TR("Shield level");
443     stringsEvent[EVENT_OBJECT_GRANGE]       = TR("Jet temperature");
444     stringsEvent[EVENT_OBJECT_GPROGRESS]    = TR("Still working ...");
445     stringsEvent[EVENT_OBJECT_GRADAR]       = TR("Number of insects detected");
446     stringsEvent[EVENT_OBJECT_GINFO]        = TR("Transmitted information");
447     stringsEvent[EVENT_OBJECT_MAPZOOM]      = TR("Zoom mini-map");
448     stringsEvent[EVENT_OBJECT_CAMERA]       = TR("Camera (\\key camera;)");
449     stringsEvent[EVENT_OBJECT_HELP]         = TR("Help about selected object");
450     stringsEvent[EVENT_OBJECT_SOLUCE]       = TR("Show the solution");
451     stringsEvent[EVENT_OBJECT_SHORTCUT_MODE]= TR("Switch bots <-> buildings");
452     stringsEvent[EVENT_OBJECT_LIMIT]        = TR("Show the range");
453     stringsEvent[EVENT_OBJECT_PEN0]         = TR("\\Raise the pencil");
454     stringsEvent[EVENT_OBJECT_PEN1]         = TR("\\Use the black pencil");
455     stringsEvent[EVENT_OBJECT_PEN2]         = TR("\\Use the yellow pencil");
456     stringsEvent[EVENT_OBJECT_PEN3]         = TR("\\Use the orange pencil");
457     stringsEvent[EVENT_OBJECT_PEN4]         = TR("\\Use the red pencil");
458     stringsEvent[EVENT_OBJECT_PEN5]         = TR("\\Use the purple pencil");
459     stringsEvent[EVENT_OBJECT_PEN6]         = TR("\\Use the blue pencil");
460     stringsEvent[EVENT_OBJECT_PEN7]         = TR("\\Use the green pencil");
461     stringsEvent[EVENT_OBJECT_PEN8]         = TR("\\Use the brown pencil");
462     stringsEvent[EVENT_OBJECT_REC]          = TR("\\Start recording");
463     stringsEvent[EVENT_OBJECT_STOP]         = TR("\\Stop recording");
464     stringsEvent[EVENT_DT_VISIT0]           = TR("Show the place");
465     stringsEvent[EVENT_DT_VISIT1]           = TR("Show the place");
466     stringsEvent[EVENT_DT_VISIT2]           = TR("Show the place");
467     stringsEvent[EVENT_DT_VISIT3]           = TR("Show the place");
468     stringsEvent[EVENT_DT_VISIT4]           = TR("Show the place");
469     stringsEvent[EVENT_DT_END]              = TR("Continue");
470     stringsEvent[EVENT_CMD]                 = TR("Command line");
471     stringsEvent[EVENT_SPEED]               = TR("Game speed");
472 
473     stringsEvent[EVENT_HYPER_PREV]          = TR("Back");
474     stringsEvent[EVENT_HYPER_NEXT]          = TR("Forward");
475     stringsEvent[EVENT_HYPER_HOME]          = TR("Home");
476     stringsEvent[EVENT_HYPER_COPY]          = TR("Copy");
477     stringsEvent[EVENT_HYPER_SIZE1]         = TR("Size 1");
478     stringsEvent[EVENT_HYPER_SIZE2]         = TR("Size 2");
479     stringsEvent[EVENT_HYPER_SIZE3]         = TR("Size 3");
480     stringsEvent[EVENT_HYPER_SIZE4]         = TR("Size 4");
481     stringsEvent[EVENT_HYPER_SIZE5]         = TR("Size 5");
482     stringsEvent[EVENT_SATCOM_HUSTON]       = TR("Instructions from Houston");
483     stringsEvent[EVENT_SATCOM_SAT]          = TR("Satellite report");
484     stringsEvent[EVENT_SATCOM_LOADING]      = TR("Programs dispatched by Houston");
485     stringsEvent[EVENT_SATCOM_OBJECT]       = TR("List of objects");
486     stringsEvent[EVENT_SATCOM_PROG]         = TR("Programming help");
487     stringsEvent[EVENT_SATCOM_SOLUCE]       = TR("Solution");
488 
489     stringsEvent[EVENT_STUDIO_OK]           = TR("OK\\Close program editor and return to game");
490     stringsEvent[EVENT_STUDIO_CANCEL]       = TR("Cancel\\Cancel all changes");
491     stringsEvent[EVENT_STUDIO_CLONE]        = TR("Clone program");
492     stringsEvent[EVENT_STUDIO_NEW]          = TR("New");
493     stringsEvent[EVENT_STUDIO_OPEN]         = TR("Open (Ctrl+O)");
494     stringsEvent[EVENT_STUDIO_SAVE]         = TR("Save (Ctrl+S)");
495     stringsEvent[EVENT_STUDIO_UNDO]         = TR("Undo (Ctrl+Z)");
496     stringsEvent[EVENT_STUDIO_CUT]          = TR("Cut (Ctrl+X)");
497     stringsEvent[EVENT_STUDIO_COPY]         = TR("Copy (Ctrl+C)");
498     stringsEvent[EVENT_STUDIO_PASTE]        = TR("Paste (Ctrl+V)");
499     stringsEvent[EVENT_STUDIO_SIZE]         = TR("Font size");
500     stringsEvent[EVENT_STUDIO_TOOL]         = TR("Instructions (\\key help;)");
501     stringsEvent[EVENT_STUDIO_HELP]         = TR("Programming help (\\key prog;)");
502     stringsEvent[EVENT_STUDIO_COMPILE]      = TR("Compile");
503     stringsEvent[EVENT_STUDIO_RUN]          = TR("Execute/stop");
504     stringsEvent[EVENT_STUDIO_REALTIME]     = TR("Pause/continue");
505     stringsEvent[EVENT_STUDIO_STEP]         = TR("One step");
506 
507 
508 
509     stringsObject[OBJECT_PORTICO]      = TR("Gantry crane");
510     stringsObject[OBJECT_BASE]         = TR("Spaceship");
511     stringsObject[OBJECT_DERRICK]      = TR("Derrick");
512     stringsObject[OBJECT_FACTORY]      = TR("Bot factory");
513     stringsObject[OBJECT_REPAIR]       = TR("Repair center");
514     stringsObject[OBJECT_DESTROYER]    = TR("Destroyer");
515     stringsObject[OBJECT_STATION]      = TR("Power station");
516     stringsObject[OBJECT_CONVERT]      = TR("Converts ore to titanium");
517     stringsObject[OBJECT_TOWER]        = TR("Defense tower");
518     stringsObject[OBJECT_NEST]         = TR("Nest");
519     stringsObject[OBJECT_RESEARCH]     = TR("Research center");
520     stringsObject[OBJECT_RADAR]        = TR("Radar station");
521     stringsObject[OBJECT_INFO]         = TR("Information exchange post");
522     stringsObject[OBJECT_ENERGY]       = TR("Power cell factory");
523     stringsObject[OBJECT_LABO]         = TR("Autolab");
524     stringsObject[OBJECT_NUCLEAR]      = TR("Nuclear power station");
525     stringsObject[OBJECT_PARA]         = TR("Lightning conductor");
526     stringsObject[OBJECT_SAFE]         = TR("Vault");
527     stringsObject[OBJECT_HUSTON]       = TR("Houston Mission Control");
528     stringsObject[OBJECT_TARGET1]      = TR("Target");
529     stringsObject[OBJECT_TARGET2]      = TR("Target");
530     stringsObject[OBJECT_START]        = TR("Start");
531     stringsObject[OBJECT_END]          = TR("Finish");
532     stringsObject[OBJECT_STONE]        = TR("Titanium ore");
533     stringsObject[OBJECT_URANIUM]      = TR("Uranium ore");
534     stringsObject[OBJECT_BULLET]       = TR("Organic matter");
535     stringsObject[OBJECT_METAL]        = TR("Titanium");
536     stringsObject[OBJECT_POWER]        = TR("Power cell");
537     stringsObject[OBJECT_ATOMIC]       = TR("Nuclear power cell");
538     stringsObject[OBJECT_BBOX]         = TR("Black box");
539     stringsObject[OBJECT_KEYa]         = TR("Key A");
540     stringsObject[OBJECT_KEYb]         = TR("Key B");
541     stringsObject[OBJECT_KEYc]         = TR("Key C");
542     stringsObject[OBJECT_KEYd]         = TR("Key D");
543     stringsObject[OBJECT_TNT]          = TR("Explosive");
544     stringsObject[OBJECT_BOMB]         = TR("Fixed mine");
545     stringsObject[OBJECT_BAG]          = TR("Survival kit");
546     stringsObject[OBJECT_WAYPOINT]     = TR("Checkpoint");
547     stringsObject[OBJECT_FLAGb]        = TR("Blue flag");
548     stringsObject[OBJECT_FLAGr]        = TR("Red flag");
549     stringsObject[OBJECT_FLAGg]        = TR("Green flag");
550     stringsObject[OBJECT_FLAGy]        = TR("Yellow flag");
551     stringsObject[OBJECT_FLAGv]        = TR("Violet flag");
552     stringsObject[OBJECT_MARKPOWER]    = TR("Energy deposit (site for power station)");
553     stringsObject[OBJECT_MARKURANIUM]  = TR("Uranium deposit (site for derrick)");
554     stringsObject[OBJECT_MARKKEYa]     = TR("Found key A (site for derrick)");
555     stringsObject[OBJECT_MARKKEYb]     = TR("Found key B (site for derrick)");
556     stringsObject[OBJECT_MARKKEYc]     = TR("Found key C (site for derrick)");
557     stringsObject[OBJECT_MARKKEYd]     = TR("Found key D (site for derrick)");
558     stringsObject[OBJECT_MARKSTONE]    = TR("Titanium deposit (site for derrick)");
559     stringsObject[OBJECT_MOBILEft]     = TR("Practice bot");
560     stringsObject[OBJECT_MOBILEtt]     = TR("Practice bot");
561     stringsObject[OBJECT_MOBILEwt]     = TR("Practice bot");
562     stringsObject[OBJECT_MOBILEit]     = TR("Practice bot");
563     stringsObject[OBJECT_MOBILErp]     = TR("Practice bot");
564     stringsObject[OBJECT_MOBILEst]     = TR("Practice bot");
565     stringsObject[OBJECT_MOBILEfa]     = TR("Winged grabber");
566     stringsObject[OBJECT_MOBILEta]     = TR("Tracked grabber");
567     stringsObject[OBJECT_MOBILEwa]     = TR("Wheeled grabber");
568     stringsObject[OBJECT_MOBILEia]     = TR("Legged grabber");
569     stringsObject[OBJECT_MOBILEfb]     = TR("Winged builder");
570     stringsObject[OBJECT_MOBILEtb]     = TR("Tracked builder");
571     stringsObject[OBJECT_MOBILEwb]     = TR("Wheeled builder");
572     stringsObject[OBJECT_MOBILEib]     = TR("Legged builder");
573     stringsObject[OBJECT_MOBILEfc]     = TR("Winged shooter");
574     stringsObject[OBJECT_MOBILEtc]     = TR("Tracked shooter");
575     stringsObject[OBJECT_MOBILEwc]     = TR("Wheeled shooter");
576     stringsObject[OBJECT_MOBILEic]     = TR("Legged shooter");
577     stringsObject[OBJECT_MOBILEfi]     = TR("Winged orga shooter");
578     stringsObject[OBJECT_MOBILEti]     = TR("Tracked orga shooter");
579     stringsObject[OBJECT_MOBILEwi]     = TR("Wheeled orga shooter");
580     stringsObject[OBJECT_MOBILEii]     = TR("Legged orga shooter");
581     stringsObject[OBJECT_MOBILEfs]     = TR("Winged sniffer");
582     stringsObject[OBJECT_MOBILEts]     = TR("Tracked sniffer");
583     stringsObject[OBJECT_MOBILEws]     = TR("Wheeled sniffer");
584     stringsObject[OBJECT_MOBILEis]     = TR("Legged sniffer");
585     stringsObject[OBJECT_MOBILErt]     = TR("Thumper");
586     stringsObject[OBJECT_MOBILErc]     = TR("Phazer shooter");
587     stringsObject[OBJECT_MOBILErr]     = TR("Recycler");
588     stringsObject[OBJECT_MOBILErs]     = TR("Shielder");
589     stringsObject[OBJECT_MOBILEsa]     = TR("Subber");
590     stringsObject[OBJECT_MOBILEtg]     = TR("Target bot");
591     stringsObject[OBJECT_MOBILEdr]     = TR("Drawer bot");
592     stringsObject[OBJECT_TECH]         = TR("Engineer");
593     stringsObject[OBJECT_TOTO]         = TR("Robbie");
594     stringsObject[OBJECT_MOTHER]       = TR("Alien Queen");
595     stringsObject[OBJECT_ANT]          = TR("Ant");
596     stringsObject[OBJECT_SPIDER]       = TR("Spider");
597     stringsObject[OBJECT_BEE]          = TR("Wasp");
598     stringsObject[OBJECT_WORM]         = TR("Worm");
599     stringsObject[OBJECT_EGG]          = TR("Egg");
600     stringsObject[OBJECT_RUINmobilew1] = TR("Wreckage");
601     stringsObject[OBJECT_RUINmobilew2] = TR("Wreckage");
602     stringsObject[OBJECT_RUINmobilet1] = TR("Wreckage");
603     stringsObject[OBJECT_RUINmobilet2] = TR("Wreckage");
604     stringsObject[OBJECT_RUINmobiler1] = TR("Wreckage");
605     stringsObject[OBJECT_RUINmobiler2] = TR("Wreckage");
606     stringsObject[OBJECT_RUINfactory]  = TR("Ruin");
607     stringsObject[OBJECT_RUINdoor]     = TR("Ruin");
608     stringsObject[OBJECT_RUINsupport]  = TR("Waste");
609     stringsObject[OBJECT_RUINradar]    = TR("Ruin");
610     stringsObject[OBJECT_RUINconvert]  = TR("Ruin");
611     stringsObject[OBJECT_RUINbase]     = TR("Spaceship ruin");
612     stringsObject[OBJECT_RUINhead]     = TR("Spaceship ruin");
613     stringsObject[OBJECT_APOLLO1]      = TR("Remains of Apollo mission");
614     stringsObject[OBJECT_APOLLO3]      = TR("Remains of Apollo mission");
615     stringsObject[OBJECT_APOLLO4]      = TR("Remains of Apollo mission");
616     stringsObject[OBJECT_APOLLO5]      = TR("Remains of Apollo mission");
617     stringsObject[OBJECT_APOLLO2]      = TR("Lunar Roving Vehicle");
618 
619 
620 
621     stringsErr[ERR_UNKNOWN]         = TR("Internal error - tell the developers");
622     stringsErr[ERR_CMD]             = TR("Unknown command");
623     stringsErr[ERR_OBJ_BUSY]        = TR("This object is currently busy");
624     stringsErr[ERR_MANIP_FLY]       = TR("Impossible when flying");
625     stringsErr[ERR_MANIP_BUSY]      = TR("Already carrying something");
626     stringsErr[ERR_MANIP_NIL]       = TR("Nothing to grab");
627     stringsErr[ERR_MANIP_MOTOR]     = TR("Impossible when moving");
628     stringsErr[ERR_MANIP_OCC]       = TR("Place occupied");
629     stringsErr[ERR_MANIP_RADIO]     = TR("You can not carry a radioactive object");
630     stringsErr[ERR_MANIP_WATER]     = TR("You can not carry an object under water");
631     stringsErr[ERR_MANIP_EMPTY]     = TR("Nothing to drop");
632     stringsErr[ERR_BUILD_FLY]       = TR("Impossible when flying");
633     stringsErr[ERR_BUILD_WATER]     = TR("Impossible under water");
634     stringsErr[ERR_BUILD_METALAWAY] = TR("Titanium too far away");
635     stringsErr[ERR_BUILD_METALNEAR] = TR("Titanium too close");
636     stringsErr[ERR_BUILD_METALINEX] = TR("No titanium around");
637     stringsErr[ERR_BUILD_FLAT]      = TR("Ground not flat enough");
638     stringsErr[ERR_BUILD_FLATLIT]   = TR("Flat ground not large enough");
639     stringsErr[ERR_BUILD_BUSY]      = TR("Place occupied");
640     stringsErr[ERR_BUILD_BASE]      = TR("Too close to space ship");
641     stringsErr[ERR_BUILD_NARROW]    = TR("Too close to a building");
642     stringsErr[ERR_BUILD_MOTOR]     = TR("Impossible when moving");
643     stringsErr[ERR_SEARCH_FLY]      = TR("Impossible when flying");
644     stringsErr[ERR_BUILD_DISABLED]  = TR("Can not produce this object in this mission");
645     stringsErr[ERR_BUILD_RESEARCH]  = TR("Can not produce not researched object");
646     stringsErr[ERR_SEARCH_MOTOR]    = TR("Impossible when moving");
647     stringsErr[ERR_TERRA_ENERGY]    = TR("Not enough energy");
648     stringsErr[ERR_RECOVER_ENERGY]  = TR("Not enough energy");
649     stringsErr[ERR_RECOVER_NULL]    = TR("Nothing to recycle");
650     stringsErr[ERR_SHIELD_ENERGY]   = TR("No more energy");
651     stringsErr[ERR_MOVE_IMPOSSIBLE] = TR("Error in instruction move");
652     stringsErr[ERR_GOTO_IMPOSSIBLE] = TR("Goto: inaccessible destination");
653     stringsErr[ERR_GOTO_ITER]       = TR("Goto: inaccessible destination");
654     stringsErr[ERR_GOTO_BUSY]       = TR("Goto: destination occupied");
655     stringsErr[ERR_FIRE_ENERGY]     = TR("Not enough energy");
656     stringsErr[ERR_CONVERT_EMPTY]   = TR("No titanium ore to convert");
657     stringsErr[ERR_DERRICK_NULL]    = TR("No ore in the subsoil");
658     stringsErr[ERR_STATION_NULL]    = TR("No energy in the subsoil");
659     stringsErr[ERR_TOWER_POWER]     = TR("No power cell");
660     stringsErr[ERR_TOWER_ENERGY]    = TR("No more energy");
661     stringsErr[ERR_RESEARCH_POWER]  = TR("No power cell");
662     stringsErr[ERR_RESEARCH_ENERGY] = TR("Not enough energy");
663     stringsErr[ERR_RESEARCH_TYPE]   = TR("Inappropriate cell type");
664     stringsErr[ERR_RESEARCH_ALREADY]= TR("Research program already performed");
665     stringsErr[ERR_ENERGY_NULL]     = TR("No energy in the subsoil");
666     stringsErr[ERR_ENERGY_LOW]      = TR("Not enough energy yet");
667     stringsErr[ERR_ENERGY_EMPTY]    = TR("No titanium to transform");
668     stringsErr[ERR_ENERGY_BAD]      = TR("Transforms only titanium");
669     stringsErr[ERR_BASE_DLOCK]      = TR("Doors blocked by a robot or another object");
670     stringsErr[ERR_BASE_DHUMAN]     = TR("You must get on the spaceship to take off");
671     stringsErr[ERR_LABO_NULL]       = TR("Nothing to analyze");
672     stringsErr[ERR_LABO_BAD]        = TR("Inappropriate sample");
673     stringsErr[ERR_LABO_ALREADY]    = TR("Analysis already performed");
674     stringsErr[ERR_NUCLEAR_EMPTY]   = TR("No uranium to transform");
675     stringsErr[ERR_NUCLEAR_BAD]     = TR("Transforms only uranium");
676     stringsErr[ERR_FACTORY_NULL]    = TR("No titanium");
677     stringsErr[ERR_FACTORY_NEAR]    = TR("Object too close");
678     stringsErr[ERR_INFO_NULL]       = TR("No information exchange post within range");
679     stringsErr[ERR_VEH_VIRUS]       = TR("Program infected by a virus");
680     stringsErr[ERR_BAT_VIRUS]       = TR("Infected by a virus; temporarily out of order");
681     stringsErr[ERR_VEH_POWER]       = TR("No power cell");
682     stringsErr[ERR_VEH_ENERGY]      = TR("No more energy");
683     stringsErr[ERR_FLAG_FLY]        = TR("Impossible when flying");
684     stringsErr[ERR_FLAG_WATER]      = TR("Impossible when swimming");
685     stringsErr[ERR_FLAG_MOTOR]      = TR("Impossible when moving");
686     stringsErr[ERR_FLAG_BUSY]       = TR("Impossible when carrying an object");
687     stringsErr[ERR_FLAG_CREATE]     = TR("Too many flags of this color (maximum 5)");
688     stringsErr[ERR_FLAG_PROXY]      = TR("Too close to an existing flag");
689     stringsErr[ERR_FLAG_DELETE]     = TR("No flag nearby");
690     stringsErr[ERR_DESTROY_NOTFOUND]= TR("Not found anything to destroy");
691     stringsErr[ERR_WRONG_OBJ]       = TR("Inappropriate object");
692     stringsErr[ERR_MISSION_NOTERM]  = TR("The mission is not accomplished yet (press \\key help; for more details)");
693     stringsErr[ERR_DELETEMOBILE]    = TR("Bot destroyed");
694     stringsErr[ERR_DELETEBUILDING]  = TR("Building destroyed");
695     stringsErr[ERR_ENEMY_OBJECT]    = TR("Unable to control enemy objects");
696     stringsErr[ERR_WRONG_BOT]       = TR("Inappropriate bot");
697     stringsErr[ERR_NO_QUICK_SLOT]   = TR("Quicksave slot not found");
698 
699     stringsErr[INFO_BUILD]          = TR("Building completed");
700     stringsErr[INFO_CONVERT]        = TR("Titanium available");
701     stringsErr[INFO_RESEARCH]       = TR("Research program completed");
702     stringsErr[INFO_RESEARCHTANK]   = TR("Plans for tracked robots available");
703     stringsErr[INFO_RESEARCHFLY]    = TR("You can fly with the keys (\\key gup;) and (\\key gdown;)");
704     stringsErr[INFO_RESEARCHTHUMP]  = TR("Plans for thumper available");
705     stringsErr[INFO_RESEARCHCANON]  = TR("Plans for shooter available");
706     stringsErr[INFO_RESEARCHTOWER]  = TR("Plans for defense tower available");
707     stringsErr[INFO_RESEARCHPHAZER] = TR("Plans for phazer shooter available");
708     stringsErr[INFO_RESEARCHSHIELD] = TR("Plans for shielder available");
709     stringsErr[INFO_RESEARCHATOMIC] = TR("Plans for nuclear power plant available");
710     stringsErr[INFO_RESEARCHBUILDER]= TR("Plans for builder available");
711     stringsErr[INFO_FACTORY]        = TR("New bot available");
712     stringsErr[INFO_LABO]           = TR("Analysis performed");
713     stringsErr[INFO_ENERGY]         = TR("Power cell available");
714     stringsErr[INFO_NUCLEAR]        = TR("Nuclear power cell available");
715     stringsErr[INFO_FINDING]        = TR("You found a usable object");
716     stringsErr[INFO_MARKPOWER]      = TR("Found a site for power station");
717     stringsErr[INFO_MARKURANIUM]    = TR("Found a site for a derrick");
718     stringsErr[INFO_MARKSTONE]      = TR("Found a site for a derrick");
719     stringsErr[INFO_MARKKEYa]       = TR("Found a site for a derrick");
720     stringsErr[INFO_MARKKEYb]       = TR("Found a site for a derrick");
721     stringsErr[INFO_MARKKEYc]       = TR("Found a site for a derrick");
722     stringsErr[INFO_MARKKEYd]       = TR("Found a site for a derrick");
723     stringsErr[INFO_WIN]            = TR("<<< Well done; mission accomplished >>>");
724     stringsErr[INFO_LOST]           = TR("<<< Sorry; mission failed >>>");
725     stringsErr[INFO_LOSTq]          = TR("<<< Sorry; mission failed >>>");
726     stringsErr[INFO_WRITEOK]        = TR("Current mission saved");
727     stringsErr[INFO_DELETEMOTHER]   = TR("Alien Queen killed");
728     stringsErr[INFO_DELETEANT]      = TR("Ant fatally wounded");
729     stringsErr[INFO_DELETEBEE]      = TR("Wasp fatally wounded");
730     stringsErr[INFO_DELETEWORM]     = TR("Worm fatally wounded");
731     stringsErr[INFO_DELETESPIDER]   = TR("Spider fatally wounded");
732     stringsErr[INFO_BEGINSATCOM]    = TR("Press \\key help; to read instructions on your SatCom");
733     stringsErr[INFO_TEAM_FINISH]    = TR("<<< Team %s finished! >>>");
734     stringsErr[INFO_TEAM_DEAD]      = TR("<<< Team %s lost! >>>");
735     stringsErr[INFO_TEAM_SCORE]     = TR("<<< Team %s recieved %d points >>>");
736 
737 
738 
739     stringsCbot[CBot::CBotErrOpenPar]       = TR("Opening bracket missing");
740     stringsCbot[CBot::CBotErrClosePar]      = TR("Closing bracket missing");
741     stringsCbot[CBot::CBotErrNotBoolean]    = TR("The expression must return a boolean value");
742     stringsCbot[CBot::CBotErrUndefVar]      = TR("Variable not declared");
743     stringsCbot[CBot::CBotErrBadLeft]       = TR("Assignment impossible");
744     stringsCbot[CBot::CBotErrNoTerminator]  = TR("Semicolon terminator missing");
745     stringsCbot[CBot::CBotErrCaseOut]       = TR("Instruction \"case\" outside a block \"switch\"");
746     stringsCbot[CBot::CBotErrNoEnd]         = TR("Instructions after the final closing brace");
747     stringsCbot[CBot::CBotErrCloseBlock]    = TR("End of block missing");
748     stringsCbot[CBot::CBotErrElseWhitoutIf] = TR("Instruction \"else\" without corresponding \"if\"");
749     stringsCbot[CBot::CBotErrOpenBlock]     = TR("Opening brace missing");
750     stringsCbot[CBot::CBotErrBadType1]      = TR("Wrong type for the assignment");
751     stringsCbot[CBot::CBotErrRedefVar]      = TR("A variable can not be declared twice");
752     stringsCbot[CBot::CBotErrBadType2]      = TR("The types of the two operands are incompatible");
753     stringsCbot[CBot::CBotErrUndefCall]     = TR("Unknown function");
754     stringsCbot[CBot::CBotErrNoDoubleDots]  = TR("Sign \" : \" missing");
755     stringsCbot[CBot::CBotErrNoWhile]       = TR("Keyword \"while\" missing");
756     stringsCbot[CBot::CBotErrBreakOutside]  = TR("Instruction \"break\" outside a loop");
757     stringsCbot[CBot::CBotErrLabel]         = TR("A label must be followed by \"for\"; \"while\"; \"do\" or \"switch\"");
758     stringsCbot[CBot::CBotErrUndefLabel]    = TR("This label does not exist");
759     stringsCbot[CBot::CBotErrNoCase]        = TR("Instruction \"case\" missing");
760     stringsCbot[CBot::CBotErrBadNum]        = TR("Number missing");
761     stringsCbot[CBot::CBotErrVoid]          = TR("Void parameter");
762     stringsCbot[CBot::CBotErrNoType]        = TR("Type declaration missing");
763     stringsCbot[CBot::CBotErrNoVar]         = TR("Variable name missing");
764     stringsCbot[CBot::CBotErrNoFunc]        = TR("Function name missing");
765     stringsCbot[CBot::CBotErrOverParam]     = TR("Too many parameters");
766     stringsCbot[CBot::CBotErrRedefFunc]     = TR("Function already exists");
767     stringsCbot[CBot::CBotErrLowParam]      = TR("Parameters missing");
768     stringsCbot[CBot::CBotErrBadParam]      = TR("No function with this name accepts this kind of parameter");
769     stringsCbot[CBot::CBotErrNbParam]       = TR("No function with this name accepts this number of parameters");
770     stringsCbot[CBot::CBotErrUndefItem]     = TR("This is not a member of this class");
771     stringsCbot[CBot::CBotErrUndefClass]    = TR("This object is not a member of a class");
772     stringsCbot[CBot::CBotErrNoConstruct]   = TR("Appropriate constructor missing");
773     stringsCbot[CBot::CBotErrRedefClass]    = TR("This class already exists");
774     stringsCbot[CBot::CBotErrCloseIndex]    = TR("\" ] \" missing");
775     stringsCbot[CBot::CBotErrReserved]      = TR("Reserved keyword of CBOT language");
776     stringsCbot[CBot::CBotErrBadNew]        = TR("Bad argument for \"new\"");
777     stringsCbot[CBot::CBotErrOpenIndex]     = TR("\" [ \" expected");
778     stringsCbot[CBot::CBotErrBadString]     = TR("String missing");
779     stringsCbot[CBot::CBotErrBadIndex]      = TR("Incorrect index type");
780     stringsCbot[CBot::CBotErrPrivate]       = TR("Private element");
781     stringsCbot[CBot::CBotErrNoPublic]      = TR("Public required");
782     stringsCbot[CBot::CBotErrNoExpression]  = TR("Expression expected after =");
783     stringsCbot[CBot::CBotErrAmbiguousCall] = TR("Ambiguous call to overloaded function");
784     stringsCbot[CBot::CBotErrFuncNotVoid]   = TR("Function needs return type \"void\"");
785     stringsCbot[CBot::CBotErrNoClassName]   = TR("Class name expected");
786     stringsCbot[CBot::CBotErrNoReturn]      = TR("Non-void function needs \"return;\"");
787     stringsCbot[CBot::CBotErrDefaultValue]  = TR("This parameter needs a default value");
788     stringsCbot[CBot::CBotErrEndQuote]      = TR("Missing end quote");
789     stringsCbot[CBot::CBotErrBadEscape]     = TR("Unknown escape sequence");
790     stringsCbot[CBot::CBotErrOctalRange]    = TR("Octal value out of range");
791     stringsCbot[CBot::CBotErrHexDigits]     = TR("Missing hex digits after escape sequence");
792     stringsCbot[CBot::CBotErrHexRange]      = TR("Hex value out of range");
793     stringsCbot[CBot::CBotErrUnicodeName]   = TR("Invalid universal character name");
794     stringsCbot[CBot::CBotErrCharEmpty]     = TR("Empty character constant");
795     stringsCbot[CBot::CBotErrRedefCase]     = TR("Duplicate label in switch");
796 
797     stringsCbot[CBot::CBotErrZeroDiv]       = TR("Dividing by zero");
798     stringsCbot[CBot::CBotErrNotInit]       = TR("Variable not initialized");
799     stringsCbot[CBot::CBotErrBadThrow]      = TR("Negative value rejected by \"throw\"");
800     stringsCbot[CBot::CBotErrNoRetVal]      = TR("The function returned no value");
801     stringsCbot[CBot::CBotErrNoRun]         = TR("No function running");
802     stringsCbot[CBot::CBotErrUndefFunc]     = TR("Calling an unknown function");
803     stringsCbot[CBot::CBotErrNotClass]      = TR("This class does not exist");
804     stringsCbot[CBot::CBotErrNull]          = TR("Unknown Object");
805     stringsCbot[CBot::CBotErrNan]           = TR("Operation impossible with value \"nan\"");
806     stringsCbot[CBot::CBotErrOutArray]      = TR("Access beyond array limit");
807     stringsCbot[CBot::CBotErrStackOver]     = TR("Stack overflow");
808     stringsCbot[CBot::CBotErrDeletedPtr]    = TR("Illegal object");
809     stringsCbot[CBot::CBotErrFileOpen]      = TR("Can't open file");
810     stringsCbot[CBot::CBotErrNotOpen]       = TR("File not open");
811     stringsCbot[CBot::CBotErrRead]          = TR("Read error");
812     stringsCbot[CBot::CBotErrWrite]         = TR("Write error");
813 }
814 
815 
816 namespace
817 {
818 char g_gamerName[100];
819 } // anonymous namespace
820 
SetGlobalGamerName(std::string name)821 void SetGlobalGamerName(std::string name)
822 {
823     strcpy(g_gamerName, name.c_str());
824 }
825 
826 // Replaces the commands "\key name;" in a text.
827 
828 namespace
829 {
830 
PutKeyName(std::string & dst,const char * src)831 void PutKeyName(std::string& dst, const char* src)
832 {
833     dst.clear();
834 
835     int s = 0;
836     while ( src[s] != 0 )
837     {
838         if ( src[s+0] == '\\' &&
839              src[s+1] == 'k'  &&
840              src[s+2] == 'e'  &&
841              src[s+3] == 'y'  &&
842              src[s+4] == ' '  )
843         {
844             unsigned int count;
845             for(count = 0; src[s+5+count] != ';'; count++);
846             CInput* input = CInput::GetInstancePointer();
847             InputSlot key = input->SearchKeyById(std::string(&src[s+5], count));
848             if (key != INPUT_SLOT_MAX)
849             {
850                 dst.append(input->GetKeysString(key));
851             }
852             s = s+5+count+1;
853         }
854 
855         dst.append(1, src[s++]);
856     }
857 }
858 
859 // Returns the translated text of a resource that needs key substitution
860 
GetResourceBase(ResType type,unsigned int num)861 const char* GetResourceBase(ResType type, unsigned int num)
862 {
863     const char *str = nullptr;
864 
865     assert(num >= 0);
866 
867     switch (type)
868     {
869         case RES_TEXT:
870             assert(num < RT_MAX);
871             str = stringsText[num];
872             break;
873 
874         case RES_EVENT:
875             if (num >= EVENT_STD_MAX)
876                 return ""; // can be safely ignored (user events)
877 
878             str = stringsEvent[num];
879             break;
880 
881         case RES_OBJECT:
882             assert(num < OBJECT_MAX);
883             if (num == OBJECT_HUMAN)
884                 return g_gamerName;
885 
886             str = stringsObject[num];
887             break;
888 
889         case RES_ERR:
890             assert(num < ERR_MAX);
891             str = stringsErr[num];
892             break;
893 
894         case RES_CBOT:
895             assert(num < CBot::CBotErrMAX);
896             str = stringsCbot[num];
897             break;
898 
899         default:
900             assert(false);
901     }
902 
903     return gettext(str);
904 }
905 
906 } // anonymous namespace
907 
908 // Returns the text of a resource.
909 
GetResource(ResType type,unsigned int num,std::string & text)910 bool GetResource(ResType type, unsigned int num, std::string& text)
911 {
912     if(type != RES_KEY)
913     {
914         const char *tmpl = GetResourceBase(type, num);
915 
916         if (!tmpl)
917         {
918             text.clear();
919             return false;
920         }
921 
922         PutKeyName(text, tmpl);
923         return true;
924     }
925     else
926     {
927         if (num == static_cast<unsigned int>(KEY_INVALID))
928             text.clear();
929         else if (num == static_cast<unsigned int>(VIRTUAL_KMOD(CTRL)))
930             text = "Ctrl";
931         else if (num == static_cast<unsigned int>(VIRTUAL_KMOD(SHIFT)))
932             text = "Shift";
933         else if (num == static_cast<unsigned int>(VIRTUAL_KMOD(ALT)))
934             text = "Alt";
935         else if (num == static_cast<unsigned int>(VIRTUAL_KMOD(GUI)))
936             text = "Win"; // TODO: Better description of this key?
937         else if (num >= static_cast<unsigned int>(VIRTUAL_JOY(0)))
938         {
939             text = gettext("Button %1");
940             text = StrUtils::Replace(text, "%1", StrUtils::ToString<int>(1 + num - VIRTUAL_JOY(0)));
941         }
942         else
943         {
944             text = SDL_GetKeyName(static_cast<SDL_Keycode>(num));
945         }
946         return true;
947     }
948 }
949