Bladeren bron

Proper map translations loading

nordsoft 2 jaren geleden
bovenliggende
commit
a710c88b07
4 gewijzigde bestanden met toevoegingen van 53 en 44 verwijderingen
  1. 28 0
      lib/mapping/CMapHeader.cpp
  2. 8 3
      lib/mapping/CMapHeader.h
  3. 16 40
      lib/mapping/MapFormatJson.cpp
  4. 1 1
      lib/mapping/MapFormatJson.h

+ 28 - 0
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::Options> 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

+ 8 - 3
lib/mapping/CMapHeader.h

@@ -245,6 +245,11 @@ public:
 
 	/// "main quests" of the map that describe victory and loss conditions
 	std::vector<TriggeredEvent> triggeredEvents;
+	
+	/// translations for map to be transferred over network
+	JsonNode translations;
+	
+	void registerMapStrings();
 
 	template <typename Handler>
 	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

+ 16 - 40
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::Options> languages{Languages::getLanguageList().begin(), Languages::getLanguageList().end()};
+	for(auto & language : Languages::getLanguageList())
 	{
-		//english is preferrable
-		language = Languages::getLanguageOptions(Languages::ELanguages::ENGLISH).identifier;
-		std::list<Languages::Options> 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

+ 1 - 1
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