1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

Full support of maps translations

This commit is contained in:
nordsoft 2023-09-29 00:24:45 +02:00
parent ae073ee35d
commit 70796d232b
10 changed files with 49 additions and 32 deletions

View File

@ -15,6 +15,7 @@
#include "../VCMI_Lib.h"
#include "../CTownHandler.h"
#include "../CGeneralTextHandler.h"
#include "../modding/CModHandler.h"
#include "../CHeroHandler.h"
#include "../Languages.h"
@ -168,14 +169,14 @@ void CMapHeader::registerMapStrings()
registerString("map", TextIdentifier(s.first), s.second.String(), language);
}
std::string mapRegisterLocalizedString(CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized)
std::string mapRegisterLocalizedString(const std::string & modContext, CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized)
{
return mapRegisterLocalizedString(mapHeader, UID, localized, VLC->generaltexth->getPreferredLanguage());
return mapRegisterLocalizedString(modContext, mapHeader, UID, localized, VLC->modh->getModLanguage(modContext));
}
std::string mapRegisterLocalizedString(CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized, const std::string & language)
std::string mapRegisterLocalizedString(const std::string & modContext, CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized, const std::string & language)
{
mapHeader.registerString("map", UID, localized, language);
mapHeader.registerString(modContext, UID, localized, language);
mapHeader.translations.Struct()[language].Struct()[UID.get()].String() = localized;
return UID.get();
}

View File

@ -281,7 +281,7 @@ public:
};
/// wrapper functions to register string into the map and stores its translation
std::string DLL_LINKAGE mapRegisterLocalizedString(CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized);
std::string DLL_LINKAGE mapRegisterLocalizedString(CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized, const std::string & language);
std::string DLL_LINKAGE mapRegisterLocalizedString(const std::string & modContext, CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized);
std::string DLL_LINKAGE mapRegisterLocalizedString(const std::string & modContext, CMapHeader & mapHeader, const TextIdentifier & UID, const std::string & localized, const std::string & language);
VCMI_LIB_NAMESPACE_END

View File

@ -2274,8 +2274,7 @@ std::string CMapLoaderH3M::readLocalizedString(const TextIdentifier & stringIden
if(mapString.empty())
return "";
mapHeader->registerString(modName, fullIdentifier, mapString);
return fullIdentifier.get();
return mapRegisterLocalizedString(modName, *mapHeader, fullIdentifier, mapString);
}
void CMapLoaderH3M::afterRead()

View File

@ -531,7 +531,7 @@ void Inspector::setProperty(CGPandoraBox * o, const QString & key, const QVarian
if(!o) return;
if(key == "Message")
o->message.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
o->message.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
}
void Inspector::setProperty(CGEvent * o, const QString & key, const QVariant & value)
@ -553,7 +553,7 @@ void Inspector::setProperty(CGTownInstance * o, const QString & key, const QVari
if(!o) return;
if(key == "Town name")
o->setNameTextId(mapRegisterLocalizedString(*map, TextIdentifier("town", o->instanceName, "name"), value.toString().toStdString()));
o->setNameTextId(mapRegisterLocalizedString("map", *map, TextIdentifier("town", o->instanceName, "name"), value.toString().toStdString()));
}
void Inspector::setProperty(CGSignBottle * o, const QString & key, const QVariant & value)
@ -561,7 +561,7 @@ void Inspector::setProperty(CGSignBottle * o, const QString & key, const QVarian
if(!o) return;
if(key == "Message")
o->message.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("sign", o->instanceName, "message"), value.toString().toStdString()));
o->message.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("sign", o->instanceName, "message"), value.toString().toStdString()));
}
void Inspector::setProperty(CGMine * o, const QString & key, const QVariant & value)
@ -577,7 +577,7 @@ void Inspector::setProperty(CGArtifact * o, const QString & key, const QVariant
if(!o) return;
if(key == "Message")
o->message.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
o->message.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
if(o->storedArtifact && key == "Spell")
{
@ -606,10 +606,10 @@ void Inspector::setProperty(CGHeroInstance * o, const QString & key, const QVari
o->gender = EHeroGender(value.toInt());
if(key == "Name")
o->nameCustomTextId = mapRegisterLocalizedString(*map, TextIdentifier("hero", o->instanceName, "name"), value.toString().toStdString());
o->nameCustomTextId = mapRegisterLocalizedString("map", *map, TextIdentifier("hero", o->instanceName, "name"), value.toString().toStdString());
if(key == "Biography")
o->biographyCustomTextId = mapRegisterLocalizedString(*map, TextIdentifier("hero", o->instanceName, "biography"), value.toString().toStdString());
o->biographyCustomTextId = mapRegisterLocalizedString("map", *map, TextIdentifier("hero", o->instanceName, "biography"), value.toString().toStdString());
if(key == "Experience")
o->exp = value.toString().toInt();
@ -646,7 +646,7 @@ void Inspector::setProperty(CGCreature * o, const QString & key, const QVariant
if(!o) return;
if(key == "Message")
o->message.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("monster", o->instanceName, "message"), value.toString().toStdString()));
o->message.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("monster", o->instanceName, "message"), value.toString().toStdString()));
if(key == "Character")
o->character = CGCreature::Character(value.toInt());
if(key == "Never flees")
@ -664,11 +664,11 @@ void Inspector::setProperty(CGSeerHut * o, const QString & key, const QVariant &
if(key == "Mission type")
o->quest->missionType = CQuest::Emission(value.toInt());
if(key == "First visit text")
o->quest->firstVisitText.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("quest", o->instanceName, "firstVisit"), value.toString().toStdString()));
o->quest->firstVisitText.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("quest", o->instanceName, "firstVisit"), value.toString().toStdString()));
if(key == "Next visit text")
o->quest->nextVisitText.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("quest", o->instanceName, "nextVisit"), value.toString().toStdString()));
o->quest->nextVisitText.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("quest", o->instanceName, "nextVisit"), value.toString().toStdString()));
if(key == "Completed text")
o->quest->completedText.appendTextID(mapRegisterLocalizedString(*map, TextIdentifier("quest", o->instanceName, "completed"), value.toString().toStdString()));
o->quest->completedText.appendTextID(mapRegisterLocalizedString("map", *map, TextIdentifier("quest", o->instanceName, "completed"), value.toString().toStdString()));
}

