SUPERNOVA2: add tool to generate engine data file

Most of the tool is copied from create supernova
Add correct gametext.h and strings_en.po for supernova2
Doesn't handle images yet
This commit is contained in:
Jaromir Wysoglad 2019-05-27 18:49:01 +02:00 committed by Thierry Crozat
parent 9bf7dc817f
commit 0ed3dbf21f
9 changed files with 4230 additions and 0 deletions

View File

@ -0,0 +1,197 @@
#include "create_supernova2.h"
#include "gametext.h"
#include "file.h"
#include "po_parser.h"
// HACK to allow building with the SDL backend on MinGW
// see bug #1800764 "TOOLS: MinGW tools building broken"
#ifdef main
#undef main
#endif // main
// List of languages to look for. To add new languages you only need to change the array below
// and add the supporting files:
// - 640x480 bitmap picture for the newpaper named 'img1-##.pbm' and 'img2-##.pbm'
// in pbm binary format (you can use gimp to generate those)
// - strings in a po file named 'strings-##.po' that uses CP850 encoding
const char *lang[] = {
"en",
NULL
};
void writeImage(File& outputFile, const char *name, const char* language) {
File imgFile;
char fileName[16];
sprintf(fileName, "%s-%s.pbm", name, language);
if (!imgFile.open(fileName, kFileReadMode)) {
printf("Cannot find image '%s' for language '%s'. This image will be skipped.\n", name, language);
return;
}
char str[256];
// Read header (and check we have a binary PBM file)
imgFile.readString(str, 256);
if (strcmp(str, "P4") != 0) {
imgFile.close();
printf("File '%s' doesn't seem to be a binary pbm file! This image will be skipped.\n", fileName);
return;
}
// Skip comments and then read and check size
do {
imgFile.readString(str, 256);
} while (str[0] == '#');
int w = 0, h = 0;
if (sscanf(str, "%d %d", &w, &h) != 2 || w != 640 || h != 480) {
imgFile.close();
printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
return;
}
// Write block header in output file (4 bytes).
// We convert the image name to upper case.
for (int i = 0 ; i < 4 ; ++i) {
if (name[i] >= 97 && name[i] <= 122)
outputFile.writeByte(name[i] - 32);
else
outputFile.writeByte(name[i]);
}
// And write the language code on 4 bytes as well (padded with 0 if needed).
int languageLength = strlen(language);
for (int i = 0 ; i < 4 ; ++i) {
if (i < languageLength)
outputFile.writeByte(language[i]);
else
outputFile.writeByte(0);
}
// Write block size (640*480 / 8)
outputFile.writeLong(38400);
// Write all the bytes. We should have 38400 bytes (640 * 480 / 8)
// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
// but pbm uses 0 for white and 1 for black.
for (int i = 0 ; i < 38400 ; ++i) {
byte b = imgFile.readByte();
outputFile.writeByte(~b);
}
imgFile.close();
}
void writeGermanStrings(File& outputFile) {
// Write header and language
outputFile.write("TEXT", 4);
outputFile.write("de\0\0", 4);
// Reserve the size for the block size, but we will write it at the end once we know what it is.
uint32 blockSizePos = outputFile.pos();
uint32 blockSize = 0;
outputFile.writeLong(blockSize);
// Write all the strings
const char **s = &gameText[0];
while (*s) {
outputFile.writeString(*s);
blockSize += strlen(*s) + 1;
++s;
}
// Now write the block size and then go back to the end of the file.
outputFile.seek(blockSizePos, SEEK_SET);
outputFile.writeLong(blockSize);
outputFile.seek(0, SEEK_END);
}
void writeStrings(File& outputFile, const char* language) {
char fileName[16];
sprintf(fileName, "strings-%s.po", language);
PoMessageList* poList = parsePoFile(fileName);
if (!poList) {
printf("Cannot find strings file for language '%s'.\n", language);
return;
}
// Write block header
outputFile.write("TEXT", 4);
// And write the language code on 4 bytes as well (padded with 0 if needed).
int languageLength = strlen(language);
for (int i = 0 ; i < 4 ; ++i) {
if (i < languageLength)
outputFile.writeByte(language[i]);
else
outputFile.writeByte(0);
}
// Reserve the size for the block size, but we will write it at the end once we know what it is.
uint32 blockSizePos = outputFile.pos();
uint32 blockSize = 0;
outputFile.writeLong(blockSize);
// Write all the strings.
// If a string is not translated we use the German one.
const char **s = &gameText[0];
while (*s) {
const char* translation = poList->findTranslation(*s);
if (translation) {
outputFile.writeString(translation);
blockSize += strlen(translation) + 1;
} else {
outputFile.writeString(*s);
blockSize += strlen(*s) + 1;
}
++s;
}
delete poList;
// Now write the block size and then go back to the end of the file.
outputFile.seek(blockSizePos, SEEK_SET);
outputFile.writeLong(blockSize);
outputFile.seek(0, SEEK_END);
}
/**
* Main method
*/
int main(int argc, char *argv[]) {
File outputFile;
if (!outputFile.open("supernova2.dat", kFileWriteMode)) {
printf("Cannot create file 'supernova2.dat' in current directory.\n");
exit(0);
}
// The generated file is of the form:
// 3 bytes: 'MSN'
// 1 byte: version
// -- data blocks
// 4 bytes: header 'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
// 'TEXT' for strings
// 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp)
// 4 bytes: block size n (uint32)
// n bytes: data
// ---
// Header
outputFile.write("MS2", 3);
outputFile.writeByte(VERSION);
// German strings
writeGermanStrings(outputFile);
// TODO make the needed images and reenable writing them to the .dat file
// Other languages
const char **l = &lang[0];
while(*l) {
// writeImage(outputFile, "img1", *l);
// writeImage(outputFile, "img2", *l);
writeStrings(outputFile, *l);
++l;
}
outputFile.close();
return 0;
}

View File

@ -0,0 +1,33 @@
/* 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.
*
* This is a utility for generating a data file for the supernova engine.
* It contains strings extracted from the original executable as well
* as translations and is required for the engine to work properly.
*/
#ifndef CREATE_SUPERNOVA_H
#define CREATE_SUPERNOVA_H
#define VERSION 1
#endif // CREATE_SUPERNOVA_H

View File

@ -0,0 +1,72 @@
#include "file.h"
bool File::open(const char *filename, AccessMode mode) {
f = fopen(filename, (mode == kFileReadMode) ? "rb" : "wb");
return (f != NULL);
}
void File::close() {
fclose(f);
f = NULL;
}
int File::seek(int32 offset, int whence) {
return fseek(f, offset, whence);
}
long File::read(void *buffer, int len) {
return fread(buffer, 1, len, f);
}
void File::write(const void *buffer, int len) {
fwrite(buffer, 1, len, f);
}
byte File::readByte() {
byte v;
read(&v, sizeof(byte));
return v;
}
uint16 File::readWord() {
uint16 v;
read(&v, sizeof(uint16));
return FROM_LE_16(v);
}
uint32 File::readLong() {
uint32 v;
read(&v, sizeof(uint32));
return FROM_LE_32(v);
}
void File::readString(char* string, int bufferLength) {
int i = 0;
while (i < bufferLength - 1 && fread(string + i, 1, 1, f) == 1) {
if (string[i] == '\n' || string[i] == 0)
break;
++ i;
}
string[i] = 0;
}
void File::writeByte(byte v) {
write(&v, sizeof(byte));
}
void File::writeWord(uint16 v) {
uint16 vTemp = TO_LE_16(v);
write(&vTemp, sizeof(uint16));
}
void File::writeLong(uint32 v) {
uint32 vTemp = TO_LE_32(v);
write(&vTemp, sizeof(uint32));
}
void File::writeString(const char *s) {
write(s, strlen(s) + 1);
}
uint32 File::pos() {
return ftell(f);
}

View File

