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:
parent
ae073ee35d
commit
70796d232b
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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()));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -41,4 +41,5 @@ private slots:
|
||||
private:
|
||||
Ui::Translations *ui;
|
||||
CMapHeader & mapHeader;
|
||||
std::string mapPreferredLanguage;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user