Quellcode durchsuchen

Full support of maps translations

nordsoft vor 2 Jahren
Ursprung
Commit
70796d232b

+ 5 - 4
lib/mapping/CMapHeader.cpp

@@ -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();
 }

+ 2 - 2
lib/mapping/CMapHeader.h

@@ -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

+ 1 - 2
lib/mapping/MapFormatH3M.cpp

@@ -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()

+ 10 - 10
mapeditor/inspector/inspector.cpp

@@ -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()));
 }
 
 

+ 2 - 2
mapeditor/inspector/rewardswidget.cpp

@@ -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();

+ 1 - 1
mapeditor/mapsettings/eventsettings.cpp

@@ -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();

+ 2 - 2
mapeditor/mapsettings/generalsettings.cpp

@@ -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

+ 1 - 1
mapeditor/mapsettings/rumorsettings.cpp

@@ -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);
 	}
 }

+ 24 - 8
mapeditor/mapsettings/translations.cpp

@@ -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;
 		}
 		

+ 1 - 0
mapeditor/mapsettings/translations.h

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