@ -0,0 +1,59 @@
/* 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.
*
* This is a utility for generating a data file for the supernova engine.
* It contains strings extracted from the original executable as well
* as translations and is required for the engine to work properly.
*/
#ifndef FILE_H
#define FILE_H
// Disable symbol overrides so that we can use system headers.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "common/endian.h"
enum AccessMode {
kFileReadMode = 1,
kFileWriteMode = 2
};
class File {
private:
FILE *f;
public:
bool open(const char *filename, AccessMode mode = kFileReadMode);
void close();
int seek(int32 offset, int whence = SEEK_SET);
uint32 pos();
long read(void *buffer, int len);
void write(const void *buffer, int len);
byte readByte();
uint16 readWord();
uint32 readLong();
void readString(char*, int bufferLength);
void writeByte(byte v);
void writeWord(uint16 v);
void writeLong(uint32 v);
void writeString(const char *s);
};
#endif // FILE_H

View File

@ -0,0 +1,778 @@
/* 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.
*
* This is a utility for generating a data file for the supernova engine.
* It contains strings extracted from the original executable as well
* as translations and is required for the engine to work properly.
*/
#ifndef GAMETEXT_H
#define GAMETEXT_H
#include <stddef.h>
// This file contains the strings in German and is encoded using CP850 encoding.
// Other language should be provided as po files also using the CP850 encoding.
// TODO: add the strings from the engine here, add an Id string in comment.
// And in the engine add a StringId enum with all the Ids = index in this array.
const char *gameText[] = {
// 0
"Gehe", //Go
"Schau", //Look
"Nimm", //Take
"\231ffne", //Open
"Schlie\341e", //Close
// 5
"Dr\201cke", //Push
"Ziehe", //Pull
"Benutze", //Use
"Rede", //Talk
"Gib", //Give
// 10
"Gespr\204ch beenden", //End of conversation
"Gehe zu ", //Go to
"Schau ", //Look at
"Nimm ", //Take
"\231ffne ", //Open
// 15
"Schlie\341e ", //Close
"Dr\201cke ", //Push
"Ziehe ", //Pull
"Benutze ", //Use
"Rede mit ", //Talk to
// 20
"Gib ", //Give
" an ", // to
" mit ", // with
"Laden", //Load
"Speichern", //Save
// 25
"Zur\201ck", //Back
"Neustart", //Restart
"Schreibfehler", //write error
"Textgeschwindigkeit:", //Text speed:
"Spiel abbrechen?", //Leave game?
// 30
"Ja", //Yes
"Nein", //No
"Das tr\204gst du doch bei dir.", //You already carry this.
"Du bist doch schon da.", //You are already there.
"Das ist geschlossen.", //This is closed.
// 35
"Das hast du doch schon.", //You already have that.
"Das brauchst du nicht.", //You don't need that.
"Das kannst du nicht nehmen.", //You can't take that.
"Das l\204\341t sich nicht \224ffnen.", //This cannot be opened.
"Das ist schon offen.", //This is already opened.
// 40
"Das ist verschlossen.", //This is locked.
"Das l\204\341t sich nicht schlie\341en.", //This cannot be closed.
"Das ist schon geschlossen.", //This is already closed.
"Behalt es lieber!", //Better keep it!
"Das geht nicht.", //You can't do that.
// 45
"^(C) 1994 Thomas und Steffen Dingel#", //^(C) 1994 Thomas and Steffen Dingel#
"Story und Grafik:^ Thomas Dingel#", //Story and Graphics:^ Thomas Dingel#
"Programmierung:^ Steffen Dingel#", //Programming:^ Steffen Dingel#
"Musik:^ Bernd Hoffmann#", //Music:^ Bernd Hoffmann#
"Getestet von ...#", //Tested by ...#
// 50
"^Das war's.#", //^That's it.#
"^Schlu\341!#", //^Over!#
"^Ende!#", //^End!#
"^Aus!#", //^Done!#
"^Tsch\201\341!#", //^Bye!#
// 55
"Oh!", //Oh!
"Nicht schlecht!", //Not bad!
"Supersound!", //Supersound!
"Klasse!", //Great!
"Nicht zu fassen!", //I can't believe it!
// 60
"Super, ey!", //Dope, yo!
"Fantastisch!", //Fantastic!
"Umwerfend!", //Stunning!
"Genial!", //Brilliant!
"Spitze!", //Awesome!
// 65
"Jawoll!", //Alright!
"Hervorragend!", //Outstanding!
"Ultragut!", //Ultra-good!
"Megacool!", //Mega cool!
"Yeah!", //Yeah!
// 70
"Ein W\204chter betritt den Raum.|Du wirst verhaftet.", //A guard enters the room.|You are getting arrested.
"Die n\204chsten paar Jahre|verbringst du im Knast.", //You will spend the next|few years in jail.
"Es wird Alarm ausgel\224st.", //The alarm is about to be set off.
"Du h\224rst Schritte.", //You are hearing footsteps.
"Um das Schloss zu \224ffnen,|brauchst du einige Zeit.", //You will take some time,|to pick that lock.
// 75
"Du ger\204tst in Panik|und ziehst die Keycard|aus der T\201r.", //You are panicking|and remove the keycard|from the door.
"Du hast deinen Auftrag|noch nicht ausgef\201hrt.", //You have not completed|your task yet.
"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du dich, zu fliehen.", //Although you haven't|disabled the alarm yet,|you decide to escape.
"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum Kulturpalast.", //You get rid of your burglar tools|and take a cab to the Palace of Culture.
"Diese T\201r brauchst|du nicht zu \224ffnen.", //You don't need|to open this door.
// 80
"Uff, es hat geklappt!", //Phew, it worked!
"Zur\201ck im Quartier der Gangster ...", //Back in the gangsters' hideout ...
"Das lief ja wie am Schn\201rchen!", //Everything went like clockwork!
"Hier, dein Anteil von 30000 Xa.", //Here, your share of 30000 Xa.
"Wo ist denn der Saurierkopf?", //Where's the dinosaur skull?
// 85
"Dazu hatte ich keine Zeit mehr.", //I didn't have enough time for that.
"Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!", //What? You're nuts!|Then you won't get your|share. Beat it!
"Der Sauger ist schon dort.", //The suction cup is already there.
"Du heftest den Sauger an die Wand|und h\204lst dich daran fest.", //You attach the suction cup to the wall|and hold on to it.
"Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand", //You stand on the floor|then remove the suction cup from the wall
// 90
"Die Alarmanlage ist|schon ausgeschaltet.", //The alarm system is|already switched off.
"Um die Anlage abzuschalten,|brauchst du einige Zeit.", //To turn off the system,|you need some time.
"Die Alarmanlage ist jetzt ausgeschaltet.", //The alarm system is now switched off.
"Saurier", //Dinosaur
"Du hast jetzt besseres zu tun,|als das Ding anzuschauen.", //You have better things to do now|than look at that thing.
// 95
"Eingang", //Entrance
"T\201r", //Door
"Strasse zum Stadtzentrum", //Road to the city center
"Kamera", //Security camera
"Hoffentlich bemerkt dich niemand.", //Hopefully nobody will notice you.
// 100
"Haupteingang", //Main entrance
"Gang", //Corridor
"Ziemlich gro\341.", //Quite large.
"Saurierkopf", //Dinosaur head
"Dies ist der Kopf,|den du suchst.", //This is the head|you're looking for.
// 105
"Alarmanlage", //Alarm system
"Sauger", //Suction cup
"Wand", //Wall
"Loch", //Opening
"Buchstabe", //Letter
// 110
"Sie ist sehr massiv.", //It is very massive.
"Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen.", //Hmm, X and Y|I have seen these letters|somewhere before.
"Deine Zeit ist um, Fremder!", //Your Time is up, Stranger!
"Du hast das Seil|doch schon festgebunden.", //You already tied the rope.
"Das w\201rde wenig bringen.", //That would have little effect.
// 115
"Sonnenstich, oder was?", //Sunstroke, or what?
"Du merkst, da\341 der Boden|unter dir nachgibt, und|springst zur Seite.", //You notice that the ground|is giving way under you,|and you leap aside.
"Puzzleteil", //Puzzle piece
"Neben diesem Stein|ist kein freies Feld.", //There's no free square|next to this stone.
"Du spielst gerade ein|Adventure, kein Rollenspiel!", //You are currently playing an|Adventure, not a Role-Playing Game!
// 120
"Du kannst das Seil|nirgends befestigen.", //There's nowhere|to attach the rope.
"Es pa\341t nicht|zwischen die Steine.", //It does not fit|between the stones.
"Das ist doch|oben festgebunden!", //That is already|tied up above!
"Hey, das ist|mindestens 10 Meter tief!", //Hey, that is|at least 10 meters deep!
"In dem Schlitz|ist nichts mehr.", //There is nothing|left in the slot.
// 125
"Das ist mindestens 5 Meter tief!", //That is at least 5 meters deep!
"Du versuchst, den Sarg zu|\224ffnen, aber der Deckel bewegt|sich keinen Millimeter.", //You try to open the coffin,|but the lid does not|move a millimeter.
"Du hast die Kugel schon gedr\201ckt.", //You have already|pushed the ball.
"Die Kugel bewegt sich ein St\201ck.", //The ball moves a bit.
"Herzlichen Gl\201ckwunsch!", //Congratulations!
// 130
"Sie haben das Spiel gel\224st|und gewinnen 400 Xa!", //You solved the game|and won 400 Xa!
"Vielen Dank f\201r die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!", //Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!
"N", //N
"O", //E
"S", //S
// 135
"W", //W
"Seil", //Rope
"Schild", //Sign
"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die Pyramide!\".", //It reads:|"Want to find|the right hole? Then dare|to enter the pyramid!".
"Es ist eine kleine \231ffnung.", //It is a small opening.
// 140
"Pyramide", //Pyramid
"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken scheinen|den Spielverlauf zu beeinflussen.", //Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to influence|the course of the game.
"Sonne", //Sun
"Sch\224n!", //Nice!
"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine Stunde Zeit,|um deine Aufgabe zu erf\201llen!\"", //"Hello, Stranger, when you enter|this room, you have only an hour|to accomplish your task!"
// 145
"rechte Seite", //right side
"linke Seite", //left side
"Knopf", //Button
"Schrift", //Inscription
"Tomate", //Tomato
// 150
"Komisch!", //Funny!
"Messer", //Knife
"Es ist ein relativ stabiles Messer.", //It is a relatively sturdy knife.
"Monster", //Monster
"Es ist dick und|ungef\204hr 15 Meter lang.", //It is thick and|about 15 meters long.
// 155
"Augen", //Eyes
"Mund", //Mouth
"Es ist nur eine Statue.", //It's just a statue.
"Zettel", //Note
"Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\"", //It reads:|"When you're almost there,|do the following:|Drink!"
// 160
"Es ist ca. 10 Meter tief.", //It is about 10 meters deep.
"Oben siehst du helles Licht.", //Above you is a bright light.
"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst belohnt!\"", //It reads:|"Rest a minute in the room|between the monsters,|and you'll be rewarded!"
"Schlitz", //Slot
"Du kommst mit den|H\204nden nicht rein.", //You cannot get in|with your hands.
// 165
"Es ist ca. 5 Meter tief.", //It is about 5 meters deep.
"Steine", //Stones
"Platte", //Plate
"Sarg", //Coffin
"Ausgang", //Exit
// 170
"Unheimlich!", //Creepy!
"Zahnb\201rste", //Toothbrush
"Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein.", //The thing with the|Artus GmbH seems to have|gotten to your head.
"Zahnpastatube", //Toothpaste
"Kugel", //Ball
// 175
"Hmm, die Kugel sieht lose aus.", //Hmm, the ball looks loose.
"Auge", //Eye
"Irgendwas stimmt damit nicht.", //Something is wrong with that.
"Es ist nichts Besonderes daran.", //There's nothing special about it.
"Sieht nach Metall aus.", //It looks like metal.
// 180
"Ein Taxi kommt angerauscht,|du steigst ein.", //A taxi arrives, and you get in.
"Du dr\201ckst auf den Knopf, aber nichts passiert", //You press the button, but nothing happens
"Es ist leer.", //It is empty.
"Du findest ein kleines Ger\204t,|einen Ausweis und einen Xa.", //You find a small device,|an ID card and a Xa.
"Du heftest den|Magnet an die Stange.", //You attach the|magnet to the pole.
// 185
"Stange mit Magnet", //Pole with magnet
"Raffiniert!", //Cunning!
"Du mu\341t das|Ger\204t erst kaufen.", //You must buy|this device first.
"Du legst den Chip|in das Ger\204t ein.", //You insert the chip|into the device.
"Du \201berspielst die CD|auf den Musikchip.", //You transfer the CD|to the Music chip.
// 190
"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger\204t nichts aufnehmen.", //Without an inserted|music chip, you can not|record on the device.
"Du nimmst den Chip|aus dem Ger\204t.", //You remove the chip|from the device.
"Es ist kein Chip eingelegt.", //There is no chip inserted.
"Wozu? Du hast sowieso nur die eine CD.", //What for? You only have one CD anyway.
"Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh\224rt.", //The "Mad Monkeys" CD.|You've heard them a thousand times.
// 195
"Du h\224rst nichts.|Der Chip ist unbespielt.", //All you hear is silence.|The chip is empty.
"Du h\224rst dir den Anfang|der \201berspielten CD an.", //You are listening to the beginning|of the copied CD.
"Es ist kein Chip einglegt.", //There is no chip inserted.
"Du trinkst etwas von den Zeug, danach|f\201hlst du dich leicht beschwipst.", //You drink some of the stuff,|then begin to feel slightly tipsy.
"%d Xa", //%d Xa
// 200
"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel\204nde bereits verlassen.", //When you get off the plane|the other passengers|have already left the airport.
"Flughafen", //Airport
"Stadtzentrum", //Downtown
"Kulturpalast", //Palace of Culture
"Erde", //Earth
// 205
"Privatwohnung", //Private apartment
"(Taxi verlassen)", //(Leave the taxi)
"(Bezahlen)", //(Pay)
"Adresse:| ", //Address:|
"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar nicht kennen!", //Fiddling with the system doesn't work!|At this time you can not|even know this address!
// 210
"Du hast nicht|mehr genug Geld.", //You do not|have enough money left.
"Du merkst, da\341 das Taxi stark beschleunigt.", //You notice the taxi is accelerating rapidly.
"F\201nf Minuten sp\204ter ...", //Five minutes later ...
"Du hast doch schon eine Stange", //You already have a pole
"Du s\204gst eine der Stangen ab.", //You saw off one of the poles.
// 215
"Du betrittst das einzige|offene Gesch\204ft, das|du finden kannst.", //You enter the only|open shop that|you can find.
"Die Kabine ist besetzt.", //The cabin is occupied.
"He, nimm erstmal das Geld|aus dem R\201ckgabeschlitz!", //Hey, take the money|from the return slot!
"Du hast doch schon bezahlt.", //You have already paid.
"Du hast nicht mehr genug Geld.", //You do not have enough money left.
// 220
"Du wirfst 10 Xa in den Schlitz.", //You put 10 Xa in the slot.
"Dir wird schwarz vor Augen.", //You are about to pass out.
"Du ruhst dich eine Weile aus.", //You rest for a while.
"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ...\"", //On the Wall is:|"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
"Ok, ich nehme es.", //OK, I'll take it.
// 225
"Nein danke, das ist mir zu teuer.", //No thanks, that's too expensive for me.
"Ich w\201rde gern etwas kaufen.", //I would like to buy something.
"Ich bin's, Horst Hummel.", //It's me, Horst Hummel.
"Haben Sie auch einen Musikchip f\201r das Ger\204t?", //Do you have a music chip for the device?
"Eine tolle Maske, nicht wahr?", //It's a great mask, right?
// 230
"Komisch, da\341 sie schon drei Jahre da steht.", //Strange that it has been there for three years.
"Ein starker Trunk. Zieht ganz sch\224n rein.", //A strong drink. It hits you pretty hard.
"Ein Abspiel- und Aufnahmeger\204t f\201r die neuen Musikchips.", //A playback and recording device for the new music chips.
"Eine ARTUS-Zahnb\201rste. Der letzte Schrei.", //An ARTUS toothbrush. The latest craze.
"Verkaufe ich massenhaft, die Dinger.", //I sell these things in bulk.
// 235
"Das sind echte Rarit\204ten. B\201cher in gebundener Form.", //These are real rarities. Books in bound form.
"Die Encyclopedia Axacussana.", //The Encyclopedia Axacussana.
"Das gr\224\341te erh\204ltliche Lexikon auf 30 Speicherchips.", //The largest available dictionary on 30 memory chips.
"\232ber 400 Trilliarden Stichw\224rter.", //Over 400 sextillion keywords.
"Die ist nicht zu verkaufen.", //It is not for sale.
// 240
"So eine habe ich meinem Enkel zum Geburtstag geschenkt.", //I gave one to my grandson for his birthday.
"Er war begeistert von dem Ding.", //He was excited about this thing.
"Der stammt aus einem bekannten Computerspiel.", //It comes from a well-known computer game.
"Robust, handlich und stromsparend.", //Sturdy, handy and energy-saving.
"Irgendein lasches Ges\224ff.", //Some cheap swill.
// 245
"Das sind Protestaufkleber gegen die hohen Taxigeb\201hren.", //These are stickers protesting the high taxi fees.
"Das ist Geschirr aus der neuen Umbina-Kollektion.", //These are dishes from the new Umbina-Collection.
"H\204\341lich, nicht wahr?", //Ugly, right?
"Aber verkaufen tut sich das Zeug gut.", //But this stuff sells well.
"Das kostet %d Xa.", //That costs %d Xa.
// 250
"Schauen Sie sich ruhig um!", //Take a look around!
"Unsinn!", //Nonsense!
"Tut mir leid, die sind|schon alle ausverkauft.", //I'm very sorry,|they are already sold out.
"Guten Abend.", //Good evening.
"Hallo.", //Hello.
// 255
"Huch, Sie haben mich aber erschreckt!", //Yikes, you scared me!
"Wieso?", //How so?
"Ihre Verkleidung ist wirklich t\204uschend echt.", //Your disguise is deceptively real-looking.
"Welche Verkleidung?", //What disguise?
"Na, tun Sie nicht so!", //Stop pretending you don't know!
// 260
"Sie haben sich verkleidet wie der Au\341erirdische,|dieser Horst Hummel, oder wie er hei\341t.", //You disguised yourself as that extraterrestrial guy,|Horst Hummel, or whatever his name is.
"Ich BIN Horst Hummel!", //I AM Horst Hummel!
"Geben Sie's auf!", //Give it up!
"An Ihrer Gestik merkt man, da\341 Sie|ein verkleideter Axacussaner sind.", //You can tell from your gestures that you are|a disguised Axacussan.
"Der echte Hummel bewegt sich|anders, irgendwie ruckartig.", //The real Hummel moves|differently, kind of jerky.
// 265
"Weil er ein Roboter ist! ICH bin der Echte!", //Because he is a robot! I am the real one!
"Ach, Sie spinnen ja!", //Oh, you are crazy!
"Sie Trottel!!!", //You Idiot!!!
"Seien Sie still, oder ich werfe Sie raus!", //Shut up or I'll kick you out!
"Taschenmesser", //Pocket knife
// 270
"Hey, da ist sogar eine S\204ge dran.", //Hey, there's even a saw on it.
"20 Xa", //20 Xa
"Discman", //Discman
"Da ist noch die \"Mad Monkeys\"-CD drin.", //The "Mad Monkeys" CD is still in there.
"Mit dem Ding sollst du dich|an der Wand festhalten.", //You should hold onto the wall|using that thing.
// 275
"Spezialkeycard", //Special keycard
"Damit sollst du die|T\201ren knacken k\224nnen.", //With that you should be able to crack the doors.
"Alarmknacker", //Alarm cracker
"Ein kleines Ger\204t, um|die Alarmanlage auszuschalten.", //A small device|to turn off the alarm.
"Karte", //Keycard
// 280
"Raumschiff", //Spaceship
"Damit bist du hierhergekommen.", //You came here with it.
"Fahrzeuge", //Vehicles
"Du kannst von hier aus nicht erkennen,|was das f\201r Fahrzeuge sind.", //You cannot tell from here|what those vehicles are.
"Fahrzeug", //Vehicle
// 285
"Es scheint ein Taxi zu sein.", //It seems to be a taxi.
"Komisch, er ist verschlossen.", //Funny, it is closed.
"Portemonnaie", //Wallet
"Das mu\341 ein Axacussaner|hier verloren haben.", //This must have been|lost by an Axacussan.
"Ger\204t", //Device
// 290
"Auf dem Ger\204t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran.", //The device says "Taxi Call."|There is a small button on it.
"Ausweis", //ID card
"Auf dem Ausweis steht:| Berta Tschell| Axacuss City| 115AY2,96A,32", //On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32
"Treppe", //Staircase
"Sie f\201hrt zu den Gesch\204ften.", //It leads to the shops.
// 295
"Gesch\204ftsstra\341e im Hintergrund", //Business street in the background
"Die Stra\341e scheint kein Ende zu haben.", //The road seems to have no end.
"Stange", //Rod
"Pfosten", //Post
"Gel\204nder", //Railing
// 300
"Plakat", //Poster
"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH", //Pure Music - The Music Competition!|Today at the Palace of Culture|Main Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH
"Kabine", //Cabin
"Sie ist frei!", //It is free!
"Sie ist besetzt.", //It is occupied.
// 305
"F\201\341e", //Feet
"Komisch, die|F\201\341e scheinen|erstarrt zu sein.", //Strange, the|feet seem to be frozen.
"Haube", //Hood
"Sieht aus wie beim Fris\224r.", //Looks like the hairdresser.
"400 Xa", //400 Xa
// 310
"10 Xa", //10 Xa
"Dar\201ber steht:|\"Geldeinwurf: 10 Xa\".", //It says:|"Coins: 10 Xa".
"Dar\201ber steht:|\"Gewinnausgabe / Geldr\201ckgabe\".", //It says:|"Prize / Money Return".
"Stuhl", //Chair
"Etwas Entspannung k\224nntest du jetzt gebrauchen.", //You could use some relaxation right about now.
// 315
"Gekritzel", //Scribble
"Gesicht", //Face
"Nicht zu fassen! Die|W\204nde sind genauso beschmutzt|wie auf der Erde.", //Unbelievable! The walls|are just as dirty|as those on Earth.
"B\201cher", //Books
"Lexikon", //Dictionary
// 320
"Pflanze", //Plant
"Maske", //Mask
"Schlange", //Snake
"Becher", //Cup
"Joystick", //Joystick
// 325
"Eine normale Zahnb\201rste,|es steht nur \"Artus\" darauf.", //An ordinary toothbrush.|It says "Artus" on it.
"Musikger\204t", //Music device
"Ein Ger\204t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon daran.", //A device for playing and recording music chips.|There is a microphone on it.
"Flasche", //Bottle
"Auf dem Etikett steht:|\"Enth\204lt 10% Hyperalkohol\".", //The label says: "Contains 10% hyperalcohol".
// 330
"Kiste", //Box
"Verk\204ufer", //Seller
"Was? Daf\201r wollen Sie die Karte haben?", //What? Do you want the card for that?
"Sie sind wohl nicht ganz \201ber|die aktuellen Preise informiert!", //You are probably not completely|informed about the current prices!
"Ich bin's, Horst Hummel!", //It's me, Horst Hummel!
// 335
"Sch\224nes Wetter heute!", //Nice weather today!
"K\224nnen Sie mir sagen, von wem ich eine Eintrittskarte f\201r den Musikwettbewerb kriegen kann?", //Can you tell me who can get me a ticket for the music contest?
"Ok, hier haben Sie den Xa.", //OK, here is the Xa.
"Ich biete Ihnen 500 Xa.", //I offer you 500 Xa.
"Ich biete Ihnen 1000 Xa.", //I offer you 1000 Xa.
// 340
"Ich biete Ihnen 5000 Xa.", //I offer you 5000 Xa.
"Ich biete Ihnen 10000 Xa.", //I offer you 10000 Xa.
"Vielen Dank f\201r Ihren Kauf!", //Thank you for your purchase!
"Was bieten Sie mir|denn nun f\201r die Karte?", //What will you offer me|for the card?
"Hallo, Sie!", //Hello to you!
// 345
"Was wollen Sie?", //What do you want?
"Wer sind Sie?", //Who are you?
"Horst Hummel!", //Horst Hummel!
"Kenne ich nicht.", //Never heard of him.
"Was, Sie kennen den ber\201hmten Horst Hummel nicht?", //What, you don't know the famous Horst Hummel?
// 350
"Ich bin doch der, der immer im Fernsehen zu sehen ist.", //I'm the guy who is always on TV.
"Ich kenne Sie wirklich nicht.", //I really do not know you.
"Komisch.", //Funny.
"Aha.", //Aha.
"Ja, kann ich.", //Yes, I can.
// 355
"Von wem denn?", //From whom?
"Diese Information kostet einen Xa.", //This information costs a Xa.
"Wie Sie meinen.", //As you say.
"Sie k\224nnen die Karte von MIR bekommen!", //You can get the card from ME!
"Aber nur eine Teilnahmekarte,|keine Eintrittskarte.", //But only a participation ticket,|not an entrance ticket.
// 360
"Was wollen Sie daf\201r haben?", //What do you want for it?
"Machen Sie ein Angebot!", //Make an offer!
"Das ist ein gutes Angebot!", //That's a good offer!
"Daf\201r gebe ich Ihnen meine|letzte Teilnahmekarte!", //For that I give you my|last participation card!
"(Dieser Trottel!)", //(That Idiot!)
// 365
"Ich w\201rde gern beim Musikwettbewerb zuschauen.", //I would like to watch the music competition.
"Ich w\201rde gern am Musikwettbewerb teilnehmen.", //I would like to participate in the music competition.
"Wieviel Uhr haben wir?", //What time is it?
"Ja.", //Yes.
"Nein.", //No.
// 370
"Hallo, Leute!", //Hi guys!
"Hi, Fans!", //Hi, fans!
"Gute Nacht!", //Good night!
"\216h, wie geht es euch?", //Uh, how are you?
"Sch\224nes Wetter heute.", //Nice weather today.
// 375
"Hmm ...", //Hmm ...
"Tja ...", //Well ...
"Also ...", //So ...
"Ok, los gehts!", //OK let's go!
"Ich klimper mal was auf dem Keyboard hier.", //I'll fix something on the keyboard here.
// 380
"Halt, sie sind doch schon drangewesen!", //Stop, you have already been on it!
"He, Sie! Haben Sie|eine Eintrittskarte?", //Hey, you! Do you have|a ticket?
"Ja nat\201rlich, hier ist meine Teilnahmekarte.", //Yes of course, here is my participation ticket.
"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten k\224nnen.", //You are a participant!|Please ask at the checkout|when you can go on stage.
"\216h, nein.", //Uh, no.
// 385
"He, wo ist Ihr Musikchip?", //Hey, where's your music chip?
"Laber nicht!", //Stop talking!
"Fang an!", //Get started!
"Einen Moment, ich mu\341 erstmal \201berlegen, was ich|euch spiele.", //One moment, I have to think about what I'm playing for you.
"Anfangen!!!", //Begin!!!
// 390
"Nun denn ...", //Well then ...
"Raus!", //Out!
"Buh!", //Boo!
"Aufh\224ren!", //Stop!
"Hilfe!", //Help!
// 395
"Ich verziehe mich lieber.", //I'd prefer to get lost.
"Mist, auf dem Chip war|gar keine Musik drauf.", //Damn, there was no music on the chip at all.
"Das ging ja voll daneben!", //That went completely wrong!
"Du n\204herst dich der B\201hne,|aber dir wird mulmig zumute.", //You approach the stage,|but you feel queasy.
"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder um.", //You do not dare to appear|in front of so many people|and turn around.
// 400
"Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp\204t dran.", //Oh, you are a participant!|But you are late.
"Spielen Sie die Musik live?", //Do you play the music live?
"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt abgespielt.", //Then please submit your music chip!|It will be played during your performance.
"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der B\201hneneingang|ist hinter dem Haupteingang rechts.", //Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the main entrance.
"Habe ich noch einen zweiten Versuch?", //Can I have another try?
// 405
"Nein!", //No!
"Haben Sie schon eine Eintrittskarte?", //Do you already have a ticket?
"Tut mir leid, die Karten|sind schon alle ausverkauft.", //I'm sorry, the tickets|are already sold out.
"Mist!", //Crap!
"Haben Sie schon eine Teilnahmekarte?", //Do you already have a participation ticket?
// 410
"Ja, hier ist sie.", //Yes, here it is.
"Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft.", //I'm sorry, the participation tickets|are already sold out.
"Schei\341e!", //Crap!
"Das kann ich Ihnen|leider nicht sagen.", //I can not tell you that.
"Wo ist denn nun Ihr Musikchip?", //Where is your music chip?
// 415
"Jetzt beeilen Sie sich doch!", //Now hurry up!
"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb", //Huh, you're here at a music contest,|not at an imitation contest
"Imitationswettbewerb?|Ich will niemanden imitieren.", //Imitation contest?|I do not want to imitate anyone.
"Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?", //Good joke. Then why do you look like Horst Hummel?
"Na, nun h\224ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht.", //Oh come on! Your disguise isn't that perfect.
// 420
"Ich werde Ihnen beweisen, da\341 ich Horst Hummel bin,|indem ich diesen Wettbewerb hier gewinne.", //I will prove to you that I am Horst Hummel|by winning this competition.
"Dann kann ich in dieser verdammten Fernsehshow|auftreten.", //Then I can perform in this|damn TV show.
"Du hampelst ein bi\341chen zu|der Musik vom Chip herum.|Die Leute sind begeistert!", //You're rocking a little bit|to the music from the chip.|The audience is excited!
"Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns.", //Good evening. This time we have|a special guest with us.
"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort vor allem durch seine|Verkleidung aufgefallen war.", //He is the winner of yesterday's music competition in the Palace of Culture.|He was particularly noteworthy|because of his disguise.
// 425
"Sie haben das Wort!", //You have the floor!
"Nun ja, meine erste Frage lautet: ...", //Well, my first question is ...
"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, f\201r|die Artus-GmbH zu arbeiten?", //Why did you decide immediately|after your arrival to work for|Artus GmbH?
"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen.", //It was a decision I made on my own.|I just decided I liked Artus-GmbH.
"Wieso betonen Sie, da\341 es|Ihre freie Entscheidung war?|Haben Sie Angst, da\341 man Ihnen|nicht glaubt?", //Why do you stress that|it was your own decision?|Are you afraid that nobody will believe you otherwise?
// 430
"Also, ich mu\341 doch sehr bitten!|Was soll diese unsinnige Frage?", //How dare you!|What is with this nonsensical question?
"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?", //I think the question is important.|Well, Mr. Hummel, what do you have to say?
"Auf solch eine Frage brauche|ich nicht zu antworten!", //I don't feel that I have|to answer such a question!
"Gut, dann etwas anderes ...", //Alright, something else then ...
"Sie sind von Beruf Koch.|Wie hie\341 das Restaurant,|in dem Sie auf der Erde|gearbeitet haben?", //You are a chef by profession.|What was the name of the restaurant|where you worked|on Earth?
// 435
"Hmm, da\341 wei\341 ich nicht mehr.", //Hmm, I do not remember that.
"Sie wollen mir doch nicht weismachen,|da\341 Sie den Namen vergessen haben!", //Do you really expect me to believe you cannot remember the name?
"Schlie\341lich haben Sie|zehn Jahre dort gearbeitet!", //After all, you worked there for ten years!
"Woher wollen Sie das wissen?", //How do you know that?
"Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!", //Well, I come from Earth,|unlike you!
// 440
"Langsam gehen Sie zu weit!", //Now you've gone too far!
"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind nicht optimal|programmiert!", //You are a robot!|It is obvious from|your stupid answer!|You are not even programmed|correctly!
"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh\224ren, mu\341 ich|Ihnen das Mikrofon abschalten!", //If you do not stop right now|with your insults, I will have|to turn off the microphone!
"Ich bin der echte Horst Hummel,|und hier ist der Beweis!", //I am the real Horst Hummel,|and here is the proof!
"Am n\204chsten Morgen sind alle|Zeitungen voll mit deiner spektakul\204ren|Enth\201llung des Schwindels.", //The next morning, all the papers|are full of your spectacular|revelation of fraud.
// 445
"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet.", //The managers of Artus-GmbH and Commander|Sumoti were arrested immediately.
"Nach dem Stre\341 der letzten Tage,|entscheidest du dich, auf die|Erde zur\201ckzukehren.", //After these stressful last few days|you decide to return to Earth.
"W\204hrend du dich vor Interviews|kaum noch retten kannst, ...", //While you can barely save|yourself from interviews, ...
"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur Erde zur\201ckbringen soll.", //... the Axacussan|technicians are working on a spaceship|to bring you back to Earth.
"Eine Woche sp\204ter ist der|Tag des Starts gekommen.", //One week later, the day of the launch has arrived.
// 450
"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf.", //For the third time in your life,|you spend a long time|in deep sleep.
"Zehn Jahre sp\204ter ...", //Ten years later ...
"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern.", //You wake up and begin|to faintly remember|your experiences.
"Um dich herum ist alles dunkel.", //Everything is dark around you.
"Sie zeigt %d an.", //It displays %d.
// 455
"Ich interessiere mich f\201r den Job, bei dem man \201ber Nacht", //I'm interested in the job where you can get
"reich werden kann.", //rich overnight.
"Ich verkaufe frische Tomaten.", //I sell fresh tomatoes.
"Ich bin der Klempner. Ich soll hier ein Rohr reparieren.", //I am the plumber. I'm supposed to fix a pipe here.
"Ja, h\224rt sich gut an.", //Yes, it sounds good.
// 460
"Krumme Gesch\204fte? F\201r wen halten Sie mich? Auf Wiedersehen!", //Crooked business? Who do you think I am? Goodbye!
"\216h - k\224nnten Sie mir das Ganze nochmal erkl\204ren?", //Uh - could you explain that to me again?
"Wie gro\341 ist mein Anteil?", //How big is my share?
"Machen Sie es immer so, da\341 Sie Ihre Komplizen \201ber ein Graffitti anwerben?", //Do you always use graffiti to recruit your accomplices?
"Hmm, Moment mal, ich frage den Boss.", //Hmm wait, I will ask the boss.
// 465
"Kurze Zeit sp\204ter ...", //A short while later ...
"Ok, der Boss will dich sprechen.", //OK, the boss wants to talk to you.
"Du betrittst die Wohnung und|wirst zu einem Tisch gef\201hrt.", //You enter the apartment and are led to a table.
"Hmm, du willst dir also|etwas Geld verdienen?", //Hmm, so you want to earn some money?
"Nun ja, wir planen|einen n\204chtlichen Besuch|eines bekannten Museums.", //Well, we're planning|a nightly visit|to a well-known museum.
// 470
"Wie sieht's aus, bist du interessiert?", //So, are you interested?
"Halt, warte!", //Stop, wait!
"\232berleg's dir, es springen|30000 Xa f\201r dich raus!", //Think about it, your share would be|30000 Xa!
"30000?! Ok, ich mache mit.", //30000?! Alright, count me in.
"Gut, dann zu den Einzelheiten.", //Good, now then to the details.
// 475
"Bei dem Museum handelt es|sich um das Orzeng-Museum.", //The museum in question is|the Orzeng Museum.
"Es enth\204lt die wertvollsten|Dinosaurierfunde von ganz Axacuss.", //It contains the most valuable|dinosaur discoveries of Axacuss.
"Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltber\201hmt.", //We're aiming to get the Sodo skeleton.|It is world-famous.
"Alle bekannten Pal\204ontologen haben|sich schon damit besch\204ftigt.", //All known paleontologists|have already dealt with it.
"Der Grund daf\201r ist, da\341 es allen|bis jetzt bekannten Erkenntnissen|\232ber die Evolution widerspricht.", //The reason for this is that it contradicts all known|knowledge about evolution.
// 480
"Irgendein verr\201ckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding beschaffen.", //Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for him.
"So, jetzt zu deiner Aufgabe:", //So, now to your task:
"Du dringst durch den Nebeneingang|in das Geb\204ude ein.", //You enter the building through|the side entrance.
"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert wird.", //There you switch off the alarm system,|which secures the Sodo skeleton.
"Wir betreten einen anderen Geb\204udeteil|und holen uns das Gerippe.", //We'll enter another part of the building|and fetch the skeleton.
// 485
"Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an.", //Your task is not easy.|Look at this plan.
"Unten siehst du die kleine Abstellkammer,|durch die du in die Austellungsr\204ume kommst.", //Below you can see the small storage room,|through which you come to the showrooms.
"Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage.", //The alarm system is at the location marked Y.
"Bei dem X steht ein gro\341er Dinosaurier|mit einem wertvollen Sch\204del.|Den Sch\204del nimmst du mit.", //The X marks the spot with a big dinosaur|with a valuable skull.|You will take the skull with you.
"Nun zu den Problemen:", //Now for the problems:
// 490
"Die wei\341 gekennzeichneten|T\201ren sind verschlossen.", //The marked white doors|are locked.
"Sie m\201ssen mit einer Spezialkeycard ge\224ffnet|werden, was jedoch einige Zeit dauert.", //They have to be opened with a special keycard,|which can take a while.
"Au\341erdem gibt es in den auf der Karte|farbigen R\204umen einen Druck-Alarm.", //In addition, there are pressure alarms|in the rooms which are colored on the map.
"Du darfst dich dort nicht l\204nger|als 16 bzw. 8 Sekunden aufhalten,|sonst wird Alarm ausgel\224st.", //You can not stay there longer than|16 or 8 seconds,|or the alarm will go off.
"Im Raum oben rechts ist|eine Kamera installiert.", //In the room at the top right|there is a camera installed.
// 495
"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute \201berwacht.", //However, it is only monitored|between the 21st and the 40th second|of every minute.
"Das gr\224\341te Problem ist der W\204chter.", //The biggest problem is the guard.
"Er braucht f\201r seine Runde genau|eine Minute, ist also ungef\204hr|zehn Sekunden in einem Raum.", //He needs exactly one minute for his round,|so he is in each room|for about ten seconds.
"Du m\201\341test seine Schritte h\224ren k\224nnen,|wenn du in der Abstellkammer bist|und der W\204chter dort vorbeikommt.", //You should be able to hear his footsteps|if you are in the closet|and the guard passes by.
"Wenn du es bis zur Alarmanlage|geschafft hast, h\204ngst du dich|mit dem Sauger an die Wand,|damit du keinen Druck-Alarm ausl\224st.", //If you make it to the alarm system,|you'll use the sucker to hang on the wall|to avoid triggering the pressure alarm.
// 500
"Die Alarmanlage schaltest du|mit einem speziellen Ger\204t aus.", //You switch off the alarm system|with a special device.
"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst keinen Alarm ausl\224sen.", //Once you're done, get out of there!|But do not panic!|You must not set off the alarm.
"So, noch irgendwelche Fragen?", //So, any more questions?
"Also gut.", //All right then.
"Du bekommst 30000 Xa.", //You get 30,000 Xa.
// 505
"Ja, die Methode hat sich bew\204hrt.", //Yes, that method has proven itself worthy.
"Hast du sonst noch Fragen?", //Do you have any questions?
"Nachdem wir alles gekl\204rt|haben, kann es ja losgehen!", //Now that we are on the same page we can get started!
"Zur vereinbarten Zeit ...", //At the agreed upon time ...
"Du stehst vor dem Orzeng Museum,|w\204hrend die Gangster schon in einen|anderen Geb\204uderteil eingedrungen sind.", //You stand in front of the Orzeng Museum,|while the gangsters have already penetrated|into another part of the building.
// 510
"Wichtiger Hinweis:|Hier ist die letzte M\224glichkeit,|vor dem Einbruch abzuspeichern.", //Important note:|Here is the last possibility to save|before the break-in.
"Wenn Sie das Museum betreten haben,|k\224nnen Sie nicht mehr speichern!", //Once you enter the museum|you will not be able to save!
"Stecken Sie sich Ihre|Tomaten an den Hut!", //You can keep your tomatoes!
"Das kann ja jeder sagen!", //Anyone can say that!
"Niemand \224ffnet.", //Nobody answers.
// 515
"Welche Zahl willst du eingeben: ", //What number do you want to enter:
"Falsche Eingabe", //Invalid input
"Der Aufzug bewegt sich.", //The elevator is moving.
"Die Karte wird|nicht angenommen.", //The card|is not accepted.
"Da ist nichts mehr.", //There is nothing left.
// 520
"Da ist ein Schl\201ssel unter dem Bett!", //There's a key under the bed!
"Hey, da ist etwas unter dem|Bett. Nach dem Ger\204usch zu|urteilen, ist es aus Metall.", //Hey, there is something under the|bed. Judging by the noise,|it is made of metal.
"Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen.", //Damn, you do not succeed in getting the object out.
"Die Klappe ist schon offen.", //The flap is already open.
"Der Schl\201sssel pa\341t nicht.", //The key does not fit.
// 525
"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage scheint kaputt zu sein.", //You put the chip in the stereo,|but nothing happens.|The stereo seems to be broken.
"Es passiert nichts. Das Ding|scheint kaputt zu sein.", //Nothing happens. The thing|seems to be broken.
"Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen m\201\341test!", //High voltage is unhealthy, as you|should already know|from Part 1!
"Es h\204ngt ein Kabel heraus.", //A cable hangs out.
"Irgendetwas hat hier|nicht ganz funktioniert.", //Something did not|quite work out here.
// 530
"Du ziehst den Raumanzug an.", //You put on your space suit.
"Du ziehst den Raumanzug aus.", //You take off your space suit.
"Das ist schon verbunden.", //That is already connected.
"Die Leitung ist hier|schon ganz richtig.", //The cable is already|at the right place.
"Roger W.! Wie kommen Sie denn hierher?", //Roger W.! How did you get here?
// 535
"Ach, sieh mal einer an! Sie schon wieder!", //Oh, look at that! It's you again!
"Wo haben Sie denn|Ihr Schiff gelassen?", //Where did you|leave your ship?
"Schauen Sie mal hinter mich auf|den Turm! Da oben h\204ngt es.", //Take a look behind me, up on|the tower! It's up there.
"Ich hatte es scheinbar etwas zu|eilig, aber ich mu\341te unbedingt|zu den Dreharbeiten nach Xenon!", //Apparently I was too much in a hurry,|but I had to be at the film shooting in Xenon!
"Mich wundert, da\341 es die Leute|hier so gelassen nehmen.", //I am surprised that people|here take things so calmly.
// 540
"Die tun gerade so, als ob der Turm|schon immer so schr\204g gestanden h\204tte!", //They are pretending that the tower|has always been that slanted!
"Hat er auch, schon seit|mehreren Jahrhunderten!", //It has, for|several centuries, actually!
"\216h ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich eilig.", //Uh ... I see. And where are you coming from? It seems you were in quite a hurry as well.
"Ich komme von Axacuss.", //I come from Axacuss.
"Hmm, was mach ich jetzt blo\341?", //Hmm, what am I going to do now?
// 545
"Ich kenne ein gutes Cafe nicht|weit von hier, da k\224nnen|wir uns erstmal erholen.", //I know a good cafe not far from here,|where we can get some rest.
"Ok, einverstanden.", //OK, I agree.
"Faszinierend!", //Fascinating!
"Taxis", //Taxis
"Hier ist ja richtig was los!", //There seems to be something really going on here!
// 550
"Axacussaner", //Axacussan
"Teilnahmekarte", //Participation card
"Axacussanerin", //Axacussian
"Darauf steht:|\"115AY2,96A\"", //It reads:|"115AY2,96A"
"Darauf steht:|\"115AY2,96B\"", //It reads:|"115AY2,96B"
// 555
"Darauf steht:|\"341,105A\"", //It reads:|"341,105A"
"Darauf steht:|\"341,105B\"", //It reads:|"341,105B"
"Klingel", //Bell
"Anzeige", //Display
"Tastenblock", //Keypad
// 560
"Es sind Tasten von 0 bis 9 darauf.", //There are keys from 0 to 9 on it.
"Chip", //Chip
"Es ist ein Musikchip!", //It's a music chip!
"Klappe", //Hatch
"Sie ist mit einem altmodischen|Schlo\341 verschlossen.", //It is secured with an old-fashioned lock.
// 565
"Musikanlage", //Music system
"Toll, eine in die Wand|integrierte Stereoanlage.", //Great, a built-in stereo|in the wall.
"Boxen", //Speakers
"Ganz normale Boxen.", //Ordinary speakers.
"Stifte", //Pencils
// 570
"Ganz normale Stifte.", //Ordinary pencils.
"Metallkl\224tzchen", //Metal blocks
"Es ist magnetisch.", //It is magnetic.
"Bild", //Image
"Ein ungew\224hnliches Bild.", //An unusual picture.
// 575
"Schrank", //Cabinet
"Er ist verschlossen", //It is closed
"Aufzug", //Elevator
"unter Bett", //under bed
"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht darunter.|Du br\204uchtest einen Stock oder so etwas.", //Under the bed are certainly important|things to find, only you cannot reach underneath.|You need a stick or something.
// 580
"Schl\201ssel", //Key
"Ein kleiner Metallschl\201ssel.", //A small metal key.
"Schalter", //Switch
"Griff", //Handle
"Luke", //Hatch
// 585
"Raumanzug", //Space suit
"Ein zusammenfaltbarer Raumanzug.", //A collapsible spacesuit.
"Leitung", //Cable
"Irgendetwas scheint hier|kaputtgegangen zu sein.", //Something seems to|have broken here.
"Sie h\204ngt lose von der Decke runter.", //It hangs loose from the ceiling.
// 590
"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimb\201ros zu fliehen.", //Reminder:|You managed to escape from the|Artus-GmbH secret offices.
"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City fliegt.", //Now you are in a passenger|spaceship that|flies to Axacuss City.
"W\204hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du st\224\341t auf etwas Interessantes ...", //During the flight, you watch the|Axacussan TV program.|You come across something interesting ...
"Herzlich willkommen!", //Welcome!
"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel stellen.", //Alga Lorch will be present today.|She will ask questions to the Earthling|Horst Hummel.
// 595
"Horst wird alle Fragen|beantworten, soweit es|ihm m\224glich ist.", //Horst will answer all|questions as fully|as possible.
"Sie haben das Wort, Frau Lorch!", //You have the floor, Mrs Lorch!
"Herr Hummel, hier ist meine erste Frage: ...", //Mr. Hummel, here is my first question: ...
"Sie sind nun ein ber\201hmter Mann auf Axacuss.|Aber sicher vermissen Sie auch Ihren Heimatplaneten.", //You are now a famous man on Axacuss.|But surely you miss your home planet.
"Wenn Sie w\204hlen k\224nnten, w\201rden Sie lieber|ein normales Leben auf der Erde f\201hren,|oder finden Sie das Leben hier gut?", //If you could choose, would you prefer|to lead a normal life on Earth,|or do you find life here good?
// 600
"Ehrlich gesagt finde ich es sch\224n,|ber\201hmt zu sein. Das Leben ist|aufregender als auf der Erde.", //Honestly, I think it's nice to be|famous. Life is more exciting here|than on Earth.
"Au\341erdem sind die Leute von der|Artus GmbH hervorragende Freunde.", //In addition, the people of|Artus GmbH are excellent friends.
"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zur\201ckzukehren?", //Well, are you still planning|to return to Earth someday?
"Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen.", //At this point in time,|I haven't made up my mind, yet.
"Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben.", //But I assure you,|I will stay here for a while.
// 605
"Aha, mich interessiert au\341erdem,|ob es hier auf Axacuss etwas gibt,|das Sie besonders m\224gen.", //I see. I'm also interested in|whether there's anything here on Axacuss that you particularly like.
"Oh mir gef\204llt der ganze Planet,|aber das Beste hier sind die|hervorragenden Artus-Zahnb\201rsten!", //Oh I like the whole planet,|but the best thing here are the|extraordinary Artus toothbrushes!
"Zahnb\201rsten von solcher Qualit\204t|gab es auf der Erde nicht.", //Toothbrushes of such quality|do not exist on Earth.
"\216h, ach so.", //Um, I see.
"Pl\224tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab.", //Suddenly, a speaker's voice|distracts you from the television.
// 610
"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von Axacuss City gelandet.\"", //"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City."
"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"", //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
"W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.", //While the other passengers|are disembarking, you are trying|to handle the shock.
"\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.", //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
NULL
};
#endif // GAMETEXT_H

