From 2f77fb88bb69d310e8a4fd29c288620e1be4c268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Fri, 26 Oct 2018 15:03:45 +0200 Subject: [PATCH] [apps/i18n] Default message ("") has index 0 --- apps/i18n.py | 90 +++++++++++++++++++------------------- apps/shared.universal.i18n | 1 - 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/apps/i18n.py b/apps/i18n.py index a8af78efc..f83321a01 100644 --- a/apps/i18n.py +++ b/apps/i18n.py @@ -80,39 +80,36 @@ def parse_files(files): def print_header(data, path, locales): f = open(path, 'w') f.write("#ifndef APPS_I18N_H\n") - f.write("#define APPS_I18N_H\n") - f.write("\n") - f.write("// This file is auto-generated by i18n.py\n") - f.write("\n") - f.write("#include \n") - f.write("\n") - f.write("namespace I18n {\n") - f.write("\n") - f.write("constexpr static int NumberOfLanguages = %d;\n" % len(locales)) - f.write("\n") + f.write("#define APPS_I18N_H\n\n") + f.write("// This file is auto-generated by i18n.py\n\n") + f.write("#include \n\n") + f.write("namespace I18n {\n\n") + f.write("constexpr static int NumberOfLanguages = %d;\n\n" % len(locales)) + + # Messages enumeration f.write("enum class Message : uint16_t {\n") - for message in data["messages"]: - f.write(" " + message + ",\n") - f.write("\n") - f.write(" UniversalMessageMarker,\n") - f.write("\n") + f.write(" Default = 0,\n") for message in data["universal_messages"]: f.write(" " + message + ",\n") - f.write("};\n") f.write("\n") + f.write(" LocalizedMessageMarker,\n\n") + for message in data["messages"]: + f.write(" " + message + ",\n") + f.write("};\n\n") + + # Languages enumeration f.write("enum class Language : uint16_t {\n") f.write(" Default = 0,\n") for locale in locales: f.write(" " + locale.upper() + ",\n") - f.write("};\n") - f.write("\n") + f.write("};\n\n") + + # Language names f.write("constexpr const Message LanguageNames[NumberOfLanguages] = {\n"); for locale in locales: f.write(" Message::Language" + locale.upper() + ",\n") - f.write("};\n") - f.write("\n") - f.write("}\n") - f.write("\n") + f.write("};\n\n") + f.write("}\n\n") f.write("#endif\n") f.close() @@ -120,10 +117,22 @@ def print_implementation(data, path, locales): f = open(path, 'w') f.write("#include \"i18n.h\"\n") f.write("#include \"global_preferences.h\"\n") - f.write("#include \n"); - f.write("\n") - f.write("namespace I18n {\n") + f.write("#include \n\n"); + f.write("namespace I18n {\n\n") + + # Write the default message + f.write("constexpr static char universalDefault[] = {0};\n") + # Write the universal messages + for message in data["universal_messages"]: + f.write("constexpr static char universal" + message + "[] = " + data["data"]["universal"][message] + ";\n") f.write("\n") + f.write("constexpr static const char * universalMessages[%d] = {\n" % (len(data["universal_messages"])+1)) + f.write(" universalDefault,\n") + for message in data["universal_messages"]: + f.write(" universal" + message + ",\n") + f.write("};\n\n") + + # Write the localized messages for message in data["messages"]: for locale in locales: if not locale in data["data"]: @@ -140,32 +149,25 @@ def print_implementation(data, path, locales): for locale in locales: f.write(locale + message + ", ") f.write("},\n") - f.write("};\n") - f.write("\n") - for message in data["universal_messages"]: - f.write("constexpr static char universal" + message + "[] = " + data["data"]["universal"][message] + ";\n") - f.write("\n") - f.write("constexpr static const char * universalMessages[%d] = {\n" % len(data["universal_messages"])) - for message in data["universal_messages"]: - f.write(" universal" + message + ",\n") - f.write("};\n") - f.write("\n") + f.write("};\n\n") + + # Write the translate method f.write("const char * translate(Message m, Language l) {\n") - f.write(" assert(m != Message::UniversalMessageMarker);\n") - f.write(" int universalMessageOffset = (int)Message::UniversalMessageMarker+1;\n") - f.write(" if ((int)m >= universalMessageOffset) {\n") - f.write(" assert(universalMessages[(int)m - universalMessageOffset] != nullptr);\n") - f.write(" return universalMessages[(int)m - universalMessageOffset];\n") + f.write(" assert(m != Message::LocalizedMessageMarker);\n") + f.write(" int localizedMessageOffset = (int)Message::LocalizedMessageMarker+1;\n") + f.write(" if ((int)m < localizedMessageOffset) {\n") + f.write(" assert(universalMessages[(int)m] != nullptr);\n") + f.write(" return universalMessages[(int)m];\n") f.write(" }\n") f.write(" int languageIndex = (int)l;\n") f.write(" if (l == Language::Default) {\n") f.write(" languageIndex = (int) GlobalPreferences::sharedGlobalPreferences()->language();\n") f.write(" }\n") f.write(" assert(languageIndex > 0);\n") - f.write(" assert(((int)m*NumberOfLanguages+languageIndex-1)*sizeof(char *) < sizeof(messages));\n") - f.write(" return messages[(int)m][languageIndex-1];\n") - f.write("}\n") - f.write("\n") + f.write(" int messageIndex = (int)m - localizedMessageOffset;\n") + f.write(" assert((messageIndex*NumberOfLanguages+languageIndex-1)*sizeof(char *) < sizeof(messages));\n") + f.write(" return messages[messageIndex][languageIndex-1];\n") + f.write("}\n\n") f.write("}\n") f.close() diff --git a/apps/shared.universal.i18n b/apps/shared.universal.i18n index 30b96a019..5dddef7d7 100644 --- a/apps/shared.universal.i18n +++ b/apps/shared.universal.i18n @@ -16,7 +16,6 @@ ConfidenceCommandWithArg = "confidence(f,n)" ConjCommandWithArg = "conj(z)" CoshCommandWithArg = "cosh(x)" D = "d" -Default = "" DeterminantCommandWithArg = "det(M)" DiffCommandWithArg = "diff(f(x),x,a)" DimensionCommandWithArg = "dim(M)"