diff options
35 files changed, 3528 insertions, 255 deletions
diff --git a/Makefile.common b/Makefile.common index 419090a705..14d220f990 100644 --- a/Makefile.common +++ b/Makefile.common @@ -28,6 +28,7 @@ MODULES += \ engines \ graphics \ common \ + po ifdef USE_MT32EMU MODULES += sound/softsynth/mt32 diff --git a/base/main.cpp b/base/main.cpp index bfb6611a91..ad6118c905 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -47,6 +47,7 @@ #include "common/fs.h" #include "common/system.h" #include "common/tokenizer.h" +#include "common/translation.h" #include "gui/GuiManager.h" #include "gui/message.h" @@ -101,20 +102,20 @@ static const EnginePlugin *detectPlugin() { ConfMan.set("gameid", gameid); // Query the plugins and find one that will handle the specified gameid - printf("User picked target '%s' (gameid '%s')...\n", ConfMan.getActiveDomainName().c_str(), gameid.c_str()); - printf(" Looking for a plugin supporting this gameid... "); + printf(_t("User picked target '%s' (gameid '%s')...\n"), ConfMan.getActiveDomainName().c_str(), gameid.c_str()); + printf(_t(" Looking for a plugin supporting this gameid... ")); GameDescriptor game = EngineMan.findGame(gameid, &plugin); if (plugin == 0) { - printf("failed\n"); - warning("%s is an invalid gameid. Use the --list-games option to list supported gameid", gameid.c_str()); + printf(_t("failed\n")); + warning(_t("%s is an invalid gameid. Use the --list-games option to list supported gameid"), gameid.c_str()); return 0; } else { printf("%s\n", plugin->getName()); } // FIXME: Do we really need this one? - printf(" Starting '%s'\n", game.description().c_str()); + printf(_t(" Starting '%s'\n"), game.description().c_str()); return plugin; } @@ -141,9 +142,9 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const // Is a separate dialog here still required? //GUI::displayErrorDialog("ScummVM could not find any game in the specified directory!"); - const char *errMsg = Common::errorToString(err); + const char *errMsg = _(Common::errorToString(err)); - warning("%s failed to instantiate engine: %s (target '%s', path '%s')", + warning(_t("%s failed to instantiate engine: %s (target '%s', path '%s')"), plugin->getName(), errMsg, ConfMan.getActiveDomainName().c_str(), @@ -200,7 +201,7 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const while (!tokenizer.empty()) { Common::String token = tokenizer.nextToken(); if (!DebugMan.enableDebugChannel(token)) - warning("Engine does not support debug level '%s'", token.c_str()); + warning(_("Engine does not support debug level '%s'"), token.c_str()); } // Inform backend that the engine is about to be run @@ -268,22 +269,22 @@ static void setupKeymapper(OSystem &system) { mapper->registerHardwareKeySet(keySet); // Now create the global keymap - act = new Action(globalMap, "MENU", "Menu", kGenericActionType, kSelectKeyType); + act = new Action(globalMap, "MENU", _("Menu"), kGenericActionType, kSelectKeyType); act->addKeyEvent(KeyState(KEYCODE_F5, ASCII_F5, 0)); - act = new Action(globalMap, "SKCT", "Skip", kGenericActionType, kActionKeyType); + act = new Action(globalMap, "SKCT", _("Skip"), kGenericActionType, kActionKeyType); act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0)); - act = new Action(globalMap, "PAUS", "Pause", kGenericActionType, kStartKeyType); + act = new Action(globalMap, "PAUS", _("Pause"), kGenericActionType, kStartKeyType); act->addKeyEvent(KeyState(KEYCODE_SPACE, ' ', 0)); - act = new Action(globalMap, "SKLI", "Skip line", kGenericActionType, kActionKeyType); + act = new Action(globalMap, "SKLI", _("Skip line"), kGenericActionType, kActionKeyType); act->addKeyEvent(KeyState(KEYCODE_PERIOD, '.', 0)); - act = new Action(globalMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType); + act = new Action(globalMap, "VIRT", _("Display keyboard"), kVirtualKeyboardActionType); act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0)); - act = new Action(globalMap, "REMP", "Remap keys", kKeyRemapActionType); + act = new Action(globalMap, "REMP", _("Remap keys"), kKeyRemapActionType); act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0)); mapper->addGlobalKeymap(globalMap); @@ -319,6 +320,8 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Update the config file ConfMan.set("versioninfo", gScummVMVersion, Common::ConfigManager::kApplicationDomain); + // Enable translation + TransMan.setLanguage(ConfMan.get("gui_language").c_str()); // Load and setup the debuglevel and the debug flags. We do this at the // soonest possible moment to ensure debug output starts early on, if @@ -387,7 +390,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Did an error occur ? if (result != Common::kNoError) { // Shows an informative error dialog if starting the selected game failed. - GUI::displayErrorDialog(result, "Error running game:"); + GUI::displayErrorDialog(result, _("Error running game:")); } // Quit unless an error occurred, or Return to launcher was requested @@ -413,8 +416,8 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { } else { // A dialog would be nicer, but we don't have any // screen to draw on yet. - warning("Could not find any engine capable of running the selected game"); - GUI::displayErrorDialog("Could not find any engine capable of running the selected game"); + warning(_("Could not find any engine capable of running the selected game")); + GUI::displayErrorDialog(_("Could not find any engine capable of running the selected game")); } // We will destroy the AudioCDManager singleton here to save some memory. diff --git a/common/error.cpp b/common/error.cpp index d51774fd3e..6d1e349287 100644 --- a/common/error.cpp +++ b/common/error.cpp @@ -26,6 +26,8 @@ #include "common/error.h" #include "common/util.h" +#include "common/translation.h" + namespace Common { /** @@ -38,24 +40,24 @@ struct ErrorMessage { }; static const ErrorMessage _errMsgTable[] = { - { kInvalidPathError, "Invalid Path" }, - { kNoGameDataFoundError, "Game Data not found" }, - { kUnsupportedGameidError, "Game Id not supported" }, - { kUnsupportedColorMode, "Unsupported Color Mode" }, + { kInvalidPathError, _s("Invalid Path") }, + { kNoGameDataFoundError, _s("Game Data not found") }, + { kUnsupportedGameidError, _s("Game Id not supported") }, + { kUnsupportedColorMode, _s("Unsupported Color Mode") }, - { kReadPermissionDenied, "Read permission denied" }, - { kWritePermissionDenied, "Write permission denied" }, + { kReadPermissionDenied, _s("Read permission denied") }, + { kWritePermissionDenied, _s("Write permission denied") }, // The following three overlap a bit with kInvalidPathError and each other. Which to keep? - { kPathDoesNotExist, "Path not exists" }, - { kPathNotDirectory, "Path not a directory" }, - { kPathNotFile, "Path not a file" }, + { kPathDoesNotExist, _s("Path not exists") }, + { kPathNotDirectory, _s("Path not a directory") }, + { kPathNotFile, _s("Path not a file") }, - { kCreatingFileFailed, "Cannot create file" }, - { kReadingFailed, "Reading failed" }, - { kWritingFailed, "Writing data failed" }, + { kCreatingFileFailed, _s("Cannot create file") }, + { kReadingFailed, _s("Reading failed") }, + { kWritingFailed, _s("Writing data failed") }, - { kUnknownError, "Unknown Error" } + { kUnknownError, _s("Unknown Error") } }; const char *errorToString(Error error) { @@ -66,7 +68,7 @@ const char *errorToString(Error error) { } } - return "Unknown Error"; + return _("Unknown Error"); } } // End of namespace Common diff --git a/common/messages.cpp b/common/messages.cpp new file mode 100755 index 0000000000..6a5fc5d813 --- /dev/null +++ b/common/messages.cpp @@ -0,0 +1,543 @@ +/* generated by po2c 1.0.2 - Do not modify */ + +#include <stdio.h> +#include <string.h> + +static const char * _po2c_msgids[] = { + /* 0 */ "", + /* 1 */ " Looking for a plugin supporting this gameid... ", + /* 2 */ " Starting '%s'\n", + /* 3 */ "%s failed to instantiate engine: %s (target '%s', path '%s')", + /* 4 */ "%s is an invalid gameid. Use the --list-games option to list supported gameid", + /* 5 */ "... progress ...", + /* 6 */ "11kHz", + /* 7 */ "22 kHz", + /* 8 */ "44 kHz", + /* 9 */ "48 kHz", + /* 10 */ "8 kHz", + /* 11 */ "<default>", + /* 12 */ "ALSA", + /* 13 */ "About", + /* 14 */ "About...", + /* 15 */ "AdLib", + /* 16 */ "AdLib emulator:", + /* 17 */ "Add Game...", + /* 18 */ "Angol", + /* 19 */ "Antialiased Renderer (16bpp)", + /* 20 */ "Aspect ratio correction", + /* 21 */ "Associated key : %s", + /* 22 */ "Associated key : none", + /* 23 */ "Atari ST MIDI", + /* 24 */ "Audio", + /* 25 */ "Autosave:", + /* 26 */ "C1Available engines:", + /* 27 */ "C1Features compiled in:", + /* 28 */ "C2(built on ", + /* 29 */ "CAMD", + /* 30 */ "Cancel", + /* 31 */ "Cannot create file", + /* 32 */ "Choose", + /* 33 */ "Choose an action to map", + /* 34 */ "Close", + /* 35 */ "CoreAudio", + /* 36 */ "CoreMIDI", + /* 37 */ "Could not find any engine capable of running the selected game", + /* 38 */ "Creative Music System", + /* 39 */ "DMedia", + /* 40 */ "Date: ", + /* 41 */ "Default", + /* 42 */ "Delete", + /* 43 */ "Disabled GFX", + /* 44 */ "Discovered %d new games ...", + /* 45 */ "Discovered %d new games.", + /* 46 */ "Display keyboard", + /* 47 */ "Do you really want to delete this savegame?", + /* 48 */ "Do you really want to remove this game configuration?", + /* 49 */ "Do you really want to run the mass game detector? This could potentially add a huge number of games.", + /* 50 */ "Edit Game...", + /* 51 */ "Enable Roland GS Mode", + /* 52 */ "Engine does not support debug level '%s'", + /* 53 */ "English", + /* 54 */ "Error running game:", + /* 55 */ "Extra Path:", + /* 56 */ "FM Towns", + /* 57 */ "Failed to load any GUI theme, aborting", + /* 58 */ "FluidSynth", + /* 59 */ "Fullscreen mode", + /* 60 */ "GFX", + /* 61 */ "GUI Renderer:", + /* 62 */ "Game", + /* 63 */ "Game Data not found", + /* 64 */ "Game Id not supported", + /* 65 */ "Game Path:", + /* 66 */ "Go up", + /* 67 */ "Graphics", + /* 68 */ "Graphics mode:", + /* 69 */ "Help", + /* 70 */ "IBM PCjr", + /* 71 */ "ID:", + /* 72 */ "Invalid Path", + /* 73 */ "Invalid game path", + /* 74 */ "Keys", + /* 75 */ "Language:", + /* 76 */ "Load", + /* 77 */ "Load game:", + /* 78 */ "Load...", + /* 79 */ "MIDI", + /* 80 */ "MIDI gain:", + /* 81 */ "MT-32 Emulation", + /* 82 */ "Map", + /* 83 */ "Mass Add...", + /* 84 */ "Menu", + /* 85 */ "Misc", + /* 86 */ "Mixed AdLib/MIDI mode", + /* 87 */ "Mouse click", + /* 88 */ "Music driver:", + /* 89 */ "Music volume:", + /* 90 */ "Mute All", + /* 91 */ "Name:", + /* 92 */ "Never", + /* 93 */ "No", + /* 94 */ "No date saved", + /* 95 */ "No music", + /* 96 */ "No playtime saved", + /* 97 */ "No time saved", + /* 98 */ "None", + /* 99 */ "OK", + /* 100 */ "Options", + /* 101 */ "Options...", + /* 102 */ "Output rate:", + /* 103 */ "Override global MIDI settings", + /* 104 */ "Override global audio settings", + /* 105 */ "Override global graphic settings", + /* 106 */ "Override global volume settings", + /* 107 */ "PC Speaker", + /* 108 */ "Path not a directory", + /* 109 */ "Path not a file", + /* 110 */ "Path not exists", + /* 111 */ "Paths", + /* 112 */ "Pause", + /* 113 */ "Pick the game:", + /* 114 */ "Platform:", + /* 115 */ "Playtime: ", + /* 116 */ "Please select an action", + /* 117 */ "Plugins Path:", + /* 118 */ "Press the key to associate", + /* 119 */ "Quit", + /* 120 */ "Read permission denied", + /* 121 */ "Reading failed", + /* 122 */ "Remap keys", + /* 123 */ "Remove Game", + /* 124 */ "Render mode:", + /* 125 */ "Resume", + /* 126 */ "Return to Launcher", + /* 127 */ "SEQ", + /* 128 */ "SFX volume:", + /* 129 */ "Save", + /* 130 */ "Save Path:", + /* 131 */ "Save Path: ", + /* 132 */ "Save game:", + /* 133 */ "Scan complete!", + /* 134 */ "Scanned %d directories ...", + /* 135 */ "ScummVM could not find any engine capable of running the selected game!", + /* 136 */ "ScummVM could not find any game in the specified directory!", + /* 137 */ "ScummVM couldn't open the specified directory!", + /* 138 */ "Search:", + /* 139 */ "Select SoundFont", + /* 140 */ "Select a Theme", + /* 141 */ "Select additional game directory", + /* 142 */ "Select an action and click 'Map'", + /* 143 */ "Select directory for GUI themes", + /* 144 */ "Select directory for extra files", + /* 145 */ "Select directory for plugins", + /* 146 */ "Select directory for saved games", + /* 147 */ "Select directory for savegames", + /* 148 */ "Select directory with game data", + /* 149 */ "Skip", + /* 150 */ "Skip line", + /* 151 */ "SoundFont:", + /* 152 */ "Speech & Subs", + /* 153 */ "Speech Only", + /* 154 */ "Speech and Subtitles", + /* 155 */ "Speech volume:", + /* 156 */ "Standard Renderer (16bpp)", + /* 157 */ "Start", + /* 158 */ "Subtitle speed:", + /* 159 */ "Subtitles Only", + /* 160 */ "Szakнtani", + /* 161 */ "Tapwave Zodiac", + /* 162 */ "Text and Speech:", + /* 163 */ "The chosen directory cannot be written to. Please select another one.", + /* 164 */ "Theme Path:", + /* 165 */ "Theme:", + /* 166 */ "This game ID is already taken. Please choose another one.", + /* 167 */ "This game does not support loading games from the launcher.", + /* 168 */ "TiMidity", + /* 169 */ "Time: ", + /* 170 */ "True Roland MT-32 (disable GM emulation)", + /* 171 */ "Unable to locate game data", + /* 172 */ "Unknown Error", + /* 173 */ "Unknown error", + /* 174 */ "Unsupported Color Mode", + /* 175 */ "Untitled savestate", + /* 176 */ "User picked target '%s' (gameid '%s')...\n", + /* 177 */ "Volume", + /* 178 */ "Windows MIDI", + /* 179 */ "Write permission denied", + /* 180 */ "Writing data failed", + /* 181 */ "Wrong configuration: Both subtitles and speech are off. Assuming subtitles only", + /* 182 */ "Yamaha Pa1", + /* 183 */ "Yes", + /* 184 */ "You have to restart ScummVM to take the effect.", + /* 185 */ "every 10 mins", + /* 186 */ "every 15 mins", + /* 187 */ "every 30 mins", + /* 188 */ "every 5 mins", + /* 189 */ "failed\n", + NULL +}; + +struct _po2c_msg { + int msgid; + const char * msgstr; +}; + +static struct _po2c_msg _po2c_lang_ru_RU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sf.net\nPOT-Creation-Date: 2010-06-08 17:25+0300\nPO-Revision-Date: 2010-06-08 08:52-0100\nLast-Translator: Eugene Sandulenko <sev@scummvm.org>\nLanguage-Team: Russian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=cp1251\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" }, + { 1, " \310\371\363 \357\353\340\343\350\355 \361 \357\356\344\344\345\360\346\352\356\351 \375\362\356\343\356 gameid... " }, + { 2, " \307\340\357\363\361\352\340\376 '%s'\n" }, + { 3, "%s \355\345 \361\354\356\343 \347\340\357\363\361\362\350\362\374 \344\342\350\346\356\352: %s (\366\345\353\374 '%s', \357\363\362\374 '%s')" }, + { 4, "\315\345\342\345\360\355\373\351 gameid %s. \310\361\357\356\353\374\347\363\351\362\345 \356\357\366\350\376 --list-games \344\353\377 \357\360\356\361\354\356\362\360\340 \361\357\350\361\352\340 \357\356\344\344\345\360\346\350\342\340\345\354\373\365 gameid" }, + { 5, "... \350\371\363 ..." }, + { 6, "11 \352\303\366" }, + { 7, "22 \352\303\366" }, + { 8, "44 \352\303\366" }, + { 9, "48 \352\303\366" }, + { 10, "8 \352\303\366" }, + { 11, "<\357\356 \363\354\356\353\367\340\355\350\376>" }, + { 12, "ALSA" }, + { 13, "\316 \357\360\356\343\360\340\354\354\345" }, + { 14, "\316 \357\360\356\343\360\340\354\354\345..." }, + { 15, "AdLib" }, + { 16, "\335\354\363\353\377\362\356\360 AdLib:" }, + { 17, "\315\356\342. \350\343\360\340..." }, + { 19, "\320\340\361\362\345\360\350\347\340\362\356\360 \361\356 \361\343\353\340\346\350\342\340\355\350\345\354 (16bpp)" }, + { 20, "\312\356\360\360\345\352\366\350\377 \361\356\356\362\355\356\370\345\355\350\377 \361\362\356\360\356\355" }, + { 21, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : %s" }, + { 22, "\315\340\347\355\340\367\345\355\355\340\377 \352\353\340\342\350\370\340 : \355\345\362" }, + { 23, "Atars ST MIDI" }, + { 24, "\300\363\344\350\356" }, + { 25, "\300\342\362\356\361\356\365\360\340\355\345\355\350\345:" }, + { 26, "C1\304\356\361\362\363\357\355\373\345 \344\342\350\346\352\350:" }, + { 27, "C1\302\352\353\376\367\345\355\355\373\345 \342 \341\350\353\344 \356\357\366\350\350:" }, + { 28, "C2(\361\356\341\360\340\355 " }, + { 29, "CAMD" }, + { 30, "\316\362\354\345\355\340" }, + { 31, "\315\345 \354\356\343\363 \361\356\347\344\340\362\374 \364\340\351\353" }, + { 32, "\302\373\341\360\340\362\374" }, + { 33, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 34, "\307\340\352\360\373\362\374" }, + { 35, "CoreAudio" }, + { 36, "CoreMIDI" }, + { 37, "\315\345 \354\356\343\363 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373" }, + { 38, "Creative Music System" }, + { 39, "DMedia" }, + { 40, "\304\340\362\340: " }, + { 41, "\317\356 \363\354\356\353\367\340\355\350\376" }, + { 42, "\323\344\340\353\350\362\374" }, + { 43, "\301\345\347 \343\360\340\364\350\352\350" }, + { 44, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360 ..." }, + { 45, "\315\340\351\344\345\355\356 %d \355\356\342\373\365 \350\343\360." }, + { 46, "\317\356\352\340\347\340\362\374 \352\353\340\342\350\340\362\363\360\363" }, + { 47, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \375\362\356 \361\356\365\360\340\355\345\355\350\345?" }, + { 48, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \363\344\340\353\350\362\374 \363\361\362\340\355\356\342\352\350 \344\353\377 \375\362\356\351 \350\343\360\373?" }, + { 49, "\302\373 \344\345\351\361\362\342\350\362\345\353\374\355\356 \365\356\362\350\362\345 \347\340\357\363\361\362\350\362\374 \344\345\362\345\352\362\356\360 \342\361\345\365 \350\343\360? \335\362\356 \357\356\362\345\355\366\350\340\353\374\355\356 \354\356\346\345\362 \344\356\341\340\342\350\362\374 \341\356\353\374\370\356\345 \352\356\353\350\367\345\361\362\342\356 \350\343\360." }, + { 50, "\310\347\354. \350\343\360\363..." }, + { 51, "\302\352\353\376\367\350\362\374 \360\345\346\350\354 Roland GS" }, + { 52, "\304\342\350\346\356\352 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \363\360\356\342\345\355\374 \356\362\353\340\344\352\350 '%s'" }, + { 53, "English" }, + { 54, "\316\370\350\341\352\340 \347\340\357\363\361\352\340 \350\343\360\373:" }, + { 55, "\304\356\357. \357\363\362\374:" }, + { 56, "FM Towns" }, + { 57, "\315\345 \363\344\340\353\356\361\374 \347\340\343\360\363\347\350\362\374 \362\345\354\363 GUI, \357\360\345\352\360\340\371\340\376 \360\340\341\356\362\363" }, + { 58, "FluidSynth" }, + { 59, "\317\356\353\355\356\375\352\360\340\355\355\373\351 \360\345\346\350\354" }, + { 60, "\303\360\364" }, + { 61, "\320\340\361\362\345\360\350\347\340\362\356\360 GUI:" }, + { 62, "\310\343\360\340" }, + { 63, "\315\345\362 \364\340\351\353\356\342 \350\343\360\373" }, + { 64, "Game Id \355\345 \357\356\344\344\345\360\346\350\342\340\345\362\361\377" }, + { 65, "\317\363\362\374 \352 \350\343\360\345: " }, + { 66, "\302\342\345\360\365" }, + { 67, "\303\360\340\364\350\352\340" }, + { 68, "\303\360\340\364\350\367\345\361\352\350\351 \360\345\346\350\354:" }, + { 69, "\317\356\354\356\371\374" }, + { 70, "IBM PCjr" }, + { 71, "ID:" }, + { 72, "\315\345\342\345\360\355\373\351 \357\363\362\374" }, + { 74, "\312\353\340\342\350\370\350" }, + { 75, "\337\347\373\352:" }, + { 76, "\307\340\343\360\363\347\350\362\374" }, + { 77, "\307\340\343\360\363\347\350\362\374 \350\343\360\363:" }, + { 78, "\307\340\343\360...." }, + { 79, "MIDI" }, + { 80, "\323\361\350\353\345\355\350\345 MIDI:" }, + { 81, "\335\354\363\353\377\366\350\377 MT-32" }, + { 82, "\315\340\347\355\340\367\350\362\374" }, + { 83, "\304\356\341. \354\355\356\343\356..." }, + { 84, "\314\345\355\376" }, + { 85, "\320\340\347\355\356\345" }, + { 86, "\321\354\345\370\340\355\355\373\351 \360\345\346\350\354 AdLib/MIDI" }, + { 87, "\312\353\350\352 \354\373\370\374\376" }, + { 88, "\304\360\340\351\342\345\360 \354\363\347\373\352\350:" }, + { 89, "\303\360\356\354\352\356\361\362\374 \354\363\347\373\352\350:" }, + { 90, "\302\373\352\353\376\367\350\362\374 \342\361\270" }, + { 91, "\315\340\347\342\340\355\350\345:" }, + { 92, "\315\350\352\356\343\344\340" }, + { 93, "\315\345\362" }, + { 94, "\304\340\362\340 \355\345 \347\340\357\350\361\340\355\340" }, + { 95, "\301\345\347 \354\363\347\373\352\350" }, + { 96, "\302\360\345\354\377 \350\343\360\373 \355\345 \347\340\357\350\361\340\355\356" }, + { 97, "\302\360\345\354\377 \355\345 \347\340\357\350\361\340\355\356" }, + { 98, "\315\345 \347\340\344\340\355" }, + { 99, "OK" }, + { 100, "\316\357\366\350\350" }, + { 101, "\316\357\366\350\350..." }, + { 102, "\302\373\365\356\344\355\340\377 \367\340\361\362\356\362\340:" }, + { 103, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 MIDI" }, + { 104, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \340\363\344\350\356" }, + { 105, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\340\364\350\352\350" }, + { 106, "\317\345\360\345\352\360\373\362\374 \343\353\356\341\340\353\374\355\373\345 \363\361\362\340\355\356\342\352\350 \343\360\356\354\352\356\361\362\350" }, + { 107, "PC \361\357\350\352\345\360" }, + { 108, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \344\350\360\345\352\362\356\360\350\345\351" }, + { 109, "\317\363\362\374 \355\345 \377\342\353\377\345\362\361\377 \364\340\351\353\356\354" }, + { 110, "\317\363\362\374 \355\345 \355\340\351\344\345\355" }, + { 111, "\317\363\362\350" }, + { 112, "\317\340\363\347\340" }, + { 113, "\302\373\341\345\360\350\362\345 \350\343\360\363:" }, + { 114, "\317\353\340\362\364\356\360\354\340:" }, + { 115, "\302\360\345\354\377 \350\343\360\373: " }, + { 116, "\317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345" }, + { 117, "\317\363\362\374 \352 \357\353\340\343\350\355\340\354:" }, + { 118, "\315\340\346\354\350\362\345 \352\353\340\342\350\370\363 \344\353\377 \355\340\347\355\340\367\345\355\350\377" }, + { 119, "\302\373\365\356\344" }, + { 120, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \367\362\345\355\350\377" }, + { 121, "\316\370\350\341\352\340 \367\362\345\355\350\377" }, + { 122, "\317\345\360\345\355\340\347\355\340\367\350\362\374 \352\353\340\342\350\370\350" }, + { 123, "\323\344\340\353\350\362\374 \350\343\360\363" }, + { 124, "\320\345\346\350\354 \360\340\361\362\360\350\360\356\342\340\355\350\377:" }, + { 125, "\317\360\356\344\356\353\346\350\362\374" }, + { 126, "\302\345\360\355\363\362\374\361\377 \342 \343\353\340\342\355\356\345 \354\345\355\376" }, + { 127, "SEQ" }, + { 128, "\303\360\356\354\352\356\361\362\374 \375\364\364\345\352\362\356\342:" }, + { 129, "\307\340\357\350\361\340\362\374" }, + { 130, "\317\363\362\374 \361\356\365\360.: " }, + { 131, "\317\363\362\374 \344\353\377 \361\356\365\360\340\355\345\355\350\351: " }, + { 132, "\321\356\365\360\340\355\350\362\374 \350\343\360\363: " }, + { 133, "\317\356\350\361\352 \347\340\352\356\355\367\345\355!" }, + { 134, "\317\360\356\361\354\356\362\360\345\355\356 %d \344\350\360\345\352\362\356\360\350\351 ..." }, + { 135, "ScummVM \355\345 \361\354\356\343 \355\340\351\362\350 \344\342\350\346\356\352 \344\353\377 \347\340\357\363\361\352\340 \342\373\341\360\340\355\355\356\351 \350\343\360\373!" }, + { 136, "ScummVM \355\345 \354\356\346\345\362 \355\340\351\362\350 \350\343\360\363 \342 \363\352\340\347\340\355\355\356\351 \344\350\360\345\352\362\356\360\350\350!" }, + { 137, "ScummVM \355\345 \354\356\346\345\362 \356\362\352\360\373\362\374 \363\352\340\347\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376!" }, + { 138, "\317\356\350\361\352:" }, + { 139, "\302\373\341\345\360\350\362\345 SoundFont" }, + { 140, "\302\373\341\345\360\350\362\345 \362\345\354\363" }, + { 141, "\302\373\341\345\360\350\362\345 \344\356\357\356\353\355\350\362\345\353\374\355\363\376 \344\350\360\345\352\362\356\360\350\376 \350\343\360\373" }, + { 142, "\302\373\341\345\360\350\362\345 \344\345\351\361\362\342\350\345 \350 \352\353\350\352\355\350\362\345 '\315\340\347\355\340\367\350\362\374'" }, + { 143, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \362\345\354 GUI" }, + { 144, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \344\356\357\356\353\355\350\362\345\353\374\355\373\354\350 \364\340\351\353\340\354\350" }, + { 145, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \357\353\340\343\350\355\340\354\350" }, + { 146, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 147, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \344\353\377 \361\356\365\360\340\355\345\355\350\351" }, + { 148, "\302\373\341\345\360\350\362\345 \344\350\360\345\352\362\356\360\350\376 \361 \364\340\351\353\340\354\350 \350\343\360\373" }, + { 149, "\317\360\356\357\363\361\362\350\362\374" }, + { 150, "\317\360\356\357\363\361\362\350\362\374 \361\362\360\356\352\363" }, + { 151, "SoundFont:" }, + { 152, "\307\342\363\352 \350 \361\363\341." }, + { 153, "\322\356\353\374\352\356 \356\347\342\363\367\352\340" }, + { 154, "\316\347\342\363\367\352\340 \350 \361\363\341\362\350\362\360\373" }, + { 155, "\303\360\356\354\352\356\361\362\374 \356\347\342\363\367\352\350:" }, + { 156, "\321\362\340\355\344\340\360\362\355\373\351 \360\340\361\362\345\360\350\347\340\362\356\360 (16bpp)" }, + { 157, "\317\363\361\352" }, + { 158, "\321\352\356\360\356\361\362\374 \361\363\341\362\350\362\360\356\342:" }, + { 159, "\322\356\353\374\352\356 \361\363\341\362\350\362\360\373" }, + { 161, "Tapware Zodiac" }, + { 162, "\322\345\352\361\362 \350 \356\347\342\363\367\352\340:" }, + { 163, "\315\345 \354\356\343\363 \357\350\361\340\362\374 \342 \342\373\341\360\340\355\355\363\376 \344\350\360\345\352\362\356\360\350\376. \317\356\346\340\353\363\351\361\362\340, \363\352\340\346\350\362\345 \344\360\363\343\363\376." }, + { 164, "\317\363\362\374 \352 \362\345\354\340\354:" }, + { 165, "\322\345\354\340:" }, + { 166, "\335\362\356\362 ID \350\343\360\373 \363\346\345 \350\361\357\356\353\374\347\363\345\362\361\377. \317\356\346\340\353\363\351\361\362\340, \342\373\341\345\360\350\362\345 \344\360\363\343\356\351." }, + { 167, "\335\362\340 \350\343\360\340 \355\345 \357\356\344\344\345\360\346\350\342\340\345\362 \347\340\343\360\363\347\352\363 \361\356\365\360\340\355\345\355\350\351 \367\345\360\345\347 \343\353\340\342\355\356\345 \354\345\355\376." }, + { 168, "TiMidity" }, + { 169, "\302\360\345\354\377: " }, + { 170, "\315\340\361\362\356\377\371\350\351 Roland MT-32 (\347\340\357\360\345\362\350\362\374 \375\354\363\353\377\366\350\376 GM)" }, + { 172, "\315\345\350\347\342\345\361\362\355\340\377 \356\370\350\341\352\340" }, + { 174, "\315\345\357\356\344\344\345\360\346\350\342\340\345\354\373\351 \360\345\346\350\354 \366\342\345\362\340" }, + { 175, "\321\356\365\360\340\355\345\355\350\345 \341\345\347 \350\354\345\355\350" }, + { 176, "\317\356\353\374\347\356\342\340\362\345\353\374 \342\373\341\360\340\353 \366\345\353\374'%s' (gameid '%s')...\n" }, + { 177, "\303\360\356\354\352\356\361\362\374" }, + { 178, "Windows MIDI" }, + { 179, "\315\345\344\356\361\362\340\362\356\367\355\356 \357\360\340\342 \344\353\377 \347\340\357\350\361\350" }, + { 180, "\316\370\350\341\352\340 \347\340\357\350\361\350 \344\340\355\355\373\365" }, + { 182, "Yamaha Pa1" }, + { 183, "\304\340" }, + { 184, "\302\373 \344\356\353\346\355\373 \357\345\360\345\347\340\357\363\361\362\350\362\374 ScummVM \367\362\356\341\373 \357\360\350\354\345\355\350\362\374 \350\347\354\345\355\345\355\350\377." }, + { 185, "\352\340\346\344\373\345 10 \354\350\355\363\362" }, + { 186, "\352\340\346\344\373\345 15 \354\350\355\363\362" }, + { 187, "\352\340\346\344\373\345 30 \354\350\355\363\362" }, + { 188, "\352\340\346\344\373\345 5 \354\350\355\363\362" }, + { 189, "\355\345 \363\344\340\353\356\361\374\n" }, + { -1, NULL } +}; + +static struct _po2c_msg _po2c_lang_hu_HU[] = { + { 0, "Project-Id-Version: ScummVM VERSION\nReport-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\nPOT-Creation-Date: 2009-11-25 07:10-0500\nPO-Revision-Date: 2009-11-25 07:42-0500\nLast-Translator: Alex Bevilacqua <alexbevi@gmail.com>\nLanguage-Team: Hungarian\nMIME-Version: 1.0\nContent-Type: text/plain; charset=ASCII\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n != 1);\n" }, + { 11, "<alap\351rtelmezett>" }, + { 16, "AdLib vezet :" }, + { 20, "Aspect adag korrekci\363" }, + { 24, "Hang" }, + { 25, "Automatikus ment\351s:" }, + { 51, "K\351pess\351 Roland GS Mode" }, + { 55, "Extra \332tvonal:" }, + { 59, "Teljes k\351perny s m\363d:" }, + { 61, "Lek\351pez eszk\366z GUI:" }, + { 67, "Grafik\341val" }, + { 68, "Grafikus m\363d:" }, + { 74, "Kulcsok" }, + { 80, "MIDI nyeres\351g:" }, + { 86, "Vegyes AdLib/MIDI m\363d" }, + { 88, "Zenei vezet :" }, + { 89, "Zene mennyis\351g:" }, + { 90, "Muta \326sszes" }, + { 92, "Soha" }, + { 98, "Semmi" }, + { 99, "Igen" }, + { 102, "Kimeneti teljes\355tm\351ny:" }, + { 111, "\326sv\351nyek" }, + { 124, "Renderel\351si m\363d:" }, + { 128, "SFX mennyis\351ge" }, + { 152, "Besz\351d s Feliratok" }, + { 153, "Csak a besz\351d" }, + { 154, "Besz\351d \351s a Feliratok" }, + { 155, "Besz\351d mennyis\351g:" }, + { 158, "Felirat sebess\351g:" }, + { 159, "Csak feliratok" }, + { 162, "Sz\366veg \351s besz\351d:" }, + { 165, "T\351ma:" }, + { 170, "Igaz Roland MT-32 (megb\351n\355t GM emul\341ci\363)" }, + { 177, "Volumene" }, + { 185, "10 percenk\351nt" }, + { 186, "15 percenk\351nt" }, + { 187, "30 percenk\351nt" }, + { 188, "5 percenk\351nt" }, + { -1, NULL } +}; + +static struct { + const char * lang; + const char * charset; + struct _po2c_msg * msgs; +} _po2c_langs[] = { + { "ru_RU", "cp1251", _po2c_lang_ru_RU }, + { "hu_HU", "ASCII", _po2c_lang_hu_HU }, + { NULL, NULL, NULL } +}; + +/* code */ + +static struct _po2c_msg * _po2c_lang=NULL; +static int _po2c_lang_size=0; +static const char * _po2c_charset=NULL; + +void po2c_setlang(const char * lang) +{ + int n; + + _po2c_lang=NULL; + _po2c_lang_size=0; + _po2c_charset=NULL; + + /* if lang is NULL or "", deactivate it */ + if(lang == NULL || *lang == '\0') + return; + + /* searches for a valid language array */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strcmp(lang, _po2c_langs[n].lang) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* try partial searches */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* if found, count entries */ + if(_po2c_lang != NULL) + { + struct _po2c_msg * m; + + for(m=_po2c_lang;m->msgid != -1;m++) + _po2c_lang_size++; + } +} + +const char * po2c_gettext(const char * msgid) +{ + struct _po2c_msg * m; + int b, t, n, c; + + /* if no language is set or msgid is empty, return msgid as is */ + if(_po2c_lang == NULL || *msgid == '\0') + return(msgid); + + /* binary-search for the msgid */ + b=0; t=_po2c_lang_size - 1; + + while(t >= b) + { + n=(b + t) / 2; + m=&_po2c_lang[n]; + + c=strcmp(msgid, _po2c_msgids[m->msgid]); + + if(c == 0) + return(m->msgstr); + else + if(c < 0) + t=n - 1; + else + b=n + 1; + } + + return(msgid); +} + +const char * po2c_getcharset(void) +{ + if (_po2c_charset) + return _po2c_charset; + else + return "ASCII"; +} + +int po2c_getnumlangs(void) +{ + int n = 0; + while (_po2c_langs[n].lang) + n++; + + return n; +} + +const char * po2c_getlang(int num) +{ + return _po2c_langs[num].lang; +} diff --git a/common/module.mk b/common/module.mk index 83d30f0a9b..857fb10edf 100644 --- a/common/module.mk +++ b/common/module.mk @@ -22,11 +22,19 @@ MODULE_OBJS := \ system.o \ textconsole.o \ tokenizer.o \ + translation.o \ unarj.o \ unzip.o \ util.o \ xmlparser.o \ zlib.o +ifdef ENABLE_TRANSLATION +common/translation.cpp: common/messages.cpp + +common/messages.cpp: $(wildcard po/*.po) + tools/po2c $^ > common/messages.cpp +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/common/translation.cpp b/common/translation.cpp new file mode 100755 index 0000000000..8301b22ecc --- /dev/null +++ b/common/translation.cpp @@ -0,0 +1,221 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program 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; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "translation.h" + +DECLARE_SINGLETON(Common::TranslationManager) + +#ifdef DETECTLANG +#include <locale.h> +#endif + +#ifdef TERMCONV +#include <langinfo.h> +#endif + +#ifdef TRANSLATION +#include "messages.cpp" +#endif + +namespace Common { + + +#ifdef TRANSLATION + +// Translation enabled + + +TranslationManager::TranslationManager() { +#ifdef DETECTLANG + // Activating current locale settings + const char* locale = setlocale(LC_ALL, ""); + + // Detect the language from the locale + if (!locale) { + strcpy(_syslang, "C"); + } else { + int len = strlen(locale); + if (len > 5) + len = 5; + strncpy(_syslang, locale, len); + _syslang[len] = 0; + } +#else // DETECTLANG + strcpy(_syslang, "C"); +#endif // DETECTLANG + +#ifdef TERMCONV + _convmsg = NULL; + _conversion = NULL; +#endif // TERMCONV + + // Set the default language + setLanguage(""); +} + +TranslationManager::~TranslationManager() { +#ifdef TERMCONV + iconv_close(_conversion); + if (_convmsg) + delete [] _convmsg; +#endif // TERMCONV +} + +void TranslationManager::setLanguage(const char* lang) { + if (*lang == '\0') + po2c_setlang(_syslang); + else + po2c_setlang(lang); + +#ifdef TERMCONV + // Get the locale character set (for terminal output) + const char* charset_term = nl_langinfo(CODESET); + + // Get the messages character set + const char* charset_po = po2c_getcharset(); + + // Delete previous conversion + if (_conversion) + iconv_close(_conversion); + + // Initialize the conversion + _conversion = iconv_open(charset_term, charset_po); +#endif // TERMCONV +} + +const char* TranslationManager::getTranslation(const char* message) { + return po2c_gettext(message); +} + +#ifdef TERMCONV +bool TranslationManager::convert(const char* message) { + // Preparing conversion origin + size_t len = strlen(message); + char* msgcpy = new char[len + 1]; + strcpy(msgcpy, message); + char* msg = msgcpy; + char** pmsg = &msg; + + // Preparing conversion destination + size_t len2 = _sizeconv; + char *conv = _convmsg; + char** pconv = &conv; + + // Clean previous conversions + iconv(_conversion, NULL, NULL, pconv, &len2); + + // Do the real conversion + size_t result = iconv(_conversion, pmsg, &len, pconv, &len2); + + delete [] msgcpy; + + return result != ((size_t)-1); +} +#endif // TERMCONV + +const char* TranslationManager::convertTerm(const char* message) { +#ifdef TERMCONV + size_t len = strlen(message); + if (!_convmsg) { + _sizeconv = len * 2; + _convmsg = new char[_sizeconv]; + } + + if (!convert(message)) { + // Resizing the buffer + delete [] _convmsg; + _sizeconv = len * 2; + _convmsg = new char[_sizeconv]; + + if (!convert(message)) { + printf("Error while converting character sets\n"); + return "Error while converting character sets"; + } + } + + return _convmsg; +#else // TERMCONV + return message; +#endif // TERMCONV +} + +const TLangArray TranslationManager::getSupportedLanguages() const { + TLangArray languages; + + int total = po2c_getnumlangs(); + for (int i = 0; i < total; i++) { + TLanguage lng(po2c_getlang(i), i + 1); + languages.push_back(lng); + } + + //sort(languages.begin(), languages.end()); + + return languages; +} + +int TranslationManager::parseLanguage(const String lang) { + int total = po2c_getnumlangs(); + + for (int i = 0; i < total; i++) { + if (lang == po2c_getlang(i)) + return i + 1; + } + + return kTranslationBuiltinId; +} + + +const char *TranslationManager::getLangById(int id) { + switch (id) { + case kTranslationAutodetectId: + return ""; + case kTranslationBuiltinId: + return "C"; + default: + return po2c_getlang(id - 1); + } +} + +#else // TRANSLATION + +// Translation disabled + + +TranslationManager::TranslationManager() {} + +TranslationManager::~TranslationManager() {} + +void TranslationManager::setLanguage(const char* lang) {} + +const char* TranslationManager::getTranslation(const char* message) { + return message; +} + +const char* TranslationManager::convertTerm(const char* message) { + return message; +} + +#endif // TRANSLATION + +} // End of namespace Common diff --git a/common/translation.h b/common/translation.h new file mode 100755 index 0000000000..95deb6bb38 --- /dev/null +++ b/common/translation.h @@ -0,0 +1,126 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program 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; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef COMMON_TRANSLATION_H +#define COMMON_TRANSLATION_H + +#include "common/singleton.h" +#include "common/str-array.h" + +#ifdef TERMCONV +#include <iconv.h> +#endif + +namespace Common { + +enum TranslationIDs { + kTranslationAutodetectId = 0, + kTranslationBuiltinId = 1000 +}; + +struct TLanguage { + const char *name; + int id; + + TLanguage() { + name = 0; + id = 0; + } + + TLanguage(const char *n, int i) { + name = n; + id = i; + } +}; + +typedef Array<TLanguage> TLangArray; + +/** + * Message translation manager. + */ +class TranslationManager : public Singleton<TranslationManager> { +private: + char _syslang[6]; + +#ifdef TERMCONV + iconv_t _conversion; + char* _convmsg; + int _sizeconv; + + bool convert(const char* message); +#endif // TERMCONV + +public: + /** + * The constructor detects the system language and sets default + * language to English. + */ + TranslationManager(); + ~TranslationManager(); + + const char *getLangById(int id); + + /** + * Sets the current translation language to the one specified in the + * parameter. If the parameter is an empty string, it sets the default + * system language. + */ + void setLanguage(const char *); + void setLanguage(int id) { + setLanguage(getLangById(id)); + } + + int parseLanguage(const String lang); + + /** + * Returns the translation into the current language of the parameter + * message. In case the message isn't found in the translation catalog, + * it returns the original untranslated message. + */ + const char* getTranslation(const char* message); + + /** + * Converts the message into the terminal character set (which may be + * different than the GUI's "native" one. + */ + const char* convertTerm(const char* message); + + const TLangArray getSupportedLanguages() const; +}; + +} // End of namespace Common + +#define TransMan Common::TranslationManager::instance() + +#ifdef TRANSLATION +#define _(str) TransMan.getTranslation(str) +#define _t(str) TransMan.convertTerm(_(str)) +#else +#define _(str) str +#define _t(str) str +#endif + +#define _s(str) str + +#endif @@ -136,6 +136,8 @@ _enable_prof=no # Default vkeybd/keymapper options _vkeybd=no _keymapper=no +# GUI translation options +_translation=yes # Default platform settings _backend=sdl _endian=unknown @@ -676,6 +678,7 @@ Optional Features: --disable-16bit don't enable 16bit color support --disable-scalers exclude scalers --disable-hq-scalers exclude HQ2x and HQ3x scalers + --disable-translation don't build support for translated messages --enable-text-console use text console instead of graphical console --enable-verbose-build enable regular echoing of commands during build process @@ -760,6 +763,8 @@ for ac_option in $@; do --default-dynamic) _plugins_default=dynamic ;; --enable-mt32emu) _mt32emu=yes ;; --disable-mt32emu) _mt32emu=no ;; + --enable-translation) _translation=yes ;; + --disable-translation) _translation=no ;; --enable-vkeybd) _vkeybd=yes ;; --disable-vkeybd) _vkeybd=no ;; --enable-keymapper) _keymapper=yes ;; @@ -2312,6 +2317,47 @@ if test "$_keymapper" = yes ; then DEFINES="$DEFINES -DENABLE_KEYMAPPER" fi +# Check whether to build translation support +# +echo_n "Building translation support... " +add_to_config_mk_if_yes $_translation 'ENABLE_TRANSLATION = 1' +add_to_config_h_if_yes $_translation '#define TRANSLATION' +if test "$_translation" = no ; then + echo "no" +else + echo_n "yes (" + + cat > $TMPC << EOF +#include <locale.h> +int main(void) { setlocale(LC_ALL, ""); return 0; } +EOF + _detectlang=no + cc_check $LDFLAGS $CXXFLAGS && _detectlang=yes + + add_to_config_h_if_yes $_detectlang '#define DETECTLANG' + if test "$_detectlang" = yes ; then + echo_n "with runtime language detection, " + + cat > $TMPC << EOF +#include <langinfo.h> +#include <iconv.h> +int main(void) { nl_langinfo(CODESET); iconv_open(0, 0); return 0; } +EOF + _termconv=no + cc_check_no_clean $LDFLAGS $CXXFLAGS && _termconv=yes + cc_check $LDFLAGS $CXXFLAGS -liconv && LIBS="$LIBS -liconv" && _termconv=yes + + add_to_config_h_if_yes $_termconv '#define TERMCONV' + if test "$_termconv" = yes ; then + echo "with terminal conversion)" + else + echo "without terminal conversion)" + fi + else + echo "without runtime language detection)" + fi +fi + # # Figure out installation directories # diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 954bc81470..4e4a656cc0 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -28,6 +28,7 @@ #include "common/savefile.h" #include "common/system.h" #include "common/events.h" +#include "common/translation.h" #include "graphics/scaler.h" @@ -85,37 +86,37 @@ MainMenuDialog::MainMenuDialog(Engine *engine) StaticTextWidget *version = new StaticTextWidget(this, "GlobalMenu.Version", gScummVMVersionDate); version->setAlign(Graphics::kTextAlignCenter); - new GUI::ButtonWidget(this, "GlobalMenu.Resume", "Resume", kPlayCmd, 'P'); + new GUI::ButtonWidget(this, "GlobalMenu.Resume", _("Resume"), kPlayCmd, 'P'); - _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", "Load", kLoadCmd, 'L'); + _loadButton = new GUI::ButtonWidget(this, "GlobalMenu.Load", _("Load"), kLoadCmd, 'L'); // TODO: setEnabled -> setVisible _loadButton->setEnabled(_engine->hasFeature(Engine::kSupportsLoadingDuringRuntime)); - _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", "Save", kSaveCmd, 'S'); + _saveButton = new GUI::ButtonWidget(this, "GlobalMenu.Save", _("Save"), kSaveCmd, 'S'); // TODO: setEnabled -> setVisible _saveButton->setEnabled(_engine->hasFeature(Engine::kSupportsSavingDuringRuntime)); - new GUI::ButtonWidget(this, "GlobalMenu.Options", "Options", kOptionsCmd, 'O'); + new GUI::ButtonWidget(this, "GlobalMenu.Options", _("Options"), kOptionsCmd, 'O'); // The help button is disabled by default. // To enable "Help", an engine needs to use a subclass of MainMenuDialog // (at least for now, we might change how this works in the future). - _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", "Help", kHelpCmd, 'H'); + _helpButton = new GUI::ButtonWidget(this, "GlobalMenu.Help", _("Help"), kHelpCmd, 'H'); _helpButton->setEnabled(false); - new GUI::ButtonWidget(this, "GlobalMenu.About", "About", kAboutCmd, 'A'); + new GUI::ButtonWidget(this, "GlobalMenu.About", _("About"), kAboutCmd, 'A'); - _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", "Return to Launcher", kRTLCmd, 'R'); + _rtlButton = new GUI::ButtonWidget(this, "GlobalMenu.RTL", _("Return to Launcher"), kRTLCmd, 'R'); _rtlButton->setEnabled(_engine->hasFeature(Engine::kSupportsRTL)); - new GUI::ButtonWidget(this, "GlobalMenu.Quit", "Quit", kQuitCmd, 'Q'); + new GUI::ButtonWidget(this, "GlobalMenu.Quit", _("Quit"), kQuitCmd, 'Q'); _aboutDialog = new GUI::AboutDialog(); _optionsDialog = new ConfigDialog(_engine->hasFeature(Engine::kSupportsSubtitleOptions)); - _loadDialog = new GUI::SaveLoadChooser("Load game:", "Load"); + _loadDialog = new GUI::SaveLoadChooser(_("Load game:"), _("Load")); _loadDialog->setSaveMode(false); - _saveDialog = new GUI::SaveLoadChooser("Save game:", "Save"); + _saveDialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save")); _saveDialog->setSaveMode(true); } @@ -297,11 +298,11 @@ ConfigDialog::ConfigDialog(bool subtitleControls) // Add the buttons // - new GUI::ButtonWidget(this, "GlobalConfig.Ok", "OK", GUI::kOKCmd, 'O'); - new GUI::ButtonWidget(this, "GlobalConfig.Cancel", "Cancel", GUI::kCloseCmd, 'C'); + new GUI::ButtonWidget(this, "GlobalConfig.Ok", _("OK"), GUI::kOKCmd, 'O'); + new GUI::ButtonWidget(this, "GlobalConfig.Cancel", _("Cancel"), GUI::kCloseCmd, 'C'); #ifdef SMALL_SCREEN_DEVICE - new GUI::ButtonWidget(this, "GlobalConfig.Keys", "Keys", kKeysCmd, 'K'); + new GUI::ButtonWidget(this, "GlobalConfig.Keys", _("Keys"), kKeysCmd, 'K'); _keysDialog = NULL; #endif } diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index 99fb3be4dc..9f04c382cb 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -27,6 +27,7 @@ #include "common/util.h" #include "common/config-manager.h" #include "common/algorithm.h" +#include "common/translation.h" #include "backends/keymapper/keymapper.h" @@ -71,7 +72,7 @@ GuiManager::GuiManager() : _redrawStatus(kRedrawDisabled), // Loading the theme failed, try to load the built-in theme if (!loadNewTheme("builtin", gfxMode)) { // Loading the built-in theme failed as well. Bail out - error("Failed to load any GUI theme, aborting"); + error(_t("Failed to load any GUI theme, aborting")); } } } @@ -94,27 +95,28 @@ void GuiManager::initKeymap() { Action *act; Keymap *guiMap = new Keymap("gui"); - act = new Action(guiMap, "CLOS", "Close", kGenericActionType, kStartKeyType); + act = new Action(guiMap, "CLOS", _("Close"), kGenericActionType, kStartKeyType); act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0)); - act = new Action(guiMap, "CLIK", "Mouse click"); + act = new Action(guiMap, "CLIK", _("Mouse click")); act->addLeftClickEvent(); - act = new Action(guiMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType); + act = new Action(guiMap, "VIRT", _("Display keyboard"), kVirtualKeyboardActionType); act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0)); - act = new Action(guiMap, "REMP", "Remap keys", kKeyRemapActionType); + act = new Action(guiMap, "REMP", _("Remap keys"), kKeyRemapActionType); act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0)); mapper->addGlobalKeymap(guiMap); } #endif -bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx) { +bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx, bool forced) { // If we are asked to reload the currently active theme, just do nothing // FIXME: Actually, why? It might be desirable at times to force a theme reload... - if (_theme && id == _theme->getThemeId() && gfx == _theme->getGraphicsMode()) - return true; + if (!forced) + if (_theme && id == _theme->getThemeId() && gfx == _theme->getGraphicsMode()) + return true; ThemeEngine *newTheme = 0; diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 892d1aa3ac..3187a0ba73 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -71,7 +71,7 @@ public: bool isActive() const { return ! _dialogStack.empty(); } - bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled); + bool loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx = ThemeEngine::kGfxDisabled, bool force = false); ThemeEngine *theme() { return _theme; } ThemeEval *xmlEval() { return _theme->getEvaluator(); } diff --git a/gui/KeysDialog.cpp b/gui/KeysDialog.cpp index b80dd200bb..65b14f9078 100644 --- a/gui/KeysDialog.cpp +++ b/gui/KeysDialog.cpp @@ -40,15 +40,15 @@ enum { KeysDialog::KeysDialog(const Common::String &title) : GUI::Dialog("KeysDialog") { - new ButtonWidget(this, "KeysDialog.Map", "Map", kMapCmd, 0); - new ButtonWidget(this, "KeysDialog.Ok", "OK", kOKCmd, 0); - new ButtonWidget(this, "KeysDialog.Cancel", "Cancel", kCloseCmd, 0); + new ButtonWidget(this, "KeysDialog.Map", _("Map"), kMapCmd, 0); + new ButtonWidget(this, "KeysDialog.Ok", _("OK"), kOKCmd, 0); + new ButtonWidget(this, "KeysDialog.Cancel", _("Cancel"), kCloseCmd, 0); _actionsList = new ListWidget(this, "KeysDialog.List"); _actionsList->setNumberingMode(kListNumberingZero); _actionTitle = new StaticTextWidget(this, "KeysDialog.Action", title); - _keyMapping = new StaticTextWidget(this, "KeysDialog.Mapping", "Select an action and click 'Map'"); + _keyMapping = new StaticTextWidget(this, "KeysDialog.Mapping", _("Select an action and click 'Map'")); _actionTitle->setFlags(WIDGET_CLEARBG); _keyMapping->setFlags(WIDGET_CLEARBG); @@ -79,9 +79,9 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { key = key - Common::ASCII_F1 + SDLK_F1; #endif if (key != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey)key)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey)key)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); _keyMapping->setLabel(selection); _keyMapping->draw(); @@ -89,7 +89,7 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { break; case kMapCmd: if (_actionsList->getSelected() < 0) { - _actionTitle->setLabel("Please select an action"); + _actionTitle->setLabel(_("Please select an action")); } else { char selection[100]; @@ -101,11 +101,11 @@ void KeysDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { key = key - Common::ASCII_F1 + SDLK_F1; #endif if (key != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey)key)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey)key)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); - _actionTitle->setLabel("Press the key to associate"); + _actionTitle->setLabel(_("Press the key to associate")); _keyMapping->setLabel(selection); _keyMapping->draw(); Actions::Instance()->beginMapping(true); @@ -140,11 +140,11 @@ void KeysDialog::handleKeyUp(Common::KeyState state) { Actions::Instance()->setMapping((ActionType)_actionSelected, state.ascii); if (state.ascii != 0) - sprintf(selection, "Associated key : %s", SDL_GetKeyName((SDLKey) state.keycode)); + sprintf(selection, _("Associated key : %s"), SDL_GetKeyName((SDLKey) state.keycode)); else - sprintf(selection, "Associated key : none"); + sprintf(selection, _("Associated key : none")); - _actionTitle->setLabel("Choose an action to map"); + _actionTitle->setLabel(_("Choose an action to map")); _keyMapping->setLabel(selection); _keyMapping->draw(); _actionTitle->draw(); diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index b472ad0535..03e21153a5 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -30,6 +30,7 @@ #include "common/fs.h" #include "common/unzip.h" #include "common/tokenizer.h" +#include "common/translation.h" #include "graphics/colormasks.h" #include "graphics/cursorman.h" @@ -329,10 +330,10 @@ ThemeEngine::~ThemeEngine() { * Rendering mode management *********************************************************/ const ThemeEngine::Renderer ThemeEngine::_rendererModes[] = { - { "Disabled GFX", "none", kGfxDisabled }, - { "Standard Renderer (16bpp)", "normal_16bpp", kGfxStandard16bit }, + { _s("Disabled GFX"), "none", kGfxDisabled }, + { _s("Standard Renderer (16bpp)"), "normal_16bpp", kGfxStandard16bit }, #ifndef DISABLE_FANCY_THEMES - { "Antialiased Renderer (16bpp)", "aa_16bpp", kGfxAntialias16bit } + { _s("Antialiased Renderer (16bpp)"), "aa_16bpp", kGfxAntialias16bit } #endif }; diff --git a/gui/about.cpp b/gui/about.cpp index 8b2f470bf6..a999674751 100644 --- a/gui/about.cpp +++ b/gui/about.cpp @@ -27,6 +27,7 @@ #include "base/version.h" #include "common/events.h" #include "common/system.h" +#include "common/translation.h" #include "common/util.h" #include "gui/about.h" #include "gui/GuiManager.h" @@ -92,7 +93,7 @@ AboutDialog::AboutDialog() version += gScummVMVersion; _lines.push_back(version); - Common::String date("C2""(built on "); + Common::String date(_s("C2""(built on ")); date += gScummVMBuildDate; date += ')'; _lines.push_back(date); @@ -100,14 +101,14 @@ AboutDialog::AboutDialog() for (i = 0; i < ARRAYSIZE(copyright_text); i++) addLine(copyright_text[i]); - addLine("C1""Features compiled in:"); + addLine(_s("C1""Features compiled in:")); Common::String features("C0"); features += gScummVMFeatures; addLine(features.c_str()); _lines.push_back(""); - addLine("C1""Available engines:"); + addLine(_s("C1""Available engines:")); const EnginePlugin::List &plugins = EngineMan.getPlugins(); EnginePlugin::List::const_iterator iter = plugins.begin(); for (; iter != plugins.end(); ++iter) { diff --git a/gui/browser.cpp b/gui/browser.cpp index c090742988..86fadf667e 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -30,6 +30,8 @@ #include "common/system.h" #include "common/algorithm.h" +#include "common/translation.h" + namespace GUI { enum { @@ -64,9 +66,9 @@ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Up", "Go up", kGoUpCmd, 0); - new ButtonWidget(this, "Browser.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", "Choose", kChooseCmd, 0); + new ButtonWidget(this, "Browser.Up", _("Go up"), kGoUpCmd, 0); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); } void BrowserDialog::open() { diff --git a/gui/error.cpp b/gui/error.cpp index fbe09c5a02..3332eb533a 100644 --- a/gui/error.cpp +++ b/gui/error.cpp @@ -27,6 +27,8 @@ #include "gui/message.h" #include "gui/error.h" +#include "common/translation.h" + namespace GUI { void displayErrorDialog(const char *text) { @@ -37,7 +39,7 @@ void displayErrorDialog(const char *text) { void displayErrorDialog(Common::Error error, const char *extraText) { Common::String errorText(extraText); errorText += " "; - errorText += Common::errorToString(error); + errorText += _(Common::errorToString(error)); GUI::MessageDialog alert(errorText); alert.runModal(); } diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 0f484c5233..3634ef7e3d 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -30,6 +30,7 @@ #include "common/util.h" #include "common/savefile.h" #include "common/system.h" +#include "common/translation.h" #include "gui/about.h" #include "gui/browser.h" @@ -166,20 +167,20 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 1) The game tab // - tab->addTab("Game"); + tab->addTab(_("Game")); // GUI: Label & edit widget for the game ID - new StaticTextWidget(tab, "GameOptions_Game.Id", "ID:"); + new StaticTextWidget(tab, "GameOptions_Game.Id", _("ID:")); _domainWidget = new DomainEditTextWidget(tab, "GameOptions_Game.Domain", _domain); // GUI: Label & edit widget for the description - new StaticTextWidget(tab, "GameOptions_Game.Name", "Name:"); + new StaticTextWidget(tab, "GameOptions_Game.Name", _("Name:")); _descriptionWidget = new EditTextWidget(tab, "GameOptions_Game.Desc", description); // Language popup - _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", "Language:"); + _langPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.LangPopupDesc", _("Language:")); _langPopUp = new PopUpWidget(tab, "GameOptions_Game.LangPopup"); - _langPopUp->appendEntry("<default>"); + _langPopUp->appendEntry(_("<default>")); _langPopUp->appendEntry(""); const Common::LanguageDescription *l = Common::g_languages; for (; l->code; ++l) { @@ -187,9 +188,9 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) } // Platform popup - _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", "Platform:"); + _platformPopUpDesc = new StaticTextWidget(tab, "GameOptions_Game.PlatformPopupDesc", _("Platform:")); _platformPopUp = new PopUpWidget(tab, "GameOptions_Game.PlatformPopup"); - _platformPopUp->appendEntry("<default>"); + _platformPopUp->appendEntry(_("<default>")); _platformPopUp->appendEntry(""); const Common::PlatformDescription *p = Common::g_platforms; for (; p->code; ++p) { @@ -199,18 +200,18 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 3) The graphics tab // - _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); - _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", "Override global graphic settings", kCmdGlobalGraphicsOverride, 0); + _globalGraphicsOverride = new CheckboxWidget(tab, "GameOptions_Graphics.EnableTabCheckbox", _("Override global graphic settings"), kCmdGlobalGraphicsOverride, 0); addGraphicControls(tab, "GameOptions_Graphics."); // // 4) The audio tab // - tab->addTab("Audio"); + tab->addTab(_("Audio")); - _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", "Override global audio settings", kCmdGlobalAudioOverride, 0); + _globalAudioOverride = new CheckboxWidget(tab, "GameOptions_Audio.EnableTabCheckbox", _("Override global audio settings"), kCmdGlobalAudioOverride, 0); addAudioControls(tab, "GameOptions_Audio."); addSubtitleControls(tab, "GameOptions_Audio."); @@ -218,18 +219,18 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 5) The volume tab // - tab->addTab("Volume"); + tab->addTab(_("Volume")); - _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", "Override global volume settings", kCmdGlobalVolumeOverride, 0); + _globalVolumeOverride = new CheckboxWidget(tab, "GameOptions_Volume.EnableTabCheckbox", _("Override global volume settings"), kCmdGlobalVolumeOverride, 0); addVolumeControls(tab, "GameOptions_Volume."); // // 6) The MIDI tab // - tab->addTab("MIDI"); + tab->addTab(_("MIDI")); - _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", "Override global MIDI settings", kCmdGlobalMIDIOverride, 0); + _globalMIDIOverride = new CheckboxWidget(tab, "GameOptions_MIDI.EnableTabCheckbox", _("Override global MIDI settings"), kCmdGlobalMIDIOverride, 0); if (_guioptions & Common::GUIO_NOMIDI) _globalMIDIOverride->setEnabled(false); @@ -239,21 +240,21 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) // // 2) The 'Path' tab // - tab->addTab("Paths"); + tab->addTab(_("Paths")); // These buttons have to be extra wide, or the text will be truncated // in the small version of the GUI. // GUI: Button + Label for the game path - new ButtonWidget(tab, "GameOptions_Paths.Gamepath", "Game Path:", kCmdGameBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Gamepath", _("Game Path:"), kCmdGameBrowser, 0); _gamePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.GamepathText", gamePath); // GUI: Button + Label for the additional path - new ButtonWidget(tab, "GameOptions_Paths.Extrapath", "Extra Path:", kCmdExtraBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Extrapath", _("Extra Path:"), kCmdExtraBrowser, 0); _extraPathWidget = new StaticTextWidget(tab, "GameOptions_Paths.ExtrapathText", extraPath); // GUI: Button + Label for the save path - new ButtonWidget(tab, "GameOptions_Paths.Savepath", "Save Path:", kCmdSaveBrowser, 0); + new ButtonWidget(tab, "GameOptions_Paths.Savepath", _("Save Path:"), kCmdSaveBrowser, 0); _savePathWidget = new StaticTextWidget(tab, "GameOptions_Paths.SavepathText", savePath); // Activate the first tab @@ -261,8 +262,8 @@ EditGameDialog::EditGameDialog(const String &domain, const String &desc) _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GameOptions.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "GameOptions.Ok", "OK", kOKCmd, 0); + new ButtonWidget(this, "GameOptions.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "GameOptions.Ok", _("OK"), kOKCmd, 0); } void EditGameDialog::open() { @@ -270,12 +271,12 @@ void EditGameDialog::open() { String extraPath(ConfMan.get("extrapath", _domain)); if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) { - _extraPathWidget->setLabel("None"); + _extraPathWidget->setLabel(_("None")); } String savePath(ConfMan.get("savepath", _domain)); if (savePath.empty() || !ConfMan.hasKey("savepath", _domain)) { - _savePathWidget->setLabel("Default"); + _savePathWidget->setLabel(_("Default")); } int sel, i; @@ -349,11 +350,11 @@ void EditGameDialog::close() { ConfMan.set("path", gamePath, _domain); String extraPath(_extraPathWidget->getLabel()); - if (!extraPath.empty() && (extraPath != "None")) + if (!extraPath.empty() && (extraPath != _("None"))) ConfMan.set("extrapath", extraPath, _domain); String savePath(_savePathWidget->getLabel()); - if (!savePath.empty() && (savePath != "Default")) + if (!savePath.empty() && (savePath != _("Default"))) ConfMan.set("savepath", savePath, _domain); Common::Platform platform = (Common::Platform)_platformPopUp->getSelectedTag(); @@ -387,14 +388,14 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat draw(); break; case kCmdChooseSoundFontCmd: { - BrowserDialog browser("Select SoundFont", false); + BrowserDialog browser(_("Select SoundFont"), false); if (browser.runModal() > 0) { // User made this choice... Common::FSNode file(browser.getResult()); _soundFont->setLabel(file.getPath()); - if (!file.getPath().empty() && (file.getPath() != "None")) + if (!file.getPath().empty() && (file.getPath() != _("None"))) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); @@ -406,7 +407,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat // Change path for the game case kCmdGameBrowser: { - BrowserDialog browser("Select directory with game data", true); + BrowserDialog browser(_("Select directory with game data"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -424,7 +425,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat // Change path for extra game data (eg, using sword cutscenes when playing via CD) case kCmdExtraBrowser: { - BrowserDialog browser("Select additional game directory", true); + BrowserDialog browser(_("Select additional game directory"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -436,7 +437,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat } // Change path for stored save game (perm and temp) data case kCmdSaveBrowser: { - BrowserDialog browser("Select directory for saved games", true); + BrowserDialog browser(_("Select directory for saved games"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -455,7 +456,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat || newDomain.hasPrefix("_") || newDomain == ConfigManager::kApplicationDomain || ConfMan.hasGameDomain(newDomain)) { - MessageDialog alert("This game ID is already taken. Please choose another one."); + MessageDialog alert(_("This game ID is already taken. Please choose another one.")); alert.runModal(); return; } @@ -496,22 +497,22 @@ LauncherDialog::LauncherDialog() new StaticTextWidget(this, "Launcher.Version", gScummVMFullVersion); #endif - new ButtonWidget(this, "Launcher.QuitButton", "Quit", kQuitCmd, 'Q'); - new ButtonWidget(this, "Launcher.AboutButton", "About...", kAboutCmd, 'B'); - new ButtonWidget(this, "Launcher.OptionsButton", "Options...", kOptionsCmd, 'O'); + new ButtonWidget(this, "Launcher.QuitButton", _("Quit"), kQuitCmd, 'Q'); + new ButtonWidget(this, "Launcher.AboutButton", _("About..."), kAboutCmd, 'B'); + new ButtonWidget(this, "Launcher.OptionsButton", _("Options..."), kOptionsCmd, 'O'); _startButton = - new ButtonWidget(this, "Launcher.StartButton", "Start", kStartCmd, 'S'); + new ButtonWidget(this, "Launcher.StartButton", _("Start"), kStartCmd, 'S'); _loadButton = - new ButtonWidget(this, "Launcher.LoadGameButton", "Load...", kLoadGameCmd, 'L'); + new ButtonWidget(this, "Launcher.LoadGameButton", _("Load..."), kLoadGameCmd, 'L'); // Above the lowest button rows: two more buttons (directly below the list box) _addButton = - new ButtonWidget(this, "Launcher.AddGameButton", "Add Game...", kAddGameCmd, 'A'); + new ButtonWidget(this, "Launcher.AddGameButton", _("Add Game..."), kAddGameCmd, 'A'); _editButton = - new ButtonWidget(this, "Launcher.EditGameButton", "Edit Game...", kEditGameCmd, 'E'); + new ButtonWidget(this, "Launcher.EditGameButton", _("Edit Game..."), kEditGameCmd, 'E'); _removeButton = - new ButtonWidget(this, "Launcher.RemoveGameButton", "Remove Game", kRemoveGameCmd, 'R'); + new ButtonWidget(this, "Launcher.RemoveGameButton", _("Remove Game"), kRemoveGameCmd, 'R'); // Search box _searchDesc = 0; @@ -522,7 +523,7 @@ LauncherDialog::LauncherDialog() _searchPic->setGfx(g_gui.theme()->getImageSurface(ThemeEngine::kImageSearch)); } else #endif - _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", "Search:"); + _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); _searchWidget = new EditTextWidget(this, "Launcher.Search", _search, kSearchCmd); _searchClearButton = new ButtonWidget(this, "Launcher.SearchClearButton", "C", kSearchClearCmd, 0); @@ -544,10 +545,10 @@ LauncherDialog::LauncherDialog() updateButtons(); // Create file browser dialog - _browser = new BrowserDialog("Select directory with game data", true); + _browser = new BrowserDialog(_("Select directory with game data"), true); // Create Load dialog - _loadDialog = new SaveLoadChooser("Load game:", "Load"); + _loadDialog = new SaveLoadChooser(_("Load game:"), _("Load")); } void LauncherDialog::selectTarget(const String &target) { @@ -619,8 +620,12 @@ void LauncherDialog::updateListing() { description = g.description(); } - if (description.empty()) - description = "Unknown (target " + iter->_key + ", gameid " + gameid + ")"; + if (description.empty()) { + char tmp[200]; + + snprintf(tmp, 200, "Unknown (target %s, gameid %s)", iter->_key.c_str(), gameid.c_str()); + description = tmp; + } if (!gameid.empty() && !description.empty()) { // Insert the game into the launcher list @@ -652,8 +657,8 @@ void LauncherDialog::addGame() { const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0; if (massAdd) { - MessageDialog alert("Do you really want to run the mass game detector? " - "This could potentially add a huge number of games.", "Yes", "No"); + MessageDialog alert(_("Do you really want to run the mass game detector? " + "This could potentially add a huge number of games."), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK && _browser->runModal() > 0) { MassAddDialog massAddDlg(_browser->getResult()); @@ -700,7 +705,7 @@ void LauncherDialog::addGame() { Common::FSNode dir(_browser->getResult()); Common::FSList files; if (!dir.getChildren(files, Common::FSNode::kListAll)) { - MessageDialog alert("ScummVM couldn't open the specified directory!"); + MessageDialog alert(_("ScummVM couldn't open the specified directory!")); alert.runModal(); return; } @@ -712,7 +717,7 @@ void LauncherDialog::addGame() { int idx; if (candidates.empty()) { // No game was found in the specified directory - MessageDialog alert("ScummVM could not find any game in the specified directory!"); + MessageDialog alert(_("ScummVM could not find any game in the specified directory!")); alert.runModal(); idx = -1; @@ -726,7 +731,7 @@ void LauncherDialog::addGame() { for (idx = 0; idx < (int)candidates.size(); idx++) list.push_back(candidates[idx].description()); - ChooserDialog dialog("Pick the game:"); + ChooserDialog dialog(_("Pick the game:")); dialog.setList(list); idx = dialog.runModal(); } @@ -802,7 +807,7 @@ Common::String addGameToConf(const GameDescriptor &result) { } void LauncherDialog::removeGame(int item) { - MessageDialog alert("Do you really want to remove this game configuration?", "Yes", "No"); + MessageDialog alert(_("Do you really want to remove this game configuration?"), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) { // Remove the currently selected game from the list @@ -865,11 +870,11 @@ void LauncherDialog::loadGame(int item) { } } else { MessageDialog dialog - ("This game does not support loading games from the launcher.", "OK"); + (_("This game does not support loading games from the launcher."), _("OK")); dialog.runModal(); } } else { - MessageDialog dialog("ScummVM could not find any engine capable of running the selected game!", "OK"); + MessageDialog dialog(_("ScummVM could not find any engine capable of running the selected game!"), _("OK")); dialog.runModal(); } } @@ -981,8 +986,8 @@ void LauncherDialog::updateButtons() { int modifiers = g_system->getEventManager()->getModifierState(); const bool massAdd = (modifiers & Common::KBD_SHIFT) != 0; const char *newAddButtonLabel = massAdd - ? "Mass Add..." - : "Add Game..."; + ? _("Mass Add...") + : _("Add Game..."); if (_addButton->getLabel() != newAddButtonLabel) _addButton->setLabel(newAddButtonLabel); @@ -1029,7 +1034,7 @@ void LauncherDialog::reflowLayout() { } } else { if (!_searchDesc) - _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", "Search:"); + _searchDesc = new StaticTextWidget(this, "Launcher.SearchDesc", _("Search:")); if (_searchPic) { removeWidget(_searchPic); diff --git a/gui/massadd.cpp b/gui/massadd.cpp index 266226161a..36efdfdd59 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -27,6 +27,7 @@ #include "common/events.h" #include "common/func.h" #include "common/config-manager.h" +#include "common/translation.h" #include "gui/launcher.h" // For addGameToConf() #include "gui/massadd.h" @@ -75,10 +76,10 @@ MassAddDialog::MassAddDialog(const Common::FSNode &startDir) // new StaticTextWidget(this, "massadddialog_caption", "Mass Add Dialog"); _dirProgressText = new StaticTextWidget(this, "MassAdd.DirProgressText", - "... progress ..."); + _("... progress ...")); _gameProgressText = new StaticTextWidget(this, "MassAdd.GameProgressText", - "... progress ..."); + _("... progress ...")); _dirProgressText->setAlign(Graphics::kTextAlignCenter); _gameProgressText->setAlign(Graphics::kTextAlignCenter); @@ -88,10 +89,10 @@ MassAddDialog::MassAddDialog(const Common::FSNode &startDir) _list->setNumberingMode(kListNumberingOff); _list->setList(l); - _okButton = new ButtonWidget(this, "MassAdd.Ok", "OK", kOkCmd, Common::ASCII_RETURN); + _okButton = new ButtonWidget(this, "MassAdd.Ok", _("OK"), kOkCmd, Common::ASCII_RETURN); _okButton->setEnabled(false); - new ButtonWidget(this, "MassAdd.Cancel", "Cancel", kCancelCmd, Common::ASCII_ESCAPE); + new ButtonWidget(this, "MassAdd.Cancel", _("Cancel"), kCancelCmd, Common::ASCII_ESCAPE); // Build a map from all configured game paths to the targets using them const Common::ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); @@ -240,17 +241,17 @@ void MassAddDialog::handleTickle() { // Enable the OK button _okButton->setEnabled(true); - snprintf(buf, sizeof(buf), "Scan complete!"); + snprintf(buf, sizeof(buf), _("Scan complete!")); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), "Discovered %d new games.", _games.size()); + snprintf(buf, sizeof(buf), _("Discovered %d new games."), _games.size()); _gameProgressText->setLabel(buf); } else { - snprintf(buf, sizeof(buf), "Scanned %d directories ...", _dirsScanned); + snprintf(buf, sizeof(buf), _("Scanned %d directories ..."), _dirsScanned); _dirProgressText->setLabel(buf); - snprintf(buf, sizeof(buf), "Discovered %d new games ...", _games.size()); + snprintf(buf, sizeof(buf), _("Discovered %d new games ..."), _games.size()); _gameProgressText->setLabel(buf); } diff --git a/gui/options.cpp b/gui/options.cpp index 212e90f9f0..9ea3c7a1e8 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -35,6 +35,7 @@ #include "common/fs.h" #include "common/config-manager.h" #include "common/system.h" +#include "common/translation.h" #include "graphics/scaler.h" @@ -67,9 +68,9 @@ enum { }; #endif -static const char *savePeriodLabels[] = { "Never", "every 5 mins", "every 10 mins", "every 15 mins", "every 30 mins", 0 }; +static const char *savePeriodLabels[] = { _s("Never"), _s("every 5 mins"), _s("every 10 mins"), _s("every 15 mins"), _s("every 30 mins"), 0 }; static const int savePeriodValues[] = { 0, 5 * 60, 10 * 60, 15 * 60, 30 * 60, -1 }; -static const char *outputRateLabels[] = { "<default>", "8 kHz", "11kHz", "22 kHz", "44 kHz", "48 kHz", 0 }; +static const char *outputRateLabels[] = { _s("<default>"), _s("8 kHz"), _s("11kHz"), _s("22 kHz"), _s("44 kHz"), _s("48 kHz"), 0 }; static const int outputRateValues[] = { 0, 8000, 11025, 22050, 44100, 48000, -1 }; @@ -85,15 +86,15 @@ OptionsDialog::OptionsDialog(const Common::String &domain, const Common::String } const char *OptionsDialog::_subModeDesc[] = { - "Speech Only", - "Speech and Subtitles", - "Subtitles Only" + _s("Speech Only"), + _s("Speech and Subtitles"), + _s("Subtitles Only") }; const char *OptionsDialog::_lowresSubModeDesc[] = { - "Speech Only", - "Speech & Subs", - "Subtitles Only" + _s("Speech Only"), + _s("Speech & Subs"), + _s("Subtitles Only") }; void OptionsDialog::init() { @@ -222,7 +223,7 @@ void OptionsDialog::open() { Common::String soundFont(ConfMan.get("soundfont", _domain)); if (soundFont.empty() || !ConfMan.hasKey("soundfont", _domain)) { - _soundFont->setLabel("None"); + _soundFont->setLabel(_("None")); _soundFontClearButton->setEnabled(false); } else { _soundFont->setLabel(soundFont); @@ -267,7 +268,7 @@ void OptionsDialog::open() { int speed; int sliderMaxValue = _subSpeedSlider->getMaxValue(); _subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); - _subToggleButton->setLabel(_subModeDesc[_subMode]); + _subToggleButton->setLabel(_(_subModeDesc[_subMode])); // Engines that reuse the subtitle speed widget set their own max value. // Scale the config value accordingly (see addSubtitleControls) @@ -378,7 +379,7 @@ void OptionsDialog::close() { ConfMan.setInt("midi_gain", _midiGainSlider->getValue(), _domain); Common::String soundFont(_soundFont->getLabel()); - if (!soundFont.empty() && (soundFont != "None")) + if (!soundFont.empty() && (soundFont != _("None"))) ConfMan.set("soundfont", soundFont, _domain); else ConfMan.removeKey("soundfont", _domain); @@ -465,7 +466,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data else _subMode = 0; - _subToggleButton->setLabel(g_system->getOverlayWidth() > 320 ? _subModeDesc[_subMode] : _lowresSubModeDesc[_subMode]); + _subToggleButton->setLabel(g_system->getOverlayWidth() > 320 ? _(_subModeDesc[_subMode]) : _(_lowresSubModeDesc[_subMode])); _subToggleButton->draw(); _subSpeedDesc->draw(); _subSpeedSlider->draw(); @@ -476,7 +477,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data _subSpeedLabel->draw(); break; case kClearSoundFontCmd: - _soundFont->setLabel("None"); + _soundFont->setLabel(_("None")); _soundFontClearButton->setEnabled(false); draw(); break; @@ -522,7 +523,7 @@ void OptionsDialog::setMIDISettingsState(bool enabled) { _soundFontButton->setEnabled(enabled); _soundFont->setEnabled(enabled); - if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != "None")) + if (enabled && !_soundFont->getLabel().empty() && (_soundFont->getLabel() != _("None"))) _soundFontClearButton->setEnabled(enabled); else _soundFontClearButton->setEnabled(false); @@ -591,64 +592,64 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes(); // The GFX mode popup - _gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", "Graphics mode:"); + _gfxPopUpDesc = new StaticTextWidget(boss, prefix + "grModePopupDesc", _("Graphics mode:")); _gfxPopUp = new PopUpWidget(boss, prefix + "grModePopup"); - _gfxPopUp->appendEntry("<default>"); + _gfxPopUp->appendEntry(_("<default>")); _gfxPopUp->appendEntry(""); while (gm->name) { - _gfxPopUp->appendEntry(gm->description, gm->id); + _gfxPopUp->appendEntry(_(gm->description), gm->id); gm++; } // RenderMode popup - _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", "Render mode:"); + _renderModePopUpDesc = new StaticTextWidget(boss, prefix + "grRenderPopupDesc", _("Render mode:")); _renderModePopUp = new PopUpWidget(boss, prefix + "grRenderPopup"); - _renderModePopUp->appendEntry("<default>", Common::kRenderDefault); + _renderModePopUp->appendEntry(_("<default>"), Common::kRenderDefault); _renderModePopUp->appendEntry(""); const Common::RenderModeDescription *rm = Common::g_renderModes; for (; rm->code; ++rm) { - _renderModePopUp->appendEntry(rm->description, rm->id); + _renderModePopUp->appendEntry(_(rm->description), rm->id); } // Fullscreen checkbox - _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", "Fullscreen mode", 0, 0); + _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode"), 0, 0); // Aspect ratio checkbox - _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", "Aspect ratio correction", 0, 0); + _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction"), 0, 0); _enableGraphicSettings = true; } void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &prefix) { // The MIDI mode popup & a label - _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", "Music driver:"); + _midiPopUpDesc = new StaticTextWidget(boss, prefix + "auMidiPopupDesc", _("Music driver:")); _midiPopUp = new PopUpWidget(boss, prefix + "auMidiPopup"); // Populate it const MidiDriverDescription *md = MidiDriver::getAvailableMidiDrivers(); while (md->name) { - _midiPopUp->appendEntry(md->description, md->id); + _midiPopUp->appendEntry(_(md->description), md->id); md++; } // The OPL emulator popup & a label - _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", "AdLib emulator:"); + _oplPopUpDesc = new StaticTextWidget(boss, prefix + "auOPLPopupDesc", _("AdLib emulator:")); _oplPopUp = new PopUpWidget(boss, prefix + "auOPLPopup"); // Populate it const OPL::Config::EmulatorDescription *ed = OPL::Config::getAvailable(); while (ed->name) { - _oplPopUp->appendEntry(ed->description, ed->id); + _oplPopUp->appendEntry(_(ed->description), ed->id); ++ed; } // Sample rate settings - _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", "Output rate:"); + _outputRatePopUpDesc = new StaticTextWidget(boss, prefix + "auSampleRatePopupDesc", _("Output rate:")); _outputRatePopUp = new PopUpWidget(boss, prefix + "auSampleRatePopup"); for (int i = 0; outputRateLabels[i]; i++) { - _outputRatePopUp->appendEntry(outputRateLabels[i], outputRateValues[i]); + _outputRatePopUp->appendEntry(_(outputRateLabels[i]), outputRateValues[i]); } _enableAudioSettings = true; @@ -656,21 +657,21 @@ void OptionsDialog::addAudioControls(GuiObject *boss, const Common::String &pref void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefix) { // SoundFont - _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", "SoundFont:", kChooseSoundFontCmd, 0); - _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", "None"); + _soundFontButton = new ButtonWidget(boss, prefix + "mcFontButton", _("SoundFont:"), kChooseSoundFontCmd, 0); + _soundFont = new StaticTextWidget(boss, prefix + "mcFontPath", _("None")); _soundFontClearButton = new ButtonWidget(boss, prefix + "mcFontClearButton", "C", kClearSoundFontCmd, 0); // Multi midi setting - _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", "Mixed AdLib/MIDI mode", 0, 0); + _multiMidiCheckbox = new CheckboxWidget(boss, prefix + "mcMixedCheckbox", _("Mixed AdLib/MIDI mode"), 0, 0); // Native mt32 setting - _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", "True Roland MT-32 (disable GM emulation)", 0, 0); + _mt32Checkbox = new CheckboxWidget(boss, prefix + "mcMt32Checkbox", _("True Roland MT-32 (disable GM emulation)"), 0, 0); // GS Extensions setting - _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", "Enable Roland GS Mode", 0, 0); + _enableGSCheckbox = new CheckboxWidget(boss, prefix + "mcGSCheckbox", _("Enable Roland GS Mode"), 0, 0); // MIDI gain setting (FluidSynth uses this) - _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", "MIDI gain:"); + _midiGainDesc = new StaticTextWidget(boss, prefix + "mcMidiGainText", _("MIDI gain:")); _midiGainSlider = new SliderWidget(boss, prefix + "mcMidiGainSlider", kMidiGainChanged); _midiGainSlider->setMinValue(0); _midiGainSlider->setMaxValue(1000); @@ -683,11 +684,11 @@ void OptionsDialog::addMIDIControls(GuiObject *boss, const Common::String &prefi // make use of the widgets. The launcher range is 0-255. SCUMM's 0-9 void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &prefix, int maxSliderVal) { - _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", "Text and Speech:"); + _subToggleDesc = new StaticTextWidget(boss, prefix + "subToggleDesc", _("Text and Speech:")); _subToggleButton = new ButtonWidget(boss, prefix + "subToggleButton", "", kSubtitleToggle, 0); // Subtitle speed - _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", "Subtitle speed:"); + _subSpeedDesc = new StaticTextWidget(boss, prefix + "subSubtitleSpeedDesc", _("Subtitle speed:")); _subSpeedSlider = new SliderWidget(boss, prefix + "subSubtitleSpeedSlider", kSubtitleSpeedChanged); _subSpeedLabel = new StaticTextWidget(boss, prefix + "subSubtitleSpeedLabel", "100%"); _subSpeedSlider->setMinValue(0); _subSpeedSlider->setMaxValue(maxSliderVal); @@ -699,24 +700,24 @@ void OptionsDialog::addSubtitleControls(GuiObject *boss, const Common::String &p void OptionsDialog::addVolumeControls(GuiObject *boss, const Common::String &prefix) { // Volume controllers - _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", "Music volume:"); + _musicVolumeDesc = new StaticTextWidget(boss, prefix + "vcMusicText", _("Music volume:")); _musicVolumeSlider = new SliderWidget(boss, prefix + "vcMusicSlider", kMusicVolumeChanged); _musicVolumeLabel = new StaticTextWidget(boss, prefix + "vcMusicLabel", "100%"); _musicVolumeSlider->setMinValue(0); _musicVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _musicVolumeLabel->setFlags(WIDGET_CLEARBG); - _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", "Mute All", kMuteAllChanged, 0); + _muteCheckbox = new CheckboxWidget(boss, prefix + "vcMuteCheckbox", _("Mute All"), kMuteAllChanged, 0); - _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", "SFX volume:"); + _sfxVolumeDesc = new StaticTextWidget(boss, prefix + "vcSfxText", _("SFX volume:")); _sfxVolumeSlider = new SliderWidget(boss, prefix + "vcSfxSlider", kSfxVolumeChanged); _sfxVolumeLabel = new StaticTextWidget(boss, prefix + "vcSfxLabel", "100%"); _sfxVolumeSlider->setMinValue(0); _sfxVolumeSlider->setMaxValue(Audio::Mixer::kMaxMixerVolume); _sfxVolumeLabel->setFlags(WIDGET_CLEARBG); - _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , "Speech volume:"); + _speechVolumeDesc = new StaticTextWidget(boss, prefix + "vcSpeechText" , _("Speech volume:")); _speechVolumeSlider = new SliderWidget(boss, prefix + "vcSpeechSlider", kSpeechVolumeChanged); _speechVolumeLabel = new StaticTextWidget(boss, prefix + "vcSpeechLabel", "100%"); _speechVolumeSlider->setMinValue(0); @@ -745,7 +746,7 @@ int OptionsDialog::getSubtitleMode(bool subtitles, bool speech_mute) { void OptionsDialog::reflowLayout() { if (_graphicsTabId != -1 && _tabWidget) - _tabWidget->setTabTitle(_graphicsTabId, g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _tabWidget->setTabTitle(_graphicsTabId, g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); Dialog::reflowLayout(); } @@ -762,17 +763,17 @@ GlobalOptionsDialog::GlobalOptionsDialog() // // 1) The graphics tab // - _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? "Graphics" : "GFX"); + _graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX")); addGraphicControls(tab, "GlobalOptions_Graphics."); // // 2) The audio tab // - tab->addTab("Audio"); + tab->addTab(_("Audio")); addAudioControls(tab, "GlobalOptions_Audio."); addSubtitleControls(tab, "GlobalOptions_Audio."); - tab->addTab("Volume"); + tab->addTab(_("Volume")); addVolumeControls(tab, "GlobalOptions_Volume."); // TODO: cd drive setting @@ -780,67 +781,85 @@ GlobalOptionsDialog::GlobalOptionsDialog() // // 3) The MIDI tab // - tab->addTab("MIDI"); + tab->addTab(_("MIDI")); addMIDIControls(tab, "GlobalOptions_MIDI."); // // 4) The miscellaneous tab // - tab->addTab("Paths"); + tab->addTab(_("Paths")); #if !( defined(__DC__) || defined(__GP32__) ) // These two buttons have to be extra wide, or the text will be // truncated in the small version of the GUI. // Save game path - new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", "Save Path: ", kChooseSaveDirCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Paths.SaveButton", _("Save Path: "), kChooseSaveDirCmd, 0); _savePath = new StaticTextWidget(tab, "GlobalOptions_Paths.SavePath", "/foo/bar"); - new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", "Theme Path:", kChooseThemeDirCmd, 0); - _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.ThemeButton", _("Theme Path:"), kChooseThemeDirCmd, 0); + _themePath = new StaticTextWidget(tab, "GlobalOptions_Paths.ThemePath", _("None")); - new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", "Extra Path:", kChooseExtraDirCmd, 0); - _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.ExtraButton", _("Extra Path:"), kChooseExtraDirCmd, 0); + _extraPath = new StaticTextWidget(tab, "GlobalOptions_Paths.ExtraPath", _("None")); #ifdef DYNAMIC_MODULES - new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", "Plugins Path:", kChoosePluginsDirCmd, 0); - _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", "None"); + new ButtonWidget(tab, "GlobalOptions_Paths.PluginsButton", _("Plugins Path:"), kChoosePluginsDirCmd, 0); + _pluginsPath = new StaticTextWidget(tab, "GlobalOptions_Paths.PluginsPath", _("None")); #endif #endif - tab->addTab("Misc"); + tab->addTab(_("Misc")); - new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", "Theme:", kChooseThemeCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.ThemeButton", _("Theme:"), kChooseThemeCmd, 0); _curTheme = new StaticTextWidget(tab, "GlobalOptions_Misc.CurTheme", g_gui.theme()->getThemeName()); - _rendererPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.RendererPopupDesc", "GUI Renderer:"); + _rendererPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.RendererPopupDesc", _("GUI Renderer:")); _rendererPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.RendererPopup"); for (uint i = 1; i < GUI::ThemeEngine::_rendererModesSize; ++i) - _rendererPopUp->appendEntry(GUI::ThemeEngine::_rendererModes[i].name, GUI::ThemeEngine::_rendererModes[i].mode); + _rendererPopUp->appendEntry(_(GUI::ThemeEngine::_rendererModes[i].name), GUI::ThemeEngine::_rendererModes[i].mode); - _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", "Autosave:"); + _autosavePeriodPopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopupDesc", _("Autosave:")); _autosavePeriodPopUp = new PopUpWidget(tab, "GlobalOptions_Misc.AutosavePeriodPopup"); for (int i = 0; savePeriodLabels[i]; i++) { - _autosavePeriodPopUp->appendEntry(savePeriodLabels[i], savePeriodValues[i]); + _autosavePeriodPopUp->appendEntry(_(savePeriodLabels[i]), savePeriodValues[i]); } #ifdef SMALL_SCREEN_DEVICE - new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", "Keys", kChooseKeyMappingCmd, 0); + new ButtonWidget(tab, "GlobalOptions_Misc.KeysButton", _("Keys"), kChooseKeyMappingCmd, 0); #endif // TODO: joystick setting +#ifdef TRANSLATION + _guiLanguagePopUpDesc = new StaticTextWidget(tab, "GlobalOptions_Misc.GuiLanguagePopupDesc", _("Language:")); + _guiLanguagePopUp = new PopUpWidget(tab, "GlobalOptions_Misc.GuiLanguagePopup"); +#ifdef DETECTLANG + _guiLanguagePopUp->appendEntry(_("<default>"), Common::kTranslationAutodetectId); +#endif // DETECTLANG + _guiLanguagePopUp->appendEntry(_("English"), Common::kTranslationBuiltinId); + _guiLanguagePopUp->appendEntry("", 0); + Common::TLangArray languages = TransMan.getSupportedLanguages(); + Common::TLangArray::iterator lang = languages.begin(); + while (lang != languages.end()) { + _guiLanguagePopUp->appendEntry(lang->name, lang->id); + lang++; + } + _guiLanguagePopUp->setSelectedTag(TransMan.parseLanguage(ConfMan.get("gui_language").c_str())); + +#endif // TRANSLATION + // Activate the first tab tab->setActiveTab(0); _tabWidget = tab; // Add OK & Cancel buttons - new ButtonWidget(this, "GlobalOptions.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "GlobalOptions.Ok", "OK", kOKCmd, 0); + new ButtonWidget(this, "GlobalOptions.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "GlobalOptions.Ok", _("OK"), kOKCmd, 0); #ifdef SMALL_SCREEN_DEVICE _keysDialog = new KeysDialog(); @@ -863,19 +882,19 @@ void GlobalOptionsDialog::open() { Common::String extraPath(ConfMan.get("extrapath", _domain)); if (savePath.empty() || !ConfMan.hasKey("savepath", _domain)) { - _savePath->setLabel("None"); + _savePath->setLabel(_("None")); } else { _savePath->setLabel(savePath); } if (themePath.empty() || !ConfMan.hasKey("themepath", _domain)) { - _themePath->setLabel("None"); + _themePath->setLabel(_("None")); } else { _themePath->setLabel(themePath); } if (extraPath.empty() || !ConfMan.hasKey("extrapath", _domain)) { - _extraPath->setLabel("None"); + _extraPath->setLabel(_("None")); } else { _extraPath->setLabel(extraPath); } @@ -883,7 +902,7 @@ void GlobalOptionsDialog::open() { #ifdef DYNAMIC_MODULES Common::String pluginsPath(ConfMan.get("pluginspath", _domain)); if (pluginsPath.empty() || !ConfMan.hasKey("pluginspath", _domain)) { - _pluginsPath->setLabel("None"); + _pluginsPath->setLabel(_("None")); } else { _pluginsPath->setLabel(pluginsPath); } @@ -907,24 +926,24 @@ void GlobalOptionsDialog::open() { void GlobalOptionsDialog::close() { if (getResult()) { Common::String savePath(_savePath->getLabel()); - if (!savePath.empty() && (savePath != "None")) + if (!savePath.empty() && (savePath != _("None"))) ConfMan.set("savepath", savePath, _domain); Common::String themePath(_themePath->getLabel()); - if (!themePath.empty() && (themePath != "None")) + if (!themePath.empty() && (themePath != _("None"))) ConfMan.set("themepath", themePath, _domain); else ConfMan.removeKey("themepath", _domain); Common::String extraPath(_extraPath->getLabel()); - if (!extraPath.empty() && (extraPath != "None")) + if (!extraPath.empty() && (extraPath != _("None"))) ConfMan.set("extrapath", extraPath, _domain); else ConfMan.removeKey("extrapath", _domain); #ifdef DYNAMIC_MODULES Common::String pluginsPath(_pluginsPath->getLabel()); - if (!pluginsPath.empty() && (pluginsPath != "None")) + if (!pluginsPath.empty() && (pluginsPath != _("None"))) ConfMan.set("pluginspath", pluginsPath, _domain); else ConfMan.removeKey("pluginspath", _domain); @@ -940,6 +959,28 @@ void GlobalOptionsDialog::close() { g_gui.loadNewTheme(g_gui.theme()->getThemeId(), selected); ConfMan.set("gui_renderer", cfg, _domain); } +#ifdef TRANSLATION + Common::String oldLang = ConfMan.get("gui_language"); + int selLang = _guiLanguagePopUp->getSelectedTag(); + + ConfMan.set("gui_language", TransMan.getLangById(selLang)); + + Common::String newLang = ConfMan.get("gui_language").c_str(); + if (newLang != oldLang) { +#if 0 + // Activate the selected language + TransMan.setLanguage(selLang); + + // FIXME: Actually, any changes (including the theme change) should + // only become active *after* the options dialog has closed. + g_gui.loadNewTheme(g_gui.theme()->getThemeId(), ThemeEngine::kGfxDisabled, true); +#else + MessageDialog error(_("You have to restart ScummVM to take the effect.")); + error.runModal(); +#endif + } +#endif // TRANSLATION + } OptionsDialog::close(); } @@ -947,14 +988,14 @@ void GlobalOptionsDialog::close() { void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) { switch (cmd) { case kChooseSaveDirCmd: { - BrowserDialog browser("Select directory for savegames", true); + BrowserDialog browser(_("Select directory for savegames"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); if (dir.isWritable()) { _savePath->setLabel(dir.getPath()); } else { - MessageDialog error("The chosen directory cannot be written to. Please select another one."); + MessageDialog error(_("The chosen directory cannot be written to. Please select another one.")); error.runModal(); return; } @@ -963,7 +1004,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; } case kChooseThemeDirCmd: { - BrowserDialog browser("Select directory for GUI themes", true); + BrowserDialog browser(_("Select directory for GUI themes"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -973,7 +1014,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; } case kChooseExtraDirCmd: { - BrowserDialog browser("Select directory for extra files", true); + BrowserDialog browser(_("Select directory for extra files"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -984,7 +1025,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #ifdef DYNAMIC_MODULES case kChoosePluginsDirCmd: { - BrowserDialog browser("Select directory for plugins", true); + BrowserDialog browser(_("Select directory for plugins"), true); if (browser.runModal() > 0) { // User made his choice... Common::FSNode dir(browser.getResult()); @@ -995,13 +1036,13 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #endif case kChooseSoundFontCmd: { - BrowserDialog browser("Select SoundFont", false); + BrowserDialog browser(_("Select SoundFont"), false); if (browser.runModal() > 0) { // User made his choice... Common::FSNode file(browser.getResult()); _soundFont->setLabel(file.getPath()); - if (!file.getPath().empty() && (file.getPath() != "None")) + if (!file.getPath().empty() && (file.getPath() != _("None"))) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); diff --git a/gui/options.h b/gui/options.h index 956f78c18f..de25bfc998 100644 --- a/gui/options.h +++ b/gui/options.h @@ -184,6 +184,8 @@ protected: PopUpWidget *_rendererPopUp; StaticTextWidget *_autosavePeriodPopUpDesc; PopUpWidget *_autosavePeriodPopUp; + StaticTextWidget *_guiLanguagePopUpDesc; + PopUpWidget *_guiLanguagePopUp; }; } // End of namespace GUI diff --git a/gui/saveload.cpp b/gui/saveload.cpp index 8ec4dc4133..85bbd252c7 100644 --- a/gui/saveload.cpp +++ b/gui/saveload.cpp @@ -23,6 +23,7 @@ */ #include "common/config-manager.h" +#include "common/translation.h" #include "gui/ListWidget.h" #include "gui/message.h" @@ -56,16 +57,16 @@ SaveLoadChooser::SaveLoadChooser(const String &title, const String &buttonLabel) _gfxWidget = new GUI::GraphicsWidget(this, 0, 0, 10, 10); - _date = new StaticTextWidget(this, 0, 0, 10, 10, "No date saved", Graphics::kTextAlignCenter); - _time = new StaticTextWidget(this, 0, 0, 10, 10, "No time saved", Graphics::kTextAlignCenter); - _playtime = new StaticTextWidget(this, 0, 0, 10, 10, "No playtime saved", Graphics::kTextAlignCenter); + _date = new StaticTextWidget(this, 0, 0, 10, 10, _("No date saved"), Graphics::kTextAlignCenter); + _time = new StaticTextWidget(this, 0, 0, 10, 10, _("No time saved"), Graphics::kTextAlignCenter); + _playtime = new StaticTextWidget(this, 0, 0, 10, 10, _("No playtime saved"), Graphics::kTextAlignCenter); // Buttons - new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", "Cancel", kCloseCmd, 0); + new GUI::ButtonWidget(this, "SaveLoadChooser.Cancel", _("Cancel"), kCloseCmd, 0); _chooseButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Choose", buttonLabel, kChooseCmd, 0); _chooseButton->setEnabled(false); - _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", "Delete", kDelCmd, 0); + _deleteButton = new GUI::ButtonWidget(this, "SaveLoadChooser.Delete", _("Delete"), kDelCmd, 0); _deleteButton->setEnabled(false); _delSupport = _metaInfoSupport = _thumbnailSupport = false; @@ -152,8 +153,8 @@ void SaveLoadChooser::handleCommand(CommandSender *sender, uint32 cmd, uint32 da break; case kDelCmd: if (selItem >= 0 && _delSupport) { - MessageDialog alert("Do you really want to delete this savegame?", - "Delete", "Cancel"); + MessageDialog alert(_("Do you really want to delete this savegame?"), + _("Delete"), _("Cancel")); if (alert.runModal() == GUI::kMessageOK) { (*_plugin)->removeSaveState(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str())); @@ -237,9 +238,9 @@ void SaveLoadChooser::updateSelection(bool redraw) { bool startEditMode = _list->isEditable(); _gfxWidget->setGfx(-1, -1, _fillR, _fillG, _fillB); - _date->setLabel("No date saved"); - _time->setLabel("No time saved"); - _playtime->setLabel("No playtime saved"); + _date->setLabel(_("No date saved")); + _time->setLabel(_("No time saved")); + _playtime->setLabel(_("No playtime saved")); if (selItem >= 0 && !_list->getSelectedString().empty() && _metaInfoSupport) { SaveStateDescriptor desc = (*_plugin)->querySaveMetaInfos(_target.c_str(), atoi(_saveList[selItem].save_slot().c_str())); @@ -261,15 +262,15 @@ void SaveLoadChooser::updateSelection(bool redraw) { if (_saveDateSupport) { if (desc.contains("save_date")) - _date->setLabel("Date: " + desc.getVal("save_date")); + _date->setLabel(_("Date: ") + desc.getVal("save_date")); if (desc.contains("save_time")) - _time->setLabel("Time: " + desc.getVal("save_time")); + _time->setLabel(_("Time: ") + desc.getVal("save_time")); } if (_playTimeSupport) { if (desc.contains("play_time")) - _playtime->setLabel("Playtime: " + desc.getVal("play_time")); + _playtime->setLabel(_("Playtime: ") + desc.getVal("play_time")); } } @@ -282,7 +283,7 @@ void SaveLoadChooser::updateSelection(bool redraw) { if (startEditMode) { _list->startEditMode(); - if (_chooseButton->isEnabled() && _list->getSelectedString() == "Untitled savestate" && + if (_chooseButton->isEnabled() && _list->getSelectedString() == _("Untitled savestate") && _list->getSelectionColor() == ThemeEngine::kFontColorAlternate) { _list->setEditString(""); _list->setEditColor(ThemeEngine::kFontColorNormal); @@ -349,7 +350,7 @@ void SaveLoadChooser::updateSaveList() { Common::String trimmedDescription = description; trimmedDescription.trim(); if (trimmedDescription.empty()) { - description = "Untitled savestate"; + description = _("Untitled savestate"); colors.push_back(ThemeEngine::kFontColorAlternate); } else { colors.push_back(ThemeEngine::kFontColorNormal); diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp index 5d0e24394f..43a9ed8d0a 100644 --- a/gui/themebrowser.cpp +++ b/gui/themebrowser.cpp @@ -26,6 +26,8 @@ #include "gui/ListWidget.h" #include "gui/widget.h" +#include "common/translation.h" + namespace GUI { enum { @@ -41,7 +43,7 @@ enum { ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _fileList = 0; - new StaticTextWidget(this, "Browser.Headline", "Select a Theme"); + new StaticTextWidget(this, "Browser.Headline", _("Select a Theme")); // Add file list _fileList = new ListWidget(this, "Browser.List"); @@ -51,8 +53,8 @@ ThemeBrowser::ThemeBrowser() : Dialog("Browser") { _backgroundType = GUI::ThemeEngine::kDialogBackgroundPlain; // Buttons - new ButtonWidget(this, "Browser.Cancel", "Cancel", kCloseCmd, 0); - new ButtonWidget(this, "Browser.Choose", "Choose", kChooseCmd, 0); + new ButtonWidget(this, "Browser.Cancel", _("Cancel"), kCloseCmd, 0); + new ButtonWidget(this, "Browser.Choose", _("Choose"), kChooseCmd, 0); } void ThemeBrowser::open() { diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip Binary files differindex 67cbbf7990..1a4481376d 100644 --- a/gui/themes/scummclassic.zip +++ b/gui/themes/scummclassic.zip diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 14f19a7151..b7b07f8845 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -406,6 +406,14 @@ type = 'PopUp' /> </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'GuiLanguagePopupDesc' + type = 'OptionsLabel' + /> + <widget name = 'GuiLanguagePopup' + type = 'PopUp' + /> + </layout> <widget name='KeysButton' type='Button' /> diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip Binary files differindex b3dc16b67e..64e9a633ff 100644 --- a/gui/themes/scummmodern.zip +++ b/gui/themes/scummmodern.zip diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index 25add37462..699d59b0be 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -419,6 +419,14 @@ type = 'PopUp' /> </layout> + <layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'> + <widget name = 'GuiLanguagePopupDesc' + type = 'OptionsLabel' + /> + <widget name = 'GuiLanguagePopup' + type = 'PopUp' + /> + </layout> <widget name='KeysButton' type='Button' /> diff --git a/po/POTFILES b/po/POTFILES new file mode 100755 index 0000000000..a8f672d01c --- /dev/null +++ b/po/POTFILES @@ -0,0 +1,24 @@ +#TODO: help_string & usage_string: + +gui/about.cpp +gui/browser.cpp +gui/error.cpp +gui/GuiManager.cpp +gui/KeysDialog.cpp +gui/launcher.cpp +gui/massadd.cpp +gui/options.cpp +gui/saveload.cpp +gui/themebrowser.cpp +gui/ThemeEngine.cpp + +base/main.cpp + +common/error.cpp + +engines/dialogs.cpp + +sound/mididrv.cpp + + +#TODO: backends engines tools? diff --git a/po/hu_HU.po b/po/hu_HU.po new file mode 100644 index 0000000000..bdc4371212 --- /dev/null +++ b/po/hu_HU.po @@ -0,0 +1,321 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2010-06-08 13:39-0100\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +# LANGUAGE translation for ScummVM. +# Copyright (C) 2009 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Alex Bevilacqua <alexbevi@gmail.com>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM VERSION\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sourceforge.net\n" +"POT-Creation-Date: 2009-11-25 07:10-0500\n" +"PO-Revision-Date: 2009-11-25 07:42-0500\n" +"Last-Translator: Alex Bevilacqua <alexbevi@gmail.com>\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: gui/options.cpp:71 +msgid "Never" +msgstr "Soha" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "5 percenkйnt" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "10 percenkйnt" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "15 percenkйnt" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "30 percenkйnt" + +#: gui/options.cpp:73 gui/options.cpp:598 gui/options.cpp:608 +#: gui/options.cpp:838 +msgid "<default>" +msgstr "<alapйrtelmezett>" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "Csak a beszйd" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "Beszйd йs a Feliratok" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "Csak feliratok" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "Beszйd s Feliratok" + +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:882 gui/options.cpp:888 +#: gui/options.cpp:894 gui/options.cpp:902 gui/options.cpp:926 +#: gui/options.cpp:930 gui/options.cpp:936 gui/options.cpp:943 +#: gui/options.cpp:1049 +msgid "None" +msgstr "Semmi" + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "Grafikus mуd:" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "Renderelйsi mуd:" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "Teljes kйperny s mуd:" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "Aspect adag korrekciу" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "Zenei vezet :" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "AdLib vezet :" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "Kimeneti teljesнtmйny:" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "Vegyes AdLib/MIDI mуd" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Igaz Roland MT-32 (megbйnнt GM emulбciу)" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "Kйpessй Roland GS Mode" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "MIDI nyeresйg:" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "Szцveg йs beszйd:" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "Felirat sebessйg:" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "Zene mennyisйg:" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "Muta Цsszes" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "SFX mennyisйge" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "Beszйd mennyisйg:" + +#: gui/options.cpp:743 +msgid "" +"Wrong configuration: Both subtitles and speech are off. Assuming subtitles " +"only" +msgstr "" + +#: gui/options.cpp:749 +msgid "Graphics" +msgstr "Grafikбval" + +#: gui/options.cpp:749 +msgid "GFX" +msgstr "" + +#: gui/options.cpp:772 +msgid "Audio" +msgstr "Hang" + +#: gui/options.cpp:776 +msgid "Volume" +msgstr "Volumene" + +#: gui/options.cpp:784 +msgid "MIDI" +msgstr "" + +#: gui/options.cpp:790 +msgid "Paths" +msgstr "Цsvйnyek" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "" + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "" + +#: gui/options.cpp:803 +msgid "Extra Path:" +msgstr "Extra Ъtvonal:" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "Tйma:" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "Lekйpez eszkцz GUI:" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "Automatikus mentйs:" + +#: gui/options.cpp:832 +msgid "Keys" +msgstr "Kulcsok" + +#: gui/options.cpp:840 +msgid "Angol" +msgstr "" + +#: gui/options.cpp:858 +msgid "Szakнtani" +msgstr "" + +#: gui/options.cpp:859 +msgid "OK" +msgstr "Igen" + +#: gui/options.cpp:995 +msgid "Select directory for savegames" +msgstr "" + +#: gui/options.cpp:1002 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" + +#: gui/options.cpp:1011 +msgid "Select directory for GUI themes" +msgstr "" + +#: gui/options.cpp:1021 +msgid "Select directory for extra files" +msgstr "" + +#: gui/options.cpp:1032 +msgid "Select directory for plugins" +msgstr "" + +#: gui/options.cpp:1043 +msgid "Select SoundFont" +msgstr "" + +#: gui/GuiManager.cpp:73 +msgid "Failed to load any GUI theme, aborting" +msgstr "" + +#: base/main.cpp:98 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "" + +#: base/main.cpp:99 +msgid " Looking for a plugin supporting this gameid... " +msgstr "" + +#: base/main.cpp:103 +msgid "failed\n" +msgstr "" + +#: base/main.cpp:104 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" + +#: base/main.cpp:111 +#, c-format +msgid " Starting '%s'\n" +msgstr "" + +#: base/main.cpp:140 +msgid "Invalid game path" +msgstr "" + +#: base/main.cpp:143 +msgid "Unable to locate game data" +msgstr "" + +#: base/main.cpp:146 +msgid "Unknown error" +msgstr "" + +#: base/main.cpp:149 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr ""
\ No newline at end of file diff --git a/po/module.mk b/po/module.mk new file mode 100755 index 0000000000..88dde53e87 --- /dev/null +++ b/po/module.mk @@ -0,0 +1,39 @@ +POTFILE := po/scummvm.pot +POFILES := $(wildcard po/*.po) + +updatepot: + xgettext -f po/POTFILES -d scummvm --c++ -k_ -k_t -k_s -o po/scummvm.pot \ + "--copyright-holder=ScummVM Team" --package-name=ScummVM \ + --package-version=$(VERSION) --msgid-bugs-address=scummvm-devel@lists.sf.net -o $(POTFILE)_ + + sed -e 's/SOME DESCRIPTIVE TITLE/LANGUAGE translation for ScummVM/' \ + -e 's/UTF-8/CHARSET/' -e 's/PACKAGE/ScummVM/' $(POTFILE)_ > $(POTFILE).new + + rm $(POTFILE)_ + if test -f $(POTFILE); then \ + sed -f po/remove-potcdate.sed < $(POTFILE) > $(POTFILE).1 && \ + sed -f po/remove-potcdate.sed < $(POTFILE).new > $(POTFILE).2 && \ + if cmp $(POTFILE).1 $(POTFILE).2 >/dev/null 2>&1; then \ + rm -f $(POTFILE).new; \ + else \ + rm -f $(POTFILE) && \ + mv -f $(POTFILE).new $(POTFILE); \ + fi; \ + rm -f $(POTFILE).1 $(POTFILE).2; \ + else \ + mv -f $(POTFILE).new $(POTFILE); \ + fi; + +po/%.po: $(POTFILE) + msgmerge $@ $(POTFILE) -o $@.new + if cmp $@ $@.new >/dev/null 2>&1; then \ + rm -f $@.new; \ + else \ + mv -f $@.new $@; \ + fi; + +update-translations: updatepot $(POFILES) + @$(foreach file, $(POFILES), echo -n $(notdir $(basename $(file)))": ";msgfmt --statistic $(file);) + @rm -f messages.mo + +.PHONY: updatepot update-translations diff --git a/po/remove-potcdate.sed b/po/remove-potcdate.sed new file mode 100755 index 0000000000..2436c49e78 --- /dev/null +++ b/po/remove-potcdate.sed @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100644 index 0000000000..684226b1cc --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,784 @@ +# Russian translation for ScummVM. +# Copyright (C) 2010 ScummVM +# This file is distributed under the same license as the ScummVM package. +# Eugene Sandulenko <sev@scummvm.org>, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: ScummVM VERSION\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"PO-Revision-Date: 2010-06-08 08:52-0100\n" +"Last-Translator: Eugene Sandulenko <sev@scummvm.org>\n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=cp1251\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%" +"10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: gui/about.cpp:117 +msgid "C2(built on " +msgstr "C2(собран " + +#: gui/about.cpp:125 +msgid "C1Features compiled in:" +msgstr "C1Включенные в билд опции:" + +#: gui/about.cpp:132 +msgid "C1Available engines:" +msgstr "C1Доступные движки:" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "Вверх" + +#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 +#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 +#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 +#: gui/options.cpp:861 +msgid "Cancel" +msgstr "Отмена" + +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "Выбрать" + +#: gui/GuiManager.cpp:75 +msgid "Failed to load any GUI theme, aborting" +msgstr "Не удалось загрузить тему GUI, прекращаю работу" + +#: gui/GuiManager.cpp:98 +msgid "Close" +msgstr "Закрыть" + +#: gui/GuiManager.cpp:101 +msgid "Mouse click" +msgstr "Клик мышью" + +#: gui/GuiManager.cpp:104 base/main.cpp:284 +msgid "Display keyboard" +msgstr "Показать клавиатуру" + +#: gui/GuiManager.cpp:107 base/main.cpp:287 +msgid "Remap keys" +msgstr "Переназначить клавиши" + +#: gui/KeysDialog.cpp:43 +msgid "Map" +msgstr "Назначить" + +#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 +#: engines/dialogs.cpp:301 gui/options.cpp:862 +msgid "OK" +msgstr "OK" + +#: gui/KeysDialog.cpp:51 +msgid "Select an action and click 'Map'" +msgstr "Выберите действие и кликните 'Назначить'" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : %s" +msgstr "Назначенная клавиша : %s" + +#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#, c-format +msgid "Associated key : none" +msgstr "Назначенная клавиша : нет" + +#: gui/KeysDialog.cpp:92 +msgid "Please select an action" +msgstr "Пожалуйста, выберите действие" + +#: gui/KeysDialog.cpp:108 +msgid "Press the key to associate" +msgstr "Нажмите клавишу для назначения" + +#: gui/KeysDialog.cpp:147 +msgid "Choose an action to map" +msgstr "Выберите действие для назначения" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "Игра" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "ID:" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "Название:" + +#: gui/launcher.cpp:181 gui/options.cpp:839 +msgid "Language:" +msgstr "Язык:" + +#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 +#: sound/mididrv.cpp:38 +msgid "<default>" +msgstr "<по умолчанию>" + +#: gui/launcher.cpp:191 +msgid "Platform:" +msgstr "Платформа:" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "Graphics" +msgstr "Графика" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "GFX" +msgstr "Грф" + +#: gui/launcher.cpp:205 +msgid "Override global graphic settings" +msgstr "Перекрыть глобальные установки графики" + +#: gui/launcher.cpp:212 gui/options.cpp:772 +msgid "Audio" +msgstr "Аудио" + +#: gui/launcher.cpp:214 +msgid "Override global audio settings" +msgstr "Перекрыть глобальные установки аудио" + +#: gui/launcher.cpp:222 gui/options.cpp:776 +msgid "Volume" +msgstr "Громкость" + +#: gui/launcher.cpp:224 +msgid "Override global volume settings" +msgstr "Перекрыть глобальные установки громкости" + +#: gui/launcher.cpp:231 gui/options.cpp:784 +msgid "MIDI" +msgstr "MIDI" + +#: gui/launcher.cpp:233 +msgid "Override global MIDI settings" +msgstr "Перекрыть глобальные установки MIDI" + +#: gui/launcher.cpp:243 gui/options.cpp:790 +msgid "Paths" +msgstr "Пути" + +#: gui/launcher.cpp:249 +msgid "Game Path:" +msgstr "Путь к игре: " + +#: gui/launcher.cpp:253 gui/options.cpp:803 +msgid "Extra Path:" +msgstr "Доп. путь:" + +#: gui/launcher.cpp:257 +msgid "Save Path:" +msgstr "Путь сохр.: " + +#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 +#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 +#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 +#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 +#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 +#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 +#: gui/options.cpp:946 gui/options.cpp:1045 +msgid "None" +msgstr "Не задан" + +#: gui/launcher.cpp:279 gui/launcher.cpp:357 +msgid "Default" +msgstr "По умолчанию" + +#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +msgid "Select SoundFont" +msgstr "Выберите SoundFont" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "Выберите директорию с файлами игры" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "Выберите дополнительную директорию игры" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "Выберите директорию для сохранений" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "Этот ID игры уже используется. Пожалуйста, выберите другой." + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "Quit" +msgstr "Выход" + +#: gui/launcher.cpp:501 +msgid "About..." +msgstr "О программе..." + +#: gui/launcher.cpp:502 +msgid "Options..." +msgstr "Опции..." + +#: gui/launcher.cpp:504 +msgid "Start" +msgstr "Пуск" + +#: gui/launcher.cpp:507 +msgid "Load..." +msgstr "Загр...." + +#: gui/launcher.cpp:511 gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "Нов. игра..." + +#: gui/launcher.cpp:513 +msgid "Edit Game..." +msgstr "Изм. игру..." + +#: gui/launcher.cpp:515 +msgid "Remove Game" +msgstr "Удалить игру" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "Поиск:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "Загрузить игру:" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +msgid "Load" +msgstr "Загрузить" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" +"Вы действительно хотите запустить детектор всех игр? Это потенциально может " +"добавить большое количество игр." + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "Yes" +msgstr "Да" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "No" +msgstr "Нет" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "ScummVM не может открыть указанную директорию!" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "ScummVM не может найти игру в указанной директории!" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "Выберите игру:" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "Вы действительно хотите удалить установки для этой игры?" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "Эта игра не поддерживает загрузку сохранений через главное меню." + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "ScummVM не смог найти движок для запуска выбранной игры!" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "Доб. много..." + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "... ищу ..." + +#: gui/massadd.cpp:244 +#, c-format +msgid "Scan complete!" +msgstr "Поиск закончен!" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "Найдено %d новых игр." + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "Просмотрено %d директорий ..." + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "Найдено %d новых игр ..." + +#: gui/options.cpp:71 +msgid "Never" +msgstr "Никогда" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "каждые 5 минут" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "каждые 10 минут" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "каждые 15 минут" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "каждые 30 минут" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "8 кГц" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "11 кГц" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "22 кГц" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "44 кГц" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "48 кГц" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "Только озвучка" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "Озвучка и субтитры" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "Только субтитры" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "Звук и суб." + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "Графический режим:" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "Режим растрирования:" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "Коррекция соотношения сторон" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "Драйвер музыки:" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "Эмулятор AdLib:" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "Выходная частота:" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "SoundFont:" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "Смешанный режим AdLib/MIDI" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "Настоящий Roland MT-32 (запретить эмуляцию GM)" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "Включить режим Roland GS" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "Усиление MIDI:" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "Текст и озвучка:" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "Скорость субтитров:" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "Громкость музыки:" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "Выключить всё" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "Громкость эффектов:" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "Громкость озвучки:" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "Путь для сохранений: " + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "Путь к темам:" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "Путь к плагинам:" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "Разное" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "Тема:" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "Растеризатор GUI:" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "Автосохранение:" + +#: gui/options.cpp:832 engines/dialogs.cpp:305 +msgid "Keys" +msgstr "Клавиши" + +#: gui/options.cpp:844 +msgid "English" +msgstr "English" + +#: gui/options.cpp:996 gui/options.cpp:991 +msgid "Select directory for savegames" +msgstr "Выберите директорию для сохранений" + +#: gui/options.cpp:1003 gui/options.cpp:998 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "Не могу писать в выбранную директорию. Пожалуйста, укажите другую." + +#: gui/options.cpp:1012 gui/options.cpp:1007 +msgid "Select directory for GUI themes" +msgstr "Выберите директорию для тем GUI" + +#: gui/options.cpp:1022 gui/options.cpp:1017 +msgid "Select directory for extra files" +msgstr "Выберите директорию с дополнительными файлами" + +#: gui/options.cpp:1033 gui/options.cpp:1028 +msgid "Select directory for plugins" +msgstr "Выберите директорию с плагинами" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "Дата не записана" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "Время не записано" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "Время игры не записано" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "Удалить" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "Вы действительно хотите удалить это сохранение?" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "Дата: " + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "Время: " + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "Время игры: " + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "Сохранение без имени" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "Выберите тему" + +#: base/main.cpp:105 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "Пользователь выбрал цель'%s' (gameid '%s')...\n" + +#: base/main.cpp:106 +msgid " Looking for a plugin supporting this gameid... " +msgstr " Ищу плагин с поддержкой этого gameid... " + +#: base/main.cpp:110 +msgid "failed\n" +msgstr "не удалось\n" + +#: base/main.cpp:111 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" +"Неверный gameid %s. Используйте опцию --list-games для просмотра списка " +"поддерживаемых gameid" + +#: base/main.cpp:118 +#, c-format +msgid " Starting '%s'\n" +msgstr " Запускаю '%s'\n" + +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "%s не смог запустить движок: %s (цель '%s', путь '%s')" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "Движок не поддерживает уровень отладки '%s'" + +#: base/main.cpp:272 +msgid "Menu" +msgstr "Меню" + +#: base/main.cpp:275 +msgid "Skip" +msgstr "Пропустить" + +#: base/main.cpp:278 +msgid "Pause" +msgstr "Пауза" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "Пропустить строку" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "Ошибка запуска игры:" + +#: base/main.cpp:419 base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "Не могу найти движок для запуска выбранной игры" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "Неверный путь" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "Нет файлов игры" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "Game Id не поддерживается" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "Неподдерживаемый режим цвета" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "Недостаточно прав для чтения" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "Недостаточно прав для записи" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "Путь не найден" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "Путь не является директорией" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "Путь не является файлом" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "Не могу создать файл" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "Ошибка чтения" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "Ошибка записи данных" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "Неизвестная ошибка" + +#: engines/dialogs.cpp:89 +msgid "Resume" +msgstr "Продолжить" + +#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +msgid "Save" +msgstr "Записать" + +#: engines/dialogs.cpp:99 +msgid "Options" +msgstr "Опции" + +#: engines/dialogs.cpp:104 +msgid "Help" +msgstr "Помощь" + +#: engines/dialogs.cpp:107 +msgid "About" +msgstr "О программе" + +#: engines/dialogs.cpp:109 +msgid "Return to Launcher" +msgstr "Вернуться в главное меню" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "Сохранить игру: " + +#: gui/options.cpp:978 +msgid "You have to restart ScummVM to take the effect." +msgstr "Вы должны перезапустить ScummVM чтобы применить изменения." + +#: gui/ThemeEngine.cpp:333 +msgid "Disabled GFX" +msgstr "Без графики" + +#: gui/ThemeEngine.cpp:334 +msgid "Standard Renderer (16bpp)" +msgstr "Стандартный растеризатор (16bpp)" + +#: gui/ThemeEngine.cpp:336 +msgid "Antialiased Renderer (16bpp)" +msgstr "Растеризатор со сглаживанием (16bpp)" + +#: sound/mididrv.cpp:39 +msgid "No music" +msgstr "Без музыки" + +#: sound/mididrv.cpp:42 +msgid "Windows MIDI" +msgstr "Windows MIDI" + +#: sound/mididrv.cpp:46 +msgid "ALSA" +msgstr "ALSA" + +#: sound/mididrv.cpp:50 +msgid "Atari ST MIDI" +msgstr "Atars ST MIDI" + +#: sound/mididrv.cpp:54 +msgid "SEQ" +msgstr "SEQ" + +#: sound/mididrv.cpp:58 +msgid "DMedia" +msgstr "DMedia" + +#: sound/mididrv.cpp:62 +msgid "CAMD" +msgstr "CAMD" + +#: sound/mididrv.cpp:66 +msgid "CoreAudio" +msgstr "CoreAudio" + +#: sound/mididrv.cpp:68 +msgid "CoreMIDI" +msgstr "CoreMIDI" + +#: sound/mididrv.cpp:73 +msgid "Yamaha Pa1" +msgstr "Yamaha Pa1" + +#: sound/mididrv.cpp:75 +msgid "Tapwave Zodiac" +msgstr "Tapware Zodiac" + +#: sound/mididrv.cpp:80 +msgid "FluidSynth" +msgstr "FluidSynth" + +#: sound/mididrv.cpp:83 +msgid "MT-32 Emulation" +msgstr "Эмуляция MT-32" + +#: sound/mididrv.cpp:87 +msgid "AdLib" +msgstr "AdLib" + +#: sound/mididrv.cpp:88 +msgid "PC Speaker" +msgstr "PC спикер" + +#: sound/mididrv.cpp:89 +msgid "IBM PCjr" +msgstr "IBM PCjr" + +#: sound/mididrv.cpp:90 +msgid "Creative Music System" +msgstr "Creative Music System" + +#: sound/mididrv.cpp:91 +msgid "FM Towns" +msgstr "FM Towns" + +#: sound/mididrv.cpp:93 +msgid "TiMidity" +msgstr "TiMidity" diff --git a/po/scummvm.pot b/po/scummvm.pot new file mode 100755 index 0000000000..77040dd25f --- /dev/null +++ b/po/scummvm.pot @@ -0,0 +1,779 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ScummVM Team +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ScummVM 1.2.0svn\n" +"Report-Msgid-Bugs-To: scummvm-devel@lists.sf.net\n" +"POT-Creation-Date: 2010-06-08 17:25+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: gui/about.cpp:117 +msgid "C2(built on " +msgstr "" + +#: gui/about.cpp:125 +msgid "C1Features compiled in:" +msgstr "" + +#: gui/about.cpp:132 +msgid "C1Available engines:" +msgstr "" + +#: gui/browser.cpp:69 +msgid "Go up" +msgstr "" + +#: gui/browser.cpp:70 gui/KeysDialog.cpp:45 gui/launcher.cpp:265 +#: gui/massadd.cpp:95 gui/options.cpp:859 gui/saveload.cpp:65 +#: gui/saveload.cpp:157 gui/themebrowser.cpp:56 engines/dialogs.cpp:302 +#: gui/options.cpp:861 +msgid "Cancel" +msgstr "" + +#: gui/browser.cpp:71 gui/themebrowser.cpp:57 +msgid "Choose" +msgstr "" + +#: gui/GuiManager.cpp:75 +msgid "Failed to load any GUI theme, aborting" +msgstr "" + +#: gui/GuiManager.cpp:98 +msgid "Close" +msgstr "" + +#: gui/GuiManager.cpp:101 +msgid "Mouse click" +msgstr "" + +#: gui/GuiManager.cpp:104 base/main.cpp:284 +msgid "Display keyboard" +msgstr "" + +#: gui/GuiManager.cpp:107 base/main.cpp:287 +msgid "Remap keys" +msgstr "" + +#: gui/KeysDialog.cpp:43 +msgid "Map" +msgstr "" + +#: gui/KeysDialog.cpp:44 gui/launcher.cpp:266 gui/launcher.cpp:873 +#: gui/launcher.cpp:877 gui/massadd.cpp:92 gui/options.cpp:860 +#: engines/dialogs.cpp:301 gui/options.cpp:862 +msgid "OK" +msgstr "" + +#: gui/KeysDialog.cpp:51 +msgid "Select an action and click 'Map'" +msgstr "" + +#: gui/KeysDialog.cpp:82 gui/KeysDialog.cpp:104 gui/KeysDialog.cpp:143 +#, c-format +msgid "Associated key : %s" +msgstr "" + +#: gui/KeysDialog.cpp:84 gui/KeysDialog.cpp:106 gui/KeysDialog.cpp:145 +#, c-format +msgid "Associated key : none" +msgstr "" + +#: gui/KeysDialog.cpp:92 +msgid "Please select an action" +msgstr "" + +#: gui/KeysDialog.cpp:108 +msgid "Press the key to associate" +msgstr "" + +#: gui/KeysDialog.cpp:147 +msgid "Choose an action to map" +msgstr "" + +#: gui/launcher.cpp:170 +msgid "Game" +msgstr "" + +#: gui/launcher.cpp:173 +msgid "ID:" +msgstr "" + +#: gui/launcher.cpp:177 +msgid "Name:" +msgstr "" + +#: gui/launcher.cpp:181 gui/options.cpp:839 +msgid "Language:" +msgstr "" + +#: gui/launcher.cpp:183 gui/launcher.cpp:193 gui/options.cpp:73 +#: gui/options.cpp:598 gui/options.cpp:608 gui/options.cpp:842 +#: sound/mididrv.cpp:38 +msgid "<default>" +msgstr "" + +#: gui/launcher.cpp:191 +msgid "Platform:" +msgstr "" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "Graphics" +msgstr "" + +#: gui/launcher.cpp:203 gui/options.cpp:749 gui/options.cpp:766 +msgid "GFX" +msgstr "" + +#: gui/launcher.cpp:205 +msgid "Override global graphic settings" +msgstr "" + +#: gui/launcher.cpp:212 gui/options.cpp:772 +msgid "Audio" +msgstr "" + +#: gui/launcher.cpp:214 +msgid "Override global audio settings" +msgstr "" + +#: gui/launcher.cpp:222 gui/options.cpp:776 +msgid "Volume" +msgstr "" + +#: gui/launcher.cpp:224 +msgid "Override global volume settings" +msgstr "" + +#: gui/launcher.cpp:231 gui/options.cpp:784 +msgid "MIDI" +msgstr "" + +#: gui/launcher.cpp:233 +msgid "Override global MIDI settings" +msgstr "" + +#: gui/launcher.cpp:243 gui/options.cpp:790 +msgid "Paths" +msgstr "" + +#: gui/launcher.cpp:249 +msgid "Game Path:" +msgstr "" + +#: gui/launcher.cpp:253 gui/options.cpp:803 +msgid "Extra Path:" +msgstr "" + +#: gui/launcher.cpp:257 +msgid "Save Path:" +msgstr "" + +#: gui/launcher.cpp:274 gui/launcher.cpp:353 gui/launcher.cpp:398 +#: gui/options.cpp:226 gui/options.cpp:382 gui/options.cpp:480 +#: gui/options.cpp:526 gui/options.cpp:661 gui/options.cpp:801 +#: gui/options.cpp:804 gui/options.cpp:808 gui/options.cpp:883 +#: gui/options.cpp:889 gui/options.cpp:895 gui/options.cpp:903 +#: gui/options.cpp:927 gui/options.cpp:931 gui/options.cpp:937 +#: gui/options.cpp:944 gui/options.cpp:1050 gui/options.cpp:885 +#: gui/options.cpp:891 gui/options.cpp:897 gui/options.cpp:905 +#: gui/options.cpp:929 gui/options.cpp:933 gui/options.cpp:939 +#: gui/options.cpp:946 gui/options.cpp:1045 +msgid "None" +msgstr "" + +#: gui/launcher.cpp:279 gui/launcher.cpp:357 +msgid "Default" +msgstr "" + +#: gui/launcher.cpp:391 gui/options.cpp:1044 gui/options.cpp:1039 +msgid "Select SoundFont" +msgstr "" + +#: gui/launcher.cpp:410 gui/launcher.cpp:548 +msgid "Select directory with game data" +msgstr "" + +#: gui/launcher.cpp:428 +msgid "Select additional game directory" +msgstr "" + +#: gui/launcher.cpp:440 +msgid "Select directory for saved games" +msgstr "" + +#: gui/launcher.cpp:459 +msgid "This game ID is already taken. Please choose another one." +msgstr "" + +#: gui/launcher.cpp:500 engines/dialogs.cpp:113 +msgid "Quit" +msgstr "" + +#: gui/launcher.cpp:501 +msgid "About..." +msgstr "" + +#: gui/launcher.cpp:502 +msgid "Options..." +msgstr "" + +#: gui/launcher.cpp:504 +msgid "Start" +msgstr "" + +#: gui/launcher.cpp:507 +msgid "Load..." +msgstr "" + +#: gui/launcher.cpp:511 gui/launcher.cpp:990 +msgid "Add Game..." +msgstr "" + +#: gui/launcher.cpp:513 +msgid "Edit Game..." +msgstr "" + +#: gui/launcher.cpp:515 +msgid "Remove Game" +msgstr "" + +#: gui/launcher.cpp:526 gui/launcher.cpp:1037 +msgid "Search:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:117 +msgid "Load game:" +msgstr "" + +#: gui/launcher.cpp:551 engines/dialogs.cpp:91 engines/dialogs.cpp:117 +msgid "Load" +msgstr "" + +#: gui/launcher.cpp:660 +msgid "" +"Do you really want to run the mass game detector? This could potentially add " +"a huge number of games." +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "Yes" +msgstr "" + +#: gui/launcher.cpp:661 gui/launcher.cpp:810 +msgid "No" +msgstr "" + +#: gui/launcher.cpp:708 +msgid "ScummVM couldn't open the specified directory!" +msgstr "" + +#: gui/launcher.cpp:720 +msgid "ScummVM could not find any game in the specified directory!" +msgstr "" + +#: gui/launcher.cpp:734 +msgid "Pick the game:" +msgstr "" + +#: gui/launcher.cpp:810 +msgid "Do you really want to remove this game configuration?" +msgstr "" + +#: gui/launcher.cpp:873 +msgid "This game does not support loading games from the launcher." +msgstr "" + +#: gui/launcher.cpp:877 +msgid "ScummVM could not find any engine capable of running the selected game!" +msgstr "" + +#: gui/launcher.cpp:989 +msgid "Mass Add..." +msgstr "" + +#: gui/massadd.cpp:79 gui/massadd.cpp:82 +msgid "... progress ..." +msgstr "" + +#: gui/massadd.cpp:244 +#, c-format +msgid "Scan complete!" +msgstr "" + +#: gui/massadd.cpp:247 +#, c-format +msgid "Discovered %d new games." +msgstr "" + +#: gui/massadd.cpp:251 +#, c-format +msgid "Scanned %d directories ..." +msgstr "" + +#: gui/massadd.cpp:254 +#, c-format +msgid "Discovered %d new games ..." +msgstr "" + +#: gui/options.cpp:71 +msgid "Never" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 5 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 10 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 15 mins" +msgstr "" + +#: gui/options.cpp:71 +msgid "every 30 mins" +msgstr "" + +#: gui/options.cpp:73 +msgid "8 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "11kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "22 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "44 kHz" +msgstr "" + +#: gui/options.cpp:73 +msgid "48 kHz" +msgstr "" + +#: gui/options.cpp:89 gui/options.cpp:95 +msgid "Speech Only" +msgstr "" + +#: gui/options.cpp:90 +msgid "Speech and Subtitles" +msgstr "" + +#: gui/options.cpp:91 gui/options.cpp:97 +msgid "Subtitles Only" +msgstr "" + +#: gui/options.cpp:96 +msgid "Speech & Subs" +msgstr "" + +#: gui/options.cpp:595 +msgid "Graphics mode:" +msgstr "" + +#: gui/options.cpp:606 +msgid "Render mode:" +msgstr "" + +#: gui/options.cpp:616 +msgid "Fullscreen mode" +msgstr "" + +#: gui/options.cpp:619 +msgid "Aspect ratio correction" +msgstr "" + +#: gui/options.cpp:626 +msgid "Music driver:" +msgstr "" + +#: gui/options.cpp:637 +msgid "AdLib emulator:" +msgstr "" + +#: gui/options.cpp:648 +msgid "Output rate:" +msgstr "" + +#: gui/options.cpp:660 +msgid "SoundFont:" +msgstr "" + +#: gui/options.cpp:665 +msgid "Mixed AdLib/MIDI mode" +msgstr "" + +#: gui/options.cpp:668 +msgid "True Roland MT-32 (disable GM emulation)" +msgstr "" + +#: gui/options.cpp:671 +msgid "Enable Roland GS Mode" +msgstr "" + +#: gui/options.cpp:674 +msgid "MIDI gain:" +msgstr "" + +#: gui/options.cpp:687 +msgid "Text and Speech:" +msgstr "" + +#: gui/options.cpp:691 +msgid "Subtitle speed:" +msgstr "" + +#: gui/options.cpp:703 +msgid "Music volume:" +msgstr "" + +#: gui/options.cpp:710 +msgid "Mute All" +msgstr "" + +#: gui/options.cpp:713 +msgid "SFX volume:" +msgstr "" + +#: gui/options.cpp:720 +msgid "Speech volume:" +msgstr "" + +#: gui/options.cpp:797 +msgid "Save Path: " +msgstr "" + +#: gui/options.cpp:800 +msgid "Theme Path:" +msgstr "" + +#: gui/options.cpp:807 +msgid "Plugins Path:" +msgstr "" + +#: gui/options.cpp:812 +msgid "Misc" +msgstr "" + +#: gui/options.cpp:814 +msgid "Theme:" +msgstr "" + +#: gui/options.cpp:818 +msgid "GUI Renderer:" +msgstr "" + +#: gui/options.cpp:824 +msgid "Autosave:" +msgstr "" + +#: gui/options.cpp:832 engines/dialogs.cpp:305 +msgid "Keys" +msgstr "" + +#: gui/options.cpp:844 +msgid "English" +msgstr "" + +#: gui/options.cpp:996 gui/options.cpp:991 +msgid "Select directory for savegames" +msgstr "" + +#: gui/options.cpp:1003 gui/options.cpp:998 +msgid "The chosen directory cannot be written to. Please select another one." +msgstr "" + +#: gui/options.cpp:1012 gui/options.cpp:1007 +msgid "Select directory for GUI themes" +msgstr "" + +#: gui/options.cpp:1022 gui/options.cpp:1017 +msgid "Select directory for extra files" +msgstr "" + +#: gui/options.cpp:1033 gui/options.cpp:1028 +msgid "Select directory for plugins" +msgstr "" + +#: gui/saveload.cpp:60 gui/saveload.cpp:241 +msgid "No date saved" +msgstr "" + +#: gui/saveload.cpp:61 gui/saveload.cpp:242 +msgid "No time saved" +msgstr "" + +#: gui/saveload.cpp:62 gui/saveload.cpp:243 +msgid "No playtime saved" +msgstr "" + +#: gui/saveload.cpp:69 gui/saveload.cpp:157 +msgid "Delete" +msgstr "" + +#: gui/saveload.cpp:156 +msgid "Do you really want to delete this savegame?" +msgstr "" + +#: gui/saveload.cpp:265 +msgid "Date: " +msgstr "" + +#: gui/saveload.cpp:268 +msgid "Time: " +msgstr "" + +#: gui/saveload.cpp:273 +msgid "Playtime: " +msgstr "" + +#: gui/saveload.cpp:286 gui/saveload.cpp:353 +msgid "Untitled savestate" +msgstr "" + +#: gui/themebrowser.cpp:46 +msgid "Select a Theme" +msgstr "" + +#: base/main.cpp:105 +#, c-format +msgid "User picked target '%s' (gameid '%s')...\n" +msgstr "" + +#: base/main.cpp:106 +msgid " Looking for a plugin supporting this gameid... " +msgstr "" + +#: base/main.cpp:110 +msgid "failed\n" +msgstr "" + +#: base/main.cpp:111 +#, c-format +msgid "" +"%s is an invalid gameid. Use the --list-games option to list supported gameid" +msgstr "" + +#: base/main.cpp:118 +#, c-format +msgid " Starting '%s'\n" +msgstr "" + +#: base/main.cpp:147 +#, c-format +msgid "%s failed to instantiate engine: %s (target '%s', path '%s')" +msgstr "" + +#: base/main.cpp:204 +#, c-format +msgid "Engine does not support debug level '%s'" +msgstr "" + +#: base/main.cpp:272 +msgid "Menu" +msgstr "" + +#: base/main.cpp:275 +msgid "Skip" +msgstr "" + +#: base/main.cpp:278 +msgid "Pause" +msgstr "" + +#: base/main.cpp:281 +msgid "Skip line" +msgstr "" + +#: base/main.cpp:393 +msgid "Error running game:" +msgstr "" + +#: base/main.cpp:419 base/main.cpp:420 +msgid "Could not find any engine capable of running the selected game" +msgstr "" + +#: common/error.cpp:43 +msgid "Invalid Path" +msgstr "" + +#: common/error.cpp:44 +msgid "Game Data not found" +msgstr "" + +#: common/error.cpp:45 +msgid "Game Id not supported" +msgstr "" + +#: common/error.cpp:46 +msgid "Unsupported Color Mode" +msgstr "" + +#: common/error.cpp:48 +msgid "Read permission denied" +msgstr "" + +#: common/error.cpp:49 +msgid "Write permission denied" +msgstr "" + +#: common/error.cpp:52 +msgid "Path not exists" +msgstr "" + +#: common/error.cpp:53 +msgid "Path not a directory" +msgstr "" + +#: common/error.cpp:54 +msgid "Path not a file" +msgstr "" + +#: common/error.cpp:56 +msgid "Cannot create file" +msgstr "" + +#: common/error.cpp:57 +msgid "Reading failed" +msgstr "" + +#: common/error.cpp:58 +msgid "Writing data failed" +msgstr "" + +#: common/error.cpp:60 common/error.cpp:71 +msgid "Unknown Error" +msgstr "" + +#: engines/dialogs.cpp:89 +msgid "Resume" +msgstr "" + +#: engines/dialogs.cpp:95 engines/dialogs.cpp:119 +msgid "Save" +msgstr "" + +#: engines/dialogs.cpp:99 +msgid "Options" +msgstr "" + +#: engines/dialogs.cpp:104 +msgid "Help" +msgstr "" + +#: engines/dialogs.cpp:107 +msgid "About" +msgstr "" + +#: engines/dialogs.cpp:109 +msgid "Return to Launcher" +msgstr "" + +#: engines/dialogs.cpp:119 +msgid "Save game:" +msgstr "" + +#: gui/options.cpp:978 +msgid "You have to restart ScummVM to take the effect." +msgstr "" + +#: gui/ThemeEngine.cpp:333 +msgid "Disabled GFX" +msgstr "" + +#: gui/ThemeEngine.cpp:334 +msgid "Standard Renderer (16bpp)" +msgstr "" + +#: gui/ThemeEngine.cpp:336 +msgid "Antialiased Renderer (16bpp)" +msgstr "" + +#: sound/mididrv.cpp:39 +msgid "No music" +msgstr "" + +#: sound/mididrv.cpp:42 +msgid "Windows MIDI" +msgstr "" + +#: sound/mididrv.cpp:46 +msgid "ALSA" +msgstr "" + +#: sound/mididrv.cpp:50 +msgid "Atari ST MIDI" +msgstr "" + +#: sound/mididrv.cpp:54 +msgid "SEQ" +msgstr "" + +#: sound/mididrv.cpp:58 +msgid "DMedia" +msgstr "" + +#: sound/mididrv.cpp:62 +msgid "CAMD" +msgstr "" + +#: sound/mididrv.cpp:66 +msgid "CoreAudio" +msgstr "" + +#: sound/mididrv.cpp:68 +msgid "CoreMIDI" +msgstr "" + +#: sound/mididrv.cpp:73 +msgid "Yamaha Pa1" +msgstr "" + +#: sound/mididrv.cpp:75 +msgid "Tapwave Zodiac" +msgstr "" + +#: sound/mididrv.cpp:80 +msgid "FluidSynth" +msgstr "" + +#: sound/mididrv.cpp:83 +msgid "MT-32 Emulation" +msgstr "" + +#: sound/mididrv.cpp:87 +msgid "AdLib" +msgstr "" + +#: sound/mididrv.cpp:88 +msgid "PC Speaker" +msgstr "" + +#: sound/mididrv.cpp:89 +msgid "IBM PCjr" +msgstr "" + +#: sound/mididrv.cpp:90 +msgid "Creative Music System" +msgstr "" + +#: sound/mididrv.cpp:91 +msgid "FM Towns" +msgstr "" + +#: sound/mididrv.cpp:93 +msgid "TiMidity" +msgstr "" diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index a9a782184e..e34f5a9705 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -27,6 +27,7 @@ #include "common/config-manager.h" #include "common/str.h" #include "common/system.h" +#include "common/translation.h" #include "common/util.h" #include "sound/mididrv.h" @@ -35,62 +36,62 @@ static const MidiDriverDescription s_musicDrivers[] = { // The flags for the "auto" & "null" drivers indicate that they are anything // you want it to be. - {"auto", "<default>", MD_AUTO, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, - {"null", "No music", MD_NULL, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, + {"auto", _s("<default>"), MD_AUTO, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, + {"null", _s("No music"), MD_NULL, MDT_MIDI | MDT_PCSPK | MDT_ADLIB | MDT_TOWNS}, #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - {"windows", "Windows MIDI", MD_WINDOWS, MDT_MIDI}, + {"windows", _s("Windows MIDI"), MD_WINDOWS, MDT_MIDI}, #endif #if defined(UNIX) && defined(USE_ALSA) - {"alsa", "ALSA", MD_ALSA, MDT_MIDI}, + {"alsa", _s("ALSA"), MD_ALSA, MDT_MIDI}, #endif #if defined(__MINT__) - {"stmidi", "Atari ST MIDI", MD_STMIDI, MDT_MIDI}, + {"stmidi", _s("Atari ST MIDI"), MD_STMIDI, MDT_MIDI}, #endif #if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) && !defined(__MAEMO__) && !defined(__MINT__) - {"seq", "SEQ", MD_SEQ, MDT_MIDI}, + {"seq", _s("SEQ"), MD_SEQ, MDT_MIDI}, #endif #if defined(IRIX) - {"dmedia", "DMedia", MD_DMEDIA, MDT_MIDI}, + {"dmedia", _s("DMedia"), MD_DMEDIA, MDT_MIDI}, #endif #if defined(__amigaos4__) - {"camd", "CAMD", MD_CAMD, MDT_MIDI}, + {"camd", _s("CAMD"), MD_CAMD, MDT_MIDI}, #endif #if defined(MACOSX) - {"core", "CoreAudio", MD_COREAUDIO, MDT_MIDI}, + {"core", _s("CoreAudio"), MD_COREAUDIO, MDT_MIDI}, // {"coreaudio", "CoreAudio", MD_COREAUDIO, MDT_MIDI}, - {"coremidi", "CoreMIDI", MD_COREMIDI, MDT_MIDI}, + {"coremidi", _s("CoreMIDI"), MD_COREMIDI, MDT_MIDI}, #endif #if defined(PALMOS_MODE) # if defined(COMPILE_CLIE) - {"ypa1", "Yamaha Pa1", MD_YPA1, MDT_MIDI}, + {"ypa1", _s("Yamaha Pa1"), MD_YPA1, MDT_MIDI}, # elif defined(COMPILE_ZODIAC) && (!defined(ENABLE_SCUMM) || !defined(PALMOS_ARM)) - {"zodiac", "Tapwave Zodiac", MD_ZODIAC, MDT_MIDI}, + {"zodiac", _s("Tapwave Zodiac"), MD_ZODIAC, MDT_MIDI}, # endif #endif #ifdef USE_FLUIDSYNTH - {"fluidsynth", "FluidSynth", MD_FLUIDSYNTH, MDT_MIDI}, + {"fluidsynth", _s("FluidSynth"), MD_FLUIDSYNTH, MDT_MIDI}, #endif #ifdef USE_MT32EMU - {"mt32", "MT-32 Emulation", MD_MT32, MDT_MIDI}, + {"mt32", _s("MT-32 Emulation"), MD_MT32, MDT_MIDI}, #endif // The flags for the "adlib" driver indicates that it can do AdLib and MIDI. - {"adlib", "AdLib", MD_ADLIB, MDT_ADLIB}, - {"pcspk", "PC Speaker", MD_PCSPK, MDT_PCSPK}, - {"pcjr", "IBM PCjr", MD_PCJR, MDT_PCSPK}, - {"cms", "Creative Music System", MD_CMS, MDT_CMS}, - {"towns", "FM Towns", MD_TOWNS, MDT_TOWNS}, + {"adlib", _s("AdLib"), MD_ADLIB, MDT_ADLIB}, + {"pcspk", _s("PC Speaker"), MD_PCSPK, MDT_PCSPK}, + {"pcjr", _s("IBM PCjr"), MD_PCJR, MDT_PCSPK}, + {"cms", _s("Creative Music System"), MD_CMS, MDT_CMS}, + {"towns", _s("FM Towns"), MD_TOWNS, MDT_TOWNS}, #if defined(UNIX) - {"timidity", "TiMidity", MD_TIMIDITY, MDT_MIDI}, + {"timidity", _s("TiMidity"), MD_TIMIDITY, MDT_MIDI}, #endif {0, 0, MD_NULL, MDT_NONE} diff --git a/tools/module.mk b/tools/module.mk index 896a2e504b..2c62e427ea 100644 --- a/tools/module.mk +++ b/tools/module.mk @@ -65,7 +65,6 @@ md5scumm: tools/md5table$(EXEEXT) tools/md5table$(EXEEXT) --c++ < $(srcdir)/tools/scumm-md5.txt > $(srcdir)/engines/scumm/scumm-md5.h cp $(srcdir)/tools/scumm-md5.txt $(srcdir)/../../web/trunk/data/scumm-md5.txt - # # Rules which automatically and implicitly rebuild the credits and # MD5 tables when needed. diff --git a/tools/po2c b/tools/po2c new file mode 100755 index 0000000000..ac1744aa2c --- /dev/null +++ b/tools/po2c @@ -0,0 +1,280 @@ +#!/usr/bin/perl + +# +# po2c - Converts .po files to C code +# +# Copyright (C) 2004 Angel Ortega <angel@triptico.com> +# +# This program 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; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# http://www.triptico.com +# + +$VERSION = "1.0.2"; + +if(scalar(@ARGV) == 0) +{ + print "Usage: po2c {po file[s]}\n"; + exit 1; +} + +%msgs = (); +%msgids = (); + +# stage 1: loading + +# arguments are .po files +foreach my $f (@ARGV) +{ + my ($lang); + my ($langDesc); + + next unless(($lang) = ($f =~ /([^\/]+)\.po$/)); + + if(open F, $f) + { + my ($msgid, $val, %a); + + while(<F>) + { + chomp; + + # ignore blank lines or comments + next if /^$/ or /^#/; + + if(/^msgid\s+\"(.*)\"\s*$/) + { + # store previous msgid + if(defined($msgid)) + { + $a{$msgid} = $val; + $msgids{$msgid} ++; + } + + # start of msgid + $val = $1; + } + elsif(/^msgstr\s+\"(.*)\"\s*$/) + { + # store previous msgid + $msgid = $val; + + # start of msgstr + $val = $1; + } + elsif(/^\"(.*)\"\s*$/) + { + # add to current value + $val .= $1; + } + } + + # store previous msgid + if(defined($msgid)) + { + $a{$msgid} = $val; + $msgids{$msgid} ++; + } + + close F; + + # add to the global message pool + $msgs{$lang} = \%a; + } +} + +# stage 2: convert the data + +# stores all sorted msgids into @msgids +@msgids = sort(keys(%msgids)); + +# travels again, storing indexes into %msgids +for(my $n = 0;$n < scalar(@msgids);$n++) +{ + $msgids{$msgids[$n]} = $n; +} + +# stage 3: dump as C code + +print "/* generated by po2c $VERSION - Do not modify */\n\n"; +print "#include <stdio.h>\n"; +print "#include <string.h>\n\n"; + +# dump first the msgid array +print "static const char * _po2c_msgids[] = {\n"; + +for(my $n = 0;$n < scalar(@msgids);$n++) +{ + print "\t/* $n */ \"" . $msgids[$n] . "\",\n"; +} + +print "\tNULL\n};\n\n"; + +# dump the lang structure +print "struct _po2c_msg {\n"; +print "\tint msgid;\n"; +print "\tconst char * msgstr;\n"; +print "};\n\n"; + +# dump now each language + +foreach my $l (keys(%msgs)) +{ + print "static struct _po2c_msg _po2c_lang_${l}\[\] = {\n"; + + # get the translation table for the language $l + my ($m) = $msgs{$l}; + +# while (my ($msgstr, $msgid) = each (%$m)) + foreach my $msgid (sort(keys(%$m))) + { + my ($msgstr) = ""; + + # make it 7-bit safe + foreach $c (split(//, $m->{$msgid})) { + if (ord($c) > 0x7f) { + $msgstr .= sprintf("\\%o", ord($c)); + } else { + $msgstr .= $c; + } + } + + print "\t{ " . $msgids{$msgid} . ", \"" . $msgstr . "\" },\n" + if $msgstr; + } + + print "\t{ -1, NULL }\n};\n\n"; +} + +# finally, dump the languages + +print "static struct {\n"; +print "\tconst char * lang;\n"; +print "\tconst char * charset;\n"; +print "\tstruct _po2c_msg * msgs;\n"; +print "} _po2c_langs[] = {\n"; + +foreach my $l (keys(%msgs)) +{ + $header = $msgs{$l}->{""}; + $header =~ /charset=([^\\]+)/; + $charset = $1; + print "\t{ \"" . $l . "\", \"" . $charset . "\", _po2c_lang_${l} },\n"; +} + +print "\t{ NULL, NULL, NULL }\n};\n\n"; + +print "/* code */\n"; +print << 'EOF'; + +static struct _po2c_msg * _po2c_lang=NULL; +static int _po2c_lang_size=0; +static const char * _po2c_charset=NULL; + +void po2c_setlang(const char * lang) +{ + int n; + + _po2c_lang=NULL; + _po2c_lang_size=0; + _po2c_charset=NULL; + + /* if lang is NULL or "", deactivate it */ + if(lang == NULL || *lang == '\0') + return; + + /* searches for a valid language array */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strcmp(lang, _po2c_langs[n].lang) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* try partial searches */ + for(n=0;_po2c_lang == NULL && _po2c_langs[n].lang != NULL;n++) + { + if(strncmp(lang, _po2c_langs[n].lang, 2) == 0) { + _po2c_lang=_po2c_langs[n].msgs; + _po2c_charset=_po2c_langs[n].charset; + } + } + + /* if found, count entries */ + if(_po2c_lang != NULL) + { + struct _po2c_msg * m; + + for(m=_po2c_lang;m->msgid != -1;m++) + _po2c_lang_size++; + } +} + +const char * po2c_gettext(const char * msgid) +{ + struct _po2c_msg * m; + int b, t, n, c; + + /* if no language is set or msgid is empty, return msgid as is */ + if(_po2c_lang == NULL || *msgid == '\0') + return(msgid); + + /* binary-search for the msgid */ + b=0; t=_po2c_lang_size - 1; + + while(t >= b) + { + n=(b + t) / 2; + m=&_po2c_lang[n]; + + c=strcmp(msgid, _po2c_msgids[m->msgid]); + + if(c == 0) + return(m->msgstr); + else + if(c < 0) + t=n - 1; + else + b=n + 1; + } + + return(msgid); +} + +const char * po2c_getcharset(void) +{ + if (_po2c_charset) + return _po2c_charset; + else + return "ASCII"; +} + +int po2c_getnumlangs(void) +{ + int n = 0; + while (_po2c_langs[n].lang) + n++; + + return n; +} + +const char * po2c_getlang(int num) +{ + return _po2c_langs[num].lang; +} +EOF + +exit 0; |