View File

@ -0,0 +1,12 @@
MODULE := devtools/create_supernova2
MODULE_OBJS := \
file.o \
po_parser.o \
create_supernova2.o
# Set the name of the executable
TOOL_EXECUTABLE := create_supernova2
# Include common rules
include $(srcdir)/rules.mk

View File

@ -0,0 +1,221 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "po_parser.h"
PoMessageList::PoMessageList() : _list(NULL), _size(0), _allocated(0) {
}
PoMessageList::~PoMessageList() {
for (int i = 0; i < _size; ++i)
delete _list[i];
delete[] _list;
}
int PoMessageList::compareString(const char* left, const char* right) {
if (left == NULL && right == NULL)
return 0;
if (left == NULL)
return -1;
if (right == NULL)
return 1;
return strcmp(left, right);
}
int PoMessageList::compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight) {
int compare = compareString(msgLeft, msgRight);
if (compare != 0)
return compare;
return compareString(contextLeft, contextRight);
}
void PoMessageList::insert(const char *translation, const char *msg, const char *context) {
if (msg == NULL || *msg == '\0' || translation == NULL || *translation == '\0')
return;
// binary-search for the insertion index
int leftIndex = 0;
int rightIndex = _size - 1;
while (rightIndex >= leftIndex) {
int midIndex = (leftIndex + rightIndex) / 2;
int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
if (compareResult == 0)
return; // The message is already in this list
else if (compareResult < 0)
rightIndex = midIndex - 1;
else
leftIndex = midIndex + 1;
}
// We now have rightIndex = leftIndex - 1 and we need to insert the new message
// between the two (i.a. at leftIndex).
if (_size + 1 > _allocated) {
_allocated += 100;
PoMessage **newList = new PoMessage*[_allocated];
for (int i = 0; i < leftIndex; ++i)
newList[i] = _list[i];
for (int i = leftIndex; i < _size; ++i)
newList[i + 1] = _list[i];
delete[] _list;
_list = newList;
} else {
for (int i = _size - 1; i >= leftIndex; --i)
_list[i + 1] = _list[i];
}
_list[leftIndex] = new PoMessage(translation, msg, context);
++_size;
}
const char *PoMessageList::findTranslation(const char *msg, const char *context) {
if (msg == NULL || *msg == '\0')
return NULL;
// binary-search for the message
int leftIndex = 0;
int rightIndex = _size - 1;
while (rightIndex >= leftIndex) {
int midIndex = (leftIndex + rightIndex) / 2;
int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
if (compareResult == 0)
return _list[midIndex]->msgstr;
else if (compareResult < 0)
rightIndex = midIndex - 1;
else
leftIndex = midIndex + 1;
}
return NULL;
}
PoMessageList *parsePoFile(const char *file) {
FILE *inFile = fopen(file, "r");
if (!inFile)
return NULL;
char msgidBuf[1024], msgctxtBuf[1024], msgstrBuf[1024];
char line[1024], *currentBuf = msgstrBuf;
PoMessageList *list = new PoMessageList();
// Initialize the message attributes.
bool fuzzy = false;
bool fuzzy_next = false;
// Parse the file line by line.
// The msgstr is always the last line of an entry (i.e. msgid and msgctxt always
// precede the corresponding msgstr).
msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
while (!feof(inFile) && fgets(line, 1024, inFile)) {
if (line[0] == '#' && line[1] == ',') {
// Handle message attributes.
if (strstr(line, "fuzzy")) {
fuzzy_next = true;
continue;
}
}
// Skip empty and comment line
if (*line == '\n' || *line == '#')
continue;
if (strncmp(line, "msgid", 5) == 0) {
if (currentBuf == msgstrBuf) {
// add previous entry
if (*msgstrBuf != '\0' && !fuzzy)
list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
// Reset the attribute flags.
fuzzy = fuzzy_next;
fuzzy_next = false;
}
strcpy(msgidBuf, stripLine(line));
currentBuf = msgidBuf;
} else if (strncmp(line, "msgctxt", 7) == 0) {
if (currentBuf == msgstrBuf) {
// add previous entry
if (*msgstrBuf != '\0' && !fuzzy)
list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
// Reset the attribute flags
fuzzy = fuzzy_next;
fuzzy_next = false;
}
strcpy(msgctxtBuf, stripLine(line));
currentBuf = msgctxtBuf;
} else if (strncmp(line, "msgstr", 6) == 0) {
strcpy(msgstrBuf, stripLine(line));
currentBuf = msgstrBuf;
} else {
// concatenate the string at the end of the current buffer
if (currentBuf)
strcat(currentBuf, stripLine(line));
}
}
if (currentBuf == msgstrBuf) {
// add last entry
if (*msgstrBuf != '\0' && !fuzzy)
list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
}
fclose(inFile);
return list;
}
char *stripLine(char *const line) {
// This function modifies line in place and return it.
// Keep only the text between the first two unprotected quotes.
// It also look for literal special characters (e.g. preceded by '\n', '\\', '\"', '\'', '\t')
// and replace them by the special character so that strcmp() can match them at run time.
// Look for the first quote
char const *src = line;
while (*src != '\0' && *src++ != '"') {}
// shift characters until we reach the end of the string or an unprotected quote
char *dst = line;
while (*src != '\0' && *src != '"') {
char c = *src++;
if (c == '\\') {
switch (c = *src++) {
case 'n': c = '\n'; break;
case 't': c = '\t'; break;
case '\"': c = '\"'; break;
case '\'': c = '\''; break;
case '\\': c = '\\'; break;
default:
// Just skip
fprintf(stderr, "Unsupported special character \"\\%c\" in string. Please contact ScummVM developers.\n", c);
continue;
}
}
*dst++ = c;
}
*dst = '\0';
return line;
}
char *parseLine(const char *line, const char *field) {
// This function allocate and return a new char*.
// It will return a NULL pointer if the field is not found.
// It is used to parse the header of the po files to find the language name
// and the charset.
const char *str = strstr(line, field);
if (str == NULL)
return NULL;
str += strlen(field);
// Skip spaces
while (*str != '\0' && isspace(*str)) {
++str;
}
// Find string length (stop at the first '\n')
int len = 0;
while (str[len] != '\0' && str[len] != '\n') {
++len;
}
if (len == 0)
return NULL;
// Create result string
char *result = new char[len + 1];
strncpy(result, str, len);
result[len] = '\0';
return result;
}

