Commits

nat_linden committed 47c84c1

Make LLTransUtil::parseStrings() merge all relevant strings.xml files.
Until now, adding a xui/en/strings.xml file in any non-default skin meant you
had to clone the entire file, editing only the particular entries you wanted
to override. With this change, we load strings.xml file(s) from the default
skin before loading the specified skin -- so a non-default skin can now
provide a strings.xml file containing only the specific entries it wants to
override.

  • Participants
  • Parent commits e36a05c

Comments (0)

Files changed (2)

indra/llui/lltransutil.cpp

 #include "lltrans.h"
 #include "lluictrlfactory.h"
 #include "llxmlnode.h"
-
+#include "lldir.h"
 
 bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args)
 {
+	// LLUICtrlFactory::getLayeredXMLNode() just calls
+	// gDirUtilp->findSkinnedFilenames(merge=false) and then passes the
+	// resulting paths to LLXMLNode::getLayeredXMLNode(). Bypass that and call
+	// LLXMLNode::getLayeredXMLNode() directly: we want merge=true.
+	std::vector<std::string> paths =
+		gDirUtilp->findSkinnedFilenames(LLDir::XUI, xml_filename, true);
+	if (paths.empty())
+	{
+		// xml_filename not found at all in any skin -- check whether entire
+		// path was passed (but I hope we no longer have callers who do that)
+		paths.push_back(xml_filename);
+	}
 	LLXMLNodePtr root;
-	BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
+	bool success = LLXMLNode::getLayeredXMLNode(root, paths);
 	if (!success)
 	{
-		llerrs << "Couldn't load string table" << llendl;
+		llerrs << "Couldn't load string table " << xml_filename << llendl;
 		return false;
 	}
 
 	
 	if (!success)
 	{
-		llerrs << "Couldn't load string table " << xml_filename << llendl;
+		llerrs << "Couldn't load localization table " << xml_filename << llendl;
 		return false;
 	}
 	

indra/llxml/llxmlnode.cpp

 
 	std::vector<std::string>::const_iterator itor;
 
-	for (itor = paths.begin(), ++itor; itor != paths.end(); ++itor)
+	// We've already dealt with the first item, skip that one
+	for (itor = paths.begin() + 1; itor != paths.end(); ++itor)
 	{
 		std::string layer_filename = *itor;
 		if(layer_filename.empty() || layer_filename == filename)