1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +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 "../VCMI_Lib.h"
#include "../CTownHandler.h" #include "../CTownHandler.h"
#include "../CGeneralTextHandler.h" #include "../CGeneralTextHandler.h"
#include "../modding/CModHandler.h"
#include "../CHeroHandler.h" #include "../CHeroHandler.h"
#include "../Languages.h" #include "../Languages.h"
@@ -168,14 +169,14 @@ void CMapHeader::registerMapStrings()
registerString("map", TextIdentifier(s.first), s.second.String(), language); 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; mapHeader.translations.Struct()[language].Struct()[UID.get()].String() = localized;
return UID.get(); return UID.get();
} }

View File

@@ -281,7 +281,7 @@ public:
}; };
/// wrapper functions to register string into the map and stores its translation /// 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(const std::string & modContext, 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, const std::string & language);
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END

View File

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

View File

@@ -531,7 +531,7 @@ void Inspector::setProperty(CGPandoraBox * o, const QString & key, const QVarian
if(!o) return; if(!o) return;
if(key == "Message") 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) 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(!o) return;
if(key == "Town name") 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) 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(!o) return;
if(key == "Message") 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) 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(!o) return;
if(key == "Message") 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") if(o->storedArtifact && key == "Spell")
{ {
@@ -606,10 +606,10 @@ void Inspector::setProperty(CGHeroInstance * o, const QString & key, const QVari
o->gender = EHeroGender(value.toInt()); o->gender = EHeroGender(value.toInt());
if(key == "Name") 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") 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") if(key == "Experience")
o->exp = value.toString().toInt(); o->exp = value.toString().toInt();
@@ -646,7 +646,7 @@ void Inspector::setProperty(CGCreature * o, const QString & key, const QVariant
if(!o) return; if(!o) return;
if(key == "Message") 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") if(key == "Character")
o->character = CGCreature::Character(value.toInt()); o->character = CGCreature::Character(value.toInt());
if(key == "Never flees") if(key == "Never flees")
@@ -664,11 +664,11 @@ void Inspector::setProperty(CGSeerHut * o, const QString & key, const QVariant &
if(key == "Mission type") if(key == "Mission type")
o->quest->missionType = CQuest::Emission(value.toInt()); o->quest->missionType = CQuest::Emission(value.toInt());
if(key == "First visit text") 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") 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") 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()) if(ui->onSelectText->text().isEmpty())
object.configuration.onSelect.clear(); object.configuration.onSelect.clear();
else 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(); object.configuration.canRefuse = ui->canRefuse->isChecked();
//reset parameters //reset parameters
@@ -232,7 +232,7 @@ void RewardsWidget::saveCurrentVisitInfo(int index)
if(ui->rewardMessage->text().isEmpty()) if(ui->rewardMessage->text().isEmpty())
vinfo.message.clear(); vinfo.message.clear();
else 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.heroLevel = ui->rHeroLevel->value();
vinfo.reward.heroExperience = ui->rHeroExperience->value(); vinfo.reward.heroExperience = ui->rHeroExperience->value();

View File

@@ -52,7 +52,7 @@ CMapEvent eventFromVariant(CMapHeader & mapHeader, const QVariant & variant)
CMapEvent result; CMapEvent result;
auto v = variant.toMap(); auto v = variant.toMap();
result.name = v.value("name").toString().toStdString(); 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.players = v.value("players").toInt();
result.humanAffected = v.value("humanAffected").toInt(); result.humanAffected = v.value("humanAffected").toInt();
result.computerAffected = v.value("computerAffected").toInt(); result.computerAffected = v.value("computerAffected").toInt();

View File

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

View File

@@ -43,7 +43,7 @@ void RumorSettings::update()
{ {
Rumor rumor; Rumor rumor;
rumor.name = ui->rumors->item(i)->text().toStdString(); 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); 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('.')) 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; updateTranslations.Struct()[s.first] = s.second;
break; break;
@@ -61,15 +61,31 @@ Translations::Translations(CMapHeader & mh, QWidget *parent) :
ui->setupUi(this); ui->setupUi(this);
//fill languages list //fill languages list
std::set<int> indexFoundLang;
int foundLang = -1;
ui->languageSelect->blockSignals(true);
for(auto & language : Languages::getLanguageList()) 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->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->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()) 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() Translations::~Translations()
@@ -101,7 +117,7 @@ void Translations::fillTranslationsTable(const std::string & language)
void Translations::on_languageSelect_currentIndexChanged(int index) void Translations::on_languageSelect_currentIndexChanged(int index)
{ {
auto language = ui->languageSelect->currentData().toString().toStdString(); 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->blockSignals(true);
ui->supportedCheck->setChecked(hasLanguage); ui->supportedCheck->setChecked(hasLanguage);
ui->supportedCheck->blockSignals(false); ui->supportedCheck->blockSignals(false);
@@ -122,21 +138,21 @@ void Translations::on_supportedCheck_toggled(bool checked)
if(checked) if(checked)
{ {
//copy from default language //copy from default language
translation = mapHeader.translations[VLC->generaltexth->getPreferredLanguage()]; translation = mapHeader.translations[mapPreferredLanguage];
fillTranslationsTable(language); fillTranslationsTable(language);
ui->translationsTable->setEnabled(true); ui->translationsTable->setEnabled(true);
} }
else else
{ {
bool canRemove = language != VLC->generaltexth->getPreferredLanguage(); bool canRemove = language != mapPreferredLanguage;
if(!canRemove) if(!canRemove)
{ {
QMessageBox::information(this, tr("Remove translation"), tr("Default language cannot be removed")); QMessageBox::information(this, tr("Remove translation"), tr("Default language cannot be removed"));
} }
else if(hasRecord) 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; canRemove = sure != QMessageBox::No;
} }

View File

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