aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorEugene Sandulenko2010-06-15 10:44:51 +0000
committerEugene Sandulenko2010-06-15 10:44:51 +0000
commit859212df2523e8b15076d968018dbf98618fd60f (patch)
treee3f7ff62c58c9ac8a762791c0a1801b75fe1f14a /common
parentdb6673c408865b201808e01ab5db796f2e794058 (diff)
downloadscummvm-rg350-859212df2523e8b15076d968018dbf98618fd60f.tar.gz
scummvm-rg350-859212df2523e8b15076d968018dbf98618fd60f.tar.bz2
scummvm-rg350-859212df2523e8b15076d968018dbf98618fd60f.zip
Implement translation support for ScummVM GUI.
Based on patch #2903830: "Updated Translation Prototype" by alexbevi which in turn is based on patch #1739965 by jvprat. Currently it builds all translations right into ScummVM. Once the feature will be accepted more widely, i.e. more translations will pop up, it will be trivial to move translation strings to external file. Finished translation: Russian Unfinished translation: Hungarian Things which are nice to do: - Language code -> language mapping for more user friendness - Specifying fonts to be used with language - Updating of interface language without restart. It will require moving of much code to reflowLayout() methods for each dialog The .po files must be in single byte encodings. I.e. no support for Unicode. svn-id: r49759
Diffstat (limited to 'common')
-rw-r--r--common/error.cpp30
-rwxr-xr-xcommon/messages.cpp543
-rw-r--r--common/module.mk8
-rwxr-xr-xcommon/translation.cpp221
-rwxr-xr-xcommon/translation.h126
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