View File

@ -211,7 +211,7 @@ bool RewardsWidget::commitChanges()
if(ui->onSelectText->text().isEmpty())
object.configuration.onSelect.clear();
else
object.configuration.onSelect = MetaString::createFromTextID(mapRegisterLocalizedString(map, TextIdentifier("reward", object.instanceName, "onSelect"), ui->onSelectText->text().toStdString()));
object.configuration.onSelect = MetaString::createFromTextID(mapRegisterLocalizedString("map", map, TextIdentifier("reward", object.instanceName, "onSelect"), ui->onSelectText->text().toStdString()));
object.configuration.canRefuse = ui->canRefuse->isChecked();
//reset parameters
@ -232,7 +232,7 @@ void RewardsWidget::saveCurrentVisitInfo(int index)
if(ui->rewardMessage->text().isEmpty())
vinfo.message.clear();
else
vinfo.message = MetaString::createFromTextID(mapRegisterLocalizedString(map, TextIdentifier("reward", object.instanceName, "info", index, "message"), ui->rewardMessage->text().toStdString()));
vinfo.message = MetaString::createFromTextID(mapRegisterLocalizedString("map", map, TextIdentifier("reward", object.instanceName, "info", index, "message"), ui->rewardMessage->text().toStdString()));
vinfo.reward.heroLevel = ui->rHeroLevel->value();
vinfo.reward.heroExperience = ui->rHeroExperience->value();

View File

@ -52,7 +52,7 @@ CMapEvent eventFromVariant(CMapHeader & mapHeader, const QVariant & variant)
CMapEvent result;
auto v = variant.toMap();
result.name = v.value("name").toString().toStdString();
result.message.appendTextID(mapRegisterLocalizedString(mapHeader, TextIdentifier("header", "event", result.name, "message"), v.value("message").toString().toStdString()));
result.message.appendTextID(mapRegisterLocalizedString("map", mapHeader, TextIdentifier("header", "event", result.name, "message"), v.value("message").toString().toStdString()));
result.players = v.value("players").toInt();
result.humanAffected = v.value("humanAffected").toInt();
result.computerAffected = v.value("computerAffected").toInt();

View File

