From 22050467f5ec42b30e98d7bd59dd0ca617b259e4 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Tue, 30 Jan 2018 17:45:04 +0200
Subject: [PATCH] MAINT-8180 Add the way to get default string despite of
 current localiztion

---
 indra/llui/lltrans.cpp         | 60 ++++++++++++++++++++--
 indra/llui/lltrans.h           |  9 ++--
 indra/newview/llappviewer.cpp  | 92 ++++++----------------------------
 indra/newview/llappviewer.h    |  3 +-
 indra/newview/llviewermenu.cpp |  2 +-
 5 files changed, 78 insertions(+), 88 deletions(-)

diff --git a/indra/llui/lltrans.cpp b/indra/llui/lltrans.cpp
index 4d4ff4236d3..a1a8feedaa9 100644
--- a/indra/llui/lltrans.cpp
+++ b/indra/llui/lltrans.cpp
@@ -36,6 +36,7 @@
 #include <map>
 
 LLTrans::template_map_t LLTrans::sStringTemplates;
+LLTrans::template_map_t LLTrans::sDefaultStringTemplates;
 LLStringUtil::format_map_t LLTrans::sDefaultArgs;
 
 struct StringDef : public LLInitParam::Block<StringDef>
@@ -76,7 +77,7 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa
 		LL_ERRS() << "Problem reading strings: " << xml_filename << LL_ENDL;
 		return false;
 	}
-	
+	static bool default_strings_init = false;
 	sStringTemplates.clear();
 	sDefaultArgs.clear();
 	
@@ -86,7 +87,10 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa
 	{
 		LLTransTemplate xml_template(it->name, it->value);
 		sStringTemplates[xml_template.mName] = xml_template;
-		
+		if (!default_strings_init)
+		{
+			sDefaultStringTemplates[xml_template.mName] = xml_template;
+		}
 		std::set<std::string>::const_iterator iter = default_args.find(xml_template.mName);
 		if (iter != default_args.end())
 		{
@@ -96,6 +100,7 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa
 			sDefaultArgs[name] = xml_template.mText;
 		}
 	}
+	default_strings_init = true;
 
 	return true;
 }
@@ -138,12 +143,17 @@ bool LLTrans::parseLanguageStrings(LLXMLNodePtr &root)
 static LLTrace::BlockTimerStatHandle FTM_GET_TRANS("Translate string");
 
 //static 
-std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& msg_args)
+std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& msg_args, bool def_string)
 {
 	// Don't care about time as much as call count.  Make sure we're not
 	// calling LLTrans::getString() in an inner loop. JC
 	LL_RECORD_BLOCK_TIME(FTM_GET_TRANS);
 	
+	if (def_string)
+	{
+		return getDefString(xml_desc, msg_args);
+	}
+
 	template_map_t::iterator iter = sStringTemplates.find(xml_desc);
 	if (iter != sStringTemplates.end())
 	{
@@ -161,13 +171,38 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
 	}
 }
 
+//static 
+std::string LLTrans::getDefString(const std::string &xml_desc, const LLStringUtil::format_map_t& msg_args)
+{
+	template_map_t::iterator iter = sDefaultStringTemplates.find(xml_desc);
+	if (iter != sDefaultStringTemplates.end())
+	{
+		std::string text = iter->second.mText;
+		LLStringUtil::format_map_t args = sDefaultArgs;
+		args.insert(msg_args.begin(), msg_args.end());
+		LLStringUtil::format(text, args);
+
+		return text;
+	}
+	else
+	{
+		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+		return "MissingString(" + xml_desc + ")";
+	}
+}
+
 //static
-std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args)
+std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args, bool def_string)
 {
 	// Don't care about time as much as call count.  Make sure we're not
 	// calling LLTrans::getString() in an inner loop. JC
 	LL_RECORD_BLOCK_TIME(FTM_GET_TRANS);
 
+	if (def_string)
+	{
+		return getDefString(xml_desc, msg_args);
+	}
+
 	template_map_t::iterator iter = sStringTemplates.find(xml_desc);
 	if (iter != sStringTemplates.end())
 	{
@@ -182,6 +217,23 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args
 	}
 }
 
+//static
+std::string LLTrans::getDefString(const std::string &xml_desc, const LLSD& msg_args)
+{
+	template_map_t::iterator iter = sDefaultStringTemplates.find(xml_desc);
+	if (iter != sDefaultStringTemplates.end())
+	{
+		std::string text = iter->second.mText;
+		LLStringUtil::format(text, msg_args);
+		return text;
+	}
+	else
+	{
+		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+		return "MissingString(" + xml_desc + ")";
+	}
+}
+
 //static 
 bool LLTrans::findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& msg_args)
 {
diff --git a/indra/llui/lltrans.h b/indra/llui/lltrans.h
index a47ce94f080..bdffc75f4f1 100644
--- a/indra/llui/lltrans.h
+++ b/indra/llui/lltrans.h
@@ -76,8 +76,10 @@ class LLTrans
 	 * @param args A list of substrings to replace in the string
 	 * @returns Translated string
 	 */
-	static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
-	static std::string getString(const std::string &xml_desc, const LLSD& args);
+	static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args, bool def_string = false);
+	static std::string getDefString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+	static std::string getString(const std::string &xml_desc, const LLSD& args, bool def_string = false);
+	static std::string getDefString(const std::string &xml_desc, const LLSD& args);
 	static bool findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& args);
 	static bool findString(std::string &result, const std::string &xml_desc, const LLSD& args);
 
