1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Proper map translations loading

This commit is contained in:
nordsoft
2023-09-28 13:09:01 +02:00
parent 67e1200448
commit a710c88b07
4 changed files with 53 additions and 44 deletions

View File

@@ -16,6 +16,7 @@
#include "../CTownHandler.h" #include "../CTownHandler.h"
#include "../CGeneralTextHandler.h" #include "../CGeneralTextHandler.h"
#include "../CHeroHandler.h" #include "../CHeroHandler.h"
#include "../Languages.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@@ -140,4 +141,31 @@ ui8 CMapHeader::levels() const
return (twoLevel ? 2 : 1); 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 VCMI_LIB_NAMESPACE_END

View File

@@ -245,6 +245,11 @@ public:
/// "main quests" of the map that describe victory and loss conditions /// "main quests" of the map that describe victory and loss conditions
std::vector<TriggeredEvent> triggeredEvents; std::vector<TriggeredEvent> triggeredEvents;
/// translations for map to be transferred over network
JsonNode translations;
void registerMapStrings();
template <typename Handler> template <typename Handler>
void serialize(Handler & h, const int Version) void serialize(Handler & h, const int Version)
@@ -269,10 +274,10 @@ public:
h & victoryIconIndex; h & victoryIconIndex;
h & defeatMessage; h & defeatMessage;
h & defeatIconIndex; 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 VCMI_LIB_NAMESPACE_END

View File

@@ -1269,31 +1269,12 @@ void CMapLoaderJson::readObjects()
void CMapLoaderJson::readTranslations() void CMapLoaderJson::readTranslations()
{ {
auto language = CGeneralTextHandler::getPreferredLanguage(); std::list<Languages::Options> languages{Languages::getLanguageList().begin(), Languages::getLanguageList().end()};
JsonNode data; for(auto & language : Languages::getLanguageList())
if(!isExistArchive(language + ".json"))
{ {
//english is preferrable if(isExistArchive(language.identifier + ".json"))
language = Languages::getLanguageOptions(Languages::ELanguages::ENGLISH).identifier; mapHeader->translations.Struct()[language.identifier] = getFromArchive(language.identifier + ".json");
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;
}
} }
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); writeTeams(handler);
writeOptions(handler); writeOptions(handler);
for(auto & s : mapHeader->mapEditorTranslations.Struct()) writeTranslations();
{
mapHeader->loadTranslationOverrides(s.first, "map", s.second);
writeTranslations(s.first);
}
addToArchive(header, HEADER_FILE_NAME); addToArchive(header, HEADER_FILE_NAME);
} }
@@ -1484,20 +1461,19 @@ void CMapSaverJson::writeObjects()
addToArchive(data, OBJECTS_FILE_NAME); 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); auto & language = s.first;
return; 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 VCMI_LIB_NAMESPACE_END

View File

@@ -259,7 +259,7 @@ public:
/** /**
* Saves texts and translations to zip archive * Saves texts and translations to zip archive
*/ */
void writeTranslations(const std::string & language); void writeTranslations();
/** /**
* Encodes one tile into string * Encodes one tile into string