@ -59,8 +59,8 @@ void GeneralSettings::initialize(MapController & c)
void GeneralSettings::update()
{
controller->map()->name.appendTextID(mapRegisterLocalizedString(*controller->map(), TextIdentifier("header", "name"), ui->mapNameEdit->text().toStdString()));
controller->map()->description.appendTextID(mapRegisterLocalizedString(*controller->map(), TextIdentifier("header", "description"), ui->mapDescriptionEdit->toPlainText().toStdString()));
controller->map()->name.appendTextID(mapRegisterLocalizedString("map", *controller->map(), TextIdentifier("header", "name"), ui->mapNameEdit->text().toStdString()));
controller->map()->description.appendTextID(mapRegisterLocalizedString("map", *controller->map(), TextIdentifier("header", "description"), ui->mapDescriptionEdit->toPlainText().toStdString()));
if(ui->heroLevelLimitCheck->isChecked())
controller->map()->levelLimit = ui->heroLevelLimit->value();
else

View File

@ -43,7 +43,7 @@ void RumorSettings::update()
{
Rumor rumor;
rumor.name = ui->rumors->item(i)->text().toStdString();
rumor.text.appendTextID(mapRegisterLocalizedString(*controller->map(), TextIdentifier("header", "rumor", i, "text"), ui->rumors->item(i)->data(Qt::UserRole).toString().toStdString()));
rumor.text.appendTextID(mapRegisterLocalizedString("map", *controller->map(), TextIdentifier("header", "rumor", i, "text"), ui->rumors->item(i)->data(Qt::UserRole).toString().toStdString()));
controller->map()->rumors.push_back(rumor);
}
}

View File

@ -28,7 +28,7 @@ void Translations::cleanupRemovedItems(CMap & map)
{
for(auto part : QString::fromStdString(s.first).split('.'))
{
if(existingObjects.count(part.toStdString()))
if(part == "map" || existingObjects.count(part.toStdString()))
{
updateTranslations.Struct()[s.first] = s.second;
break;
@ -61,15 +61,31 @@ Translations::Translations(CMapHeader & mh, QWidget *parent) :
ui->setupUi(this);
//fill languages list
std::set<int> indexFoundLang;
int foundLang = -1;
ui->languageSelect->blockSignals(true);
for(auto & language : Languages::getLanguageList())
{
ui->languageSelect->blockSignals(true);
ui->languageSelect->addItem(QString("%1 (%2)").arg(QString::fromStdString(language.nameEnglish), QString::fromStdString(language.nameNative)));
ui->languageSelect->setItemData(ui->languageSelect->count() - 1, QVariant(QString::fromStdString(language.identifier)));
ui->languageSelect->blockSignals(false);
if(mapHeader.translations.Struct().count(language.identifier) && !mapHeader.translations[language.identifier].Struct().empty())
indexFoundLang.insert(ui->languageSelect->count() - 1);
if(language.identifier == VLC->generaltexth->getPreferredLanguage())
ui->languageSelect->setCurrentIndex(ui->languageSelect->count() - 1);
foundLang = ui->languageSelect->count() - 1;
}
ui->languageSelect->blockSignals(false);
if(foundLang >= 0 && !indexFoundLang.empty() && !indexFoundLang.count(foundLang))
{
foundLang = *indexFoundLang.begin();
mapPreferredLanguage = ui->languageSelect->itemData(foundLang).toString().toStdString();
}
if(foundLang >= 0)
ui->languageSelect->setCurrentIndex(foundLang);
if(mapPreferredLanguage.empty())
mapPreferredLanguage = VLC->generaltexth->getPreferredLanguage();
}
Translations::~Translations()
@ -101,7 +117,7 @@ void Translations::fillTranslationsTable(const std::string & language)
void Translations::on_languageSelect_currentIndexChanged(int index)
{
auto language = ui->languageSelect->currentData().toString().toStdString();
bool hasLanguage = !mapHeader.translations[language].isNull();
bool hasLanguage = mapHeader.translations.Struct().count(language);
ui->supportedCheck->blockSignals(true);
ui->supportedCheck->setChecked(hasLanguage);
ui->supportedCheck->blockSignals(false);
@ -122,21 +138,21 @@ void Translations::on_supportedCheck_toggled(bool checked)
if(checked)
{
//copy from default language
translation = mapHeader.translations[VLC->generaltexth->getPreferredLanguage()];
translation = mapHeader.translations[mapPreferredLanguage];
fillTranslationsTable(language);
ui->translationsTable->setEnabled(true);
}
else
{
bool canRemove = language != VLC->generaltexth->getPreferredLanguage();
bool canRemove = language != mapPreferredLanguage;
if(!canRemove)
{
QMessageBox::information(this, tr("Remove translation"), tr("Default language cannot be removed"));
}
else if(hasRecord)
{
auto sure = QMessageBox::question(this, tr("Remove translation"), tr("This language has text records which will be removed. Continue?"));
auto sure = QMessageBox::question(this, tr("Remove translation"), tr("All existing text records for this language will be removed. Continue?"));
canRemove = sure != QMessageBox::No;
}

View File

@ -41,4 +41,5 @@ private slots:
private:
Ui::Translations *ui;
CMapHeader & mapHeader;
std::string mapPreferredLanguage;
};