@@ -92,7 +94,7 @@ class LLTrans
 	 * @param xml_desc String's description
 	 * @returns Translated string
 	 */
-	static std::string getString(const std::string &xml_desc)
+	static std::string getString(const std::string &xml_desc, bool def_string = false)
 	{
 		LLStringUtil::format_map_t empty;
 		return getString(xml_desc, empty);
@@ -128,6 +130,7 @@ class LLTrans
 private:
 	typedef std::map<std::string, LLTransTemplate > template_map_t;
 	static template_map_t sStringTemplates;
+	static template_map_t LLTrans::sDefaultStringTemplates;
 	static LLStringUtil::format_map_t sDefaultArgs;
 };
 
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 73f70dffe49..c357244c460 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3218,7 +3218,7 @@ LLSD LLAppViewer::getViewerInfo() const
 	return info;
 }
 
-std::string LLAppViewer::getViewerInfoString() const
+std::string LLAppViewer::getViewerInfoString(bool default_string) const
 {
 	std::ostringstream support;
 
@@ -3228,7 +3228,7 @@ std::string LLAppViewer::getViewerInfoString() const
 	LLStringUtil::format_map_t args;
 
 	// allow the "Release Notes" URL label to be localized
-	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes", default_string);
 
 	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
 		ii != iend; ++ii)
@@ -3238,7 +3238,7 @@ std::string LLAppViewer::getViewerInfoString() const
 			// Scalar value
 			if (ii->second.isUndefined())
 			{
-				args[ii->first] = LLTrans::getString("none_text");
+				args[ii->first] = LLTrans::getString("none_text", default_string);
 			}
 			else
 			{
@@ -3257,101 +3257,37 @@ std::string LLAppViewer::getViewerInfoString() const
 	}
 
 	// Now build the various pieces
-	support << LLTrans::getString("AboutHeader", args);
+	support << LLTrans::getString("AboutHeader", args, default_string);
 	if (info.has("BUILD_CONFIG"))
 	{
-		support << "\n" << LLTrans::getString("BuildConfig", args);
+		support << "\n" << LLTrans::getString("BuildConfig", args, default_string);
 	}
 	if (info.has("REGION"))
 	{
-		support << "\n\n" << LLTrans::getString("AboutPosition", args);
+		support << "\n\n" << LLTrans::getString("AboutPosition", args, default_string);
 	}
-	support << "\n\n" << LLTrans::getString("AboutSystem", args);
+	support << "\n\n" << LLTrans::getString("AboutSystem", args, default_string);
 	support << "\n";
 	if (info.has("GRAPHICS_DRIVER_VERSION"))
 	{
-		support << "\n" << LLTrans::getString("AboutDriver", args);
+		support << "\n" << LLTrans::getString("AboutDriver", args, default_string);
 	}
-	support << "\n" << LLTrans::getString("AboutOGL", args);
-	support << "\n\n" << LLTrans::getString("AboutSettings", args);
-	support << "\n\n" << LLTrans::getString("AboutLibs", args);
+	support << "\n" << LLTrans::getString("AboutOGL", args, default_string);
+	support << "\n\n" << LLTrans::getString("AboutSettings", args, default_string);
+	support << "\n\n" << LLTrans::getString("AboutLibs", args, default_string);
 	if (info.has("COMPILER"))
 	{
-		support << "\n" << LLTrans::getString("AboutCompiler", args);
+		support << "\n" << LLTrans::getString("AboutCompiler", args, default_string);
 	}
 	if (info.has("PACKETS_IN"))
 	{
-		support << '\n' << LLTrans::getString("AboutTraffic", args);
+		support << '\n' << LLTrans::getString("AboutTraffic", args, default_string);
 	}
 
 	// SLT timestamp
 	LLSD substitution;
 	substitution["datetime"] = (S32)time(NULL);//(S32)time_corrected();
