diff --git a/lib/mapping/CMapHeader.cpp b/lib/mapping/CMapHeader.cpp index 345974bc2..cd3193f41 100644 --- a/lib/mapping/CMapHeader.cpp +++ b/lib/mapping/CMapHeader.cpp @@ -16,6 +16,7 @@ #include "../CTownHandler.h" #include "../CGeneralTextHandler.h" #include "../CHeroHandler.h" +#include "../Languages.h" VCMI_LIB_NAMESPACE_BEGIN @@ -140,4 +141,31 @@ ui8 CMapHeader::levels() const return (twoLevel ? 2 : 1); } +void CMapHeader::registerMapStrings() +{ + auto language = CGeneralTextHandler::getPreferredLanguage(); + JsonNode data; + + if(translations[language].isNull()) + { + //english is preferrable + language = Languages::getLanguageOptions(Languages::ELanguages::ENGLISH).identifier; + std::list languages{Languages::getLanguageList().begin(), Languages::getLanguageList().end()}; + while(translations[language].isNull() && !languages.empty()) + { + language = languages.front().identifier; + languages.pop_front(); + } + + if(!translations[language].isNull()) + { + logGlobal->info("Map %s doesn't have any translation", name.toString()); + return; + } + } + + for(auto & s : translations[language].Struct()) + registerString("map", TextIdentifier(s.first), s.second.String(), language); +} + VCMI_LIB_NAMESPACE_END diff --git a/lib/mapping/CMapHeader.h b/lib/mapping/CMapHeader.h index 737eb98e0..9f08747f2 100644 --- a/lib/mapping/CMapHeader.h +++ b/lib/mapping/CMapHeader.h @@ -245,6 +245,11 @@ public: /// "main quests" of the map that describe victory and loss conditions std::vector triggeredEvents; + + /// translations for map to be transferred over network + JsonNode translations; + + void registerMapStrings(); template void serialize(Handler & h, const int Version) @@ -269,10 +274,10 @@ public: h & victoryIconIndex; h & defeatMessage; h & defeatIconIndex; + h & translations; + if(!h.saving) + registerMapStrings(); } - - /// do not serialize, used only in map editor to write translations properly - JsonNode mapEditorTranslations; }; VCMI_LIB_NAMESPACE_END diff --git a/lib/mapping/MapFormatJson.cpp b/lib/mapping/MapFormatJson.cpp index c0dafdeec..5ab9f6297 100644 --- a/lib/mapping/MapFormatJson.cpp +++ b/lib/mapping/MapFormatJson.cpp @@ -1269,31 +1269,12 @@ void CMapLoaderJson::readObjects() void CMapLoaderJson::readTranslations() { - auto language = CGeneralTextHandler::getPreferredLanguage(); - JsonNode data; - - if(!isExistArchive(language + ".json")) + std::list languages{Languages::getLanguageList().begin(), Languages::getLanguageList().end()}; + for(auto & language : Languages::getLanguageList()) { - //english is preferrable - language = Languages::getLanguageOptions(Languages::ELanguages::ENGLISH).identifier; - std::list options{Languages::getLanguageList().begin(), Languages::getLanguageList().end()}; - while(!isExistArchive(language + ".json") && !options.empty()) - { - language = options.front().identifier; - options.pop_front(); - } - - if(!isExistArchive(language + ".json")) - { - logGlobal->info("Map doesn't have any translation"); - return; - } + if(isExistArchive(language.identifier + ".json")) + mapHeader->translations.Struct()[language.identifier] = getFromArchive(language.identifier + ".json"); } - - data = getFromArchive(language + ".json"); - - for(auto & s : data.Struct()) - mapHeader->registerString("map", TextIdentifier(s.first), s.second.String(), language); } @@ -1378,12 +1359,8 @@ void CMapSaverJson::writeHeader() writeTeams(handler); writeOptions(handler); - - for(auto & s : mapHeader->mapEditorTranslations.Struct()) - { - mapHeader->loadTranslationOverrides(s.first, "map", s.second); - writeTranslations(s.first); - } + + writeTranslations(); addToArchive(header, HEADER_FILE_NAME); } @@ -1484,20 +1461,19 @@ void CMapSaverJson::writeObjects() addToArchive(data, OBJECTS_FILE_NAME); } -void CMapSaverJson::writeTranslations(const std::string & language) +void CMapSaverJson::writeTranslations() { - if(Languages::getLanguageOptions(language).identifier.empty()) + for(auto & s : mapHeader->translations.Struct()) { - logGlobal->error("Serializing of unsupported language %s is not permitted", language); - return; + auto & language = s.first; + if(Languages::getLanguageOptions(language).identifier.empty()) + { + logGlobal->error("Serializing of unsupported language %s is not permitted", language); + continue;; + } + logGlobal->trace("Saving translations, language: %s", language); + addToArchive(s.second, language + ".json"); } - - logGlobal->trace("Saving translations, language: %s", language); - JsonNode data(JsonNode::JsonType::DATA_STRUCT); - - mapHeader->jsonSerialize(data); - - addToArchive(data, language + ".json"); } VCMI_LIB_NAMESPACE_END diff --git a/lib/mapping/MapFormatJson.h b/lib/mapping/MapFormatJson.h index 8f0a6a39f..9f5ee3e36 100644 --- a/lib/mapping/MapFormatJson.h +++ b/lib/mapping/MapFormatJson.h @@ -259,7 +259,7 @@ public: /** * Saves texts and translations to zip archive */ - void writeTranslations(const std::string & language); + void writeTranslations(); /** * Encodes one tile into string