aboutsummaryrefslogtreecommitdiff
path: root/tools/create_translations/create_translations.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/create_translations/create_translations.cpp')
-rw-r--r--tools/create_translations/create_translations.cpp187
1 files changed, 0 insertions, 187 deletions
diff --git a/tools/create_translations/create_translations.cpp b/tools/create_translations/create_translations.cpp
deleted file mode 100644
index 9fcf3b4a31..0000000000
--- a/tools/create_translations/create_translations.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/* 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 create the translations.dat file from all the po files.
- * The generated files is used by ScummVM to propose translation of its GUI.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.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
-
-#include "create_translations.h"
-#include "po_parser.h"
-
-#define TRANSLATIONS_DAT_VER 2 // 1 byte
-
-// Padding buffer (filled with 0) used if we want to aligned writes
-// static uint8 padBuf[DATAALIGNMENT];
-
-// Utility functions
-// Some of the function are very simple but are factored out so that it would require
-// minor modifications if we want for example to aligne writes on 4 bytes.
-void writeByte(FILE *fp, uint8 b) {
- fwrite(&b, 1, 1, fp);
-}
-
-void writeUint16BE(FILE *fp, uint16 value) {
- writeByte(fp, (uint8)(value >> 8));
- writeByte(fp, (uint8)(value & 0xFF));
-}
-
-int stringSize(const char *string) {
- // Each string is preceded by its size coded on 2 bytes
- if (string == NULL)
- return 2;
- int len = strlen(string) + 1;
- return 2 + len;
- // The two lines below are an example if we want to align string writes
- // pad = DATAALIGNMENT - (len + 2) % DATAALIGNMENT;
- // return 2 + len + pad;
-}
-
-void writeString(FILE *fp, const char *string) {
- // Each string is preceded by its size coded on 2 bytes
- if (string == NULL) {
- writeUint16BE(fp, 0);
- return;
- }
- int len = strlen(string) + 1;
- writeUint16BE(fp, len);
- fwrite(string, len, 1, fp);
- // The commented lines below are an example if we want to align string writes
- // It replaces the two lines above.
- // int pad = DATAALIGNMENT - (len + 2) % DATAALIGNMENT;
- // writeUint16BE(fp, len + pad);
- // fwrite(string, len, 1, fp);
- // fwrite(padBuf, pad, 1, fp);
-}
-
-// Main
-int main(int argc, char *argv[]) {
- // Build the translation list
- PoMessageList messageIds;
- PoMessageEntryList **translations = new PoMessageEntryList*[argc - 1];
- int numLangs = 0;
- for (int i = 1; i < argc; ++i) {
- translations[numLangs] = parsePoFile(argv[i], messageIds);
- if (translations[numLangs] != NULL)
- ++numLangs;
- }
-
- FILE *outFile;
- int i, lang;
- int len;
-
- // Padding buffer initialization (filled with 0)
- // used if we want to aligned writes
- // for (i = 0; i < DATAALIGNMENT; i++)
- // padBuf[i] = 0;
-
- outFile = fopen("translations.dat", "wb");
-
- // Write header
- fwrite("TRANSLATIONS", 12, 1, outFile);
-
- writeByte(outFile, TRANSLATIONS_DAT_VER);
-
- // Write number of translations
- writeUint16BE(outFile, numLangs);
-
- // Write the length of each data block here.
- // We could write it at the start of each block but that would mean that
- // to go to block 4 we would have to go at the start of each preceding block,
- // read its size and skip it until we arrive at the block we want.
- // By having all the sizes at the start we just need to read the start of the
- // file and can then skip to the block we want.
- // Blocks are:
- // 1. List of languages with the language name
- // 2. Original messages (i.e. english)
- // 3. First translation
- // 4. Second translation
- // ...
-
- // Write length for translation description
- len = 0;
- for (lang = 0; lang < numLangs; lang++) {
- len += stringSize(translations[lang]->language());
- len += stringSize(translations[lang]->languageName());
- }
- writeUint16BE(outFile, len);
-
- // Write size for the original language (english) block
- // It starts with the number of strings coded on 2 bytes followed by each
- // string (two bytes for the number of chars and the string itself).
- len = 2;
- for (i = 0; i < messageIds.size(); ++i)
- len += stringSize(messageIds[i]);
- writeUint16BE(outFile, len);
-
- // Then comes the size of each translation block.
- // It starts with the number of strings coded on 2 bytes, the charset and then the strings.
- // For each string we have the string id (on two bytes) followed by
- // the string size (two bytes for the number of chars and the string itself).
- for (lang = 0; lang < numLangs; lang++) {
- len = 2 + stringSize(translations[lang]->charset());
- for (i = 0; i < translations[lang]->size(); ++i) {
- len += 2 + stringSize(translations[lang]->entry(i)->msgstr);
- len += stringSize(translations[lang]->entry(i)->msgctxt);
- }
- writeUint16BE(outFile, len);
- }
-
- // Write list of languages
- for (lang = 0; lang < numLangs; lang++) {
- writeString(outFile, translations[lang]->language());
- writeString(outFile, translations[lang]->languageName());
- }
-
- // Write original messages
- writeUint16BE(outFile, messageIds.size());
- for (i = 0; i < messageIds.size(); ++i) {
- writeString(outFile, messageIds[i]);
- }
-
- // Write translations
- for (lang = 0; lang < numLangs; lang++) {
- writeUint16BE(outFile, translations[lang]->size());
- writeString(outFile, translations[lang]->charset());
- for (i = 0; i < translations[lang]->size(); ++i) {
- writeUint16BE(outFile, messageIds.findIndex(translations[lang]->entry(i)->msgid));
- writeString(outFile, translations[lang]->entry(i)->msgstr);
- writeString(outFile, translations[lang]->entry(i)->msgctxt);
- }
- }
-
- fclose(outFile);
-
- // Clean the memory
- for (i = 0; i < numLangs; ++i)
- delete translations[i];
- delete[] translations;
-
- return 0;
-}