diff options
Diffstat (limited to 'translations/generate_translations_header.c')
-rw-r--r-- | translations/generate_translations_header.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/translations/generate_translations_header.c b/translations/generate_translations_header.c new file mode 100644 index 000000000..69671913e --- /dev/null +++ b/translations/generate_translations_header.c @@ -0,0 +1,86 @@ +// Copyright (c) 2013, Sergey Lyubka +// Copyright (c) 2017, The Monero Project +// All rights reserved. +// Released under the MIT license. + +// This program takes a list of files as an input, and produces C++ code that +// contains the contents of all these files as a collection of strings. +// +// Usage: +// 1. Compile this file: +// cc -o generate-translations-header generate-translations-header.c +// +// 2. Convert list of files into single header: +// ./generate-translations-header monero_fr.qm monero_it.qm > translations_files.h +// +// 3. In your application code, include translations_files.h, then you can +// access the files using this function: +// static bool find_embedded_file(const std::string &file_name, std::string &data); +// std::string data; +// find_embedded_file("monero_fr.qm", data); + +#include <stdio.h> +#include <stdlib.h> + +static const char *code = + "static bool find_embedded_file(const std::string &name, std::string &data) {\n" + " const struct embedded_file *p;\n" + " for (p = embedded_files; p->name != NULL; p++) {\n" + " if (*p->name == name) {\n" + " data = *p->data;\n" + " return true;\n" + " }\n" + " }\n" + " return false;\n" + "}\n"; + +int main(int argc, char *argv[]) { + FILE *fp, *foutput; + int i, j, ch; + + if((foutput = fopen("translation_files.h", "w")) == NULL) { + exit(EXIT_FAILURE); + } + + fprintf(foutput, "#ifndef TRANSLATION_FILES_H\n"); + fprintf(foutput, "#define TRANSLATION_FILES_H\n\n"); + fprintf(foutput, "#include <string>\n\n"); + + for (i = 1; i < argc; i++) { + if ((fp = fopen(argv[i], "rb")) == NULL) { + exit(EXIT_FAILURE); + } else { + fprintf(foutput, "static const std::string translation_file_name_%d = \"%s\";\n", i, argv[i]); + fprintf(foutput, "static const std::string translation_file_data_%d = std::string(", i); + for (j = 0; (ch = fgetc(fp)) != EOF; j++) { + if ((j % 16) == 0) { + if (j > 0) { + fprintf(foutput, "%s", "\""); + } + fprintf(foutput, "%s", "\n \""); + } + fprintf(foutput, "\\x%02x", ch); + } + fprintf(foutput, "\",\n %d);\n\n", j); + fclose(fp); + } + } + + fprintf(foutput, "%s", "static const struct embedded_file {\n"); + fprintf(foutput, "%s", " const std::string *name;\n"); + fprintf(foutput, "%s", " const std::string *data;\n"); + fprintf(foutput, "%s", "} embedded_files[] = {\n"); + + for (i = 1; i < argc; i++) { + fprintf(foutput, " {&translation_file_name_%d, &translation_file_data_%d},\n", i, i); + } + fprintf(foutput, "%s", " {NULL, NULL}\n"); + fprintf(foutput, "%s", "};\n\n"); + fprintf(foutput, "%s\n", code); + + fprintf(foutput, "#endif /* TRANSLATION_FILES_H */\n"); + + fclose(foutput); + + return EXIT_SUCCESS; +} |