Multiple Language Support

This is similar to https://gerrit.omnirom.org/#/c/14014

A lot of the features built in the older patch set have been split
out into separate patches, most of which have already been merged.
The remaining functionality here should all be directly related to
language selection and loading. We always load English as a base
before loading other languages over the top of the base. The idea
is that if another language is missing a translation, then we will
still display the English.

Maybe still to do: read the /cache/recovery/last_locale file and
load a language based on that. For me, this file contains just:
en_US
We probably won't bother with region specific translations so we
would have to look at either trimming off the _US or using some
other method like perhaps a symlink or a combination of the two.

Thanks to _that for twmsg.cpp class

Change-Id: I9647a22e47883a3ddd2de1da51f64aab7c328f74
diff --git a/gui/twmsg.h b/gui/twmsg.h
new file mode 100644
index 0000000..cd035d1
--- /dev/null
+++ b/gui/twmsg.h
@@ -0,0 +1,97 @@
+/*
+	Copyright 2015 _that/TeamWin
+	This file is part of TWRP/TeamWin Recovery Project.
+
+	TWRP is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	TWRP is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with TWRP.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef twmsg_h
+#define twmsg_h
+
+#include <cstdlib>
+#include <cstring>
+#include <string>
+#include <sstream>
+#include <vector>
+#include <errno.h>
+
+/*
+Abstract interface for something that can look up strings by name.
+*/
+class StringLookup
+{
+public:
+	virtual std::string operator()(const std::string& name) const = 0;
+	virtual ~StringLookup() {};
+};
+
+
+namespace msg
+{
+	// These get translated to colors in the GUI console
+	enum Kind
+	{
+		kNormal,
+		kHighlight,
+		kWarning,
+		kError
+	};
+
+
+	template<typename T> std::string to_string(const T& v)
+	{
+		std::ostringstream ss;
+		ss << v;
+		return ss.str();
+	}
+}
+
+
+/*
+Generic message formatting class.
+Designed to decouple message generation from actual resource string lookup and variable insertion,
+so that messages can be re-translated at any later time.
+*/
+class Message
+{
+	msg::Kind kind; // severity or similar message kind
+	std::string name; // the resource string name. may be of format "name=default value".
+	std::vector<std::string> variables; // collected insertion variables to replace {1}, {2}, ...
+	const StringLookup& resourceLookup; // object to resolve resource string name into a final format string
+	const StringLookup& varLookup; // object to resolve any non-numeric insertion strings
+
+	std::string GetFormatString(const std::string& name) const;
+
+public:
+	Message(msg::Kind kind, const char* name, const StringLookup& resourceLookup, const StringLookup& varLookup)
+		: kind(kind), name(name), resourceLookup(resourceLookup), varLookup(varLookup) {}
+
+	// Variable insertion.
+	template<typename T>
+	Message& operator()(const T& v) { variables.push_back(msg::to_string(v)); return *this; }
+
+	// conversion to final string
+	operator std::string() const;
+
+	// Get Message Kind
+	msg::Kind GetKind() {return kind;};
+};
+
+
+// Utility functions to create messages with standard resource and data manager lookups.
+// Short names to make usage convenient.
+Message Msg(const char* name);
+Message Msg(msg::Kind kind, const char* name);
+
+#endif