Browse Source

Hide not installed translation mods to languages other than selected one

Ivan Savenko 2 years ago
parent
commit
adf58fa834
3 changed files with 23 additions and 4 deletions
  1. 2 1
      docs/modders/Mod_File_Format.md
  2. 15 2
      launcher/modManager/cmodlist.cpp
  3. 6 1
      lib/modding/CModInfo.cpp

+ 2 - 1
docs/modders/Mod_File_Format.md

@@ -34,7 +34,8 @@
 	// "Mechanics", "Interface", "Heroes", "Graphical", "Expansion", "Creatures", "Compatibility", "Artifacts", "AI"
 	//
 	// Some mod types have additional effects on your mod:
-	// Translation: mod of this type is only active if player uses base language of this mod. See "language" property.
+	// Translation: mod of this type is only active if player uses base language of this mod. See "language" property. 
+	// Additionally, if such type is used for submod it will be hidden in UI and automatically activated if player uses base language of this mod. This allows to provide locale-specific resources for a mod
 	// Compatibility: mods of this type are hidden in UI and will be automatically activated if all mod dependencies are active. Intended to be used to provide compatibility patches between mods
 	"modType" : "Graphical",
 	

+ 15 - 2
launcher/modManager/cmodlist.cpp

@@ -92,8 +92,21 @@ bool CModEntry::isInstalled() const
 
 bool CModEntry::isVisible() const
 {
-	if (getBaseValue("modType").toString() == "Compatibility" && isSubmod())
-		return false;
+	if (getBaseValue("modType").toString() == "Compatibility")
+	{
+		if (isSubmod())
+			return false;
+	}
+
+	if (getBaseValue("modType").toString() == "Translation")
+	{
+		// Do not show not installed translation mods to languages other than player language
+		if (localData.empty() && getBaseValue("language") != QString::fromStdString(settings["general"]["language"].String()) )
+			return false;
+
+		if (isSubmod())
+			return false;
+	}
 
 	return !localData.isEmpty() || !repository.isEmpty();
 }

+ 6 - 1
lib/modding/CModInfo.cpp

@@ -115,9 +115,14 @@ void CModInfo::loadLocalData(const JsonNode & data)
 	{
 		if (baseLanguage != VLC->generaltexth->getPreferredLanguage())
 		{
-			logGlobal->warn("Translation mod %s was not loaded: language mismatch!", verificationInfo.name);
+			if (identifier.find_last_of('.') == std::string::npos)
+				logGlobal->warn("Translation mod %s was not loaded: language mismatch!", verificationInfo.name);
 			implicitlyEnabled = false;
 		}
+
+		// Translation submods are always explicitly enabled
+		if (identifier.find_last_of('.') != std::string::npos)
+			explicitlyEnabled = true;
 	}
 	if (config["modType"].String() == "Compatibility")
 	{