diff src/base_media_base.h @ 13281:e241d1485669 draft

(svn r17790) -Feature: translatable base sound/graphics set descriptions
author rubidium <rubidium@openttd.org>
date Sat, 17 Oct 2009 20:34:09 +0000 (2009-10-17)
parents e3e4c1648e0c
children a5fb37f9f59d
line wrap: on
line diff
--- a/src/base_media_base.h
+++ b/src/base_media_base.h
@@ -13,6 +13,7 @@
 #define BASE_MEDIA_BASE_H
 
 #include "fileio_func.h"
+#include "core/smallmap_type.hpp"
 
 /* Forward declare these; can't do 'struct X' in functions as older GCCs barf on that */
 struct IniFile;
@@ -41,28 +42,35 @@
  */
 template <class T, size_t Tnum_files>
 struct BaseSet {
+	typedef SmallMap<const char *, const char *> TranslatedStrings;
+
 	/** Number of files in this set */
 	static const size_t NUM_FILES = Tnum_files;
 
 	/** Internal names of the files in this set. */
 	static const char * const *file_names;
 
-	const char *name;          ///< The name of the base set
-	const char *description;   ///< Description of the base set
-	uint32 shortname;          ///< Four letter short variant of the name
-	uint32 version;            ///< The version of this base set
+	const char *name;              ///< The name of the base set
+	TranslatedStrings description; ///< Description of the base set
+	uint32 shortname;              ///< Four letter short variant of the name
+	uint32 version;                ///< The version of this base set
 
-	MD5File files[NUM_FILES];  ///< All files part of this set
-	uint found_files;          ///< Number of the files that could be found
-	uint valid_files;          ///< Number of the files that could be found and are valid
+	MD5File files[NUM_FILES];      ///< All files part of this set
+	uint found_files;              ///< Number of the files that could be found
+	uint valid_files;              ///< Number of the files that could be found and are valid
 
-	T *next;                   ///< The next base set in this list
+	T *next;                       ///< The next base set in this list
 
 	/** Free everything we allocated */
 	~BaseSet()
 	{
 		free((void*)this->name);
-		free((void*)this->description);
+
+		for (TranslatedStrings::iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
+			free((void*)iter->first);
+			free((void*)iter->second);
+		}
+
 		for (uint i = 0; i < NUM_FILES; i++) {
 			free((void*)this->files[i].filename);
 			free((void*)this->files[i].missing_warning);
@@ -97,6 +105,30 @@
 	 * @return true if loading was successful.
 	 */
 	bool FillSetDetails(IniFile *ini, const char *path);
+
+	/**
+	 * Get the description for the given ISO code.
+	 * It falls back to the first two characters of the ISO code in case
+	 * no match could be made with the full ISO code. If even then the
+	 * matching fails the default is returned.
+	 * @param isocode the isocode to search for
+	 * @return the description
+	 */
+	const char *GetDescription(const char *isocode = NULL) const
+	{
+		if (isocode != NULL) {
+			/* First the full ISO code */
+			for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
+				if (strcmp(iter->first, isocode) == 0) return iter->second;
+			}
+			/* Then the first two characters */
+			for (TranslatedStrings::const_iterator iter = this->description.Begin(); iter != this->description.End(); iter++) {
+				if (strncmp(iter->first, isocode, 2) == 0) return iter->second;
+			}
+		}
+		/* Then fall back */
+		return this->description.Begin()->second;
+	}
 };
 
 /**