-	support << "\n" << LLTrans::getString("AboutTime", substitution);
-
-	return support.str();
-}
-
-std::string LLAppViewer::getShortViewerInfoString() const
-{
-	std::ostringstream support;
-	LLSD info(getViewerInfo());
-
-	support << info["CHANNEL"].asString() << " ";
-	support << info["VIEWER_VERSION_STR"].asString() << " (" << info["ADDRESS_SIZE"].asString() << "bit)";
-	if (info.has("BUILD_CONFIG"))
-	{
-		support << "\n" << "Build Configuration " << info["BUILD_CONFIG"].asString();
-	}
-	if (info.has("REGION"))
-	{
-		support << "\n\n" << "You are at " << ll_vector3_from_sd(info["POSITION_LOCAL"]) << " in " << info["REGION"].asString();
-		support << " located at " << info["HOSTNAME"].asString() << " (" << info["HOSTIP"].asString() << ")";
-		support << "\n" << "SLURL: " << info["SLURL"].asString();
-		support << "\n" << "(Global coordinates " << ll_vector3_from_sd(info["POSITION"]) << ")";
-		support << "\n" << info["SERVER_VERSION"].asString();
-	}
-
-	support << "\n\n" << "CPU: " << info["CPU"].asString();
-	support << "\n" << "Memory: " << info["MEMORY_MB"].asString() << " MB";
-	support << "\n" << "OS: " << info["OS_VERSION"].asString();
-	support << "\n" << "Graphics Card: " << info["GRAPHICS_CARD"].asString() << " (" <<  info["GRAPHICS_CARD_VENDOR"].asString() << ")";
-
-	if (info.has("GRAPHICS_DRIVER_VERSION"))
-	{
-		support << "\n" << "Windows Graphics Driver Version: " << info["GRAPHICS_DRIVER_VERSION"].asString();
-	}
-
-	support << "\n" << "OpenGL Version: " << info["OPENGL_VERSION"].asString();
-
-	support << "\n\n" << "Window size:" << info["WINDOW_WIDTH"].asString() << "x" << info["WINDOW_HEIGHT"].asString();
-	support << "\n" << "Language: " << LLUI::getLanguage();
-	support << "\n" << "Font Size Adjustment: " << info["FONT_SIZE_ADJUSTMENT"].asString() << "pt";
-	support << "\n" << "UI Scaling: " << info["UI_SCALE"].asString();
-	support << "\n" << "Draw distance: " << info["DRAW_DISTANCE"].asString();
-	support << "\n" << "Bandwidth: " << info["NET_BANDWITH"].asString() << "kbit/s";
-	support << "\n" << "LOD factor: " << info["LOD_FACTOR"].asString();
-	support << "\n" << "Render quality: " << info["RENDER_QUALITY"].asString() << " / 7";
-	support << "\n" << "ALM: " << info["GPU_SHADERS"].asString();
-	support << "\n" << "Texture memory: " << info["TEXTURE_MEMORY"].asString() << "MB";
-	support << "\n" << "VFS (cache) creation time: " << info["VFS_TIME"].asString();
-
-	support << "\n\n" << "J2C Decoder: " << info["J2C_VERSION"].asString();
-	support << "\n" << "Audio Driver: " << info["AUDIO_DRIVER_VERSION"].asString();
-	support << "\n" << "LLCEFLib/CEF: " << info["LLCEFLIB_VERSION"].asString();
-	support << "\n" << "LibVLC: " << info["LIBVLC_VERSION"].asString();
-	support << "\n" << "Voice Server: " << info["VOICE_VERSION"].asString();
-
-	if (info.has("PACKETS_IN"))
-	{
-		support << "\n" << "Packets Lost: " << info["PACKETS_LOST"].asInteger() << "/" << info["PACKETS_IN"].asInteger();
-		F32 packets_pct = info["PACKETS_PCT"].asReal();
-		support << " (" << ll_round(packets_pct, 0.001f) << "%)";
-	}
-
-	LLSD substitution;
-	substitution["datetime"] = (S32)time(NULL);
-	support << "\n" << LLTrans::getString("AboutTime", substitution);
+	support << "\n" << LLTrans::getString("AboutTime", substitution, default_string);
 
 	return support.str();
 }
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index e5a88837251..e607b4a994f 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -99,8 +99,7 @@ class LLAppViewer : public LLApp
 
 	void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; }
 	LLSD getViewerInfo() const;
-	std::string getViewerInfoString() const;
-	std::string getShortViewerInfoString() const;
+	std::string getViewerInfoString(bool default_string = false) const;
 
 	// Report true if under the control of a debugger. A null-op default.
 	virtual bool beingDebugged() { return false; } 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 5bbf5650ad2..e973363e0f3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -8001,7 +8001,7 @@ void handle_report_bug(const LLSD& param)
 	LLUIString url(param.asString());
 	
 	LLStringUtil::format_map_t replace;
-	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getShortViewerInfoString());
+	replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString(true));
 	LLSLURL location_url;
 	LLAgentUI::buildSLURL(location_url);
 	replace["[LOCATION]"] = LLURI::escape(location_url.getSLURLString());
-- 
GitLab