This doesn't work, it's just a work snapshot and it's just a start of *very*
long work which I might undertake once but not soon. :)

Index: strings.c
===================================================================
--- strings.c	(revision 544)
+++ strings.c	(working copy)
@@ -114,13 +114,23 @@
 	return _langpack_offs[_langtab_start[string >> 11] + (string & 0x7FF)];
 }
 
-byte *GetString(byte *buffr, uint16 string)
+byte *GetString(byte *buffr, const char *string)
 {
-	uint index = string & 0x7FF;
-	uint tab = string >> 11;
+	uint index, tab;
 
-	if (string == 0) error("!invalid string id 0 in GetString");
+	if (string == 0) error("!invalid NULL string in GetString");
 
+	if (string[0] != 1) {
+		return DecodeString(buffr, _(string));
+	}
+
+	tab = string[1];
+
+	if ( tab == 15)
+		return GetName(index, buffr);
+
+	index = (string[2] & 0x07) << 8 | (string[3] & 0xFF);
+
 	if ( tab == 4 && index >= 0xC0)
 		return GetSpecialCityNameString(buffr, index - 0xC0);
 
@@ -130,18 +140,12 @@
 	if ( tab == 14 && index >= 0xE4)
 		return GetSpecialPlayerNameString(buffr, index - 0xE4);
 
-	if ( tab == 15)
-		return GetName(index, buffr);
-
 	// tab 31 is used for special or dynamic strings
 	if ( tab == 31) {
 		return DecodeString(buffr, index == (STR_SPEC_SCREENSHOT_NAME & 0x7FF) ? _screenshot_name : _userstring);
 	}
 
-	if (index >= _langtab_num[tab])
-		error("!String 0x%X is invalid. Probably because an old version of the .lng file.\n", string);
-
-	return DecodeString(buffr, GetStringPtr(string));
+	error("String '%s' (tab %d index %x) is an invalid special string.\n", string, tab, index);
 }
 
 void InjectDparam(int amount) 
@@ -360,8 +364,7 @@
 			break;
 		// 0x80 is reserved for EURO
 		case 0x81: // {STRINL}
-			str += 2;
-			buff = GetString(buff, READ_LE_UINT16(str-2));
+			buff = GetString(buff, "\1\6\0\xD1");
 			break;
 		case 0x82: // {DATE_LONG}
 			buff = FormatYmdString(buff, GetParamUint16());
Index: stdafx.h
===================================================================
--- stdafx.h	(revision 544)
+++ stdafx.h	(working copy)
@@ -20,6 +20,10 @@
 #include <string.h>
 #include <stdlib.h>
 
+#include <libintl.h>
+#define _(a) gettext(a)
+#define N_(a) gettext_noop(a)
+
 #if defined(UNIX)
 #	include <sys/types.h>
 #endif
