aboutsummaryrefslogtreecommitdiff
path: root/translations/generate_translations_header.c
diff options
context:
space:
mode:
Diffstat (limited to 'translations/generate_translations_header.c')
-rw-r--r--translations/generate_translations_header.c86
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;
+}