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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user