diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/error.cpp | 30 | ||||
-rwxr-xr-x | common/messages.cpp | 543 | ||||
-rw-r--r-- | common/module.mk | 8 | ||||
-rwxr-xr-x | common/translation.cpp | 221 | ||||
-rwxr-xr-x | common/translation.h | 126 |
5 files changed, 914 insertions, 14 deletions
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 |