View File

@ -0,0 +1,78 @@
/* 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.
*
* This is a utility for generating a data file for the supernova engine.
* It contains strings extracted from the original executable as well
* as translations and is required for the engine to work properly.
*/
#ifndef PO_PARSER_H
#define PO_PARSER_H
struct PoMessage {
char *msgstr;
char *msgid;
char *msgctxt;
PoMessage(const char *translation, const char *message, const char *context = NULL) :
msgstr(NULL), msgid(NULL), msgctxt(NULL)
{
if (translation != NULL && *translation != '\0') {
msgstr = new char[1 + strlen(translation)];
strcpy(msgstr, translation);
}
if (message != NULL && *message != '\0') {
msgid = new char[1 + strlen(message)];
strcpy(msgid, message);
}
if (context != NULL && *context != '\0') {
msgctxt = new char[1 + strlen(context)];
strcpy(msgctxt, context);
}
}
~PoMessage() {
delete[] msgstr;
delete[] msgid;
delete[] msgctxt;
}
};
class PoMessageList {
public:
PoMessageList();
~PoMessageList();
void insert(const char *translation, const char *msg, const char *context = NULL);
const char *findTranslation(const char *msg, const char *context = NULL);
private:
int compareString(const char *left, const char *right);
int compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight);
PoMessage **_list;
int _size;
int _allocated;
};
PoMessageList *parsePoFile(const char *file);
char *stripLine(char *);
char *parseLine(const char *line, const char *field);
#endif /* PO_PARSER_H */

File diff suppressed because it is too large Load Diff