aboutsummaryrefslogtreecommitdiff
path: root/translations/generate_translations_header.c
diff options
context:
space:
mode:
authorGuillaume LE VAILLANT <glv@posteo.net>2017-12-15 18:44:01 +0100
committerGuillaume LE VAILLANT <glv@posteo.net>2017-12-15 18:44:01 +0100
commitdb2bc96512917c49dc6fa36058ef5fe9d4e66d16 (patch)
treef7ff01553df0407a0b14ef29620df81c48ec6637 /translations/generate_translations_header.c
parentMerge pull request #2913 (diff)
downloadmonero-db2bc96512917c49dc6fa36058ef5fe9d4e66d16.tar.xz
Embed the translation files in the binary
If a translation file exists in a "translations" directory located in the same directory as the binary, it is used in priority (this can be useful when working on translations as you don't have to recompile the whole program all the time), and if no such file is found the embedded translation file is used (if it exists).
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;
+}