diff -ur --new-file -Xdiff_ignore freeorig/ai/aicity.c freeciv/ai/aicity.c
--- freeorig/ai/aicity.c	2003-01-27 20:30:32.000000000 +0100
+++ freeciv/ai/aicity.c	2003-02-13 15:30:40.000000000 +0100
@@ -24,6 +24,7 @@
 #include "combat.h"
 #include "events.h"
 #include "fcintl.h"
+#include "fims.h"
 #include "game.h"
 #include "government.h"
 #include "log.h"
@@ -229,18 +230,18 @@
        (is_unit_choice_type(bestchoice.type) ||
         bestchoice.choice != pcity->currently_building))
       notify_player_ex(NULL, pcity->x, pcity->y, E_WONDER_STOPPED,
-		       _("Game: The %s have stopped building The %s in %s."),
-		       get_nation_name_plural(pplayer->nation),
-		       get_impr_name_ex(pcity, pcity->currently_building),
+		       N_("Game: The %N have stopped building The %I in %S."),
+		       pplayer->nation,
+		       get_fims_impr(pcity, pcity->currently_building),
 		       pcity->name);
 
     if (bestchoice.type == CT_BUILDING && (pcity->is_building_unit ||
                  pcity->currently_building != bestchoice.choice) &&
                  is_wonder(bestchoice.choice)) {
       notify_player_ex(NULL, pcity->x, pcity->y, E_WONDER_STARTED,
-		       _("Game: The %s have started building The %s in %s."),
-		       get_nation_name_plural(city_owner(pcity)->nation),
-		       get_impr_name_ex(pcity, bestchoice.choice),
+		       N_("Game: The %N have started building The %I in %S."),
+		       city_owner(pcity)->nation,
+		       get_fims_impr(pcity, bestchoice.choice),
 		       pcity->name);
       pcity->currently_building = bestchoice.choice;
       pcity->is_building_unit    = is_unit_choice_type(bestchoice.type);
@@ -674,9 +675,9 @@
        && (wonder_replacement(pcity, i) || building_unwanted(city_owner(pcity), i))) {
       do_sell_building(pplayer, pcity, i);
       notify_player_ex(pplayer, pcity->x, pcity->y, E_IMP_SOLD,
-		       _("Game: %s is selling %s (not needed) for %d."), 
-		       pcity->name, get_improvement_name(i), 
-		       improvement_value(i)/2);
+		        N_("Game: %S is selling %s (not needed) for %d."), 
+		        pcity->name, get_improvement_name_orig(i), 
+		        improvement_value(i)/2);
       return; /* max 1 building each turn */
     }
   } built_impr_iterate_end;
diff -ur --new-file -Xdiff_ignore freeorig/client/civclient.c freeciv/client/civclient.c
--- freeorig/client/civclient.c	2003-02-13 07:41:23.000000000 +0100
+++ freeciv/client/civclient.c	2003-02-13 15:30:40.000000000 +0100
@@ -463,6 +463,9 @@
   case PACKET_THAW_HINT:
     handle_thaw_hint();
     break;
+    
+  case PACKET_FIMS:
+    handle_packet_fims((struct packet_fims*)packet); break;
 
   case PACKET_PING_INFO:
     handle_ping_info((struct packet_ping_info *) packet);
diff -ur --new-file -Xdiff_ignore freeorig/client/packhand.c freeciv/client/packhand.c
--- freeorig/client/packhand.c	2003-02-13 07:41:24.000000000 +0100
+++ freeciv/client/packhand.c	2003-02-13 15:30:40.000000000 +0100
@@ -61,6 +61,7 @@
 #include "options.h"
 #include "plrdlg_g.h"
 #include "repodlgs_g.h"
+#include "fims.h"
 #include "spaceshipdlg_g.h"
 #include "tilespec.h"
 #include "wldlg_g.h"
@@ -2549,3 +2550,44 @@
 
   agents_thaw_hint();
 }
+
+/**************************************************************************
+ check, translate, show, play sound
+**************************************************************************/
+void handle_packet_fims(struct packet_fims* packet)
+{
+  int where = MW_OUTPUT;	/* where to display the message */
+  struct packet_generic_message message;
+  struct data_in din;
+  
+  dio_input_init(&din, packet->data, packet->size);
+
+  if (packet->size < 3 || !get_and_translate_fims(&din, message.message)) {
+    /* its not allways the server fault, sometimes localization is 
+       incorrect */
+    freelog(LOG_NORMAL, "Problem with fims received from server!");
+    return;
+  }
+
+  message.x = packet->x;
+  message.y = packet->y;
+  message.event = packet->event;
+  
+  if (packet->event >= E_LAST)  {
+    /* Server may have added a new event; leave as MW_OUTPUT */
+    freelog(LOG_NORMAL, "Unknown event type %d!", packet->event);
+  } else if (packet->event >= 0)  {
+    where = messages_where[packet->event];
+  }
+  if (BOOL_VAL(where & MW_OUTPUT))
+    append_output_window(message.message);
+  if (BOOL_VAL(where & MW_MESSAGES))
+    add_notify_window(&message);
+  if (BOOL_VAL(where & MW_POPUP) &&
+      (!game.player_ptr->ai.control || ai_popup_windows))
+    popup_notify_goto_dialog(_("Popup Request"), message.message, 
+			     packet->x, packet->y);
+
+  if (packet->event <= E_LAST) /* Server may have added a new event */
+    play_sound_for_event(packet->event);
+}
diff -ur --new-file -Xdiff_ignore freeorig/client/packhand.h freeciv/client/packhand.h
--- freeorig/client/packhand.h	2003-02-13 07:41:24.000000000 +0100
+++ freeciv/client/packhand.h	2003-02-13 15:30:40.000000000 +0100
@@ -65,6 +65,7 @@
 void handle_start_turn(void);
 void handle_freeze_hint(void);
 void handle_thaw_hint(void);
+void handle_packet_fims(struct packet_fims* packet);
 
 void notify_about_incoming_packet(struct connection *pc,
 				   int packet_type, int size);
diff -ur --new-file -Xdiff_ignore freeorig/common/capstr.c freeciv/common/capstr.c
--- freeorig/common/capstr.c	2003-02-13 07:41:30.000000000 +0100
+++ freeciv/common/capstr.c	2003-02-13 15:32:25.000000000 +0100
@@ -76,8 +76,9 @@
 
 #define CAPABILITY "+1.14.0 conn_info +occupied team tech_impr_gfx " \
                    "city_struct_minor_cleanup obsolete_last class_legend " \
-                   "+impr_req +waste +fastfocus +continent"
-  
+                   "+impr_req +waste +fastfocus +continent" \
+		   "+fims"
+
 /* "+1.14.0" is protocol for 1.14.0 release.
  *
  * "conn_info" is sending the conn_id field. To preserve compatability
@@ -109,6 +110,9 @@
  * "fastfocus" removes the server from client unit focus.
  *
  * +continent": the server gives the client continent information
+ *
+ * fims is Freeciv Internationalized Message system. See fims.c for 
+ * details.
  */
 
 void init_our_capability(void)
diff -ur --new-file -Xdiff_ignore freeorig/common/fcintl.h freeciv/common/fcintl.h
--- freeorig/common/fcintl.h	2002-01-14 18:17:16.000000000 +0100
+++ freeciv/common/fcintl.h	2003-02-13 15:30:40.000000000 +0100
@@ -30,6 +30,7 @@
 #define N_(String) String
 #define Q_(String) skip_intl_qualifier_prefix(gettext(String))
 #define PL_(String1, String2, n) ngettext((String1), (String2), (n))
+#define NPL_(String1, String2, n) String1, String2, n
 
 #else
 
@@ -37,6 +38,7 @@
 #define N_(String) String
 #define Q_(String) skip_intl_qualifier_prefix(String)
 #define PL_(String1, String2, n) ((n) == 1 ? (String1) : (String2))
+#define NPL_(String1, String2, n) String1, String2, n
 
 #define textdomain(Domain)
 #define bindtextdomain(Package, Directory)
diff -ur --new-file -Xdiff_ignore freeorig/common/fims.c freeciv/common/fims.c
--- freeorig/common/fims.c	1970-01-01 01:00:00.000000000 +0100
+++ freeciv/common/fims.c	2003-02-13 17:23:20.000000000 +0100
@@ -0,0 +1,541 @@
+/********************************************************************** 
+ Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
+   This program 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 2, or (at your option)
+   any later version.
+
+   This program 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.
+***********************************************************************/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "dataio.h"
+#include "fims.h"
+#include "fcintl.h"
+#include "map.h"
+#include "game.h"
+#include "nation.h"
+#include "player.h"
+#include "support.h"
+#include "tech.h"
+
+/*
+    The FIMS system (Freeciv Internationalized Message System)
+ == introducion == 
+
+ The FIMS system is used to pack an untraslated expression into
+ a machine-independent buffer, which could be later unpacked and 
+ translated.
+ 
+ Mechanizm is intended to be very simple:
+ 1) Server calls serialize_fims(data_out, format, args)
+    Where format is something similiar to printf-format and
+    following args are used as in vprintf,
+ 2) The serialize_fims writes on some buffer
+    using data_out structure (dataio),
+ 3) Server somehow sends this buffer to the client,
+ 4) Client receives the buffer and calls
+    get_and_translate_fims(struct data_in * din, char *out)
+ 5) The translated string sits in out
+ 
+ == fims format ==
+ 
+ It works just as printf
+
+ Conversion specifiers available:
+  s - the string which will be translated with Q_()
+  S - the string which will stay unchanged
+      We clearly need strings that will be translated (i.e., most texts)
+      and some that won't be (i.e., city and leader names).  Since the
+      translation must come at the client end, we need two separate
+      meta-sequences for it.
+  L - There are 2 arg: (x, y) which
+      will be replaced with 
+      get_location_str_in(x, y)
+  A - There are 2 arg: (x, y) which
+      will be replaced with 
+      get_location_str_at(x, y)
+  P - There are 3 args (string1, string2, int n) which
+      will be replaced with PL_(string1, string2, n)
+      This is a recursive specifier.
+  M - the Nation_Type_id, which will be replaced with get_nation_name
+  N - the Nation_Type_id, which will be replaced with get_nation_name_plural
+      N & M can be used interchangeably by translator
+  I - struct fims_impr, which you can get from get_fims_impr()
+      This "sends" get_impr_name_ex() to the client
+      we need this because get_impr_name_ex() sometimes appand
+      Q_("?redundant:*") or Q_("?obsolete:O) or Q_("?wonder:w")
+  F - flag, will be replaced with get_units_with_flag_string()
+  R - recursive specifier, which will be translated first
+  
+  % - for '%'
+  
+  Some correct examples:
+  N_("Hello there")
+  N_("The city %S may soon grow to size %d"), city.name, size
+  N_("You lost %U %L"), punit->type, x, y
+  N_("You are %s), loser? N_("loser") : N_("winner")
+  
+  To change the order of specifications you should write a number and '$'
+  beetween '%' and the conversion specifier. For example:
+  "%2$l %1$s", string, x, y
+  is correct.
+  But When you use digit after one '%' you should use it everywhere
+  "%2$s %1$s %d" is incorrect
+  
+  == recursive specifiers ==
+  
+  String which is returned by a recursive specifier is treated as an another 
+  format. Arguments for it should be __after__ another arguments.
+  I.E:
+  N_("%P because %s"), 
+     NPL_("You lost %d unit", "You lost %d units", count), 
+     N_("something has happened"),
+     count);
+     
+  or:
+  
+  N_("Year: %R", textyear_orig(year), year < 0 ? -year : year);
+     
+  There is only one level of recursion allowed.
+  
+*/
+
+enum fims_data_type {
+  FIMS_STRING = 0,
+  FIMS_DONTTRANSLATE = 1,
+  FIMS_INT = 2,
+  FIMS_LOCATION_IN = 3,
+  FIMS_LOCATION_AT = 4,
+  FIMS_PLURAL = 5,
+  FIMS_NATION = 6,
+  FIMS_NATION_PLURAL = 7,
+  FIMS_IMPROVEMENT_EX = 8,
+  FIMS_FLAG = 9,
+  FIMS_RECURSIVE = 10,
+  FIMS_LAST = 11
+};
+
+/* If you change something here you will break network compatibility !!*/
+static char *directives = "sSdLAPMNIFR";
+
+/***********************************************************************
+ ...
+***********************************************************************/
+static bool is_recursive(enum fims_data_type specifier)
+{
+  return (specifier == FIMS_PLURAL || specifier == FIMS_RECURSIVE);
+}
+
+/**************************************************************************
+ Return number of directives in format and fill tab[]
+ tab[] should have at least 100 elements
+ Return -1 on failure
+**************************************************************************/
+static int parse_fims_format(const char *format, enum fims_data_type *tab)
+{
+  int count = 0;
+  char *p;
+  for (; *format; format++) {
+    if (*format == '%') {
+      int n = 0;
+      format++;
+      while (*format <= '9' && *format >= '0') {
+        n = 10 * n + (*(format++) - '0');
+      }
+      if (*format == '\0' || n >= 100) {
+        return -1;
+      }
+      if (*format != '%') {
+        if (n == 0) {
+          n = count++;
+        } else {
+          if (*format != '$')
+            return -1;
+          format++;
+          if (count < n)
+            count = n;
+          n--;
+        }
+        p = strchr(directives, *format);
+        if (p == 0)
+          return -1;
+        tab[n] = p - directives;
+      }
+    }
+  }
+  return count;
+}
+
+/**************************************************************************
+ Write one directive to dout, get value from args
+ Return TRUE on success and FALSE on failure
+ Check everything
+**************************************************************************/
+static bool serialize_one_directive(struct data_out *dout,
+                                    enum fims_data_type type,
+                                    va_list * args)
+{
+  Nation_Type_id nation;
+  struct fims_impr f;
+  int x, y;
+
+  switch (type) {
+  case FIMS_STRING:
+  case FIMS_DONTTRANSLATE:
+    dio_put_string(dout, va_arg(*args, char *));
+    break;
+  case FIMS_INT:
+    dio_put_uint32(dout, va_arg(*args, int));
+    break;
+  case FIMS_LOCATION_IN:
+  case FIMS_LOCATION_AT:
+    x = va_arg(*args, int);
+    y = va_arg(*args, int);
+    if (x < 0 || x > 255 || y < 0 || y > 255) {
+      return FALSE;
+    }
+    dio_put_uint8(dout, x);
+    dio_put_uint8(dout, y);
+    break;
+  case FIMS_NATION:
+  case FIMS_NATION_PLURAL:
+    nation = va_arg(*args, Nation_Type_id);
+    if (nation < 0 || nation >= game.nation_count) {
+      return FALSE;
+    }
+    dio_put_uint16(dout, nation);
+    break;
+  case FIMS_IMPROVEMENT_EX:
+    f = va_arg(*args, struct fims_impr);
+    if (f.state < 0 || f.state >= FIS_LAST ||
+        f.id < 0 || f.id >= game.num_impr_types) {
+      return FALSE;
+    }
+    dio_put_uint8(dout, f.state);
+    dio_put_uint32(dout, f.id);
+    break;
+  case FIMS_FLAG:
+    dio_put_uint32(dout, va_arg(*args, int));
+    break;
+  default:
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**************************************************************************
+ Serialize fims into dout, with format and args
+ Return TRUE on success and FALSE on failure
+**************************************************************************/
+bool serialize_fims(struct data_out * dout, const char *format,
+                    va_list args)
+{
+  enum fims_data_type tab[100];
+  char *recursion[100];         /* remember recursive formats */
+  enum fims_data_type tab2[100];
+  int n = parse_fims_format(format, tab);
+  int i;
+  int d;
+
+  if (n < 0) {
+    return FALSE;
+  }
+
+  dio_put_string(dout, format);
+
+  for (i = 0; i < n; i++) {
+    if (tab[i] == FIMS_PLURAL) {
+      recursion[i] = va_arg(args, char *);
+      dio_put_string(dout, recursion[i]);
+      dio_put_string(dout, va_arg(args, char *));
+      d = va_arg(args, int);
+      assert(d >= 0);
+      dio_put_uint32(dout, d);
+    } else if (tab[i] == FIMS_RECURSIVE) {
+      recursion[i] = va_arg(args, char *);
+      dio_put_string(dout, recursion[i]);
+    } else if (serialize_one_directive(dout, tab[i], &args) == FALSE) {
+      assert(0);
+      return FALSE;
+
+    }
+  }
+
+  /* and the recursion */
+  for (i = 0; i < n; i++)
+    if (is_recursive(tab[i])) {
+      int k = parse_fims_format(recursion[i], tab2);
+      int j;
+      if (k < 0) {
+        assert(0);
+        return FALSE;
+      }
+      for (j = 0; j < k; j++) {
+        if (is_recursive(tab2[i])) {
+          /* only one level of recursion allowed */
+          assert(0);
+          return FALSE;
+        }
+        if (serialize_one_directive(dout, tab2[j], &args) == FALSE) {
+          assert(0);
+          return FALSE;
+        }
+      }
+    }
+  return TRUE;
+}
+
+
+struct mixed {
+  int d;
+  char s[100];
+  char s2[100];
+  Nation_Type_id nation;
+  Impr_Type_id impr;
+  struct {
+    int x;
+    int y;
+  } location;
+};
+
+/**************************************************************************
+ Get values for mixed struct m from din
+ Return true on success and FALSE on failure
+ Check everything
+**************************************************************************/
+static bool unserialize_one_directive(struct data_in *din,
+                                      enum fims_data_type type,
+                                      struct mixed *m)
+{
+  switch (type) {
+  case FIMS_STRING:
+  case FIMS_DONTTRANSLATE:
+  case FIMS_RECURSIVE:
+    dio_get_string(din, m->s, sizeof(m->s));
+    break;
+  case FIMS_INT:
+    dio_get_uint32(din, &m->d);
+    break;
+  case FIMS_LOCATION_AT:
+  case FIMS_LOCATION_IN:
+    dio_get_uint8(din, &m->location.x);
+    dio_get_uint8(din, &m->location.y);
+    break;
+  case FIMS_PLURAL:
+    dio_get_string(din, m->s, sizeof(m->s));
+    dio_get_string(din, m->s2, sizeof(m->s2));
+    dio_get_uint32(din, &m->d);
+    if (m->d < 0) {
+      return FALSE;
+    }
+    break;
+  case FIMS_NATION:
+  case FIMS_NATION_PLURAL:
+    dio_get_uint16(din, &m->nation);
+    if (m->nation < 0 || m->nation >= game.nation_count) {
+      return FALSE;
+    }
+    break;
+  case FIMS_IMPROVEMENT_EX:
+    dio_get_uint8(din, &m->d);
+    if (m->d < 0 || m->d >= FIS_LAST) {
+      return FALSE;
+    }
+    dio_get_uint32(din, &m->impr);
+    if (m->impr < 0 || m->impr >= game.num_impr_types) {
+      return FALSE;
+    }
+    break;
+  case FIMS_FLAG:
+    dio_get_uint32(din, &m->d);
+    break;
+  default:
+    return FALSE;
+  }
+  return din->bad_string ? FALSE : TRUE;
+}
+
+static const char *fims_impr_states[] = {
+  N_("?redundant:*"),
+  N_("?obsolete:O"),
+  N_("?built:B"),
+  N_("?wonder:w")
+};
+
+/**************************************************************************
+ Write one directive into out using data from mixed* m
+ Values have already been checked in unserialize_one_directive
+**************************************************************************/
+static bool write_one_directive(enum fims_data_type type, char *out,
+                                struct mixed *m)
+{
+  switch (type) {
+
+  case FIMS_STRING:
+    if (m->s[0]) {
+      strcpy(out, Q_(m->s));
+    } else {
+      /* yes, this is needed, see the loop in 
+       * get_and_translate_fims_with_format */
+      out[0] = '\0'; 
+    }
+    break;
+  case FIMS_DONTTRANSLATE:
+    strcpy(out, m->s);
+    break;
+  case FIMS_INT:
+    my_snprintf(out, 10, "%d", m->d);
+    break;
+  case FIMS_LOCATION_IN:
+    strcpy(out, get_location_str_in(m->location.x, m->location.y));
+    break;
+  case FIMS_LOCATION_AT:
+    strcpy(out, get_location_str_at(m->location.x, m->location.y));
+    break;
+  case FIMS_NATION:
+    strcpy(out, get_nation_name(m->nation));
+    break;
+  case FIMS_NATION_PLURAL:
+    strcpy(out, get_nation_name_plural(m->nation));
+    break;
+  case FIMS_IMPROVEMENT_EX:
+    if (m->d != FIS_normal) {
+      my_snprintf(out, 50, "%s(%s)", get_improvement_name(m->impr),
+                  Q_(fims_impr_states[m->d]));
+      break;
+    }
+    strcpy(out, get_improvement_name(m->impr));
+    break;
+  case FIMS_FLAG:
+    strcpy(out, get_units_with_flag_string(m->d));
+    break;
+  default:
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/**************************************************************************
+ ...
+**************************************************************************/
+static bool get_and_translate_fims_with_format(char *format,
+                                               struct data_in *din,
+                                               char *out)
+{
+  enum fims_data_type tab[100];
+  int n, i;
+  int count;
+
+  struct mixed M[100];
+
+  n = parse_fims_format(format, tab);
+  if (n < 0)
+    return FALSE;
+  for (i = 0; i < n; i++) {
+    if (unserialize_one_directive(din, tab[i], &M[i])
+        == FALSE)
+      return FALSE;
+  }
+
+  for (count = 0; *format; format++) {
+    if (*format != '%') {
+      *(out++) = *format;
+    } else {
+      int n = 0;
+      format++;
+      while (*format <= '9' && *format >= '0') {
+        n = 10 * n + (*(format++) - '0');
+      }
+      if (*format == '\0' || n >= 100) {
+        return FALSE;
+      }
+      if (*format == '%') {
+        *(out++) = '%';
+      } else {
+        if (n == 0) {
+          n = count++;
+        } else {
+          if (*format != '$') {
+            return FALSE;
+          }
+          format++;
+          if (count < n) {
+            count = n;
+          }
+          n--;
+        }
+        if (tab[n] == FIMS_PLURAL) {
+          if (get_and_translate_fims_with_format
+              (PL_(M[n].s, M[n].s2, M[n].d), din, out) == FALSE)
+            return FALSE;
+        } else if (tab[n] == FIMS_RECURSIVE) {
+          if (get_and_translate_fims_with_format(Q_(M[n].s),
+                                                 din, out) == FALSE) {
+            return FALSE;
+          }
+        } else {
+          write_one_directive(tab[n], out, &M[n]);
+        }
+        out += strlen(out);
+      }
+    }
+  }
+  *out = '\0';
+  return TRUE;
+}
+
+/**************************************************************************
+ Write translated string to out
+ return TRUE on succes
+**************************************************************************/
+bool get_and_translate_fims(struct data_in * din, char *out)
+{
+  char format[250];
+  dio_get_string(din, format, sizeof(format));
+  if (din->bad_string || format[0] == '\0') {
+    return FALSE;
+  }
+  return get_and_translate_fims_with_format(_(format), din, out);
+}
+
+/*************************************************************************
+ Create fims_impr struct
+ Fill values as in get_impr_name_ex() (city.c)
+*************************************************************************/
+struct fims_impr get_fims_impr(struct city *pcity, Impr_Type_id id)
+{
+  struct fims_impr f;
+  f.id = id;
+  if (pcity) {
+    switch (pcity->improvements[id]) {
+    case I_REDUNDANT:
+      f.state = FIS_redundant;
+      break;
+    case I_OBSOLETE:
+      f.state = FIS_obsolete;
+      break;
+    default:
+      f.state = FIS_normal;
+    }
+  } else if (is_wonder(id)) {
+    if (game.global_wonders[id] != 0) {
+      f.state = FIS_built;
+    } else {
+      f.state = FIS_wonder;
+    }
+  } else {
+    f.state = FIS_normal;
+  }
+  return f;
+}
diff -ur --new-file -Xdiff_ignore freeorig/common/fims.h freeciv/common/fims.h
--- freeorig/common/fims.h	1970-01-01 01:00:00.000000000 +0100
+++ freeciv/common/fims.h	2003-02-13 15:30:40.000000000 +0100
@@ -0,0 +1,39 @@
+/********************************************************************** 
+ Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
+   This program 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 2, or (at your option)
+   any later version.
+
+   This program 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.
+***********************************************************************/
+#ifndef FC__FIMS_H
+#define FC__FIMS_H
+
+#include <stdarg.h>
+
+#include "city.h"
+#include "dataio.h"
+#include "improvement.h"
+
+bool serialize_fims(struct data_out *dout, const char *format,
+                    va_list args);
+bool get_and_translate_fims(struct data_in *din, char *out);
+
+enum fims_impr_state {
+  FIS_redundant = 0,
+  FIS_obsolete = 1,
+  FIS_built = 2,
+  FIS_wonder = 3,
+  FIS_normal = 4,
+  FIS_LAST
+};
+struct fims_impr {
+  Impr_Type_id id;
+  enum fims_impr_state state;
+};
+struct fims_impr get_fims_impr(struct city *pcity, Impr_Type_id id);
+#endif
diff -ur --new-file -Xdiff_ignore freeorig/common/government.c freeciv/common/government.c
--- freeorig/common/government.c	2003-01-29 06:10:50.000000000 +0100
+++ freeciv/common/government.c	2003-02-13 15:30:40.000000000 +0100
@@ -233,6 +233,16 @@
 }
 
 /***************************************************************
+...
+***************************************************************/
+const char *get_government_name_orig(int type)
+{
+  if(type >= 0 && type < game.government_count)
+    return governments[type].name_orig;
+  return "";
+}
+
+/***************************************************************
   Can change to government if appropriate tech exists, and one of:
    - no required tech (required is A_NONE)
    - player has required tech
diff -ur --new-file -Xdiff_ignore freeorig/common/government.h freeciv/common/government.h
--- freeorig/common/government.h	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/government.h	2003-02-13 15:30:40.000000000 +0100
@@ -189,6 +189,7 @@
 int get_government_max_rate(int type);
 int get_government_civil_war_prob(int type);
 const char *get_government_name(int type);
+const char *get_government_name_orig(int type);
 const char *get_ruler_title(int gov, bool male, int nation);
 
 bool can_change_to_government(struct player *pplayer, int government);
diff -ur --new-file -Xdiff_ignore freeorig/common/improvement.c freeciv/common/improvement.c
--- freeorig/common/improvement.c	2003-02-13 07:41:31.000000000 +0100
+++ freeciv/common/improvement.c	2003-02-13 15:30:40.000000000 +0100
@@ -312,6 +312,14 @@
 /**************************************************************************
 ...
 **************************************************************************/
+const char *get_improvement_name_orig(Impr_Type_id id)
+{
+  return get_improvement_type(id)->name_orig; 
+}
+
+/**************************************************************************
+...
+**************************************************************************/
 int improvement_value(Impr_Type_id id)
 {
   return (improvement_types[id].build_cost);
diff -ur --new-file -Xdiff_ignore freeorig/common/improvement.h freeciv/common/improvement.h
--- freeorig/common/improvement.h	2003-02-13 07:41:31.000000000 +0100
+++ freeciv/common/improvement.h	2003-02-13 15:30:40.000000000 +0100
@@ -231,6 +231,7 @@
 int improvement_value(Impr_Type_id id);
 bool is_wonder(Impr_Type_id id);
 const char *get_improvement_name(Impr_Type_id id);
+const char *get_improvement_name_orig(Impr_Type_id id);
 
 /* FIXME: remove improvement_variant() when gen-impr obsoletes */
 int improvement_variant(Impr_Type_id id);  
diff -ur --new-file -Xdiff_ignore freeorig/common/Makefile.am freeciv/common/Makefile.am
--- freeorig/common/Makefile.am	2002-12-21 15:19:06.000000000 +0100
+++ freeciv/common/Makefile.am	2003-02-13 15:30:40.000000000 +0100
@@ -27,6 +27,8 @@
 		diptreaty.c	\
 		diptreaty.h	\
 		events.h	\
+		fims.c		\
+		fims.h		\
 		fcintl.c	\
 		fcintl.h	\
 		game.c		\
diff -ur --new-file -Xdiff_ignore freeorig/common/map.c freeciv/common/map.c
--- freeorig/common/map.c	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/map.c	2003-02-13 15:40:39.000000000 +0100
@@ -1588,3 +1588,82 @@
   /* no better place to put this */
   free(terrain_control.river_help_text);
 }
+
+/**************************************************************************
+ Find the nearest city on the same continent
+**************************************************************************/
+static struct city* dist_nearest_city(int x, int y) {
+  struct city *pc = NULL;
+  int dist = MAX(map.xsize / 2, map.ysize);
+  int con = map_get_continent(x, y);
+
+  players_iterate(pplay) {
+    city_list_iterate(pplay->cities, pcity)
+      if (real_map_distance(x, y, pcity->x, pcity->y) < dist &&
+         (con == 0 || con == map_get_continent(pcity->x, pcity->y))) {
+        dist = real_map_distance(x, y, pcity->x, pcity->y);
+        pc = pcity;
+      }
+    city_list_iterate_end;
+  } players_iterate_end;
+  return(pc);
+}
+
+/**************************************************************************
+  Returns a pointer to a (static) string which gives an informational
+  message about location (x,y).
+  One of:
+    "in Foo City"  or  "at Foo City" (see below)
+    "outside Foo City"
+    "near Foo City"
+    "" (if no cities known)
+  There are two variants for the first case, one when something happens
+  inside the city, otherwise when it happens "at" but "outside" the city.
+  Eg, when an attacker fails, the attacker dies "at" the city, but
+  not "in" the city (since the attacker never made it in).
+  Don't call this function directly; use the wrappers below.
+**************************************************************************/
+static char *get_location_str(int x, int y, bool use_at)
+{
+  static char buffer[MAX_LEN_NAME+64];
+  struct city *incity, *nearcity;
+
+  incity = map_get_city(x, y);
+  if (incity) {
+    if (use_at) {
+      my_snprintf(buffer, sizeof(buffer), _(" at %s"), incity->name);
+    } else {
+      my_snprintf(buffer, sizeof(buffer), _(" in %s"), incity->name);
+    }
+  } else {
+    nearcity = dist_nearest_city(x, y);
+    if (nearcity) {
+      if (is_tiles_adjacent(x, y, nearcity->x, nearcity->y)) {
+	my_snprintf(buffer, sizeof(buffer),
+		   _(" outside %s"), nearcity->name);
+      } else {
+	my_snprintf(buffer, sizeof(buffer),
+		    _(" near %s"), nearcity->name);
+      }
+    } else {
+      buffer[0] = '\0';
+    }
+  }
+  return buffer;
+}
+
+/**************************************************************************
+  See get_location_str() above.
+**************************************************************************/
+char *get_location_str_in(int x, int y)
+{
+  return get_location_str(x, y, FALSE);
+}
+
+/**************************************************************************
+  See get_location_str() above.
+**************************************************************************/
+char *get_location_str_at(int x, int y)
+{
+  return get_location_str(x, y, TRUE);
+}
diff -ur --new-file -Xdiff_ignore freeorig/common/map.h freeciv/common/map.h
--- freeorig/common/map.h	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/map.h	2003-02-13 15:30:40.000000000 +0100
@@ -330,6 +330,9 @@
 bool can_channel_land(int x, int y);
 bool can_reclaim_ocean(int x, int y);
 
+char *get_location_str_in(int x, int y);
+char *get_location_str_at(int x, int y);
+
 extern struct civ_map map;
 
 extern struct terrain_misc terrain_control;
diff -ur --new-file -Xdiff_ignore freeorig/common/packets.c freeciv/common/packets.c
--- freeorig/common/packets.c	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/packets.c	2003-02-13 15:30:40.000000000 +0100
@@ -446,6 +446,9 @@
 
   case PACKET_ATTRIBUTE_CHUNK:
     return receive_packet_attribute_chunk(pc);
+    
+  case PACKET_FIMS:
+    return receive_packet_fims(pc);
 
   case PACKET_PING_INFO:
     return receive_packet_ping_info(pc);
@@ -3145,6 +3148,44 @@
 /**************************************************************************
 ...
 **************************************************************************/
+int send_packet_fims(struct connection *pc,
+			     const struct packet_fims *packet)
+{
+  SEND_PACKET_START(PACKET_FIMS);
+  if (packet->x == -1) {
+    dio_put_uint8(&dout, 255);
+  } else {
+    dio_put_uint8(&dout, packet->x);
+    dio_put_uint8(&dout, packet->y);
+  }
+  dio_put_uint32(&dout, packet->event);
+  dio_put_uint16(&dout, packet->size);
+  dio_put_memory(&dout, packet->data, packet->size);
+  SEND_PACKET_END;
+}
+
+/**************************************************************************
+...
+**************************************************************************/
+struct packet_fims *receive_packet_fims(struct connection
+							*pc)
+{
+  RECEIVE_PACKET_START(packet_fims, packet);
+  dio_get_uint8(&din, &packet->x);
+  if (packet->x == 255) {
+    packet->x = packet->y = -1;
+  } else {
+    dio_get_uint8(&din, &packet->y);
+  }
+  dio_get_uint32(&din, &packet->event);
+  dio_get_uint16(&din, &packet->size);
+  dio_get_memory(&din, packet->data, packet->size);
+  RECEIVE_PACKET_END(packet);
+}
+
+/**************************************************************************
+...
+**************************************************************************/
 int send_packet_attribute_chunk(struct connection *pc,
 				struct packet_attribute_chunk *packet)
 {
@@ -3270,3 +3311,4 @@
 
   connection_do_unbuffer(pconn);
 }
+
diff -ur --new-file -Xdiff_ignore freeorig/common/packets.h freeciv/common/packets.h
--- freeorig/common/packets.h	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/packets.h	2003-02-13 15:30:40.000000000 +0100
@@ -25,6 +25,7 @@
 #define MAX_LEN_MSG             1536
 #define MAX_ATTRIBUTE_BLOCK     (256*1024)	/* largest attribute block */
 #define ATTRIBUTE_CHUNK_SIZE    (1024*2)  /* attribute chunk size to use */
+#define MAX_FIMS_SIZE              (1024)
 
 /* Note that MAX_LEN_USERNAME cannot be expanded, because it
    is used for the name in the first packet sent by the client,
@@ -128,6 +129,7 @@
   PACKET_FREEZE_HINT,
   PACKET_THAW_HINT,
   PACKET_PING_INFO,
+  PACKET_FIMS,
   PACKET_LAST  /* leave this last */
 };
 
@@ -923,6 +925,15 @@
   Nation_Type_id nations_used[MAX_NUM_PLAYERS];
 };
 
+/*********************************************************
+...
+*********************************************************/
+struct packet_fims {
+  int size;
+  int x, y, event;
+  unsigned char data[MAX_FIMS_SIZE];
+};
+
 int send_packet_diplomacy_info(struct connection *pc, enum packet_type pt,
 			       const struct packet_diplomacy_info *packet);
 struct packet_diplomacy_info *
@@ -1148,7 +1159,11 @@
 			     const struct packet_nations_used *packet);
 struct packet_nations_used *receive_packet_nations_used(struct connection
 							*pc);
-
+							
+int send_packet_fims(struct connection *pc,
+			     const struct packet_fims *packet);
+struct packet_fims *receive_packet_fims(struct connection
+							*pc);
 #include "packets_lsend.h"		/* lsend_packet_* functions */
 
 #endif  /* FC__PACKETS_H */
diff -ur --new-file -Xdiff_ignore freeorig/common/player.c freeciv/common/player.c
--- freeorig/common/player.c	2003-02-13 07:41:31.000000000 +0100
+++ freeciv/common/player.c	2003-02-13 15:30:40.000000000 +0100
@@ -464,34 +464,42 @@
 }
 
 /**************************************************************************
-Return a reputation level as a human-readable string
+Return a reputation level as an untranslated human-readable string
 **************************************************************************/
-const char *reputation_text(const int rep)
+const char *reputation_text_orig(const int rep)
 {
   if (rep == -1)
     return "-";
   else if (rep > GAME_MAX_REPUTATION * 0.95)
-    return _("Spotless");
+    return N_("Spotless");
   else if (rep > GAME_MAX_REPUTATION * 0.85)
-    return _("Excellent");
+    return N_("Excellent");
   else if (rep > GAME_MAX_REPUTATION * 0.75)
-    return _("Honorable");
+    return N_("Honorable");
   else if (rep > GAME_MAX_REPUTATION * 0.55)
-    return _("Questionable");
+    return N_("Questionable");
   else if (rep > GAME_MAX_REPUTATION * 0.30)
-    return _("Dishonorable");
+    return N_("Dishonorable");
   else if (rep > GAME_MAX_REPUTATION * 0.15)
-    return _("Poor");
+    return N_("Poor");
   else if (rep > GAME_MAX_REPUTATION * 0.07)
-    return _("Despicable");
+    return N_("Despicable");
   else
-    return _("Atrocious");
+    return N_("Atrocious");
 }
 
 /**************************************************************************
-Return a diplomatic state as a human-readable string
+Return a reputation level as a human-readable string
 **************************************************************************/
-const char *diplstate_text(const enum diplstate_type type)
+const char *reputation_text(const int rep)
+{
+  return _(reputation_text_orig(rep));
+}
+
+/**************************************************************************
+Return a diplomatic state as an untranslated human-readable string
+**************************************************************************/
+const char *diplstate_text_orig(const enum diplstate_type type)
 {
   static const char *ds_names[DS_LAST] = 
   {
@@ -504,10 +512,18 @@
   };
 
   if (type < DS_LAST)
-    return Q_(ds_names[type]);
+    return ds_names[type];
   die("Bad diplstate_type in diplstate_text: %d", type);
 }
 
+/**************************************************************************
+Return a diplomatic state as a human-readable string
+**************************************************************************/
+const char *diplstate_text(const enum diplstate_type type)
+{
+  return Q_(diplstate_text_orig(type));
+}
+
 /***************************************************************
 returns diplomatic state type between two players
 ***************************************************************/
diff -ur --new-file -Xdiff_ignore freeorig/common/player.h freeciv/common/player.h
--- freeorig/common/player.h	2003-02-11 07:57:22.000000000 +0100
+++ freeciv/common/player.h	2003-02-13 15:30:40.000000000 +0100
@@ -248,6 +248,8 @@
 bool ai_fuzzy(struct player *pplayer, bool normal_decision);
 
 const char *reputation_text(const int rep);
+const char *reputation_text_orig(const int rep);
+const char *diplstate_text_orig(const enum diplstate_type type);
 const char *diplstate_text(const enum diplstate_type type);
 
 const struct player_diplstate *pplayer_get_diplstate(const struct player
diff -ur --new-file -Xdiff_ignore freeorig/common/shared.c freeciv/common/shared.c
--- freeorig/common/shared.c	2002-12-18 18:36:19.000000000 +0100
+++ freeciv/common/shared.c	2003-02-13 15:30:40.000000000 +0100
@@ -400,6 +400,16 @@
   return TRUE;
 }
 
+
+/***************************************************************
+ Returns an untranslated format for given year.
+ It's used by FIMS
+***************************************************************/
+const char *textyear_orig(int year)
+{
+  return year < 0 ? N_("%d BC") : N_("%d AD");
+}
+
 /***************************************************************
   Produce a statically allocated textual representation of the given
   year.
diff -ur --new-file -Xdiff_ignore freeorig/common/shared.h freeciv/common/shared.h
--- freeorig/common/shared.h	2002-12-18 20:05:22.000000000 +0100
+++ freeciv/common/shared.h	2003-02-13 15:30:40.000000000 +0100
@@ -145,6 +145,7 @@
 
 bool is_sane_name(const char *name);
 const char *textyear(int year);
+const char *textyear_orig(int year);
 int compare_strings(const void *first, const void *second);
 int compare_strings_ptrs(const void *first, const void *second);
 
diff -ur --new-file -Xdiff_ignore freeorig/common/unittype.c freeciv/common/unittype.c
--- freeorig/common/unittype.c	2003-02-01 03:10:45.000000000 +0100
+++ freeciv/common/unittype.c	2003-02-13 15:57:23.000000000 +0100
@@ -216,6 +216,14 @@
 /**************************************************************************
 ...
 **************************************************************************/
+const char *unit_name_orig(Unit_Type_id id)
+{
+  return (unit_types[id].name_orig);
+}
+
+/**************************************************************************
+...
+**************************************************************************/
 const char *get_unit_name(Unit_Type_id id)
 {
   struct unit_type *ptype;
diff -ur --new-file -Xdiff_ignore freeorig/common/unittype.h freeciv/common/unittype.h
--- freeorig/common/unittype.h	2003-02-01 03:10:45.000000000 +0100
+++ freeciv/common/unittype.h	2003-02-13 15:57:43.000000000 +0100
@@ -210,6 +210,7 @@
 int unit_pop_value(Unit_Type_id id);
 
 const char *unit_name(Unit_Type_id id);
+const char *unit_name_orig(Unit_Type_id id);
 const char *unit_class_name(Unit_Class_id id);
 
 const char *get_unit_name(Unit_Type_id id);
diff -ur --new-file -Xdiff_ignore freeorig/configure.ac freeciv/configure.ac
--- freeorig/configure.ac	2003-02-13 07:41:23.000000000 +0100
+++ freeciv/configure.ac	2003-02-13 15:30:40.000000000 +0100
@@ -616,13 +616,15 @@
 dnl "--keyword=N_" with "--keyword=N_ --keyword=Q_ --keyword=PL_:1,2"
 dnl in the 'po/Makefile' file.
 AC_CONFIG_COMMANDS([fc_default-1],[[if test -f po/Makefile ; then
-     if grep 'keyword=N_ --keyword=Q_ --keyword=PL_:1,2' po/Makefile >/dev/null 2>&1 ; then
+     if grep 'keyword=N_ --keyword=Q_ --keyword=PL_:1,2 --keyword=NPL_:1,2' \
+         po/Makefile >/dev/null 2>&1 ; then
        # has already been extended
        :
      else
        echo extending po/Makefile
        mv -f po/Makefile po/Makefile.tmp
-       sed -e 's/--keyword=N_/--keyword=N_ --keyword=Q_ --keyword=PL_:1,2/g' po/Makefile.tmp > po/Makefile
+       sed -e 's/--keyword=N_/--keyword=N_ --keyword=Q_ --keyword=PL_:1,2 --keyword=NPL_:1,2/g' \
+        po/Makefile.tmp > po/Makefile
        rm po/Makefile.tmp
      fi
    fi]],[[]])
diff -ur --new-file -Xdiff_ignore freeorig/configure.in freeciv/configure.in
--- freeorig/configure.in	2003-02-13 07:41:23.000000000 +0100
+++ freeciv/configure.in	2003-02-13 15:30:40.000000000 +0100
@@ -609,13 +609,13 @@
 dnl in the 'po/Makefile' file.
 AC_OUTPUT_COMMANDS(
   [if test -f po/Makefile ; then
-     if grep 'keyword=N_ --keyword=Q_ --keyword=PL_:1,2' po/Makefile >/dev/null 2>&1 ; then
+     if grep 'keyword=N_ --keyword=Q_ --keyword=PL_:1,2 --keyword=NPL_:1,2' po/Makefile >/dev/null 2>&1 ; then
        # has already been extended
        :
      else
        echo extending po/Makefile
        mv -f po/Makefile po/Makefile.tmp
-       sed -e 's/--keyword=N_/--keyword=N_ --keyword=Q_ --keyword=PL_:1,2/g' po/Makefile.tmp > po/Makefile
+       sed -e 's/--keyword=N_/--keyword=N_ --keyword=Q_ --keyword=PL_:1,2 --keyword=NPL:1,2/g' po/Makefile.tmp > po/Makefile
        rm po/Makefile.tmp
      fi
    fi])
diff -ur --new-file -Xdiff_ignore freeorig/server/autoattack.c freeciv/server/autoattack.c
--- freeorig/server/autoattack.c	2002-09-30 15:08:56.000000000 +0200
+++ freeciv/server/autoattack.c	2003-02-13 15:59:07.000000000 +0100
@@ -132,10 +132,10 @@
   if((unit_type(enemy)->defense_strength) >
      unit_type(punit)->attack_strength*1.5) {
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: Auto-Attack: %s's %s found a too "
-		       "tough enemy (%s)"),
-		     pcity->name, unit_name(punit->type),
-		     unit_name(enemy->type));
+		      N_("Game: Auto-Attack: %S's %s found a too "
+		         "tough enemy (%s)"),
+		     pcity->name, unit_name_orig(punit->type),
+		     unit_name_orig(enemy->type));
     punit->ai.control=FALSE;
     handle_unit_activity_request(punit, ACTIVITY_IDLE);
     return NULL;
@@ -161,9 +161,9 @@
   freelog(LOG_DEBUG, "launching attack");
   
   notify_player_ex(pplayer, enemy->x, enemy->y, E_NOEVENT,
-		   _("Game: Auto-Attack: %s's %s attacking %s's %s"),
-		   pcity->name, unit_name(punit->type),
-		   unit_owner(enemy)->name, unit_name(enemy->type));
+		    N_("Game: Auto-Attack: %S's %s attacking %S's %s"),
+		   pcity->name, unit_name_orig(punit->type),
+		   unit_owner(enemy)->name, unit_name_orig(enemy->type));
   
   set_unit_activity(punit, ACTIVITY_GOTO);
   punit->goto_dest_x=enemy->x;
diff -ur --new-file -Xdiff_ignore freeorig/server/barbarian.c freeciv/server/barbarian.c
--- freeorig/server/barbarian.c	2003-01-09 03:36:37.000000000 +0100
+++ freeciv/server/barbarian.c	2003-02-13 15:30:40.000000000 +0100
@@ -396,11 +396,11 @@
   /* There should probably be a different message about Sea Raiders */
   if (is_land_barbarian(barbarians))
     notify_player_ex(victim, xu, yu, E_UPRISING,
-		     _("Native unrest near %s led by %s."), pc->name,
-		     barbarians->name);
+		      N_("Native unrest near %S led by %S."), pc->name,
+		      barbarians->name);
   else if (map_get_known_and_seen(xu, yu, victim))
     notify_player_ex(victim, xu, yu, E_UPRISING,
-		     _("Sea raiders seen near %s!"), pc->name);
+		     N_("Sea raiders seen near %S!"), pc->name);
 }
 
 /**************************************************************************
diff -ur --new-file -Xdiff_ignore freeorig/server/cityhand.c freeciv/server/cityhand.c
--- freeorig/server/cityhand.c	2002-12-18 20:05:22.000000000 +0100
+++ freeciv/server/cityhand.c	2003-02-13 15:59:40.000000000 +0100
@@ -23,6 +23,7 @@
 #include "city.h"
 #include "events.h"
 #include "fcintl.h"
+#include "fims.h"
 #include "idex.h"
 #include "log.h"
 #include "map.h"
@@ -139,7 +140,7 @@
     sync_cities();
   } else {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		     _("Game: you don't have a worker here.")); 
+		     N_("Game: you don't have a worker here.")); 
   }
 }
 
@@ -191,7 +192,7 @@
 {  
   if (pcity->did_sell) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT, 
-		  _("Game: You have already sold something here this turn."));
+		  N_("Game: You have already sold something here this turn."));
     return;
   }
 
@@ -200,8 +201,8 @@
 
   pcity->did_sell=TRUE;
   notify_player_ex(pplayer, pcity->x, pcity->y, E_IMP_SOLD,
-		   _("Game: You sell %s in %s for %d gold."), 
-		   get_improvement_name(id), pcity->name,
+		   N_("Game: You sell %I in %S for %d gold."), 
+		   get_fims_impr(pcity, id), pcity->name,
 		   improvement_value(id));
   do_sell_building(pplayer, pcity, id);
 
@@ -230,41 +231,38 @@
 **************************************************************************/
 void really_handle_city_buy(struct player *pplayer, struct city *pcity)
 {
-  const char *name;
   int cost, total;
 
   assert(pcity && player_owns_city(pplayer, pcity));
  
   if (pcity->turn_founded == game.turn) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		  _("Game: Cannot buy in city created this turn."));
+		  N_("Game: Cannot buy in city created this turn."));
     return;
   }
 
   if (pcity->did_buy) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		  _("Game: You have already bought this turn."));
+		  N_("Game: You have already bought this turn."));
     return;
   }
 
   if (!pcity->is_building_unit && pcity->currently_building==B_CAPITAL)  {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-                     _("Game: You don't buy %s!"),
-		     improvement_types[B_CAPITAL].name);
+                     N_("Game: You don't buy %s!"),
+		     get_improvement_name_orig(B_CAPITAL));
     return;
   }
 
   if (pcity->is_building_unit && pcity->anarchy != 0) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT, 
-		     _("Game: Can't buy units when city is in disorder."));
+		     N_("Game: Can't buy units when city is in disorder."));
     return;
   }
 
   if (pcity->is_building_unit) {
-    name=unit_types[pcity->currently_building].name;
     total=unit_value(pcity->currently_building);
   } else {
-    name=get_improvement_name(pcity->currently_building);
     total=improvement_value(pcity->currently_building);
   }
   cost=city_buy_cost(pcity);
@@ -291,10 +289,20 @@
   city_refresh(pcity);
   
   conn_list_do_buffer(&pplayer->connections);
-  notify_player_ex(pplayer, pcity->x, pcity->y, 
-                   pcity->is_building_unit?E_UNIT_BUY:E_IMP_BUY,
-		   _("Game: %s bought in %s for %d gold."), 
-		   name, pcity->name, cost);
+  if (pcity->is_building_unit) {
+    notify_player_ex(pplayer, pcity->x, pcity->y, 
+                      E_UNIT_BUY,
+                      N_("Game: %s bought in %S for %d gold."), 
+		      unit_name_orig(pcity->currently_building),
+		      pcity->name, cost);
+
+  } else {
+    notify_player_ex(pplayer, pcity->x, pcity->y, 
+                      E_IMP_BUY,
+                      N_("Game: %s bought in %S for %d gold."), 
+		      get_improvement_name_orig(pcity->currently_building),
+		      pcity->name, cost);  
+  }
   send_city_info(pplayer, pcity);
   send_player_info(pplayer,pplayer);
   conn_list_do_unbuffer(&pplayer->connections);
@@ -367,7 +375,7 @@
      return;
   if (pcity->did_buy && pcity->shield_stock > 0) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		     _("Game: You have bought this turn, can't change."));
+		      N_("Game: You have bought this turn, can't change."));
     return;
   }
 
@@ -391,7 +399,7 @@
   }
 
   if (!is_sane_name(preq->name)) {
-    notify_player(pplayer, _("Game: %s is not a valid name."), preq->name);
+    notify_player(pplayer, N_("Game: %s is not a valid name."), preq->name);
     return;
   }
 
diff -ur --new-file -Xdiff_ignore freeorig/server/citytools.c freeciv/server/citytools.c
--- freeorig/server/citytools.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/citytools.c	2003-02-13 16:00:49.000000000 +0100
@@ -23,6 +23,7 @@
 #include "city.h"
 #include "events.h"
 #include "fcintl.h"
+#include "fims.h"
 #include "government.h"
 #include "idex.h"
 #include "log.h"
@@ -221,7 +222,7 @@
       city_list_find_name(&pplayer->cities, city_name)) {
     if (notify_player) {
       notify_player_ex(pplayer, x, y, E_NOEVENT,
-		       _("Game: You already have a city called %s"),
+		       N_("Game: You already have a city called %S"),
 		       city_name);
     }
     return FALSE;
@@ -244,9 +245,9 @@
     if (pother != NULL) {
       if (notify_player) {
 	notify_player_ex(pplayer, x, y, E_NOEVENT,
-			 _("Game: Can't use %s as a city name. "
-			   "It is reserved for %s."),
-			 city_name, get_nation_name_plural(pother->nation));
+			 N_("Game: Can't use %S as a city name. "
+			   "It is reserved for %N."),
+			 city_name, pother->nation);
       }
       return FALSE;
     }
@@ -257,7 +258,7 @@
        game.allowed_city_names == 3) && game_find_city_by_name(city_name)) {
     if (notify_player) {
       notify_player_ex(pplayer, x, y, E_NOEVENT,
-		       _("Game: A city called %s already exists."),
+		       N_("Game: A city called %S already exists."),
 		       city_name);
     }
     return FALSE;
@@ -574,7 +575,7 @@
     freelog(LOG_VERBOSE, "Changed homecity of %s's %s to %s",
 	    from_player->name, unit_name(punit->type), tocity->name);
     if (verbose) {
-      notify_player(from_player, _("Game: Changed homecity of %s to %s."),
+      notify_player(from_player, N_("Game: Changed homecity of %S to %S."),
 		    unit_name(punit->type), tocity->name);
     }
   } else {
@@ -584,8 +585,9 @@
 	      unit_name(punit->type), in_city->name,
 	      from_player->name, to_player->name);
       if (verbose) {
-	notify_player(from_player, _("Game: Transfered %s in %s from %s to %s."),
-		      unit_name(punit->type), in_city->name,
+	notify_player(from_player, 
+	              N_("Game: Transfered %s in %S from %S to %S."),
+		      unit_name_orig(punit->type), in_city->name,
 		      from_player->name, to_player->name);
       }
     } else {
@@ -593,8 +595,8 @@
 	      unit_name(punit->type),
 	      from_player->name, to_player->name);
       if (verbose) {
-	notify_player(from_player, _("Game: Transfered %s from %s to %s."),
-		      unit_name(punit->type),
+	notify_player(from_player, N_("Game: Transfered %s from %S to %S."),
+		      unit_name_orig(punit->type),
 		      from_player->name, to_player->name);
       }
     }
@@ -781,8 +783,8 @@
    */
   send_player_cities(pplayer);
 
-  notify_player(pplayer, _("Game: You lost your capital %s. A new palace "
-			   "was built in %s."), old_capital_name,
+  notify_player(pplayer, N_("Game: You lost your capital %S. A new palace "
+			   "was built in %S."), old_capital_name,
 		pnew_capital->name);
 
   /* 
@@ -840,8 +842,8 @@
     sz_strlcpy(pcity->name,
 	       city_name_suggestion(ptaker, pcity->x, pcity->y));
     notify_player_ex(ptaker, pcity->x, pcity->y, E_NOEVENT,
-		     _("You already had a city called %s."
-		       " The city was renamed to %s."), old_city_name,
+		     N_("You already had a city called %S."
+		       " The city was renamed to %S."), old_city_name,
 		     pcity->name);
   }
 
@@ -944,7 +946,7 @@
       && player_knows_techs_with_flag (ptaker, TF_RAILROAD)
       && !map_has_special(pcity->x, pcity->y, S_RAILROAD)) {
     notify_player(ptaker,
-		  _("Game: The people in %s are stunned by your"
+		  N_("Game: The people in %S are stunned by your"
 		    " technological insight!\n"
 		    "      Workers spontaneously gather and upgrade"
 		    " the city with railroads."),
@@ -1116,7 +1118,7 @@
   sync_cities(); /* Will also send pcity. */
 
   notify_player_ex(pplayer, x, y, E_CITY_BUILD,
-		   _("Game: You have founded %s"), pcity->name);
+		   N_("Game: You have founded %S"), pcity->name);
   maybe_make_first_contact(x, y, city_owner(pcity));
 
   /* Catch fortress building, transforming into ocean, etc. */
@@ -1160,8 +1162,8 @@
 	 unless that city is actually the same city (happens if disbanding) */
       freelog(LOG_VERBOSE, "Changed homecity of %s in %s",
 	      unit_name(punit->type), new_home_city->name);
-      notify_player(pplayer, _("Game: Changed homecity of %s in %s."),
-		    unit_name(punit->type), new_home_city->name);
+      notify_player(pplayer, N_("Game: Changed homecity of %s in %S."),
+		    unit_name_orig(punit->type), new_home_city->name);
       (void) create_unit_full(city_owner(new_home_city), x, y,
 		       punit->type, punit->veteran, new_home_city->id,
 		       punit->moves_left, punit->hp);
@@ -1191,9 +1193,9 @@
 	  moved = handle_unit_move_request(punit, x1, y1, FALSE, TRUE);
 	  if (moved) {
 	    notify_player_ex(unit_owner(punit), -1, -1, E_NOEVENT,
-			     _("Game: Moved %s out of disbanded city %s "
+			     N_("Game: Moved %s out of disbanded city %S "
 			       "to avoid being landlocked."),
-			     unit_type(punit)->name, pcity->name);
+			     unit_name_orig(punit->type), pcity->name);
 	    goto OUT;
 	  }
 	}
@@ -1202,9 +1204,9 @@
   OUT:
     if (!moved) {
       notify_player_ex(unit_owner(punit), -1, -1, E_NOEVENT,
-		       _("Game: When %s was disbanded your %s could not "
+		       N_("Game: When %S was disbanded your %s could not "
 			 "get out, and it was therefore stranded."),
-		       pcity->name, unit_type(punit)->name);
+		       pcity->name, unit_name_orig(punit->type));
       wipe_unit(punit);
     }
     /* We just messed with the unit list. Avoid trouble by starting over.
@@ -1305,9 +1307,9 @@
    */
   if (pcity->size<=1) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		     _("Game: You destroy %s completely."), pcity->name);
+		     N_("Game: You destroy %S completely."), pcity->name);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_CITY_LOST, 
-		     _("Game: %s has been destroyed by %s."), 
+		     N_("Game: %S has been destroyed by %S."), 
 		     pcity->name, pplayer->name);
     gamelog(GAMELOG_LOSEC, _("%s (%s) (%i,%i) destroyed by %s"), pcity->name,
 	    get_nation_name(city_owner(pcity)->nation), pcity->x, pcity->y,
@@ -1327,11 +1329,11 @@
   send_player_info(cplayer, cplayer);
   if (pcity->original != pplayer->player_no) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT, 
-		     _("Game: You conquer %s, your lootings accumulate"
+		     N_("Game: You conquer %S, your lootings accumulate"
 		       " to %d gold!"), 
 		     pcity->name, coins);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_CITY_LOST, 
-		     _("Game: %s conquered %s and looted %d gold"
+		     N_("Game: %S conquered %S and looted %d gold"
 		       " from the city."),
 		     pplayer->name, pcity->name, coins);
     gamelog(GAMELOG_CONQ, _("%s (%s) (%i,%i) conquered by %s"), pcity->name,
@@ -1339,12 +1341,12 @@
 	    get_nation_name_plural(pplayer->nation));
   } else {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT, 
-		     _("Game: You have liberated %s!!"
+		     N_("Game: You have liberated %S!!"
 		       " lootings accumulate to %d gold."),
 		     pcity->name, coins);
     
     notify_player_ex(cplayer, pcity->x, pcity->y, E_CITY_LOST, 
-		     _("Game: %s liberated %s and looted %d gold"
+		     N_("Game: %S liberated %S and looted %d gold"
 		       " from the city."),
 		     pplayer->name, pcity->name, coins);
     gamelog(GAMELOG_CONQ, _("%s (%s) (%i,%i) liberated by %s"), pcity->name,
@@ -1817,8 +1819,8 @@
 void change_build_target(struct player *pplayer, struct city *pcity, 
 			 int target, bool is_unit, int event)
 {
-  char *name;
   const char *source;
+  const char *name;
 
   /* If the city is already building this thing, don't do anything */
   if (pcity->is_building_unit == is_unit &&
@@ -1834,9 +1836,9 @@
        don't announce that the player has *stopped* building that wonder. 
        */
     notify_player_ex(NULL, pcity->x, pcity->y, E_WONDER_STOPPED,
-		     _("Game: The %s have stopped building The %s in %s."),
-		     get_nation_name_plural(pplayer->nation),
-		     get_impr_name_ex(pcity, pcity->currently_building),
+		     N_("Game: The %N have stopped building The %I in %S."),
+		     pplayer->nation,
+		     get_fims_impr(pcity, pcity->currently_building),
 		     pcity->name);
   }
 
@@ -1850,12 +1852,12 @@
 
   /* What's the name of the target? */
   if (is_unit)
-    name = unit_types[pcity->currently_building].name;
+    name = unit_types[pcity->currently_building].name_orig;
   else
-    name = improvement_types[pcity->currently_building].name;
+    name = improvement_types[pcity->currently_building].name_orig;
 
   switch (event) {
-    case E_WORKLIST: source = _(" from the worklist"); break;
+    case E_WORKLIST: source = N_(" from the worklist"); break;
 /* Should we give the AI auto code credit?
     case E_IMP_AUTO: source = _(" as suggested by the AI advisor"); break;
 */
@@ -1865,20 +1867,20 @@
   /* Tell the player what's up. */
   if (event != 0)
     notify_player_ex(pplayer, pcity->x, pcity->y, event,
-		     _("Game: %s is building %s%s."),
+		     N_("Game: %s is building %s%s."),
 		     pcity->name, name, source);
   else
     notify_player_ex(pplayer, pcity->x, pcity->y, E_UNIT_BUILD,
-		     _("Game: %s is building %s."), 
+		     N_("Game: %s is building %s."), 
 		     pcity->name, name);
 
   /* If the city is building a wonder, tell the rest of the world
      about it. */
   if (!pcity->is_building_unit && is_wonder(pcity->currently_building)) {
     notify_player_ex(NULL, pcity->x, pcity->y, E_WONDER_STARTED,
-		     _("Game: The %s have started building The %s in %s."),
-		     get_nation_name_plural(pplayer->nation),
-		     get_impr_name_ex(pcity, pcity->currently_building),
+		     N_("Game: The %N have started building The %s in %s."),
+		     pplayer->nation,
+		     get_fims_impr(pcity, pcity->currently_building),
 		     pcity->name);
   }
 }
@@ -2118,9 +2120,9 @@
             && !city_has_terr_spec_gate(pcity, impr)) {
           do_sell_building(pplayer, pcity, impr);
           notify_player_ex(pplayer, x1, y1, E_IMP_SOLD,
-                           _("Game: You sell %s in %s (now landlocked)"
-                             " for %d gold."),
-                           get_improvement_name(impr), pcity->name,
+                           N_("Game: You sell %s in %S (now landlocked)"
+                           " for %d gold."),
+                           get_improvement_name_orig(impr), pcity->name,
                            improvement_value(impr)); 
         }
       } built_impr_iterate_end;
diff -ur --new-file -Xdiff_ignore freeorig/server/cityturn.c freeciv/server/cityturn.c
--- freeorig/server/cityturn.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/cityturn.c	2003-02-13 16:03:59.000000000 +0100
@@ -23,6 +23,7 @@
 #include "city.h"
 #include "events.h"
 #include "fcintl.h"
+#include "fims.h"
 #include "game.h"
 #include "government.h"
 #include "log.h"
@@ -118,8 +119,8 @@
     if (!is_wonder(i) && improvement_obsolete(pplayer, i)) {
       do_sell_building(pplayer, pcity, i);
       notify_player_ex(pplayer, pcity->x, pcity->y, E_IMP_SOLD, 
-		       _("Game: %s is selling %s (obsolete) for %d."),
-		       pcity->name, get_improvement_name(i), 
+		       N_("Game: %S is selling %s (obsolete) for %d."),
+		       pcity->name, get_improvement_name_orig(i), 
 		       improvement_value(i));
       sold = TRUE;
     }
@@ -330,9 +331,9 @@
 	  && can_player_build_improvement(city_owner(pcity), pcity->currently_building)) {
 	notify_conn_ex(dest, pcity->x, pcity->y,
 		       E_WONDER_WILL_BE_BUILT,
-		       _("Game: Notice: Wonder %s in %s will be finished"
+		       N_("Game: Notice: Wonder %s in %S will be finished"
 			 " next turn."), 
-		       get_improvement_name(pcity->currently_building),
+		       get_improvement_name_orig(pcity->currently_building),
 		       pcity->name);
       }
     } city_list_iterate_end;
@@ -362,9 +363,9 @@
 	  (turns_growth < turns_granary)) {
 	notify_conn_ex(dest, pcity->x, pcity->y,
 			 E_CITY_GRAN_THROTTLE,
-			 _("Game: Suggest throttling growth in %s to use %s "
+			 N_("Game: Suggest throttling growth in %S to use %s "
 			   "(being built) more effectively."), pcity->name,
-			 improvement_types[B_GRANARY].name);
+			 get_improvement_name_orig(B_GRANARY));
       }
     }
 
@@ -376,14 +377,14 @@
     if ((turns_growth <= 0) && !city_celebrating(pcity) && can_grow) {
       notify_conn_ex(dest, pcity->x, pcity->y,
 		       E_CITY_MAY_SOON_GROW,
-		       _("Game: %s may soon grow to size %i."),
+		       N_("Game: %S may soon grow to size %d."),
 		       pcity->name, pcity->size + 1);
     }
   } else {
     if (pcity->food_stock + pcity->food_surplus <= 0 && pcity->food_surplus < 0) {
       notify_conn_ex(dest, pcity->x, pcity->y,
 		     E_CITY_FAMINE_FEARED,
-		     _("Game: Warning: Famine feared in %s."),
+		     N_("Game: Warning: Famine feared in %S."),
 		     pcity->name);
     }
   }
@@ -415,7 +416,7 @@
   pplayer->ai.prev_gold = gold;
   if (gold-(gold-pplayer->economic.gold)*3<0) {
     notify_player_ex(pplayer, -1, -1, E_LOW_ON_FUNDS,
-		     _("Game: WARNING, we're LOW on FUNDS sire."));  
+		     N_("Game: WARNING, we're LOW on FUNDS sire."));  
   }
     /* uncomment to unbalance the game, like in civ1 (CLG)
       if (pplayer->got_tech && pplayer->research.researched > 0)    
@@ -479,13 +480,13 @@
       && pcity->size>=game.aqueduct_size) {/* need aqueduct */
     if (!pcity->is_building_unit && pcity->currently_building == B_AQUEDUCT) {
       notify_player_ex(powner, pcity->x, pcity->y, E_CITY_AQ_BUILDING,
-		       _("Game: %s needs %s (being built) "
+		       N_("Game: %S needs %s (being built) "
 			 "to grow any further."), pcity->name,
-		       improvement_types[B_AQUEDUCT].name);
+		       get_improvement_name_orig(B_AQUEDUCT));
     } else {
       notify_player_ex(powner, pcity->x, pcity->y, E_CITY_AQUEDUCT,
-		       _("Game: %s needs %s to grow any further."),
-		       pcity->name, improvement_types[B_AQUEDUCT].name);
+		       N_("Game: %S needs %s to grow any further."),
+		       pcity->name, get_improvement_name_orig(B_AQUEDUCT));
     }
     /* Granary can only hold so much */
     new_food = (city_granary_size(pcity->size) *
@@ -498,13 +499,13 @@
       && pcity->size>=game.sewer_size) {/* need sewer */
     if (!pcity->is_building_unit && pcity->currently_building == B_SEWER) {
       notify_player_ex(powner, pcity->x, pcity->y, E_CITY_AQ_BUILDING,
-		       _("Game: %s needs %s (being built) "
+		       N_("Game: %S needs %s (being built) "
 			 "to grow any further."), pcity->name,
-		       improvement_types[B_SEWER].name);
+		       get_improvement_name_orig(B_SEWER));
     } else {
       notify_player_ex(powner, pcity->x, pcity->y, E_CITY_AQUEDUCT,
-		       _("Game: %s needs %s to grow any further."),
-		       pcity->name, improvement_types[B_SEWER].name);
+		       N_("Game: %S needs %s to grow any further."),
+		       pcity->name, get_improvement_name_orig(B_SEWER));
     }
     /* Granary can only hold so much */
     new_food = (city_granary_size(pcity->size) *
@@ -555,7 +556,7 @@
       ai_scientists_taxmen(pcity);
 
   notify_player_ex(powner, pcity->x, pcity->y, E_CITY_GROWTH,
-                   _("Game: %s grows to size %d."), pcity->name, pcity->size);
+                   N_("Game: %S grows to size %d."), pcity->name, pcity->size);
 
   sync_cities();
 }
@@ -582,12 +583,12 @@
     unit_list_iterate(pcity->units_supported, punit) {
       if (unit_type(punit)->food_cost > 0) {
 	char *utname = unit_type(punit)->name;
-	wipe_unit_safe(punit, &myiter);
 	notify_player_ex(city_owner(pcity), pcity->x, pcity->y, E_UNIT_LOST,
-			 _("Game: Famine feared in %s, %s lost!"), 
-			 pcity->name, utname);
+			 N_("Game: Famine feared in %S, %s lost!"), 
+			 pcity->name, unit_name_orig(punit->type));
 	gamelog(GAMELOG_UNITFS, _("%s lose %s (famine)"),
 		get_nation_name_plural(city_owner(pcity)->nation), utname);
+	wipe_unit_safe(punit, &myiter);
 	if (city_got_effect(pcity, B_GRANARY))
 	  pcity->food_stock=city_granary_size(pcity->size)/2;
 	else
@@ -597,7 +598,7 @@
     }
     unit_list_iterate_end;
     notify_player_ex(city_owner(pcity), pcity->x, pcity->y, E_CITY_FAMINE,
-		     _("Game: Famine causes population loss in %s."),
+		     N_("Game: Famine causes population loss in %S."),
 		     pcity->name);
     if (city_got_effect(pcity, B_GRANARY))
       pcity->food_stock = city_granary_size(pcity->size - 1) / 2;
@@ -682,13 +683,13 @@
       if (!can_eventually_build_unit(pcity, new_target)) {
 	/* Nope, never in a million years. */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			 _("Game: %s can't build %s from the worklist.  "
+			 N_("Game: %S can't build %s from the worklist.  "
 			   "Purging..."),
 			 pcity->name,
 			 /* Yes, warn about the targets that's actually
 			    in the worklist, not its obsolete-closure
 			    new_target. */
-			 get_unit_type(target)->name);
+			 unit_name_orig(target));
 	/* Purge this worklist item. */
 	worklist_remove(&pcity->worklist, i-1);
 	/* Reset i to index to the now-next element. */
@@ -701,17 +702,17 @@
       if (new_target == target) {
 	/* Nope, we're stuck.  Dump this item from the worklist. */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			 _("Game: %s can't build %s from the worklist; "
+			 N_("Game: %S can't build %s from the worklist; "
 			   "tech not yet available.  Postponing..."),
 			 pcity->name,
-			 get_unit_type(target)->name);
+			 unit_name_orig(target));
 	continue;
       } else {
 	/* Yep, we can go after new_target instead.  Joy! */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_WORKLIST,
-			 _("Game: Production of %s is upgraded to %s in %s."),
-			 get_unit_type(target)->name, 
-			 get_unit_type(new_target)->name,
+			 N_("Game: Production of %s is upgraded to %s in %S."),
+			 unit_name_orig(target), 
+			 unit_name_orig(new_target),
 			 pcity->name);
 	target = new_target;
       }
@@ -722,10 +723,10 @@
       if (!can_eventually_build_improvement(pcity, new_target)) {
 	/* Nope, never in a million years. */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			 _("Game: %s can't build %s from the worklist.  "
+			 N_("Game: %S can't build %I from the worklist.  "
 			   "Purging..."),
 			 pcity->name,
-			 get_impr_name_ex(pcity, target));
+			 get_fims_impr(pcity, target));
 
 	/* Purge this worklist item. */
 	worklist_remove(&pcity->worklist, i-1);
@@ -742,33 +743,34 @@
 	/* Nope, no use.  *sigh*  */
 	if (!player_knows_improvement_tech(pplayer, target)) {
 	  notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			   _("Game: %s can't build %s from the worklist; "
-			     "tech not yet available.  Postponing..."),
+			   N_("Game: %S can't build %I from the worklist; "
+			      "tech not yet available.  Postponing..."),
 			   pcity->name,
-			   get_impr_name_ex(pcity, target));
+			   get_fims_impr(pcity, target));
 	} else if (improvement_types[target].bldg_req != B_LAST) {
 	  notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			   _("Game: %s can't build %s from the worklist; "
-			     "need to have %s first.  Postponing..."),
-			   pcity->name,
-			   get_impr_name_ex(pcity, target),
-			   get_impr_name_ex(pcity, improvement_types[target].bldg_req));
+			    N_("Game: %S can't build %I from the worklist; "
+			        "need to have %I first.  Postponing..."),
+			    pcity->name,
+			    get_fims_impr(pcity, target),
+			    get_fims_impr(pcity, 
+			                  improvement_types[target].bldg_req));
 	} else {
 	  /* This shouldn't happen...
 	     FIXME: make can_build_improvement() return a reason enum. */
 	  notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-			   _("Game: %s can't build %s from the worklist; "
-			     "Reason unknown!  Postponing..."),
-			   pcity->name,
-			   get_impr_name_ex(pcity, target));
+			    N_("Game: %S can't build %I from the worklist; "
+			       "Reason unknown!  Postponing..."),
+			    pcity->name,
+			    get_fims_impr(pcity, target));
 	}
 	continue;
       } else {
 	/* Hey, we can upgrade the improvement!  */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_WORKLIST,
-			 _("Game: Production of %s is upgraded to %s in %s."),
-			 get_impr_name_ex(pcity, target), 
-			 get_impr_name_ex(pcity, new_target),
+			 N_("Game: Production of %I is upgraded to %I in %S."),
+			 get_fims_impr(pcity, target), 
+			 get_fims_impr(pcity, new_target),
 			 pcity->name);
 	target = new_target;
       }
@@ -791,8 +793,8 @@
     /* There *was* something in the worklist, but it's empty now.  Bug the
        player about it. */
     notify_player_ex(pplayer, pcity->x, pcity->y, E_WORKLIST,
-		     _("Game: %s's worklist is now empty."),
-		     pcity->name);
+		      N_("Game: %S's worklist is now empty."),
+		      pcity->name);
   }
 
   return success;
@@ -871,10 +873,10 @@
   if (can_build_unit_direct(pcity, id2)) {
     pcity->currently_building=id2;
     notify_player_ex(pplayer, pcity->x, pcity->y, E_UNIT_UPGRADED, 
-		  _("Game: Production of %s is upgraded to %s in %s."),
-		  get_unit_type(id)->name, 
-		  get_unit_type(id2)->name , 
-		  pcity->name);
+		      N_("Game: Production of %s is upgraded to %s in %S."),
+		      unit_name_orig(id), 
+		      unit_name_orig(id2), 
+		      pcity->name);
   }
 }
 
@@ -890,8 +892,8 @@
     unit_list_iterate(pcity->units_supported, punit) {
       if (utype_shield_cost(unit_type(punit), g) > 0) {
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_UNIT_LOST,
-			 _("Game: %s can't upkeep %s, unit disbanded."),
-			 pcity->name, unit_type(punit)->name);
+			  N_("Game: %S can't upkeep %s, unit disbanded."),
+			  pcity->name, unit_name_orig(punit->type));
 	wipe_unit_safe(punit, &myiter);
 	break;
       }
@@ -922,11 +924,10 @@
   upgrade_building_prod(pcity);
   if (!can_build_improvement(pcity, pcity->currently_building)) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-		     _("Game: %s is building %s, which "
+		      N_("Game: %S is building %I, which "
 		       "is no longer available."),
-		     pcity->name, get_impr_name_ex(pcity,
-						   pcity->
-						   currently_building));
+		      pcity->name, 
+		      get_fims_impr(pcity, pcity->currently_building));
     return TRUE;
   }
   if (pcity->shield_stock >= improvement_value(pcity->currently_building)) {
@@ -958,10 +959,10 @@
     if (is_wonder(pcity->currently_building)) {
       game.global_wonders[pcity->currently_building] = pcity->id;
       notify_player_ex(NULL, pcity->x, pcity->y, E_WONDER_BUILD,
-		       _("Game: The %s have finished building %s in %s."),
-		       get_nation_name_plural(pplayer->nation),
-		       get_impr_name_ex(pcity, pcity->currently_building),
-		       pcity->name);
+		        N_("Game: The %N have finished building %I in %S."),
+		        pplayer->nation,
+		        get_fims_impr(pcity, pcity->currently_building),
+		        pcity->name);
       gamelog(GAMELOG_WONDER, _("%s build %s in %s"),
 	      get_nation_name_plural(pplayer->nation),
 	      get_impr_name_ex(pcity, pcity->currently_building),
@@ -974,16 +975,15 @@
 	      pcity->name);
 
     notify_player_ex(pplayer, pcity->x, pcity->y, E_IMP_BUILD,
-		     _("Game: %s has finished building %s."), pcity->name,
-		     improvement_types[pcity->currently_building].name);
+		      N_("Game: %S has finished building %s."), pcity->name,
+		      get_improvement_name_orig(pcity->currently_building));
 
     if (pcity->currently_building == B_DARWIN) {
       Tech_Type_id first, second;
-      char buffer[200];
 
-      notify_player(pplayer, _("Game: %s boosts research, "
-			       "you gain 2 immediate advances."),
-		    improvement_types[B_DARWIN].name);
+      notify_player(pplayer, N_("Game: %s boosts research, "
+			         "you gain 2 immediate advances."),
+		     get_improvement_name_orig(B_DARWIN));
 
       do_free_cost(pplayer);
       first = pplayer->research.researching;
@@ -993,20 +993,34 @@
       second = pplayer->research.researching;
       found_new_tech(pplayer, pplayer->research.researching, TRUE, TRUE);
 
-      (void) mystrlcpy(buffer, get_tech_name(pplayer, first),
-		       sizeof(buffer));
-
-      notify_embassies(pplayer, NULL,
-		       _("Game: The %s have acquired %s and %s from %s."),
-		       get_nation_name_plural(pplayer->nation), buffer,
-		       get_tech_name(pplayer, second),
-		       improvement_types[B_DARWIN].name);
+      if (is_future_tech(first)) {
+        notify_embassies(pplayer, NULL,
+	                 N_("Game: The %N have acquired Future Techs: %d and "
+	                    "%d from %s."),
+	                 pplayer->future_tech,
+			 pplayer->future_tech + 1,
+			 get_improvement_name_orig(B_DARWIN));
+      } else if (is_future_tech(second)) {
+        notify_embassies(pplayer, NULL,
+	                 N_("Game: %N have acquired %s and Future Tech. %d "
+			    "from %s."),
+			 advances[first].name_orig,
+			 pplayer->future_tech + 1,
+			 get_improvement_name_orig(B_DARWIN));
+      } else {
+        notify_embassies(pplayer, NULL,
+		         N_("Game: The %N have acquired %s and %s from %s."),
+		         pplayer->nation, 
+			 advances[first].name_orig,
+		         advances[second].name_orig,
+		         get_improvement_name_orig(B_DARWIN));
+      }
     }
     if (space_part && pplayer->spaceship.state == SSHIP_NONE) {
       notify_player_ex(NULL, pcity->x, pcity->y, E_SPACESHIP,
-		       _("Game: The %s have started "
-			 "building a spaceship!"),
-		       get_nation_name_plural(pplayer->nation));
+		        N_("Game: The %N have started "
+			   "building a spaceship!"),
+		        pplayer->nation);
       pplayer->spaceship.state = SSHIP_STARTED;
     }
     if (space_part) {
@@ -1047,8 +1061,9 @@
 
     if (pcity->size <= pop_cost) {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_CANTBUILD,
-		       _("Game: %s can't build %s yet."),
-		       pcity->name, unit_name(pcity->currently_building));
+		        N_("Game: %S can't build %s yet."),
+		        pcity->name, 
+			unit_name_orig(pcity->currently_building));
       return TRUE;
     }
 
@@ -1074,9 +1089,9 @@
     pcity->shield_stock -= unit_value(pcity->currently_building);
 
     notify_player_ex(pplayer, pcity->x, pcity->y, E_UNIT_BUILD,
-		     _("Game: %s is finished building %s."),
+		     N_("Game: %S is finished building %s."),
 		     pcity->name,
-		     unit_types[pcity->currently_building].name);
+		     unit_name_orig(pcity->currently_building));
 
     gamelog(GAMELOG_UNIT, _("%s build %s in %s (%i,%i)"),
 	    get_nation_name_plural(pplayer->nation),
@@ -1117,9 +1132,9 @@
 	&& pplayer->government != game.government_when_anarchy) {
       if (pplayer->economic.gold - improvement_upkeep(pcity, i) < 0) {
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_IMP_AUCTIONED,
-			 _("Game: Can't afford to maintain %s in %s, "
-			   "building sold!"),
-			 improvement_types[i].name, pcity->name);
+			  N_("Game: Can't afford to maintain %s in %S, "
+			     "building sold!"),
+			  get_improvement_name_orig(i), pcity->name);
 	do_sell_building(pplayer, pcity, i);
 	city_refresh(pcity);
       } else
@@ -1153,8 +1168,8 @@
 	map_set_special(mx, my, S_POLLUTION);
 	send_tile_info(NULL, mx, my);
 	notify_player_ex(city_owner(pcity), pcity->x, pcity->y,
-			 E_POLLUTION, _("Game: Pollution near %s."),
-			 pcity->name);
+			  E_POLLUTION, N_("Game: Pollution near %S."),
+			  pcity->name);
 	return;
       }
       k--;
@@ -1285,7 +1300,7 @@
       pcity->rapture++;
       if (pcity->rapture == 1)
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_LOVE,
-			 _("Game: We Love The %s Day celebrated in %s."), 
+			 N_("Game: We Love The %s Day celebrated in %s."), 
 			 get_ruler_title(pplayer->government, pplayer->is_male,
 					 pplayer->nation),
 			 pcity->name);
@@ -1293,7 +1308,7 @@
     else {
       if (pcity->rapture != 0)
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_NORMAL,
-			 _("Game: We Love The %s Day canceled in %s."),
+			 N_("Game: We Love The %s Day canceled in %s."),
 			 get_ruler_title(pplayer->government, pplayer->is_male,
 					 pplayer->nation),
 			 pcity->name);
@@ -1325,16 +1340,16 @@
       pcity->anarchy++;
       if (pcity->anarchy == 1) 
         notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_DISORDER,
-	  	         _("Game: Civil disorder in %s."), pcity->name);
+	  	          N_("Game: Civil disorder in %S."), pcity->name);
       else
         notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_DISORDER,
-		         _("Game: CIVIL DISORDER CONTINUES in %s."),
+		          N_("Game: CIVIL DISORDER CONTINUES in %S."),
 			 pcity->name);
     }
     else {
       if (pcity->anarchy != 0)
         notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_NORMAL,
-	  	         _("Game: Order restored in %s."), pcity->name);
+	  	          N_("Game: Order restored in %S."), pcity->name);
       pcity->anarchy=0;
     }
     check_pollution(pcity);
@@ -1342,9 +1357,9 @@
     send_city_info(NULL, pcity);
     if (pcity->anarchy>2 && government_has_flag(g, G_REVOLUTION_WHEN_UNHAPPY)) {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_ANARCHY,
-		       _("Game: The people have overthrown your %s, "
-			 "your country is in turmoil."),
-		       get_government_name(g->index));
+		        N_("Game: The people have overthrown your %s, "
+			   "your country is in turmoil."),
+		        g->name_orig);
       handle_player_revolution(pplayer);
     }
     sanity_check_city(pcity);
@@ -1366,9 +1381,10 @@
   if (!rcity) {
     /* What should we do when we try to disband our only city? */
     notify_player_ex(pplayer, x, y, E_CITY_CANTBUILD,
-		     _("Game: %s can't build %s yet, "
-		     "and we can't disband our only city."),
-		     pcity->name, unit_name(pcity->currently_building));
+		      N_("Game: %S can't build %s yet, "
+		         "and we can't disband our only city."),
+		         pcity->name, 
+			 unit_name_orig(pcity->currently_building));
     return FALSE;
   }
 
@@ -1383,8 +1399,9 @@
   transfer_city_units(pplayer, pplayer, &pcity->units_supported, rcity, pcity, -1, TRUE);
 
   notify_player_ex(pplayer, x, y, E_UNIT_BUILD,
-		   _("Game: %s is disbanded into %s."), 
-		   pcity->name, unit_types[pcity->currently_building].name);
+		   N_("Game: %S is disbanded into %s."), 
+		   pcity->name,
+		   unit_name_orig(pcity->currently_building));
   gamelog(GAMELOG_UNIT, _("%s (%i, %i) disbanded into %s by the %s"),
 	  pcity->name, x, y, unit_types[pcity->currently_building].name,
 	  get_nation_name_plural(pplayer->nation));
diff -ur --new-file -Xdiff_ignore freeorig/server/diplhand.c freeciv/server/diplhand.c
--- freeorig/server/diplhand.c	2002-11-15 22:24:30.000000000 +0100
+++ freeciv/server/diplhand.c	2003-02-13 15:30:40.000000000 +0100
@@ -154,8 +154,9 @@
 		    advances[pclause->value].name,
 		    get_nation_name_plural(other->nation));
 	    notify_player(pplayer,
-			  _("Game: You don't have tech %s, you can't accept treaty."),
-			  advances[pclause->value].name);
+			  N_("Game: You don't have tech %s, "
+			     "you can't accept treaty."),
+			  advances[pclause->value].name_orig);
 	    return;
 	  }
 	  break;
@@ -163,28 +164,29 @@
 	  pcity = find_city_by_id(pclause->value);
 	  if (!pcity) { /* Can't find out cityname any more. */
 	    notify_player(pplayer,
-			  _("City you are trying to give no longer exists, "
-			    "you can't accept treaty."));
+			   N_("City you are trying to give no longer exists, "
+			      "you can't accept treaty."));
 	    return;
 	  }
 	  if (pcity->owner != pplayer->player_no) {
 	    notify_player(pplayer,
-			  _("You are not owner of %s, you can't accept treaty."),
-			  pcity->name);
+			   N_("You are not owner of %S, "
+			      "you can't accept treaty."),
+			   pcity->name);
 	    return;
 	  }
 	  if (city_got_building(pcity,B_PALACE)) {
 	    notify_player(pplayer,
-			  _("Game: Your capital (%s) is requested, "
+			   N_("Game: Your capital (%S) is requested, "
 			    "you can't accept treaty."),
-			  pcity->name);
+			   pcity->name);
 	    return;
 	  }
 	  break;
 	case CLAUSE_GOLD:
 	  if (pplayer->economic.gold < pclause->value) {
 	    notify_player(pplayer,
-			  _("Game: You don't have enough gold, "
+			  N_("Game: You don't have enough gold, "
 			    "you can't accept treaty."));
 	    return;
 	  }
@@ -216,15 +218,15 @@
 				packet);
 
     notify_player(plr0,
-		  PL_("Game: A treaty containing %d clause was agreed upon.",
-		      "Game: A treaty containing %d clauses was agreed upon.",
-		      nclauses),
+		  NPL_("Game: A treaty containing %d clause was agreed upon.",
+		       "Game: A treaty containing %d clauses was agreed upon.",
+		        nclauses),
 		  nclauses);
     notify_player(plr1,
-		  PL_("Game: A treaty containing %d clause was agreed upon.",
-		      "Game: A treaty containing %d clauses was agreed upon.",
-		      nclauses),
-		  nclauses);
+		   NPL_("Game: A treaty containing %d clause was agreed upon.",
+		        "Game: A treaty containing %d clauses was agreed upon.",
+		        nclauses),
+		   nclauses);
     gamelog(GAMELOG_TREATY, _("%s and %s agree to a treaty"),
 	    get_nation_name_plural(plr0->nation),
 	    get_nation_name_plural(plr1->nation));
@@ -240,39 +242,39 @@
 	  pcity = find_city_by_id(pclause->value);
 	  if (!pcity) { /* Can't find out cityname any more. */
 	    notify_player(plr0,
-			  _("Game: One of the cities %s is giving away is destroyed! "
-			    "Treaty canceled!"),
-			  get_nation_name_plural(other->nation));
+			   N_("Game: One of the cities %N is giving away "
+			      "is destroyed! Treaty canceled!"),
+			   other->nation);
 	    notify_player(plr1,
-			  _("Game: One of the cities %s is giving away is destroyed! "
-			    "Treaty canceled!"),
-			  get_nation_name_plural(other->nation));
+			   N_("Game: One of the cities %N is giving away "
+			      "is destroyed! Treaty canceled!"),
+			   other->nation);
 	    goto cleanup;
 	  }
 	  if (pcity->owner != other->player_no) {
 	    notify_player(plr0,
-			  _("Game: The %s no longer control %s! "
+			   N_("Game: The %N no longer control %S! "
 			    "Treaty canceled!"),
-			  get_nation_name_plural(other->nation),
-			  pcity->name);
+			   other->nation,
+			   pcity->name);
 	    notify_player(plr1,
-			  _("Game: The %s no longer control %s! "
-			    "Treaty canceled!"),
-			  get_nation_name_plural(other->nation),
-			  pcity->name);
+			   N_("Game: The %N no longer control %S! "
+			      "Treaty canceled!"),
+			   other->nation,
+			   pcity->name);
 	    goto cleanup;
 	  }
 	  break;
 	case CLAUSE_GOLD:
 	  if (other->economic.gold < pclause->value) {
 	    notify_player(plr0,
-			  _("Game: The %s don't have the promised amount "
-			    "of gold! Treaty canceled!"),
-			  get_nation_name_plural(other->nation));
+			   N_("Game: The %N don't have the promised amount "
+			      "of gold! Treaty canceled!"),
+			   other->nation);
 	    notify_player(plr1,
-			  _("Game: The %s don't have the promised amount "
-			    "of gold! Treaty canceled!"),
-			  get_nation_name_plural(other->nation));
+			   N_("Game: The %N don't have the promised amount "
+			      "of gold! Treaty canceled!"),
+			   other->nation);
 	    goto cleanup;
 	  }
 	  break;
@@ -288,39 +290,53 @@
 
       switch (pclause->type) {
       case CLAUSE_ADVANCE:
-	notify_player_ex(pdest, -1, -1, E_TECH_GAIN,
-			 _("Game: You are taught the knowledge of %s."),
-			 get_tech_name(pdest, pclause->value));
-
-	notify_embassies(pdest, pgiver,
-			 _("Game: The %s have acquired %s from the %s."),
-			 get_nation_name_plural(pdest->nation),
-			 get_tech_name(pdest, pclause->value),
-			 get_nation_name_plural(pgiver->nation));
-
-	gamelog(GAMELOG_TECH, _("%s acquire %s (Treaty) from %s"),
-		get_nation_name_plural(pdest->nation),
+        if (is_future_tech(pclause->value)) {
+	  notify_player_ex(pdest, -1, -1, E_TECH_GAIN,
+			   N_("Game: You are taught the knowledge of Future "
+			      "Tech. %d."),
+			   pdest->future_tech);
+
+	  notify_embassies(pdest, pgiver,
+			   N_("Game: The %N have acquired Future Tech. %d "
+			      "from the %N."),
+			   pdest->nation,
+			   pdest->future_tech,
+			   pgiver->nation);
+	} else {
+	  notify_player_ex(pdest, -1, -1, E_TECH_GAIN,
+			   N_("Game: You are taught the knowledge of %s."),
+			   advances[pclause->value].name_orig);
+
+	  notify_embassies(pdest, pgiver,
+			   N_("Game: The %N have acquired %s from the %N."),
+			   pdest->nation,
+			   advances[pclause->value].name_orig,
+			   pgiver->nation);
+	}
+	
+        gamelog(GAMELOG_TECH, _("%s acquire %s (Treaty) from %s"),
+                get_nation_name_plural(pdest->nation),
 		get_tech_name(pdest, pclause->value),
 		get_nation_name_plural(pgiver->nation));
-
+		
 	do_dipl_cost(pdest);
 
 	found_new_tech(pdest, pclause->value, FALSE, TRUE);
 	break;
       case CLAUSE_GOLD:
-	notify_player(pdest, _("Game: You get %d gold."), pclause->value);
+	notify_player(pdest, N_("Game: You get %d gold."), pclause->value);
 	pgiver->economic.gold -= pclause->value;
 	pdest->economic.gold += pclause->value;
 	break;
       case CLAUSE_MAP:
 	give_map_from_player_to_player(pgiver, pdest);
-	notify_player(pdest, _("Game: You receive %s's worldmap."),
-		      pgiver->name);
+	notify_player(pdest, _("Game: You receive %S's worldmap."),
+		       pgiver->name);
 	break;
       case CLAUSE_SEAMAP:
 	give_seamap_from_player_to_player(pgiver, pdest);
-	notify_player(pdest, _("Game: You receive %s's seamap."),
-		      pgiver->name);
+	notify_player(pdest, _("Game: You receive %S's seamap."),
+		       pgiver->name);
 	break;
       case CLAUSE_CITY:
 	{
@@ -334,12 +350,12 @@
 	  }
 
 	  notify_player_ex(pdest, pcity->x, pcity->y, E_CITY_TRANSFER,
-			   _("Game: You receive city of %s from %s."),
-			   pcity->name, pgiver->name);
+			    N_("Game: You receive city of %S from %S."),
+			    pcity->name, pgiver->name);
 
 	  notify_player_ex(pgiver, pcity->x, pcity->y, E_CITY_LOST,
-			   _("Game: You give city of %s to %s."),
-			   pcity->name, pdest->name);
+			    N_("Game: You give city of %S to %S."),
+			    pcity->name, pdest->name);
 
 	  transfer_city(pdest, pcity, -1, TRUE, TRUE, FALSE);
 	  break;
@@ -350,11 +366,11 @@
 	pdest->diplstates[pgiver->player_no].type=DS_CEASEFIRE;
 	pdest->diplstates[pgiver->player_no].turns_left=16;
 	notify_player_ex(pgiver, -1, -1, E_TREATY_CEASEFIRE,
-			 _("Game: You agree on a cease-fire with %s."),
-			 pdest->name);
+			  N_("Game: You agree on a cease-fire with %S."),
+			  pdest->name);
 	notify_player_ex(pdest, -1, -1, E_TREATY_CEASEFIRE,
-			 _("Game: You agree on a cease-fire with %s."),
-			 pgiver->name);
+			  N_("Game: You agree on a cease-fire with %S."),
+			  pgiver->name);
 	check_city_workers(plr0);
 	check_city_workers(plr1);
 	break;
@@ -362,10 +378,10 @@
 	pgiver->diplstates[pdest->player_no].type=DS_PEACE;
 	pdest->diplstates[pgiver->player_no].type=DS_PEACE;
 	notify_player_ex(pgiver, -1, -1, E_TREATY_PEACE,
-			 _("Game: You agree on a peace treaty with %s."),
+			  N_("Game: You agree on a peace treaty with %S."),
 			 pdest->name);
 	notify_player_ex(pdest, -1, -1, E_TREATY_PEACE,
-			 _("Game: You agree on a peace treaty with %s."),
+			 N_("Game: You agree on a peace treaty with %S."),
 			 pgiver->name);
 	check_city_workers(plr0);
 	check_city_workers(plr1);
@@ -374,22 +390,22 @@
 	pgiver->diplstates[pdest->player_no].type=DS_ALLIANCE;
 	pdest->diplstates[pgiver->player_no].type=DS_ALLIANCE;
 	notify_player_ex(pgiver, -1, -1, E_TREATY_ALLIANCE,
-			 _("Game: You agree on an alliance with %s."),
-			 pdest->name);
+			  N_("Game: You agree on an alliance with %S."),
+			  pdest->name);
 	notify_player_ex(pdest, -1, -1, E_TREATY_ALLIANCE,
-			 _("Game: You agree on an alliance with %s."),
-			 pgiver->name);
+			  N_("Game: You agree on an alliance with %S."),
+			  pgiver->name);
 	check_city_workers(plr0);
 	check_city_workers(plr1);
 	break;          
       case CLAUSE_VISION:
 	give_shared_vision(pgiver, pdest);
 	notify_player_ex(pgiver, -1, -1, E_TREATY_SHARED_VISION,
-			 _("Game: You give shared vision to %s."),
-			 pdest->name);
+			  N_("Game: You give shared vision to %S."),
+			  pdest->name);
 	notify_player_ex(pdest, -1, -1, E_TREATY_SHARED_VISION,
-			 _("Game: %s gives you shared vision."),
-			 pgiver->name);
+			  N_("Game: %S gives you shared vision."),
+			  pgiver->name);
 	break;
       }
 
@@ -489,14 +505,14 @@
     lsend_packet_diplomacy_info(&pplayer2->connections, 
 			       PACKET_DIPLOMACY_CANCEL_MEETING, 
 			       &packet);
-    notify_player(pplayer2, _("Game: %s canceled the meeting!"), 
-		  pplayer->name);
+    notify_player(pplayer2, N_("Game: %S canceled the meeting!"), 
+		   pplayer->name);
     /* Need to send to pplayer too, for multi-connects: */
     lsend_packet_diplomacy_info(&pplayer->connections, 
 			       PACKET_DIPLOMACY_CANCEL_MEETING, 
 			       &packet);
-    notify_player(pplayer, _("Game: Meeting with %s canceled."), 
-		  pplayer2->name);
+    notify_player(pplayer, N_("Game: Meeting with %S canceled."), 
+		   pplayer2->name);
     treaty_list_unlink(&treaties, ptreaty);
     free(ptreaty);
   }
@@ -538,8 +554,8 @@
 
   if (!find_treaty(plr0, plr1)) {
     if (plr0->ai.control || plr1->ai.control) {
-      notify_player(plr0, _("AI controlled players cannot participate in "
-			    "diplomatic meetings."));
+        notify_player(plr0, N_("AI controlled players cannot participate in "
+			        "diplomatic meetings."));
       return;
     }
 
diff -ur --new-file -Xdiff_ignore freeorig/server/diplomats.c freeciv/server/diplomats.c
--- freeorig/server/diplomats.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/diplomats.c	2003-02-13 16:46:36.000000000 +0100
@@ -86,9 +86,9 @@
   /* If city is too small, can't poison. */
   if (pcity->size < 2) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s could not poison the water"
-		       " supply in %s."),
-		     unit_name(pdiplomat->type), pcity->name);
+		      N_("Game: Your %s could not poison the water"
+		         " supply in %S."),
+		      unit_name_orig(pdiplomat->type), pcity->name);
     freelog (LOG_DEBUG, "poison: target city too small");
     return;
   }
@@ -100,11 +100,11 @@
 
   /* Notify everybody involved. */
   notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_POISON,
-		   _("Game: Your %s poisoned the water supply of %s."),
-		   unit_name(pdiplomat->type), pcity->name);
+		   N_("Game: Your %s poisoned the water supply of %S."),
+		   unit_name_orig(pdiplomat->type), pcity->name);
   notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_POISON,
-		   _("Game: %s is suspected of poisoning the water supply"
-		     " of %s."), pplayer->name, pcity->name);
+		   N_("Game: %S is suspected of poisoning the water supply"
+		   " of %S."), pplayer->name, pcity->name);
 
   /* Update clients. */
   city_refresh (pcity);  
@@ -250,16 +250,16 @@
   /* Check for "foul" ambassador. */
   if (pdiplomat->foul) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s was executed in %s on suspicion"
-		       " of spying.  The %s welcome future diplomatic"
-		       " efforts providing the Ambassador is reputable."),
-		     unit_name(pdiplomat->type),
-		     pcity->name, get_nation_name_plural(cplayer->nation));
+		     N_("Game: Your %s was executed in %S on suspicion"
+		        " of spying.  The %N welcome future diplomatic"
+		        " efforts providing the Ambassador is reputable."),
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name, cplayer->nation);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_FAILED,
-		     _("You executed a %s the %s had sent to establish"
-		       " an embassy in %s for being untrustworthy"),
-		     unit_name(pdiplomat->type),
-		     get_nation_name_plural(pplayer->nation), pcity->name);
+		     N_("You executed a %s the %N had sent to establish"
+		        " an embassy in %S for being untrustworthy"),
+		     unit_name_orig(pdiplomat->type),
+		     pplayer->nation, pcity->name);
     wipe_unit (pdiplomat);
     return;
   }
@@ -267,9 +267,9 @@
   /* Check for Barbarian response. */
   if (is_barbarian (cplayer)) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s was executed in %s by primitive %s."),
-		     unit_name(pdiplomat->type),
-		     pcity->name, get_nation_name_plural(cplayer->nation));
+		     N_("Game: Your %s was executed in %S by primitive %N."),
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name, cplayer->nation);
     wipe_unit (pdiplomat);
     return;
   }
@@ -284,11 +284,11 @@
 
   /* Notify everybody involved. */
   notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_EMBASSY,
-		   _("Game: You have established an embassy in %s."),
-		   pcity->name);
+		    N_("Game: You have established an embassy in %S."),
+		    pcity->name);
   notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_EMBASSY,
-		   _("Game: The %s have established an embassy in %s."),
-		   get_nation_name_plural(pplayer->nation), pcity->name);
+		    N_("Game: The %N have established an embassy in %S."),
+		    pplayer->nation, pcity->name);
   gamelog(GAMELOG_EMBASSY, _("%s establish an embassy in %s (%s) (%i,%i)"),
 	  get_nation_name_plural(pplayer->nation), pcity->name,
 	  get_nation_name(cplayer->nation), pcity->x, pcity->y);
@@ -345,9 +345,10 @@
   /* If unit has too few hp, can't sabotage. */
   if (pvictim->hp < 2) {
     notify_player_ex(pplayer, pvictim->x, pvictim->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s could not sabotage %s's %s."),
-		     unit_name(pdiplomat->type),
-		     unit_owner(pvictim)->name, unit_name(pvictim->type));
+		      N_("Game: Your %s could not sabotage %S's %s."),
+		      unit_name_orig(pdiplomat->type),
+		      unit_owner(pvictim)->name,
+		      unit_name_orig(pvictim->type));
     freelog (LOG_DEBUG, "sabotage-unit: unit has too few hit points");
     return;
   }
@@ -360,13 +361,15 @@
 
   /* Notify everybody involved. */
   notify_player_ex(pplayer, pvictim->x, pvictim->y, E_MY_DIPLOMAT_SABOTAGE,
-		   _("Game: Your %s succeeded in sabotaging %s's %s."),
-		   unit_name(pdiplomat->type),
-		   unit_owner(pvictim)->name, unit_name(pvictim->type));
+		   N_("Game: Your %s succeeded in sabotaging %S's %s."),
+		   unit_name_orig(pdiplomat->type),
+		   unit_owner(pvictim)->name, 
+		   unit_name_orig(pvictim->type));
   notify_player_ex(uplayer, pvictim->x, pvictim->y,
 		   E_ENEMY_DIPLOMAT_SABOTAGE,
-		   _("Game: Your %s was sabotaged by %s!"),
-		   unit_name(pvictim->type), pplayer->name);
+		   N_("Game: Your %s was sabotaged by %S!"),
+		   unit_name_orig(pvictim->type), 
+		   pplayer->name);
 
   /* this may cause a diplomatic incident */
   maybe_cause_incident(SPY_SABOTAGE_UNIT, pplayer, pvictim, NULL);
@@ -417,8 +420,8 @@
   if (government_has_flag(get_gov_pplayer(unit_owner(pvictim)),
 			  G_UNBRIBABLE)) {
     notify_player_ex(pplayer, pdiplomat->x, pdiplomat->y,
-		     E_MY_DIPLOMAT_FAILED,
-		     _("Game: You can't bribe a unit from this nation."));
+		      E_MY_DIPLOMAT_FAILED,
+		      N_("Game: You can't bribe a unit from this nation."));
     freelog (LOG_DEBUG, "bribe-unit: unit's government is unbribable");
     return;
   }
@@ -427,9 +430,10 @@
   if (pplayer->economic.gold < pvictim->bribe_cost) {
     notify_player_ex(pplayer, pdiplomat->x, pdiplomat->y,
 		     E_MY_DIPLOMAT_FAILED,
-		     _("Game: You don't have enough gold to"
-		       " bribe %s's %s."),
-		     unit_owner(pvictim)->name, unit_name(pvictim->type));
+		     N_("Game: You don't have enough gold to"
+		        " bribe %S's %s."),
+		     unit_owner(pvictim)->name,
+		     unit_name_orig(pvictim->type));
     freelog (LOG_DEBUG, "bribe-unit: not enough gold");
     return;
   }
@@ -444,12 +448,14 @@
 
   /* Notify everybody involved. */
   notify_player_ex(pplayer, pvictim->x, pvictim->y, E_MY_DIPLOMAT_BRIBE,
-		   _("Game: Your %s succeeded in bribing %s's %s."),
-		   unit_name(pdiplomat->type),
-		   unit_owner(pvictim)->name, unit_name(pvictim->type));
+		   N_("Game: Your %s succeeded in bribing %S's %s."),
+		   unit_name_orig(pdiplomat->type),
+		   unit_owner(pvictim)->name, 
+		   unit_name_orig(pvictim->type));
   notify_player_ex(uplayer, pvictim->x, pvictim->y, E_ENEMY_DIPLOMAT_BRIBE,
-		   _("Game: Your %s was bribed by %s."),
-		   unit_name(pvictim->type), pplayer->name);
+		   N_("Game: Your %s was bribed by %S."),
+		   unit_name_orig(pvictim->type),
+		   pplayer->name);
 
   /* This costs! */
   pplayer->economic.gold -= pvictim->bribe_cost;
@@ -544,12 +550,15 @@
   }
   if (count > 0) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s was caught in the attempt of"
-		       " stealing technology from %s."),
-		     unit_name(pdiplomat->type), pcity->name);
+		     N_("Game: Your %s was caught in the attempt of"
+		        " stealing technology from %S."),
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_FAILED,
-		     _("Game: %s's %s failed to steal technology from %s."),
-		     pplayer->name, unit_name(pdiplomat->type), pcity->name);
+		     N_("Game: %S's %s failed to steal technology from %S."),
+		     pplayer->name,
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name);
     wipe_unit (pdiplomat);
     return;
   }
@@ -578,8 +587,8 @@
       freelog (LOG_DEBUG, "steal-tech: targeted future-tech: %d", target);
     } else {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		       _("Game: No new technology found in %s."),
-		       pcity->name);
+		        N_("Game: No new technology found in %S."),
+		        pcity->name);
       diplomat_charge_movement (pdiplomat, pcity->x, pcity->y);
       send_unit_info (pplayer, pdiplomat);
       freelog (LOG_DEBUG, "steal-tech: nothing to steal");
@@ -614,10 +623,11 @@
 	       target, advances[target].name);
     } else {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		       _("Game: Your %s could not find the %s technology"
-			 " to steal in %s."),
-		       unit_name(pdiplomat->type),
-		       advances[technology].name, pcity->name);
+		       N_("Game: Your %s could not find the %s technology"
+		          " to steal in %S."),
+		       unit_name_orig(pdiplomat->type),
+	               advances[technology].name,
+		       pcity->name);
       diplomat_charge_movement (pdiplomat, pcity->x, pcity->y);
       send_unit_info (pplayer, pdiplomat);
       freelog (LOG_DEBUG, "steal-tech: target technology not found: %d (%s)",
@@ -635,13 +645,16 @@
 
     /* Report it. */
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_THEFT,
-		     _("Game: Your %s stole Future Tech. %d from %s."),
-		     unit_name(pdiplomat->type),
-		     pplayer->future_tech, cplayer->name);
+		     N_("Game: Your %s stole Future Tech. %d from %S."),
+		     unit_name_orig(pdiplomat->type),
+		     pplayer->future_tech,
+		     cplayer->name);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_THEFT,
-		     _("Game: Future Tech. %d stolen by %s %s from %s."),
-		     pplayer->future_tech, get_nation_name(pplayer->nation),
-		     unit_name(pdiplomat->type), pcity->name);
+		     N_("Game: Future Tech. %d stolen by %M %s from %S."),
+		     pplayer->future_tech,
+		     pplayer->nation,
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name);
     gamelog(GAMELOG_TECH, _("%s steals Future Tech. %d from the %s"),
 	    get_nation_name_plural(pplayer->nation), pplayer->future_tech,
 	    get_nation_name_plural(cplayer->nation));
@@ -655,18 +668,21 @@
     found_new_tech (pplayer, target, FALSE, TRUE);
     /* Report it. */
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_THEFT,
-		     _("Game: Your %s stole %s from %s."),
-		     unit_name(pdiplomat->type),
-		     advances[target].name, cplayer->name);
+		     N_("Game: Your %s stole %s from %S."),
+		     unit_name_orig(pdiplomat->type),
+		     advances[target].name_orig,
+		     cplayer->name);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_THEFT,
-		     _("Game: %s's %s stole %s from %s."),
-		     pplayer->name, unit_name(pdiplomat->type),
-		     advances[target].name, pcity->name);
+		     N_("Game: %S's %s stole %s from %S."),
+		     pplayer->name,
+		     unit_name_orig(pdiplomat->type),
+		     advances[target].name_orig,
+		     pcity->name);
     notify_embassies(pplayer, cplayer,
-		     _("Game: The %s have stolen %s from the %s."),
-		     get_nation_name_plural(pplayer->nation),
-		     advances[target].name,
-		     get_nation_name_plural(cplayer->nation));
+		      N_("Game: The %N have stolen %s from the %N."),
+		      pplayer->nation,
+		      advances[target].name_orig,
+		      cplayer->nation);
     gamelog(GAMELOG_TECH, _("%s steals %s from the %s"),
 	    get_nation_name_plural(pplayer->nation), advances[target].name,
 	    get_nation_name_plural(cplayer->nation));
@@ -724,7 +740,7 @@
   /* Check for city from a bribable government. */
   if (government_has_flag (get_gov_pcity (pcity), G_UNBRIBABLE)) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: You can't subvert a city from this nation."));
+		      N_("Game: You can't subvert a city from this nation."));
     freelog (LOG_DEBUG, "incite: city's government is unbribable");
     return;
   }
@@ -733,7 +749,7 @@
   capital = find_palace (city_owner (pcity));
   if (pcity == capital) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: You can't subvert the capital of a nation."));
+		      N_("Game: You can't subvert the capital of a nation."));
     freelog (LOG_DEBUG, "incite: city is the capital");
     return;
   }
@@ -744,8 +760,8 @@
   /* If player doesn't have enough gold, can't incite a revolt. */
   if (pplayer->economic.gold < revolt_cost) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: You don't have enough gold to"
-		       " subvert %s."), pcity->name);
+		      N_("Game: You don't have enough gold to"
+		       " subvert %S."), pcity->name);
     freelog (LOG_DEBUG, "incite: not enough gold");
     return;
   }
@@ -759,14 +775,15 @@
   /* Check if the Diplomat/Spy succeeds with his/her task. */
   if (myrand (100) >= game.diplchance) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s was caught in the attempt"
-		       " of inciting a revolt!"),
-		     unit_name(pdiplomat->type));
+		     N_("Game: Your %s was caught in the attempt"
+		        " of inciting a revolt!"),
+		     unit_name_orig(pdiplomat->type));
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_FAILED,
-		     _("Game: You caught %s %s attempting"
-		       " to incite a revolt in %s!"),
-		     get_nation_name(pplayer->nation),
-		     unit_name(pdiplomat->type), pcity->name);
+		     N_("Game: You caught %M %s attempting"
+		        " to incite a revolt in %S!"),
+		     pplayer->nation,
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name);
     wipe_unit (pdiplomat);
     return;
   }
@@ -785,11 +802,11 @@
 
   /* Notify everybody involved. */
   notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_INCITE,
-		   _("Game: Revolt incited in %s, you now rule the city!"),
-		   pcity->name);
+		    N_("Game: Revolt incited in %S, you now rule the city!"),
+		    pcity->name);
   notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_INCITE,
-		   _("Game: %s has revolted, %s influence suspected."),
-		   pcity->name, get_nation_name(pplayer->nation));
+		    N_("Game: %S has revolted, %M influence suspected."),
+		    pcity->name, pplayer->nation);
 
   pcity->shield_stock = 0;
   nullify_prechange_production(pcity);
@@ -839,7 +856,6 @@
 {
   struct player *cplayer;
   int count, which, target;
-  const char *prod;
   struct city *capital;
 
   /* Fetch target city's player.  Sanity checks. */
@@ -866,14 +882,15 @@
   if ((myrand (100) >= game.diplchance) ||
       ((improvement != B_LAST) && (myrand (100) >= game.diplchance))) {
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		     _("Game: Your %s was caught in the attempt"
-		       " of industrial sabotage!"),
-		     unit_name(pdiplomat->type));
+		     N_("Game: Your %s was caught in the attempt"
+		        " of industrial sabotage!"),
+		     unit_name_orig(pdiplomat->type));
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_SABOTAGE,
-		     _("Game: You caught %s %s attempting"
-		       " sabotage in %s!"),
-		     get_nation_name(pplayer->nation),
-		     unit_name(pdiplomat->type), pcity->name);
+		     N_("Game: You caught %M %s attempting"
+		        " sabotage in %S!"),
+		     pplayer->nation,
+		     unit_name_orig(pdiplomat->type),
+		     pcity->name);
     wipe_unit (pdiplomat);
     return;
   }
@@ -904,8 +921,9 @@
      */
     if (count == 0 && pcity->shield_stock == 0) {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		       _("Game: Your %s could not find anything to"
-			 " sabotage in %s."), unit_name(pdiplomat->type),
+		       N_("Game: Your %s could not find anything to"
+		          " sabotage in %S."),
+		       unit_name_orig(pdiplomat->type),
 		       pcity->name);
       diplomat_charge_movement (pdiplomat, pcity->x, pcity->y);
       send_unit_info (pplayer, pdiplomat);
@@ -946,8 +964,8 @@
 	       target, get_improvement_name (target));
       } else {
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: You cannot sabotage a wonder or a %s!"),
-			 improvement_types[B_PALACE].name);
+			  N_("Game: You cannot sabotage a wonder or a %s!"),
+			  get_improvement_name_orig(B_PALACE));
 	diplomat_charge_movement (pdiplomat, pcity->x, pcity->y);
 	send_unit_info (pplayer, pdiplomat);
 	freelog (LOG_DEBUG, "sabotage: disallowed target improvement: %d (%s)",
@@ -956,9 +974,11 @@
       }
     } else {
       notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-		       _("Game: Your %s could not find the %s to"
-			 " sabotage in %s."), unit_name(pdiplomat->type),
-		       get_improvement_name(improvement), pcity->name);
+		       N_("Game: Your %s could not find the %s to"
+			  " sabotage in %S."),
+		       unit_name_orig(pdiplomat->type),
+		       get_improvement_name_orig(improvement),
+		       pcity->name);
       diplomat_charge_movement (pdiplomat, pcity->x, pcity->y);
       send_unit_info (pplayer, pdiplomat);
       freelog (LOG_DEBUG, "sabotage: target improvement not found: %d (%s)",
@@ -976,18 +996,34 @@
     nullify_prechange_production(pcity); /* Make it impossible to recover */
 
     /* Report it. */
-    if (pcity->is_building_unit)
-      prod = unit_name (pcity->currently_building);
-    else
-      prod = get_improvement_name (pcity->currently_building);
-    notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_SABOTAGE,
-		     _("Game: Your %s succeeded in destroying"
-		       " the production of %s in %s."),
-		     unit_name(pdiplomat->type), prod, pcity->name);
-    notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_SABOTAGE,
-		     _("Game: The production of %s was destroyed in %s,"
-		       " %s are suspected."), prod, pcity->name,
-		     get_nation_name_plural(pplayer->nation));
+    if (pcity->is_building_unit) {
+      notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_SABOTAGE,
+                       N_("Game: Your %s succeeded in destroying"
+		          " the production of %s in %S."),
+		       unit_name_orig(pdiplomat->type),
+		       unit_name_orig(pcity->currently_building), 
+		       pcity->name);
+      notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_SABOTAGE,
+		       N_("Game: The production of %s was destroyed in %S,"
+		          " %M are suspected."), 
+		       unit_name_orig(pcity->currently_building),
+		       pcity->name,
+		       pplayer->nation);
+    }
+    else {
+      notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_SABOTAGE,
+                       N_("Game: Your %s succeeded in destroying"
+		          " the production of %s in %S."),
+		       unit_name_orig(pdiplomat->type), 
+		       get_improvement_name_orig(pcity->currently_building), 
+		       pcity->name);
+      notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_SABOTAGE,
+		        N_("Game: The production of %s was destroyed in %S,"
+		           " %M are suspected."), 
+			get_improvement_name_orig(pcity->currently_building), 
+			pcity->name,
+		        pplayer->nation);
+    }
     freelog (LOG_DEBUG, "sabotage: sabotaged production");
   } else {
     /* Sabotage a city improvement. */
@@ -1002,15 +1038,17 @@
       if (myrand (2) == 1) {
 	/* Caught! */
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: Your %s was caught in the attempt"
-			   " of sabotage!"), unit_name(pdiplomat->type));
+			 N_("Game: Your %s was caught in the attempt"
+			    " of sabotage!"),
+			 unit_name_orig(pdiplomat->type));
 	notify_player_ex(cplayer, pcity->x, pcity->y,
 			 E_ENEMY_DIPLOMAT_FAILED,
-			 _("Game: You caught %s %s attempting"
-			   " to sabotage the %s in %s!"),
-			 get_nation_name(pplayer->nation),
-			 unit_name(pdiplomat->type),
-			 get_improvement_name(improvement), pcity->name);
+			 N_("Game: You caught %M %s attempting"
+			     " to sabotage the %s in %S!"),
+			 pplayer->nation,
+			 unit_name_orig(pdiplomat->type),
+			 get_improvement_name_orig(improvement), 
+			 pcity->name);
 	wipe_unit (pdiplomat);
 	freelog (LOG_DEBUG, "sabotage: caught in capital or on city walls");
 	return;
@@ -1019,13 +1057,14 @@
 
     /* Report it. */
     notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_SABOTAGE,
-		     _("Game: Your %s destroyed the %s in %s."),
-		     unit_name(pdiplomat->type),
-		     get_improvement_name(target), pcity->name);
+		      N_("Game: Your %s destroyed the %s in %s."),
+		      unit_name(pdiplomat->type),
+		      get_improvement_name(target), pcity->name);
     notify_player_ex(cplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_SABOTAGE,
-		     _("Game: The %s destroyed the %s in %s."),
-		     get_nation_name_plural(pplayer->nation),
-		     get_improvement_name(target), pcity->name);
+		      N_("Game: The %M destroyed the %s in %S."),
+		      pplayer->nation,
+		      get_improvement_name_orig(target), 
+		      pcity->name);
     freelog (LOG_DEBUG, "sabotage: sabotaged improvement: %d (%s)",
 	       target, get_improvement_name (target));
 
@@ -1106,27 +1145,33 @@
 	/* Defending Spy/Diplomat dies. */
 
 	notify_player_ex(cplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: Your %s has been eliminated defending"
-			   " against a %s in %s."), unit_name(punit->type),
-			 unit_name(pdiplomat->type), pcity->name);
+			 N_("Game: Your %s has been eliminated defending"
+			    " against a %s in %S."), 
+			 unit_name_orig(punit->type),
+			 unit_name_orig(pdiplomat->type),
+			 pcity->name);
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_ENEMY_DIPLOMAT_FAILED,
-			 _("Game: An enemy %s has been eliminated defending"
-			   " %s."), unit_name(punit->type), pcity->name);
+			 N_("Game: An enemy %s has been eliminated defending"
+			    "%S."), 
+			 unit_name_orig(punit->type),
+			 pcity->name);
 
 	wipe_unit_safe(punit, &myiter);
       } else {
 	/* Attacking Spy/Diplomat dies. */
 
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: Your %s was eliminated"
-			   " by a defending %s in %s."),
-			 unit_name(pdiplomat->type), unit_name(punit->type),
+			 N_("Game: Your %s was eliminated"
+			    " by a defending %s in %S."),
+			 unit_name_orig(pdiplomat->type),
+			 unit_name_orig(punit->type),
 			 pcity->name);
 	notify_player_ex(cplayer, pcity->x, pcity->y,
 			 E_ENEMY_DIPLOMAT_FAILED,
-			 _("Game: Eliminated %s %s while infiltrating %s."),
-			 get_nation_name(pplayer->nation),
-			 unit_name(pdiplomat->type), pcity->name);
+			 N_("Game: Eliminated %M %s while infiltrating %S."),
+			 pplayer->nation,
+			 unit_name_orig(pdiplomat->type),
+			 pcity->name);
 
 	wipe_unit_safe(pdiplomat, &myiter);
 	return FALSE;
@@ -1172,9 +1217,10 @@
       }
 
       notify_player_ex(pplayer, x, y, E_MY_DIPLOMAT_ESCAPE,
-		       _("Game: Your %s has successfully completed"
-			 " her mission and returned unharmed to %s."),
-		       unit_name(pdiplomat->type), spyhome->name);
+		       N_("Game: Your %s has successfully completed"
+			  " her mission and returned unharmed to %S."),
+                       unit_name_orig(pdiplomat->type),
+		       spyhome->name);
 
       /* may become a veteran */
       maybe_make_veteran (pdiplomat);
@@ -1192,13 +1238,15 @@
 
       if (pcity) {
 	notify_player_ex(pplayer, x, y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: Your %s was captured after completing"
-			   " her mission in %s."),
-			 unit_name(pdiplomat->type), pcity->name);
+			 N_("Game: Your %s was captured after completing"
+			    " her mission in %S."),
+			 unit_name_orig(pdiplomat->type),
+			 pcity->name);
       } else {
 	notify_player_ex(pplayer, x, y, E_MY_DIPLOMAT_FAILED,
-			 _("Game: Your %s was captured after completing"
-			   " her mission."), unit_name(pdiplomat->type));
+			 N_("Game: Your %s was captured after completing"
+			    " her mission."),
+			 unit_name_orig(pdiplomat->type));
       }
 
       /* fall through */
@@ -1236,33 +1284,33 @@
     switch (action) {
     case DIPLOMAT_BRIBE:
       notify_player_ex(offender, x, y, E_DIPLOMATIC_INCIDENT,
-		       _("Game: You have caused an incident while bribing "
- 			 "%s's %s."),
+		       N_("Game: You have caused an incident while bribing "
+ 			  "%S's %s."),
  		       victim_player->name,
- 		       unit_name(victim_unit->type));
+ 		       unit_name_orig(victim_unit->type));
       notify_player_ex(victim_player, x, y, E_DIPLOMATIC_INCIDENT,
-		       _("Game: %s has caused an incident while bribing "
- 			 "your %s."),
+		       N_("Game: %S has caused an incident while bribing "
+ 			  "your %s."),
  		       offender->name,
- 		       unit_name(victim_unit->type));
+ 		       unit_name_orig(victim_unit->type));
       break;
     case DIPLOMAT_STEAL:
       notify_player_ex(offender, x, y, E_DIPLOMATIC_INCIDENT,
- 		       _("Game: You have caused an incident while stealing "
- 			 "tech from %s."),
- 		       victim_player->name);
+ 		        N_("Game: You have caused an incident while stealing "
+ 			   "tech from %S."),
+ 		        victim_player->name);
       notify_player_ex(victim_player, x, y, E_DIPLOMATIC_INCIDENT,
-		       _("Game: %s has caused an incident while stealing "
-			 "tech from you."),
-		       offender->name);
+		        N_("Game: %S has caused an incident while stealing "
+			   "tech from you."),
+		        offender->name);
       break;
     case DIPLOMAT_INCITE:
       notify_player_ex(offender, x, y, E_DIPLOMATIC_INCIDENT,
- 		       _("Game: You have caused an incident while inciting a "
- 			 "revolt in %s."), victim_city->name);
+ 		        N_("Game: You have caused an incident while inciting a "
+ 			   "revolt in %S."), victim_city->name);
       notify_player_ex(victim_player, x, y, E_DIPLOMATIC_INCIDENT,
- 		       _("Game: %s have caused an incident while inciting a "
- 			 "revolt in %s."), offender->name, victim_city->name);
+ 		        N_("Game: %S have caused an incident while inciting a "
+ 			   "revolt in %S."), offender->name, victim_city->name);
       break;
     case DIPLOMAT_MOVE:
     case DIPLOMAT_EMBASSY:
diff -ur --new-file -Xdiff_ignore freeorig/server/gamehand.c freeciv/server/gamehand.c
--- freeorig/server/gamehand.c	2003-02-11 07:57:38.000000000 +0100
+++ freeciv/server/gamehand.c	2003-02-13 15:30:40.000000000 +0100
@@ -182,8 +182,8 @@
   lsend_packet_new_year(&game.est_connections, &apacket);
 
   /* Hmm, clients could add this themselves based on above packet? */
-  notify_conn_ex(&game.est_connections, -1, -1, E_NEXT_YEAR, _("Year: %s"),
-		 textyear(year));
+  notify_conn_ex(&game.est_connections, -1, -1, E_NEXT_YEAR, N_("Year: %R"),
+		  textyear_orig(year), year<0 ? -year : year);
 }
 
 
@@ -284,16 +284,16 @@
 
     if (game.timeout > GAME_MAX_TIMEOUT) {
       notify_conn_ex(&game.est_connections, -1, -1, E_NOEVENT,
-		     _("The turn timeout has exceeded its maximum value, "
-		       "fixing at its maximum"));
+		      N_("The turn timeout has exceeded its maximum value, "
+		         "fixing at its maximum"));
       freelog(LOG_DEBUG, "game.timeout exceeded maximum value");
       game.timeout = GAME_MAX_TIMEOUT;
       game.timeoutint = 0;
       game.timeoutinc = 0;
     } else if (game.timeout < 0) {
       notify_conn_ex(&game.est_connections, -1, -1, E_NOEVENT,
-		     _("The turn timeout is smaller than zero, "
-		       "fixing at zero."));
+		      N_("The turn timeout is smaller than zero, "
+		         "fixing at zero."));
       freelog(LOG_DEBUG, "game.timeout less than zero");
       game.timeout = 0;
     }
diff -ur --new-file -Xdiff_ignore freeorig/server/maphand.c freeciv/server/maphand.c
--- freeorig/server/maphand.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/maphand.c	2003-02-13 15:30:40.000000000 +0100
@@ -121,9 +121,9 @@
   }
 
   notify_player_ex(NULL, -1, -1, E_GLOBAL_ECO,
-		   _("Game: Global warming has occurred!"));
-  notify_player(NULL, _("Game: Coastlines have been flooded and vast "
-			"ranges of grassland have become deserts."));
+		    N_("Game: Global warming has occurred!"));
+  notify_player(NULL, N_("Game: Coastlines have been flooded and vast "
+			  "ranges of grassland have become deserts."));
 }
 
 /**************************************************************************
@@ -165,9 +165,9 @@
   }
 
   notify_player_ex(NULL, -1, -1, E_GLOBAL_ECO,
-		   _("Game: Nuclear winter has occurred!"));
-  notify_player(NULL, _("Game: Wetlands have dried up and vast "
-			"ranges of grassland have become tundra."));
+		    N_("Game: Nuclear winter has occurred!"));
+  notify_player(NULL, N_("Game: Wetlands have dried up and vast "
+			  "ranges of grassland have become tundra."));
 }
 
 /***************************************************************
@@ -187,16 +187,16 @@
 
   if (discovery) {
     notify_player(pplayer,
-		  _("Game: New hope sweeps like fire through the country as "
-		    "the discovery of railroad is announced.\n"
-		    "      Workers spontaneously gather and upgrade all "
-		    "cities with railroads."));
+		   N_("Game: New hope sweeps like fire through the country as "
+		      "the discovery of railroad is announced.\n"
+		      "      Workers spontaneously gather and upgrade all "
+		      "cities with railroads."));
   } else {
     notify_player(pplayer,
-		  _("Game: The people are pleased to hear that your "
-		    "scientists finally know about railroads.\n"
-		    "      Workers spontaneously gather and upgrade all "
-		    "cities with railroads."));
+		   N_("Game: The people are pleased to hear that your "
+		      "scientists finally know about railroads.\n"
+		      "      Workers spontaneously gather and upgrade all "
+		      "cities with railroads."));
   }
   
   city_list_iterate(pplayer->cities, pcity) {
@@ -1265,7 +1265,7 @@
   }
 
   remove_shared_vision(pplayer, pplayer2);
-  notify_player(pplayer2, _("%s no longer gives us shared vision!"),
+  notify_player(pplayer2, N_("%S no longer gives us shared vision!"),
 		pplayer->name);
 }
 
diff -ur --new-file -Xdiff_ignore freeorig/server/plrhand.c freeciv/server/plrhand.c
--- freeorig/server/plrhand.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/plrhand.c	2003-02-13 17:37:45.000000000 +0100
@@ -25,6 +25,7 @@
 #include "packets.h"
 #include "player.h"
 #include "rand.h"
+#include "fims.h"
 #include "support.h"
 #include "tech.h"
 #include "shared.h"
@@ -130,15 +131,15 @@
 	if (get_invention(pplayer, i)!=TECH_KNOWN 
 	    && game.global_advances[i]>=2) {
 	  notify_player_ex(pplayer, -1, -1, E_TECH_GAIN,
-			   _("Game: %s acquired from The Great Library!"),
-			   advances[i].name);
+			    N_("Game: %s acquired from The Great Library!"),
+			    advances[i].name_orig);
 	  gamelog(GAMELOG_TECH, _("%s discover %s (Library)"),
 		  get_nation_name_plural(pplayer->nation), advances[i].name);
 	  notify_embassies(pplayer, NULL,
-			   _("Game: The %s have acquired %s"
-			     " from the Great Library."),
-			   get_nation_name_plural(pplayer->nation),
-			   advances[i].name);
+			    N_("Game: The %N have acquired %s"
+			       " from the Great Library."),
+			    pplayer->nation,
+			    advances[i].name_orig);
 
 	  do_free_cost(pplayer);
 	  found_new_tech(pplayer, i, FALSE, FALSE);
@@ -177,12 +178,12 @@
     if(unit_list_size(&pplayer->units)==0 && 
        city_list_size(&pplayer->cities)==0) {
       notify_player_ex(pplayer, -1, -1, E_GAME_END,
-		       _("Game: You are dead!"));
+		        N_("Game: You are dead!"));
       pplayer->is_alive = FALSE;
       if( !is_barbarian(pplayer) ) {
 	notify_player_ex(NULL, -1, -1, E_DESTROYED,
-			 _("Game: The %s are no more!"),
-			 get_nation_name_plural(pplayer->nation));
+			  N_("Game: The %N are no more!"),
+			  pplayer->nation);
 	gamelog(GAMELOG_GENO, _("%s civilization destroyed"),
 		get_nation_name(pplayer->nation));
       }
@@ -229,9 +230,10 @@
 	  improvement_types[id].obsolete_by == tech_found &&
 	  (pcity = find_city_by_id(game.global_wonders[id]))) {
 	notify_player_ex(city_owner(pcity), -1, -1, E_WONDER_OBSOLETE,
-	                 _("Game: Discovery of %s OBSOLETES %s in %s!"), 
-	                 advances[tech_found].name, get_improvement_name(id),
-	                 pcity->name);
+	                  N_("Game: Discovery of %s OBSOLETES %s in %S!"), 
+	                  advances[tech_found].name_orig, 
+			  get_improvement_name_orig(id),
+	                  pcity->name);
       }
     } impr_type_iterate_end;
   }
@@ -239,9 +241,10 @@
   for (i=0; i<game.government_count; i++) {
     if (tech_found == governments[i].required_tech) {
       notify_player_ex(plr,-1,-1, E_NEW_GOVERNMENT,
-		       _("Game: Discovery of %s makes the government form %s"
-			 " available. You may want to start a revolution."),
-		       advances[tech_found].name, get_government_name(i));
+		        N_("Game: Discovery of %s makes the government form %s"
+			   " available. You may want to start a revolution."),
+		        advances[tech_found].name_orig, 
+			get_government_name_orig(i));
     }
   }
     
@@ -280,31 +283,33 @@
 
     if (choose_goal_tech(plr)) {
       notify_player_ex(plr, -1, -1, E_TECH_LEARNED,
-		       _("Game: Learned %s.  "
-			 "Our scientists focus on %s, goal is %s."),
-		       advances[tech_found].name,
-		       advances[plr->research.researching].name,
-		       advances[plr->ai.tech_goal].name);
+		        N_("Game: Learned %s.  "
+			   "Our scientists focus on %s, goal is %s."),
+		        advances[tech_found].name_orig,
+		        advances[plr->research.researching].name_orig,
+		        advances[plr->ai.tech_goal].name_orig);
     } else {
       choose_random_tech(plr);
       if (!is_future_tech(plr->research.researching)
-	  || !is_future_tech(tech_found)) {
+	  && !is_future_tech(tech_found)) {
 	notify_player_ex(plr, -1, -1, E_TECH_LEARNED,
-			 _("Game: Learned %s.  Scientists "
+			 N_("Game: Learned %s.  Scientists "
 			   "choose to research %s."),
-			 advances[tech_found].name,
-			 get_tech_name(plr, plr->research.researching));
+			 advances[tech_found].name_orig,
+			 advances[plr->research.researching].name_orig);
+      } else if (!is_future_tech(tech_found)){
+        notify_player_ex(plr, -1, -1, E_TECH_LEARNED,
+	                 N_("Game: Learned %s.  Scientists "
+			    "choose to research Future Tech. %d."),
+			 advances[tech_found].name_orig,
+			 ++plr->future_tech);
       } else {
-	char buffer1[300];
-	char buffer2[300];
-
-	my_snprintf(buffer1, sizeof(buffer1), _("Game: Learned %s. "),
-		    get_tech_name(plr, plr->research.researching));
+	notify_player_ex(plr, -1, -1, E_TECH_LEARNED, 
+	                 N_("Game: Learned Future Tech. %d. Researching "
+			    " Future Tech. %d"),
+			 plr->future_tech,
+			 plr->future_tech+1);
 	plr->future_tech++;
-	my_snprintf(buffer2, sizeof(buffer2), _("Researching %s."),
-		    get_tech_name(plr, plr->research.researching));
-	notify_player_ex(plr, -1, -1, E_TECH_LEARNED, "%s%s", buffer1,
-			 buffer2);
       }
     }
     if (saving_bulbs) {
@@ -314,12 +319,12 @@
 
   if (bonus_tech_hack) {
     if (advances[tech_found].bonus_message) {
-      notify_player(plr, _("Game: %s"),
-		    _(advances[tech_found].bonus_message));
+      notify_player(plr, N_("Game: %s"),
+		     N_(advances[tech_found].bonus_message));
     } else {
-      notify_player(plr, _("Game: Great scientists from all the "
-			   "world join your civilization: you get "
-			   "an immediate advance."));
+      notify_player(plr, N_("Game: Great scientists from all the "
+			     "world join your civilization: you get "
+			     "an immediate advance."));
     }
     tech_researched(plr);
   }
@@ -384,18 +389,18 @@
 
   if (!is_future_tech(plr->research.researching)) {
     notify_embassies(plr, NULL,
-		     _("Game: The %s have researched %s."), 
-		     get_nation_name_plural(plr->nation),
-		     advances[plr->research.researching].name);
+		      N_("Game: The %N have researched %s."), 
+		      plr->nation,
+		      advances[plr->research.researching].name_orig);
 
     gamelog(GAMELOG_TECH, _("%s discover %s"),
 	    get_nation_name_plural(plr->nation),
 	    advances[plr->research.researching].name);
   } else {
     notify_embassies(plr, NULL,
-		     _("Game: The %s have researched Future Tech. %d."), 
-		     get_nation_name_plural(plr->nation),
-		     plr->future_tech);
+		      N_("Game: The %N have researched Future Tech. %d."), 
+		      plr->nation,
+		      plr->future_tech);
   
     gamelog(GAMELOG_TECH, _("%s discover Future Tech %d"),
 	    get_nation_name_plural(plr->nation), plr->future_tech);
@@ -517,7 +522,9 @@
 
 void choose_tech_goal(struct player *plr, int tech)
 {
-  notify_player(plr, _("Game: Technology goal is %s."), advances[tech].name);
+  notify_player(plr, 
+                N_("Game: Technology goal is %s."), 
+                advances[tech].name_orig);
   plr->ai.tech_goal = tech;
 }
 
@@ -611,21 +618,41 @@
 	  get_tech_name(pplayer, i),
 	  get_nation_name_plural(target->nation));
 
-  notify_player_ex(pplayer, -1, -1, E_TECH_GAIN,
-		   _("Game: You steal %s from the %s."),
-		   get_tech_name(pplayer, i),
-		   get_nation_name_plural(target->nation));
-
-  notify_player_ex(target, -1, -1, E_ENEMY_DIPLOMAT_THEFT,
-                   _("Game: The %s stole %s from you!"),
-		   get_nation_name_plural(pplayer->nation),
-		   get_tech_name(pplayer, i));
-
-  notify_embassies(pplayer, target,
-		   _("Game: The %s have stolen %s from the %s."),
-		   get_nation_name_plural(pplayer->nation),
-		   get_tech_name(pplayer, i),
-		   get_nation_name_plural(target->nation));
+  if (is_future_tech(i)) {
+    notify_player_ex(pplayer, -1, -1, E_TECH_GAIN,
+ 		     N_("Game: You steal Future Tech. %d from the %N."),
+		     pplayer->future_tech + 1, 
+                     target->nation);
+
+    notify_player_ex(target, -1, -1, E_ENEMY_DIPLOMAT_THEFT,
+                     N_("Game: The %N stole Future Tech. %d from you!"),
+		     pplayer->nation,
+		     pplayer->future_tech + 1);
+
+    notify_embassies(pplayer, target,
+		     N_("Game: The %N have stolen Future Tech. %d "
+		        "from the %N."),
+		     pplayer->nation,
+		     pplayer->future_tech + 1,
+		     target->nation);
+  } else {
+    notify_player_ex(pplayer, -1, -1, E_TECH_GAIN,
+ 		     N_("Game: You steal %s from the %N."),
+		     advances[i].name_orig, 
+                     target->nation);
+
+    notify_player_ex(target, -1, -1, E_ENEMY_DIPLOMAT_THEFT,
+                     N_("Game: The %N stole %s from you!"),
+		     pplayer->nation,
+		     advances[i].name_orig);
+
+    notify_embassies(pplayer, target,
+		     N_("Game: The %N have stolen %s "
+		        "from the %N."),
+		     pplayer->nation,
+		     advances[i].name_orig,
+		     target->nation);
+  }
 
   do_conquer_cost(pplayer);
   found_new_tech(pplayer, i, FALSE, TRUE);
@@ -642,7 +669,8 @@
   if (server_state!=RUN_GAME_STATE) {
     freelog(LOG_ERROR, "received player_rates packet from %s before start",
 	    pplayer->name);
-    notify_player(pplayer, _("Game: Cannot change rates before game start."));
+    notify_player(pplayer, 
+                   N_("Game: Cannot change rates before game start."));
     return;
   }
 	
@@ -655,13 +683,13 @@
   if (preq->tax>maxrate || preq->luxury>maxrate || preq->science>maxrate) {
     char *rtype;
     if (preq->tax > maxrate)
-      rtype = _("Tax");
+      rtype = N_("Tax");
     else if (preq->luxury > maxrate)
-      rtype = _("Luxury");
+      rtype = N_("Luxury");
     else
-      rtype = _("Science");
-    notify_player(pplayer, _("Game: %s rate exceeds the max rate for %s."),
-                  rtype, get_government_name(pplayer->government));
+      rtype = N_("Science");
+    notify_player(pplayer, N_("Game: %s rate exceeds the max rate for %s."),
+                  rtype, get_government_name_orig(pplayer->government));
   } else {
     pplayer->economic.tax=preq->tax;
     pplayer->economic.luxury=preq->luxury;
@@ -712,10 +740,10 @@
     return;
 
   pplayer->government=preq->government;
-  notify_player(pplayer, _("Game: %s now governs the %s as a %s."), 
-		pplayer->name, 
-  	        get_nation_name_plural(pplayer->nation),
-		get_government_name(preq->government));  
+  notify_player(pplayer, N_("Game: %S now governs the %N as a %s."), 
+                pplayer->name, 
+                pplayer->nation,
+                get_government_name_orig(preq->government));  
   gamelog(GAMELOG_GOVERNMENT, _("%s form a %s"),
 	  get_nation_name_plural(pplayer->nation),
 	  get_government_name(preq->government));
@@ -749,8 +777,8 @@
   pplayer->revolution=myrand(5)+1;
   pplayer->government=game.government_when_anarchy;
   notify_player_ex(pplayer, -1, -1, E_REVOLT_START,
-		   _("Game: The %s have incited a revolt!"),
-		   get_nation_name_plural(pplayer->nation));
+		    N_("Game: The %N have incited a revolt!"),
+		    pplayer->nation);
   gamelog(GAMELOG_REVOLT, _("The %s revolt!"),
 	  get_nation_name_plural(pplayer->nation));
 
@@ -776,20 +804,22 @@
   if (pplayer->economic.tax != old_econ.tax) {
     changed = TRUE;
     notify_player(pplayer,
-		  _("Game: Tax rate exceeded the max rate for %s; adjusted."), 
-		  get_government_name(pplayer->government));
+		  N_("Game: Tax rate exceeded the max rate for %s; adjusted."), 
+		  get_government_name_orig(pplayer->government));
   }
   if (pplayer->economic.science != old_econ.science) {
     changed = TRUE;
     notify_player(pplayer,
-		  _("Game: Science rate exceeded the max rate for %s; adjusted."), 
-		  get_government_name(pplayer->government));
+		  N_("Game: Science rate exceeded the max rate for %s; "
+		      "adjusted."), 
+		  get_government_name_orig(pplayer->government));
   }
   if (pplayer->economic.luxury != old_econ.luxury) {
     changed = TRUE;
     notify_player(pplayer,
-		  _("Game: Luxury rate exceeded the max rate for %s; adjusted."), 
-		  get_government_name(pplayer->government));
+		  N_("Game: Luxury rate exceeded the max rate for %s;"
+		     " adjusted."), 
+		  get_government_name_orig(pplayer->government));
   }
 
   if (changed) {
@@ -855,9 +885,9 @@
   if (pplayer->diplstates[pplayer2->player_no].has_reason_to_cancel > 0) {
     pplayer->diplstates[pplayer2->player_no].has_reason_to_cancel = 0;
     if (has_senate)
-      notify_player(pplayer, _("The senate passes your bill because of the "
-			       "constant provocations of the %s."),
-		    get_nation_name_plural(pplayer2->nation));
+      notify_player(pplayer, N_("The senate passes your bill because of the "
+			         "constant provocations of the %N."),
+		     pplayer2->nation);
   }
   /* no reason to cancel, apply penalty (and maybe suffer a revolution) */
   /* FIXME: according to civII rules, republics and democracies
@@ -865,12 +895,13 @@
      extend the govt rulesets to mimic this -- pt */
   else {
     pplayer->reputation = MAX(pplayer->reputation - reppenalty, 0);
-    notify_player(pplayer, _("Game: Your reputation is now %s."),
-		  reputation_text(pplayer->reputation));
+    notify_player(pplayer, N_("Game: Your reputation is now %s."),
+		  reputation_text_orig(pplayer->reputation));
     if (has_senate) {
       if (myrand(GAME_MAX_REPUTATION) > pplayer->reputation) {
-	notify_player(pplayer, _("Game: The senate decides to dissolve "
-				 "rather than support your actions any longer."));
+	notify_player(pplayer, 
+	               N_("Game: The senate decides to dissolve "
+		          "rather than support your actions any longer."));
 	handle_player_revolution(pplayer);
       }
     }
@@ -904,22 +935,23 @@
   check_city_workers(pplayer2);
 
   notify_player_ex(pplayer, -1, -1, E_TREATY_BROKEN,
-		   _("Game: The diplomatic state between the %s "
-		     "and the %s is now %s."),
-		   get_nation_name_plural(pplayer->nation),
-		   get_nation_name_plural(pplayer2->nation),
-		   diplstate_text(new_type));
+		   N_("Game: The diplomatic state between the %N "
+		      "and the %N is now %s."),
+                   pplayer->nation,
+                   pplayer2->nation,
+                   diplstate_text_orig(new_type));
   notify_player_ex(pplayer2, -1, -1, E_TREATY_BROKEN,
-		   _("Game:  %s cancelled the diplomatic agreement! "
-		     "The diplomatic state between the %s and the %s "
-		     "is now %s."), pplayer->name,
-		   get_nation_name_plural(pplayer2->nation),
-		   get_nation_name_plural(pplayer->nation),
-		   diplstate_text(new_type));
+                   N_("Game:  %S cancelled the diplomatic agreement! "
+                      "The diplomatic state between the %N and the %N "
+                      "is now %s."), 
+                   pplayer->name,
+                   pplayer2->nation,
+                   pplayer->nation,
+                   diplstate_text_orig(new_type));
 }
 
 /**************************************************************************
-  This is the basis for following notify_conn* and notify_player* functions.
+  This is the basis for following notify_conn and notify_player functions.
   Notify specified connections of an event of specified type (from events.h)
   and specified (x,y) coords associated with the event.  Coords will only
   apply if game has started and the conn's player knows that tile (or
@@ -929,12 +961,17 @@
   (But current clients do not use (x,y) data for E_NOEVENT events.)
 **************************************************************************/
 static void vnotify_conn_ex(struct conn_list *dest, int x, int y, int event,
-			    const char *format, va_list vargs) 
+			    const char *fims_format, va_list vargs) 
 {
-  struct packet_generic_message genmsg;
+  struct packet_fims packet;
+  struct data_out dout;
+
+  dio_output_init(&dout, packet.data, sizeof(packet.data));
+  if (!serialize_fims(&dout, fims_format, vargs) || dout.too_short)
+    return;
+  packet.size = dio_output_used(&dout);
   
-  my_vsnprintf(genmsg.message, sizeof(genmsg.message), format, vargs);
-  genmsg.event = event;
+  packet.event = event;
 
   conn_list_iterate(*dest, pconn) {
     if (server_state >= RUN_GAME_STATE
@@ -942,14 +979,14 @@
 	&& ((!pconn->player && pconn->observer)
 	    || (pconn->player && map_get_known(x, y, pconn->player)))) {
       CHECK_MAP_POS(x, y);
-      genmsg.x = x;
-      genmsg.y = y;
+      packet.x = x;
+      packet.y = y;
     } else {
       assert(server_state < RUN_GAME_STATE || !is_normal_map_pos(-1, -1));
-      genmsg.x = -1;
-      genmsg.y = -1;
+      packet.x = -1;
+      packet.y = -1;
     }
-    send_packet_generic_message(pconn, PACKET_CHAT_MSG, &genmsg);
+    send_packet_fims(pconn, &packet);
   }
   conn_list_iterate_end;
 }
@@ -958,34 +995,34 @@
   See vnotify_conn_ex - this is just the "non-v" version, with varargs.
 **************************************************************************/
 void notify_conn_ex(struct conn_list *dest, int x, int y, int event,
-		    const char *format, ...) 
+		    const char *fims_format, ...) 
 {
   va_list args;
-  va_start(args, format);
-  vnotify_conn_ex(dest, x, y, event, format, args);
+  va_start(args, fims_format);
+  vnotify_conn_ex(dest, x, y, event, fims_format, args);
   va_end(args);
 }
 
 /**************************************************************************
   See vnotify_conn_ex - this is varargs, and cannot specify (x,y), event.
 **************************************************************************/
-void notify_conn(struct conn_list *dest, const char *format, ...) 
+void notify_conn(struct conn_list *dest, const char *fims_format, ...) 
 {
   va_list args;
-  va_start(args, format);
-  vnotify_conn_ex(dest, -1, -1, E_NOEVENT, format, args);
+  va_start(args, fims_format);
+  vnotify_conn_ex(dest, -1, -1, E_NOEVENT, fims_format, args);
   va_end(args);
 }
 
 /**************************************************************************
-  Similar to vnotify_conn_ex (see also), but takes player as "destination".
+  Similar to vnotify_conn_ex2 (see also), but takes player as "destination".
   If player != NULL, sends to all connections for that player.
   If player == NULL, sends to all established connections, to support
   old code, but this feature may go away - should use notify_conn with
   explicitly game.est_connections or game.game_connections as dest.
 **************************************************************************/
 void notify_player_ex(const struct player *pplayer, int x, int y,
-		      int event, const char *format, ...) 
+  int event, const char *fims_format, ...) 
 {
   struct conn_list *dest;
   va_list args;
@@ -996,15 +1033,15 @@
     dest = &game.est_connections;
   }
   
-  va_start(args, format);
-  vnotify_conn_ex(dest, x, y, event, format, args);
+  va_start(args, fims_format);
+  vnotify_conn_ex(dest, x, y, event, fims_format, args);
   va_end(args);
 }
 
 /**************************************************************************
   Just like notify_player_ex, but no (x,y) nor event type.
 **************************************************************************/
-void notify_player(const struct player *pplayer, const char *format, ...) 
+void notify_player(const struct player *pplayer, const char *fims_format, ...) 
 {
   struct conn_list *dest;
   va_list args;
@@ -1015,8 +1052,8 @@
     dest = &game.est_connections;
   }
   
-  va_start(args, format);
-  vnotify_conn_ex(dest, -1, -1, E_NOEVENT, format, args);
+  va_start(args, fims_format);
+  vnotify_conn_ex(dest, -1, -1, E_NOEVENT, fims_format, args);
   va_end(args);
 }
 
@@ -1025,25 +1062,19 @@
   but excluding pplayer and specified player.
 **************************************************************************/
 void notify_embassies(struct player *pplayer, struct player *exclude,
-		      const char *format, ...) 
+		      const char *fims_format, ...) 
 {
-  struct packet_generic_message genmsg;
   va_list args;
-  va_start(args, format);
-  my_vsnprintf(genmsg.message, sizeof(genmsg.message), format, args);
-  va_end(args);
-  genmsg.x = -1;
-  genmsg.y = -1;
-  genmsg.event = E_NOEVENT;
-
+  va_start(args, fims_format);
   players_iterate(other_player) {
     if (player_has_embassy(other_player, pplayer)
 	&& exclude != other_player
         && pplayer != other_player) {
-      lsend_packet_generic_message(&other_player->connections,
-				   PACKET_CHAT_MSG, &genmsg);
+      vnotify_conn_ex(&other_player->connections, 
+                        -1, -1, E_NOEVENT, fims_format, args);
     }
   } players_iterate_end;
+  va_end(args);  
 }
 
 /**************************************************************************
@@ -1343,7 +1374,7 @@
   }
 
   freelog(LOG_NORMAL, _("Removing player %s."), pplayer->name);
-  notify_player(pplayer, _("Game: You've been removed from the game!"));
+  notify_player(pplayer, N_("Game: You've been removed from the game!"));
 
   /* Note it is ok to remove the _current_ item in a list_iterate: */
   conn_list_iterate(pplayer->connections, pconn) {
@@ -1353,7 +1384,7 @@
   conn_list_iterate_end;
   
   notify_conn(&game.est_connections,
-	      _("Game: %s has been removed from the game."), pplayer->name);
+	       N_("Game: %S has been removed from the game."), pplayer->name);
   
   pack.value=pplayer->player_no;
   lsend_packet_generic_integer(&game.est_connections,
@@ -1383,13 +1414,13 @@
     = pplayer2->diplstates[player1].type
     = pplayer1->ai.control || pplayer2->ai.control ? DS_WAR : DS_NEUTRAL;
   notify_player_ex(pplayer1, x, y,
-		   E_FIRST_CONTACT,
-		   _("Game: You have made contact with the %s, ruled by %s."),
-		   get_nation_name_plural(pplayer2->nation), pplayer2->name);
+		    E_FIRST_CONTACT,
+		    N_("Game: You have made contact with the %N, ruled by %S."),
+		    pplayer2->nation, pplayer2->name);
   notify_player_ex(pplayer2, x, y,
-		   E_FIRST_CONTACT,
-		   _("Game: You have made contact with the %s, ruled by %s."),
-		   get_nation_name_plural(pplayer1->nation), pplayer1->name);
+		    E_FIRST_CONTACT,
+		    N_("Game: You have made contact with the %N, ruled by %S."),
+		    pplayer1->nation, pplayer1->name);
   send_player_info(pplayer1, pplayer1);
   send_player_info(pplayer1, pplayer2);
   send_player_info(pplayer2, pplayer1);
@@ -1747,9 +1778,9 @@
 	  "%s's nation is thrust into civil war, created AI player %s",
 	  pplayer->name, cplayer->name);
   notify_player_ex(pplayer, -1, -1, E_CIVIL_WAR,
-		   _("Game: Your nation is thrust into civil war, "
-		     " %s is declared the leader of the rebel states."),
-		   cplayer->name);
+		    N_("Game: Your nation is thrust into civil war, "
+		       " %S is declared the leader of the rebel states."),
+		    cplayer->name);
 
   i = city_list_size(&pplayer->cities)/2;   /* number to flip */
   j = city_list_size(&pplayer->cities);	    /* number left to process */
@@ -1767,8 +1798,8 @@
 	freelog(LOG_VERBOSE, "%s declares allegiance to %s",
 		pcity->name, cplayer->name);
 	notify_player_ex(pplayer, pcity->x, pcity->y, E_CITY_LOST,
-			 _("Game: %s declares allegiance to %s."),
-			 pcity->name, cplayer->name);
+			  N_("Game: %S declares allegiance to %S."),
+			  pcity->name, cplayer->name);
 	i--;
       }
     }
@@ -1790,14 +1821,14 @@
 
 
   notify_player(NULL,
-		_("Game: The capture of %s's capital and the destruction "
-		  "of the empire's administrative\n"
-		  "      structures have sparked a civil war.  "
-		  "Opportunists have flocked to the rebel cause,\n"
-		  "      and the upstart %s now holds power in %d "
-		  "rebel provinces."),
-		pplayer->name, cplayer->name,
-		city_list_size(&cplayer->cities));
+		 N_("Game: The capture of %S's capital and the destruction "
+		   "of the empire's administrative\n"
+		   "      structures have sparked a civil war.  "
+		   "Opportunists have flocked to the rebel cause,\n"
+		   "      and the upstart %S now holds power in %d "
+		   "rebel provinces."),
+		 pplayer->name, cplayer->name,
+		 city_list_size(&cplayer->cities));
 }  
 
 /**************************************************************************
diff -ur --new-file -Xdiff_ignore freeorig/server/plrhand.h freeciv/server/plrhand.h
--- freeorig/server/plrhand.h	2002-12-18 18:36:20.000000000 +0100
+++ freeciv/server/plrhand.h	2003-02-13 15:30:40.000000000 +0100
@@ -45,18 +45,14 @@
 void send_conn_info_remove(struct conn_list *src, struct conn_list *dest);
 
 void notify_conn_ex(struct conn_list *dest, int x, int y, int event,
-		    const char *format, ...) 
-                    fc__attribute((format (printf, 5, 6)));
-void notify_conn(struct conn_list *dest, const char *format, ...) 
-                 fc__attribute((format (printf, 2, 3)));
+		    const char *format, ...);
+void notify_conn(struct conn_list *dest, const char *format, ...);
 void notify_player_ex(const struct player *pplayer, int x, int y,
-		      int event, const char *format, ...)
-                      fc__attribute((format (printf, 5, 6)));
-void notify_player(const struct player *pplayer, const char *format, ...)
-                   fc__attribute((format (printf, 2, 3)));
+		      int event, const char *format, ...);
+void notify_player(const struct player *pplayer, const char *format, ...);
 void notify_embassies(struct player *pplayer, struct player *exclude,
-		      const char *format, ...)
-		      fc__attribute((format (printf, 3, 4)));
+		      const char *format, ...);
+
 
 struct conn_list *player_reply_dest(struct player *pplayer);
 
diff -ur --new-file -Xdiff_ignore freeorig/server/spacerace.c freeciv/server/spacerace.c
--- freeorig/server/spacerace.c	2002-11-18 12:50:36.000000000 +0100
+++ freeciv/server/spacerace.c	2003-02-13 15:30:40.000000000 +0100
@@ -161,17 +161,17 @@
 
   if (!find_palace(pplayer)) {
     notify_player(pplayer,
-                  _("Game: You need to have a capital in order to launch "
-		    "your spaceship."));
+                   N_("Game: You need to have a capital in order to launch "
+		      "your spaceship."));
     return;
   }
   if (ship->state >= SSHIP_LAUNCHED) {
-    notify_player(pplayer, _("Game: Your spaceship is already launched!"));
+    notify_player(pplayer, N_("Game: Your spaceship is already launched!"));
     return;
   }
   if (ship->state != SSHIP_STARTED
       || ship->success_rate == 0.0) {
-    notify_player(pplayer, _("Game: Your spaceship can't be launched yet!"));
+    notify_player(pplayer, N_("Game: Your spaceship can't be launched yet!"));
     return;
   }
 
@@ -180,10 +180,10 @@
   arrival = ship->launch_year + (int) ship->travel_time;
 
   notify_player_ex(NULL, -1, -1, E_SPACESHIP,
-		   _("Game: The %s have launched a spaceship!  "
-		     "It is estimated to arrive on Alpha Centauri in %s."),
-		   get_nation_name_plural(pplayer->nation),
-		   textyear(arrival));
+		    N_("Game: The %N have launched a spaceship!  "
+		       "It is estimated to arrive on Alpha Centauri in %R."),
+		    pplayer->nation,
+		    textyear_orig(arrival), arrival < 0 ? -arrival : arrival);
 
   send_spaceship_info(pplayer, NULL);
 }
@@ -199,8 +199,8 @@
   int num = packet->num;
   
   if (ship->state == SSHIP_NONE) {
-    notify_player(pplayer, _("Game: Spaceship action received,"
-			     " but you don't have a spaceship!"));
+    notify_player(pplayer, N_("Game: Spaceship action received,"
+			       " but you don't have a spaceship!"));
     return;
   }
   if (action == SSHIP_ACT_LAUNCH) {
@@ -208,8 +208,8 @@
     return;
   }
   if (ship->state >= SSHIP_LAUNCHED) {
-    notify_player(pplayer, _("Game: You can't modify your"
-			     " spaceship after launch!"));
+    notify_player(pplayer, N_("Game: You can't modify your"
+			       " spaceship after launch!"));
     return;
   }
   if (action == SSHIP_ACT_PLACE_STRUCTURAL) {
@@ -217,13 +217,13 @@
       return;
     }
     if (num_spaceship_structurals_placed(ship) >= ship->structurals) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Structurals!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			         " Space Structurals!"));
       return;
     }
     if (num!=0 && !ship->structure[structurals_info[num].required]) {
-      notify_player(pplayer, _("Game: That Space Structural"
-			       " would not be connected!"));
+      notify_player(pplayer, N_("Game: That Space Structural"
+			         " would not be connected!"));
       return;
     }
     ship->structure[num] = TRUE;
@@ -236,13 +236,13 @@
       return;
     }
     if (ship->fuel + ship->propulsion >= ship->components) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Components!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			         " Space Components!"));
       return;
     }
     if (num > NUM_SS_COMPONENTS/2) {
-      notify_player(pplayer, _("Game: Your spaceship already has"
-			       " the maximum number of Fuel Components!"));
+      notify_player(pplayer, N_("Game: Your spaceship already has"
+			         " the maximum number of Fuel Components!"));
       return;
     }
     ship->fuel++;
@@ -255,13 +255,13 @@
       return;
     }
     if (ship->fuel + ship->propulsion >= ship->components) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Components!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			         " Space Components!"));
       return;
     }
     if (num > NUM_SS_COMPONENTS/2) {
-      notify_player(pplayer, _("Game: Your spaceship already has the"
-			       " maximum number of Propulsion Components!"));
+      notify_player(pplayer, N_("Game: Your spaceship already has the"
+			         " maximum number of Propulsion Components!"));
       return;
     }
     ship->propulsion++;
@@ -275,12 +275,12 @@
     }
     if (ship->habitation + ship->life_support + ship->solar_panels
 	>= ship->modules) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Modules!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			         " Space Modules!"));
       return;
     }
     if (num > NUM_SS_MODULES/3) {
-      notify_player(pplayer, _("Game: Your spaceship already has the"
+      notify_player(pplayer, N_("Game: Your spaceship already has the"
 			       " maximum number of Habitation Modules!"));
       return;
     }
@@ -295,13 +295,13 @@
     }
     if (ship->habitation + ship->life_support + ship->solar_panels
 	>= ship->modules) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Modules!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			        " Space Modules!"));
       return;
     }
     if (num > NUM_SS_MODULES/3) {
-      notify_player(pplayer, _("Game: Your spaceship already has the"
-			       " maximum number of Life Support Modules!"));
+      notify_player(pplayer, N_("Game: Your spaceship already has the"
+			         " maximum number of Life Support Modules!"));
       return;
     }
     ship->life_support++;
@@ -315,13 +315,13 @@
     }
     if (ship->habitation + ship->life_support + ship->solar_panels
 	>= ship->modules) {
-      notify_player(pplayer, _("Game: You don't have any unplaced"
-			       " Space Modules!"));
+      notify_player(pplayer, N_("Game: You don't have any unplaced"
+			         " Space Modules!"));
       return;
     }
     if (num > NUM_SS_MODULES/3) {
-      notify_player(pplayer, _("Game: Your spaceship already has the"
-			       " maximum number of Solar Panel Modules!"));
+      notify_player(pplayer, N_("Game: Your spaceship already has the"
+			         " maximum number of Solar Panel Modules!"));
       return;
     }
     ship->solar_panels++;
@@ -339,9 +339,9 @@
 void spaceship_lost(struct player *pplayer)
 {
   notify_player_ex(NULL, -1, -1, E_SPACESHIP,
-		   _("Game: Without guidance from the capital, the %s "
-		     "spaceship is lost!"),
-		   get_nation_name(pplayer->nation));
+		    N_("Game: Without guidance from the capital, the %M "
+		       "spaceship is lost!"),
+		    pplayer->nation);
   spaceship_init(&pplayer->spaceship);
   send_spaceship_info(pplayer, NULL);
 }
@@ -374,9 +374,9 @@
     best_pplayer->spaceship.state = SSHIP_ARRIVED;
     server_state = GAME_OVER_STATE;
     notify_player_ex(NULL, -1, -1, E_SPACESHIP,
-		     _("Game: The %s spaceship has arrived "
-		       "at Alpha Centauri."),
-		     get_nation_name(best_pplayer->nation));
+		      N_("Game: The %M spaceship has arrived "
+		         "at Alpha Centauri."),
+		     best_pplayer->nation);
     gamelog(GAMELOG_NORMAL, _("The %s spaceship has arrived at "
 			      "Alpha Centauri."),
             get_nation_name(best_pplayer->nation));
diff -ur --new-file -Xdiff_ignore freeorig/server/srv_main.c freeciv/server/srv_main.c
--- freeorig/server/srv_main.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/srv_main.c	2003-02-13 15:30:40.000000000 +0100
@@ -199,7 +199,7 @@
   /* quit if we are past the year limit */
   if (game.year > game.end_year) {
     notify_conn(&game.est_connections, 
-       _("Game ended in a draw as end year exceeded"));
+       N_("Game ended in a draw as end year exceeded"));
     gamelog(GAMELOG_NORMAL, _("Game ended in a draw as end year exceeded"));
     return TRUE;
   }
@@ -228,7 +228,7 @@
   team_iterate(pteam) {
     if (team_count_members_alive(pteam->id) == alive) {
       notify_conn(&game.est_connections, 
-          _("Team victory to %s"), pteam->name);
+          N_("Team victory to %S"), pteam->name);
       gamelog(GAMELOG_NORMAL, _("Team victory to %s"), pteam->name);
       gamelog(GAMELOG_TEAM, "TEAMVICTORY %s", pteam->name);
       return TRUE;
@@ -238,13 +238,13 @@
   /* quit if only one player is left alive */
   if (alive == 1) {
     notify_conn(&game.est_connections, 
-        _("Game ended in victory for %s"), victor->name);
+        N_("Game ended in victory for %S"), victor->name);
     gamelog(GAMELOG_NORMAL, _("Game ended in victory for %s"), 
         victor->name);
     gamelog(GAMELOG_TEAM, "SINGLEWINNER %s", victor->name);
     return TRUE;
   } else if (alive == 0) {
-    notify_conn(&game.est_connections, _("Game ended in a draw"));
+    notify_conn(&game.est_connections, N_("Game ended in a draw"));
     gamelog(GAMELOG_NORMAL, _("Game ended in a draw"));
     gamelog(GAMELOG_TEAM, "NOWINNER");
     return TRUE;
@@ -267,7 +267,7 @@
     }
   } players_iterate_end;
   if (all_allied) {
-    notify_conn(&game.est_connections, _("Game ended in allied victory"));
+    notify_conn(&game.est_connections, N_("Game ended in allied victory"));
     gamelog(GAMELOG_NORMAL, _("Game ended in allied victory"));
     gamelog(GAMELOG_TEAM, "ALLIEDVICTORY");
     return TRUE;
@@ -388,16 +388,16 @@
 	switch(--pdiplstate->turns_left) {
 	case 1:
 	  notify_player(player1,
-			_("Game: Concerned citizens point "
-  			  "out that the cease-fire with %s will run out soon."),
-			player2->name);
+			 N_("Game: Concerned citizens point "
+  			  "out that the cease-fire with %S will run out soon."),
+			 player2->name);
   	  break;
   	case -1:
 	  notify_player(player1,
-  			_("Game: The cease-fire with %s has "
-  			  "run out. You are now neutral towards the %s."),
-			player2->name,
-			get_nation_name_plural(player2->nation));
+  			 N_("Game: The cease-fire with %S has "
+  			    "run out. You are now neutral towards the %N."),
+			 player2->name,
+			 player2->nation);
 	  pdiplstate->type = DS_NEUTRAL;
 	  check_city_workers(player1);
 	  check_city_workers(player2);
@@ -650,7 +650,7 @@
     break;
   case REPORT_SERVER_OPTIONS: /* obsolete */
   default:
-    notify_conn(dest, _("Game: request for unknown report (type %d)"), type);
+    notify_conn(dest, N_("Game: request for unknown report (type %d)"), type);
   }
 }
 
@@ -1013,7 +1013,7 @@
   remove_leading_trailing_spaces(packet->name);
 
   if (strlen(packet->name)==0) {
-    notify_player(pplayer, _("Please choose a non-blank name."));
+    notify_player(pplayer, N_("Please choose a non-blank name."));
     send_select_nation(pplayer);
     return;
   }
@@ -1037,16 +1037,16 @@
       if (other_player->player_no != pplayer->player_no
 	  && mystrcasecmp(other_player->name,packet->name) == 0) {
 	notify_player(pplayer,
-		     _("Another player already has the name '%s'.  "
-		       "Please choose another name."), packet->name);
+		       N_("Another player already has the name '%S'.  "
+		          "Please choose another name."), packet->name);
        send_select_nation(pplayer);
        return;
     }
   } players_iterate_end;
 
   notify_conn_ex(&game.est_connections, -1, -1, E_NATION_SELECTED,
-		 _("Game: %s is the %s ruler %s."), pplayer->name,
-		 get_nation_name(packet->nation_no), packet->name);
+		  N_("Game: %S is the %M ruler %S."), pplayer->name,
+		  packet->nation_no, packet->name);
 
   /* inform player his choice was ok */
   lsend_packet_generic_empty(&pplayer->connections,
@@ -1077,7 +1077,7 @@
 	freelog(LOG_NORMAL, _("No nations left: Removing player %s."),
 		other_player->name);
 	notify_player(other_player,
-		      _("Game: Sorry, there are no nations left."));
+		       N_("Game: Sorry, there are no nations left."));
 	server_remove_player(other_player);
       }
     } players_iterate_end;
@@ -1132,8 +1132,8 @@
   conn_list_iterate(game.est_connections, aconn) {
     if (aconn!=pconn) {
       notify_conn(&aconn->self,
-		  _("Game: Connection %s from %s has joined as player %s."),
-		  pconn->name, pconn->addr, pplayer->name);
+		   N_("Game: Connection %S from %S has joined as player %S."),
+		   pconn->name, pconn->addr, pplayer->name);
     }
   }
   conn_list_iterate_end;
@@ -1153,10 +1153,10 @@
   dest = &pconn->self;
   
   if (my_gethostname(hostname, sizeof(hostname))==0) {
-    notify_conn(dest, _("Welcome to the %s Server running at %s port %d."), 
+    notify_conn(dest, N_("Welcome to the %S Server running at %S port %d."), 
 		freeciv_name_version(), hostname, srvarg.port);
   } else {
-    notify_conn(dest, _("Welcome to the %s Server at port %d."),
+    notify_conn(dest, N_("Welcome to the %S Server at port %d."),
 		freeciv_name_version(), srvarg.port);
   }
 
@@ -1167,8 +1167,8 @@
 	  && !cplayer->ai.control
 	  && !cplayer->turn_done
 	  && cplayer != pconn->player) {  /* skip current player */
-	notify_conn(dest, _("Turn-blocking game play: "
-			    "waiting on %s to finish turn..."),
+	notify_conn(dest, N_("Turn-blocking game play: "
+			      "waiting on %S to finish turn..."),
 		    cplayer->name);
       }
     } players_iterate_end;
@@ -1213,8 +1213,8 @@
     freelog(LOG_NORMAL, _("%s has been added as an AI-controlled player."),
 	    name);
     notify_player(NULL,
-		  _("Game: %s has been added as an AI-controlled player."),
-		  name);
+		   N_("Game: %S has been added as an AI-controlled player."),
+		   name);
   }
 
   game.nplayers++;
@@ -1495,7 +1495,7 @@
    */
   conn_list_unlink(&game.est_connections, pconn);
   delayed_disconnect++;
-  notify_conn(&game.est_connections, _("Game: Lost connection: %s."), desc);
+  notify_conn(&game.est_connections, N_("Game: Lost connection: %S."), desc);
 
   if (!pplayer) {
     /* This happens eg if the player has not yet joined properly. */
@@ -1741,8 +1741,8 @@
 
   players_iterate(other_player) {
     notify_player(other_player,
-		  _("Game: %s rules the %s."), pplayer->name,
-		  get_nation_name_plural(pplayer->nation));
+		   N_("Game: %S rules the %N."), pplayer->name,
+		   pplayer->nation);
   } players_iterate_end;
 }
 
@@ -1932,7 +1932,7 @@
     send_game_state(&game.est_connections, CLIENT_GAME_OVER_STATE);
     report_scores(TRUE);
     show_map_to_all();
-    notify_player(NULL, _("Game: The game is over..."));
+    notify_player(NULL, N_("Game: The game is over..."));
     gamelog(GAMELOG_NORMAL, _("The game is over!"));
     if (game.save_nturns > 0) {
       save_game_auto();
diff -ur --new-file -Xdiff_ignore freeorig/server/stdinhand.c freeciv/server/stdinhand.c
--- freeorig/server/stdinhand.c	2003-01-20 16:44:28.000000000 +0100
+++ freeciv/server/stdinhand.c	2003-02-13 15:30:40.000000000 +0100
@@ -1378,7 +1378,7 @@
 			"(?!?)";  /* this case is a bug! */
 
   if (caller) {
-    notify_conn(&caller->self, "/%s: %s%s", cmdname, prefix, line);
+    notify_conn(&caller->self, "/%S: %S%S", cmdname, prefix, line);
     /* cc: to the console - testing has proved it's too verbose - rp
     con_write(rfc_status, "%s/%s: %s%s", caller->name, cmdname, prefix, line);
     */
@@ -1387,7 +1387,7 @@
   }
 
   if (rfc_status == C_OK) {
-    notify_player(NULL, _("Game: %s"), line);
+    notify_player(NULL, _("Game: %S"), line);
   }
 }
 
@@ -1523,7 +1523,7 @@
 {
   server_open_udp();
   if (send_server_info_to_metaserver(TRUE, FALSE)) {
-    notify_player(NULL, _("Open metaserver connection to [%s]."),
+    notify_player(NULL, N_("Open metaserver connection to [%S]."),
 		  meta_addr_port());
   }
 }
@@ -1535,7 +1535,7 @@
 {
   if (send_server_info_to_metaserver(TRUE, TRUE)) {
     server_close_udp();
-    notify_player(NULL, _("Close metaserver connection to [%s]."),
+    notify_player(NULL, _("Close metaserver connection to [%S]."),
 		  meta_addr_port());
   }
 }
@@ -1586,7 +1586,7 @@
     cmd_reply(CMD_METAINFO, caller, C_METAERROR,
 	      _("Not reporting to the metaserver."));
   } else {
-    notify_player(NULL, _("Metaserver infostring set to '%s'."),
+    notify_player(NULL, N_("Metaserver infostring set to '%S'."),
 		  srvarg.metaserver_info_line);
   }
 }
@@ -1601,7 +1601,7 @@
   sz_strlcpy(srvarg.metaserver_addr, arg);
   meta_addr_split();
 
-  notify_player(NULL, _("Metaserver is now [%s]."),
+  notify_player(NULL, N_("Metaserver is now [%S]."),
 		meta_addr_port());
 }
 
@@ -2040,9 +2040,9 @@
 {
   if (first_access_level > default_access_level
       && !first_access_level_is_taken()) {
-    notify_player(NULL, _("Game: Anyone can assume command access level "
-			  "'%s' now by issuing the 'firstlevel' command."),
-		  cmdlevel_name(first_access_level));
+    notify_player(NULL, N_("Game: Anyone can assume command access level "
+			    "'%S' now by issuing the 'firstlevel' command."),
+		   cmdlevel_name(first_access_level));
   }
 }
 
@@ -2401,7 +2401,7 @@
 static void wall(char *str)
 {
   notify_conn_ex(&game.game_connections, -1, -1, E_MESSAGE_WALL,
-		 _("Server Operator: %s"), str);
+		  N_("Server Operator: %S"), str);
 }
   
 /******************************************************************
@@ -2856,7 +2856,7 @@
   }
 
   if (strlen(buffer) > 0 && sset_is_to_client(cmd)) {
-    notify_player(NULL, "%s", buffer);
+    notify_player(NULL, "%S", buffer);
   }
 
   if (do_update) {
@@ -3164,8 +3164,8 @@
      * use command,arg instead of str because of the trailing
      * newline in str when it comes from the server command line
      */
-    notify_player(NULL, "%s: '%s %s'",
-      caller ? caller->name : _("(server prompt)"), command, arg);
+    notify_player(NULL, caller? "%S: '%S %S'" : "%s: '%S %S'",
+      caller ? caller->name : N_("(server prompt)"), command, arg);
   }
 
   switch(cmd) {
@@ -3312,8 +3312,9 @@
       } else {
         conn_list_iterate(game.est_connections, pconn) {
           if (!pconn->player) {
-            notify_conn(&pconn->self, _("You're not associated with a player "
-                                        "and the game is starting. Bye."));
+            notify_conn(&pconn->self, 
+	                 N_("You're not associated with a player "
+                            "and the game is starting. Bye."));
             close_connection(pconn);
           }
         } conn_list_iterate_end;
diff -ur --new-file -Xdiff_ignore freeorig/server/unithand.c freeciv/server/unithand.c
--- freeorig/server/unithand.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/unithand.c	2003-02-13 16:34:15.000000000 +0100
@@ -164,8 +164,8 @@
 
   if (to_unittype == -1) {
     notify_player(pplayer,
-		  _("Game: Illegal packet, can't upgrade %s (yet)."),
-                  unit_types[from_unittype].name);
+		  N_("Game: Illegal packet, can't upgrade %s (yet)."),
+                  unit_name_orig(from_unittype));
   } else {
     const int cost = unit_upgrade_price(pplayer, from_unittype, to_unittype);
     int number_of_upgraded_units = 0;
@@ -196,13 +196,14 @@
 
     /* Alert the player about what happened. */
     if (number_of_upgraded_units > 0) {
-      notify_player(pplayer, _("Game: %d %s upgraded to %s for %d gold."),
-                    number_of_upgraded_units, unit_types[from_unittype].name,
-                    unit_types[to_unittype].name,
+      notify_player(pplayer, N_("Game: %d %s upgraded to %s for %d gold."),
+                    number_of_upgraded_units,
+		    unit_name_orig(from_unittype),
+                    unit_name_orig(to_unittype),
                     cost * number_of_upgraded_units);
       send_player_info(pplayer, pplayer);
     } else {
-      notify_player(pplayer, _("Game: No units could be upgraded."));
+      notify_player(pplayer, N_("Game: No units could be upgraded."));
     }
   }
 }
@@ -224,26 +225,29 @@
   }
 
   if(!same_pos(punit->x, punit->y, pcity->x, pcity->y))  {
-    notify_player(pplayer, _("Game: Illegal move, unit not in city!"));
+    notify_player(pplayer, N_("Game: Illegal move, unit not in city!"));
     return;
   }
   from_unit = punit->type;
   if((to_unit=can_upgrade_unittype(pplayer, punit->type)) == -1) {
-    notify_player(pplayer, _("Game: Illegal package, can't upgrade %s (yet)."), 
-		  unit_type(punit)->name);
+    notify_player(pplayer, 
+                  N_("Game: Illegal package, can't upgrade %s (yet)."), 
+		  unit_name_orig(punit->type));
     return;
   }
   cost = unit_upgrade_price(pplayer, punit->type, to_unit);
   if(cost > pplayer->economic.gold) {
-    notify_player(pplayer, _("Game: Insufficient funds, upgrade costs %d."),
+    notify_player(pplayer, N_("Game: Insufficient funds, upgrade costs %d."),
 		  cost);
     return;
   }
   pplayer->economic.gold -= cost;
   upgrade_unit(punit, to_unit);
   send_player_info(pplayer, pplayer);
-  notify_player(pplayer, _("Game: %s upgraded to %s for %d gold."), 
-		unit_name(from_unit), unit_name(to_unit), cost);
+  notify_player(pplayer, N_("Game: %s upgraded to %s for %d gold."), 
+		unit_name_orig(from_unit),
+		unit_name_orig(to_unit),
+		cost);
 }
 
 
@@ -460,70 +464,71 @@
   switch (res) {
   case AB_NOT_BUILD_LOC:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: Can't place city here."));
+		      N_("Game: Can't place city here."));
     break;
   case AB_NOT_BUILD_UNIT:
     {
-      const char *us = get_units_with_flag_string(F_CITIES);
-      if (us) {
+      if (num_role_units(F_CITIES) > 0) {
 	notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-			 _("Game: Only %s can build a city."),
-			 us);
-	free((void *) us);
+			  N_("Game: Only %F can build a city."),
+			  F_CITIES);
       } else {
 	notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-			 _("Game: Can't build a city."));
+			  N_("Game: Can't build a city."));
       }
     }
     break;
   case AB_NOT_ADDABLE_UNIT:
     {
-      const char *us = get_units_with_flag_string(F_ADD_TO_CITY);
-      if (us) {
+      if (num_role_units(F_ADD_TO_CITY) > 0) {
 	notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-			 _("Game: Only %s can add to a city."),
-			 us);
-	free((void *) us);
+			  N_("Game: Only %F can add to a city."),
+			  F_ADD_TO_CITY);
       } else {
 	notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-			 _("Game: Can't add to a city."));
+			  N_("Game: Can't add to a city."));
       }
     }
     break;
   case AB_NO_MOVES_ADD:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: %s unit has no moves left to add to %s."),
-		     unit_name, pcity->name);
+		     N_("Game: %s unit has no moves left to add to %S."),
+		     unit_name_orig(punit->type),
+		     pcity->name);
     break;
   case AB_NO_MOVES_BUILD:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: %s unit has no moves left to build city."),
-		     unit_name);
+		     N_("Game: %s unit has no moves left to build city."),
+		     unit_name_orig(punit->type));
     break;
   case AB_TOO_BIG:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: %s is too big to add %s."),
-		     pcity->name, unit_name);
+		     N_("Game: %S is too big to add %s."),
+		     pcity->name, 
+		     unit_name_orig(punit->type));
     break;
   case AB_NO_AQUEDUCT:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: %s needs %s to grow, so you cannot add %s."),
-		     pcity->name, get_improvement_name(B_AQUEDUCT),
-		     unit_name);
+		      N_("Game: %S needs %s to grow, so you cannot add %s."),
+		      pcity->name, 
+		      get_improvement_name_orig(B_AQUEDUCT),
+		      unit_name_orig(punit->type));
     break;
   case AB_NO_SEWER:
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: %s needs %s to grow, so you cannot add %s."),
-		     pcity->name, get_improvement_name(B_SEWER),
-		     unit_name);
+		      N_("Game: %S needs %s to grow, so you cannot add %s."),
+		      pcity->name, 
+		      get_improvement_name_orig(B_SEWER),
+		      unit_name_orig(punit->type));
     break;
   default:
     /* Shouldn't happen */
     freelog(LOG_ERROR, "Cannot add %s to %s for unknown reason",
 	    unit_name, pcity->name);
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: Can't add %s to %s."),
-		     unit_name, pcity->name);
+		      N_("Game: Can't add %s to %S."),
+		      unit_name_orig(punit->type),
+		      pcity->name);
     break;
   }
 }
@@ -536,7 +541,6 @@
 static void city_add_unit(struct player *pplayer, struct unit *punit)
 {
   struct city *pcity = map_get_city(punit->x, punit->y);
-  char *unit_name = unit_type(punit)->name;
 
   assert(unit_pop_value(punit->type) > 0);
   pcity->size += unit_pop_value(punit->type);
@@ -544,8 +548,9 @@
   wipe_unit(punit);
   send_city_info(NULL, pcity);
   notify_player_ex(pplayer, pcity->x, pcity->y, E_NOEVENT,
-		   _("Game: %s added to aid %s in growing."),
-		   unit_name, pcity->name);
+		    N_("Game: %s added to aid %S in growing."),
+		    unit_name_orig(punit->type),
+		    pcity->name);
 }
 
 /**************************************************************************
@@ -559,8 +564,8 @@
 {
   if (!is_sane_name(name)) {
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: Let's not build a city with "
-		       "such a stupid name."));
+		      N_("Game: Let's not build a city with "
+		         "such a stupid name."));
     return;
   }
 
@@ -696,11 +701,11 @@
     packet.y=def_y;
     if ((pcity=sdi_defense_close(unit_owner(punit), def_x, def_y))) {
       notify_player_ex(pplayer, punit->x, punit->y, E_UNIT_LOST_ATT,
-		       _("Game: Your Nuclear missile was shot down by"
-			 " SDI defences, what a waste."));
+		        N_("Game: Your Nuclear missile was shot down by"
+			   " SDI defences, what a waste."));
       notify_player_ex(city_owner(pcity), def_x, def_y, E_UNIT_WIN,
-		       _("Game: The nuclear attack on %s was avoided by"
-			 " your SDI defense."), pcity->name);
+		        N_("Game: The nuclear attack on %S was avoided by"
+			   " your SDI defense."), pcity->name);
       wipe_unit(punit);
       return;
     } 
@@ -800,21 +805,21 @@
 
     notify_player_ex(unit_owner(pwinner),
 		     pwinner->x, pwinner->y, E_UNIT_WIN,
-		     _("Game: Your %s%s survived the pathetic attack"
-		       " from %s's %s."),
-		     unit_name(pwinner->type),
-		     get_location_str_in(unit_owner(pwinner),
-					 pwinner->x, pwinner->y),
-		     unit_owner(plooser)->name, unit_name(plooser->type));
+		     N_("Game: Your %s%L survived the pathetic attack"
+		       " from %S's %s."),
+		     unit_name_orig(pwinner->type),
+                     pwinner->x, pwinner->y,
+		     unit_owner(plooser)->name, 
+		     unit_name_orig(plooser->type));
     
     notify_player_ex(unit_owner(plooser),
 		     def_x, def_y, E_UNIT_LOST_ATT,
-		     _("Game: Your attacking %s failed "
-		       "against %s's %s%s!"),
-		     unit_name(plooser->type), unit_owner(pwinner)->name,
-		     unit_name(pwinner->type),
-		     get_location_str_at(unit_owner(plooser),
-					 pwinner->x, pwinner->y));
+		     N_("Game: Your attacking %s failed "
+		       "against %S's %s%A!"),
+		     unit_name_orig(plooser->type),
+		     unit_owner(pwinner)->name,
+		     unit_name_orig(pwinner->type),
+                     pwinner->x, pwinner->y);
     wipe_unit(plooser);
   } else {
     /* The defender lost, the attacker punit lives! */
@@ -826,11 +831,12 @@
 
     notify_player_ex(unit_owner(pwinner), punit->x, punit->y,
 		     E_UNIT_WIN_ATT,
-		     _("Game: Your attacking %s succeeded"
-		       " against %s's %s%s!"), unit_name(pwinner->type),
-		     unit_owner(plooser)->name, unit_name(plooser->type),
-		     get_location_str_at(unit_owner(pwinner), plooser->x,
-					 plooser->y));
+		     N_("Game: Your attacking %s succeeded"
+		       " against %S's %s%A!"),
+		     unit_name_orig(pwinner->type),
+		     unit_owner(plooser)->name,
+		     unit_name_orig(plooser->type),
+		     plooser->x, plooser->y);
     kill_unit(pwinner, plooser);
                /* no longer pplayer - want better msgs -- Syela */
   }
@@ -877,7 +883,8 @@
 static void how_to_declare_war(struct player *pplayer)
 {
   notify_player_ex(pplayer, -1, -1, E_NOEVENT,
-		   _("Game: Cancel treaty in the players dialog first (F3)."));
+		    N_("Game: Cancel treaty in "
+		       "the players dialog first (F3)."));
 }
 
 /**************************************************************************
@@ -897,24 +904,23 @@
     return TRUE;
 
   if (reason == MR_BAD_TYPE_FOR_CITY_TAKE_OVER) {
-    const char *units_str = get_units_with_flag_string(F_MARINES);
-    if (units_str) {
+    if (num_role_units(F_MARINES) > 0) {
       notify_player_ex(unit_owner(punit), src_x, src_y,
-		       E_NOEVENT, _("Game: Only %s can attack from sea."),
-		       units_str);
-      free((void *) units_str);
+		        E_NOEVENT, N_("Game: Only %F can attack from sea."),
+		        F_MARINES);
     } else {
       notify_player_ex(unit_owner(punit), src_x, src_y,
-		       E_NOEVENT, _("Game: Cannot attack from sea."));
+		        E_NOEVENT, N_("Game: Cannot attack from sea."));
     }
   } else if (reason == MR_NO_WAR) {
     notify_player_ex(unit_owner(punit), src_x, src_y,
-		     E_NOEVENT,
-		     _("Game: Cannot attack unless you declare war first."));
+		      E_NOEVENT,
+		      N_("Game: Cannot attack unless you declare war first."));
   } else if (reason == MR_ZOC) {
     notify_player_ex(unit_owner(punit), src_x, src_y, E_NOEVENT,
-		     _("Game: %s can only move into your own zone of control."),
-		     unit_type(punit)->name);
+		     N_("Game: %s can only move into "
+		        "your own zone of control."),
+		     unit_name_orig(punit->type));
   }
   return FALSE;
 }
@@ -997,9 +1003,9 @@
     } else if (!can_unit_move_to_tile(punit, dest_x, dest_y, igzoc)) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
 		       is_ocean(map_get_terrain(punit->x, punit->y))
-		       ? _("Game: Unit must be on land to "
+		       ? N_("Game: Unit must be on land to "
 			   "perform diplomatic action.")
-		       : _("Game: No diplomat action possible."));
+		       : N_("Game: No diplomat action possible."));
       return FALSE;
     }
   }
@@ -1009,24 +1015,24 @@
       && pplayers_at_war(unit_owner(punit), unit_owner(pdefender))) {
     if (pcity && !pplayers_at_war(city_owner(pcity), unit_owner(punit))) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		       _("Game: Can't attack %s's unit in the city of %s "
-			 "because you are not at war with %s."),
-		       unit_owner(pdefender)->name,
-		       pcity->name,
-		       city_owner(pcity)->name);
+		        N_("Game: Can't attack %S's unit in the city of %S "
+			 "because you are not at war with %S."),
+		        unit_owner(pdefender)->name,
+		        pcity->name,
+		        city_owner(pcity)->name);
       how_to_declare_war(pplayer);
       return FALSE;
     }
 
     if (!can_unit_attack_tile(punit, dest_x , dest_y)) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-  		       _("Game: You can't attack there."));
+  		        N_("Game: You can't attack there."));
       return FALSE;
     }
  
     if (punit->moves_left<=0)  {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
- 		       _("Game: This unit has no moves left."));
+ 		        N_("Game: This unit has no moves left."));
       return FALSE;
     }
 
@@ -1036,8 +1042,9 @@
     if (punit->activity == ACTIVITY_GOTO && 
         !same_pos(punit->goto_dest_x, punit->goto_dest_y, dest_x, dest_y)) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
- 		       _("Game: %s aborted GOTO as there are units in the way."),
- 		       unit_type(punit)->name);
+ 		       N_("Game: %s aborted GOTO as there are "
+			  "units in the way."),
+ 		       unit_name_orig(punit->type));
       return FALSE;
     }
  
@@ -1050,8 +1057,8 @@
   pdefender = is_non_allied_unit_tile(pdesttile, unit_owner(punit));
   if (pdefender) {
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: No war declared against %s, cannot attack."),
-		     unit_owner(pdefender)->name);
+		      N_("Game: No war declared against %S, cannot attack."),
+		      unit_owner(pdefender)->name);
     how_to_declare_war(pplayer);
     return FALSE;
   }
@@ -1061,15 +1068,15 @@
   if (pcity && !pplayers_allied(city_owner(pcity), unit_owner(punit))) {
     if (is_air_unit(punit) || !is_military_unit(punit) || is_sailing_unit(punit)) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		       _("Game: Only ground troops can take over "
-			 "a city."));
+		        N_("Game: Only ground troops can take over "
+			   "a city."));
       return FALSE;
     }
 
     if (!pplayers_at_war(city_owner(pcity), unit_owner(punit))) {
       notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		       _("Game: No war declared against %s, cannot take "
-			 "over city."), city_owner(pcity)->name);
+		        N_("Game: No war declared against %S, cannot take "
+			   "over city."), city_owner(pcity)->name);
       how_to_declare_war(pplayer);
       return FALSE;
     }
@@ -1118,9 +1125,10 @@
 
   conn_list_do_buffer(&pplayer->connections);
   notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		   _("Game: Your %s helps build the %s in %s (%d remaining)."), 
-		   unit_name(punit->type),
-		   get_improvement_type(pcity_dest->currently_building)->name,
+                   N_("Game: "
+		      "Your %s helps build the %s in %S (%d remaining)."), 
+		   unit_name_orig(punit->type),
+		   get_improvement_name_orig(pcity_dest->currently_building),
 		   pcity_dest->name, 
 		   build_points_left(pcity_dest));
 
@@ -1160,29 +1168,32 @@
   if (!can_establish_trade_route(pcity_homecity, pcity_dest)) {
     int i;
     notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		     _("Game: Sorry, your %s cannot establish"
-		       " a trade route here!"),
-		     unit_name(punit->type));
+		     N_("Game: Sorry, your %s cannot establish"
+		        " a trade route here!"),
+		     unit_name_orig(punit->type));
     for (i = 0; i < NUM_TRADEROUTES; i++) {
       if (pcity_homecity->trade[i]==pcity_dest->id) {
 	notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		      _("      A traderoute already exists between %s and %s!"),
+		      N_("Game: "
+		         "A traderoute already exists between %S and %S!"),
 		      pcity_homecity->name, pcity_dest->name);
 	return FALSE;
       }
     }
     if (city_num_trade_routes(pcity_homecity) == NUM_TRADEROUTES) {
       notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		       _("      The city of %s already has %d "
-			 "trade routes!"), pcity_homecity->name,
-		       NUM_TRADEROUTES);
+		        N_("Game: "
+			   "The city of %S already has %d "
+			   "trade routes!"), 
+			pcity_homecity->name,
+		        NUM_TRADEROUTES);
       return FALSE;
     }
     if (city_num_trade_routes(pcity_dest) == NUM_TRADEROUTES) {
       notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		       _("      The city of %s already has %d "
+		        N_("Game: The city of %S already has %d "
 			 "trade routes!"), pcity_dest->name,
-		       NUM_TRADEROUTES);
+		        NUM_TRADEROUTES);
       return FALSE;
     }
     return FALSE;
@@ -1191,10 +1202,12 @@
   revenue = establish_trade_route(pcity_homecity, pcity_dest);
   conn_list_do_buffer(&pplayer->connections);
   notify_player_ex(pplayer, pcity_dest->x, pcity_dest->y, E_NOEVENT,
-		   _("Game: Your %s from %s has arrived in %s,"
-		   " and revenues amount to %d in gold and research."), 
-		   unit_name(punit->type), pcity_homecity->name,
-		   pcity_dest->name, revenue);
+		   N_("Game: Your %s from %S has arrived in %S,"
+		      " and revenues amount to %d in gold and research."), 
+		   unit_name_orig(punit->type),
+		   pcity_homecity->name,
+		   pcity_dest->name,
+		   revenue);
   wipe_unit(punit);
   pplayer->economic.gold+=revenue;
   update_tech(pplayer, revenue);
diff -ur --new-file -Xdiff_ignore freeorig/server/unittools.c freeciv/server/unittools.c
--- freeorig/server/unittools.c	2003-02-13 07:41:32.000000000 +0100
+++ freeciv/server/unittools.c	2003-02-13 16:46:15.000000000 +0100
@@ -323,11 +323,11 @@
     if (leonardo_variant != 0 || i == candidate_to_upgrade) {
       upgrade_type=can_upgrade_unittype(pplayer, punit->type);
       notify_player(pplayer,
-            _("Game: %s has upgraded %s to %s%s."),
-            improvement_types[B_LEONARDO].name,
-            unit_type(punit)->name,
-            get_unit_type(upgrade_type)->name,
-            get_location_str_in(pplayer, punit->x, punit->y));
+            N_("Game: %s has upgraded %s to %s%L."),
+            get_improvement_name_orig(B_LEONARDO),
+            unit_name_orig(punit->type),
+            unit_name_orig(upgrade_type),
+            punit->x, punit->y);
       punit->veteran = FALSE;
       upgrade_unit(punit, upgrade_type);
     }
@@ -482,8 +482,8 @@
 	 but if any other units get 0 hp somehow, catch
 	 them too.  --dwp  */
       notify_player_ex(pplayer, punit->x, punit->y, E_UNIT_LOST, 
-          _("Game: Your %s has run out of hit points."), 
-          unit_name(punit->type));
+          N_("Game: Your %s has run out of hit points."), 
+          punit->type);
       gamelog(GAMELOG_UNITF, _("%s lose a %s (out of hp)"),
 	      get_nation_name_plural(pplayer->nation),
 	      unit_name(punit->type));
@@ -495,8 +495,8 @@
     if (unit_flag(punit, F_TRIREME)
 	&& myrand(100) < trireme_loss_pct(pplayer, punit->x, punit->y)) {
       notify_player_ex(pplayer, punit->x, punit->y, E_UNIT_LOST, 
-		       _("Game: Your %s has been lost on the high seas."),
-		       unit_name(punit->type));
+		       N_("Game: Your %s has been lost on the high seas."),
+		       unit_name_orig(punit->type));
       gamelog(GAMELOG_UNITTRI, _("%s Trireme lost at sea"),
 	      get_nation_name_plural(pplayer->nation));
       wipe_unit_safe(punit, &myiter);
@@ -525,8 +525,8 @@
 	    set_unit_activity(punit, ACTIVITY_GOTO);
 	    (void) do_unit_goto(punit, GOTO_MOVE_ANY, FALSE);
 	    notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT, 
-			     _("Game: Your %s has returned to refuel."),
-			     unit_name(punit->type));
+			     N_("Game: Your %s has returned to refuel."),
+			     unit_name_orig(punit->type));
 	    goto OUT;
 	  }
 	} iterate_outward_end;
@@ -550,8 +550,8 @@
   unit_list_iterate(pplayer->units, punit) {
     if (is_air_unit(punit) && punit->fuel<=0) {
       notify_player_ex(pplayer, punit->x, punit->y, E_UNIT_LOST, 
-		       _("Game: Your %s has run out of fuel."),
-		       unit_name(punit->type));
+		       N_("Game: Your %s has run out of fuel."),
+		       unit_name_orig(punit->type));
       gamelog(GAMELOG_UNITF, _("%s lose a %s (fuel)"),
 	      get_nation_name_plural(pplayer->nation),
 	      unit_name(punit->type));
@@ -988,9 +988,10 @@
 		    punit2->x, punit2->y);
 	    notify_player_ex(unit_owner(punit2),
 			     punit2->x, punit2->y, E_UNIT_RELOCATED,
-			     _("Game: Moved your %s due to changing"
-			       " land to sea at (%d, %d)."),
-			     unit_name(punit2->type), punit2->x, punit2->y);
+			     N_("Game: Moved your %s due to changing"
+			        " land to sea at (%d, %d)."),
+			     unit_name_orig(punit2->type),
+			     punit2->x, punit2->y);
 	    (void) move_unit(punit2, x, y, TRUE, FALSE, 0);
 	    if (punit2->activity == ACTIVITY_SENTRY)
 	      handle_unit_activity_request(punit2, ACTIVITY_IDLE);
@@ -1011,9 +1012,10 @@
 		    punit2->x, punit2->y);
 	    notify_player_ex(unit_owner(punit2),
 			     punit2->x, punit2->y, E_UNIT_RELOCATED,
-			     _("Game: Embarked your %s due to changing"
-			       " land to sea at (%d, %d)."),
-			     unit_name(punit2->type), punit2->x, punit2->y);
+			     N_("Game: Embarked your %s due to changing"
+			        " land to sea at (%d, %d)."),
+			     unit_name_orig(punit2->type),
+			     punit2->x, punit2->y);
 	    (void) move_unit(punit2, x, y, TRUE, FALSE, 0);
 	    if (punit2->activity == ACTIVITY_SENTRY)
 	      handle_unit_activity_request(punit2, ACTIVITY_IDLE);
@@ -1027,9 +1029,10 @@
 		punit2->x, punit2->y);
 	notify_player_ex(unit_owner(punit2),
 			 punit2->x, punit2->y, E_UNIT_LOST,
-			 _("Game: Disbanded your %s due to changing"
-			   " land to sea at (%d, %d)."),
-			 unit_name(punit2->type), punit2->x, punit2->y);
+			 N_("Game: Disbanded your %s due to changing"
+			    " land to sea at (%d, %d)."),
+			 unit_name_orig(punit2->type),
+			 punit2->x, punit2->y);
 	wipe_unit_spec_safe(punit2, NULL, FALSE);
 	goto START;
       }
@@ -1051,9 +1054,10 @@
 		    punit2->x, punit2->y);
 	    notify_player_ex(unit_owner(punit2),
 			  punit2->x, punit2->y, E_UNIT_RELOCATED,
-			  _("Game: Moved your %s due to changing"
+			  N_("Game: Moved your %s due to changing"
 			    " sea to land at (%d, %d)."),
-			  unit_name(punit2->type), punit2->x, punit2->y);
+			  unit_name_orig(punit2->type),
+			  punit2->x, punit2->y);
 	    (void) move_unit(punit2, x, y, TRUE, TRUE, 0);
 	    if (punit2->activity == ACTIVITY_SENTRY)
 	      handle_unit_activity_request(punit2, ACTIVITY_IDLE);
@@ -1073,9 +1077,10 @@
 		    punit2->x, punit2->y);
 	    notify_player_ex(unit_owner(punit2),
 			     punit2->x, punit2->y, E_UNIT_RELOCATED,
-			     _("Game: Docked your %s due to changing"
-			       " sea to land at (%d, %d)."),
-			     unit_name(punit2->type), punit2->x, punit2->y);
+			     N_("Game: Docked your %s due to changing"
+			        " sea to land at (%d, %d)."),
+			     unit_name_orig(punit2->type),
+			     punit2->x, punit2->y);
 	    (void) move_unit(punit2, x, y, TRUE, TRUE, 0);
 	    if (punit2->activity == ACTIVITY_SENTRY)
 	      handle_unit_activity_request(punit2, ACTIVITY_IDLE);
@@ -1088,10 +1093,10 @@
 		unit_owner(punit2)->name, unit_name(punit2->type),
 		punit2->x, punit2->y);
 	notify_player_ex(unit_owner(punit2),
-			 punit2->x, punit2->y, E_UNIT_LOST,
-			 _("Game: Disbanded your %s due to changing"
-			   " sea to land at (%d, %d)."),
-			 unit_name(punit2->type), punit2->x, punit2->y);
+			  punit2->x, punit2->y, E_UNIT_LOST,
+			  N_("Game: Disbanded your %s due to changing"
+			    " sea to land at (%d, %d)."),
+			  punit2->type, punit2->x, punit2->y);
 	wipe_unit_spec_safe(punit2, NULL, FALSE);
 	goto START;
       }
@@ -1100,64 +1105,6 @@
   }
 }
 
-/**************************************************************************
-  Returns a pointer to a (static) string which gives an informational
-  message about location (x,y), in terms of cities known by pplayer.
-  One of:
-    "in Foo City"  or  "at Foo City" (see below)
-    "outside Foo City"
-    "near Foo City"
-    "" (if no cities known)
-  There are two variants for the first case, one when something happens
-  inside the city, otherwise when it happens "at" but "outside" the city.
-  Eg, when an attacker fails, the attacker dies "at" the city, but
-  not "in" the city (since the attacker never made it in).
-  Don't call this function directly; use the wrappers below.
-**************************************************************************/
-static char *get_location_str(struct player *pplayer, int x, int y, bool use_at)
-{
-  static char buffer[MAX_LEN_NAME+64];
-  struct city *incity, *nearcity;
-
-  incity = map_get_city(x, y);
-  if (incity) {
-    if (use_at) {
-      my_snprintf(buffer, sizeof(buffer), _(" at %s"), incity->name);
-    } else {
-      my_snprintf(buffer, sizeof(buffer), _(" in %s"), incity->name);
-    }
-  } else {
-    nearcity = dist_nearest_city(pplayer, x, y, FALSE, FALSE);
-    if (nearcity) {
-      if (is_tiles_adjacent(x, y, nearcity->x, nearcity->y)) {
-	my_snprintf(buffer, sizeof(buffer),
-		   _(" outside %s"), nearcity->name);
-      } else {
-	my_snprintf(buffer, sizeof(buffer),
-		    _(" near %s"), nearcity->name);
-      }
-    } else {
-      buffer[0] = '\0';
-    }
-  }
-  return buffer;
-}
-
-/**************************************************************************
-  See get_location_str() above.
-**************************************************************************/
-char *get_location_str_in(struct player *pplayer, int x, int y)
-{
-  return get_location_str(pplayer, x, y, FALSE);
-}
-
-/**************************************************************************
-  See get_location_str() above.
-**************************************************************************/
-char *get_location_str_at(struct player *pplayer, int x, int y)
-{
-  return get_location_str(pplayer, x, y, TRUE);
-}
 
 /**************************************************************************
 ...
@@ -1339,8 +1286,9 @@
 	  punit->x, punit->y);
   if (verbose) {
     notify_player(unit_owner(punit),
-		  _("Game: Disbanded your %s at (%d, %d)."),
-		  unit_name(punit->type), punit->x, punit->y);
+		  N_("Game: Disbanded your %s at (%d, %d)."),
+		  unit_name_orig(punit->type),
+		  punit->x, punit->y);
   }
   wipe_unit(punit);
 }
@@ -1363,8 +1311,9 @@
 	    src_x, src_y, pcity->name);
     if (verbose) {
       notify_player(unit_owner(punit),
-		    _("Game: Teleported your %s from (%d, %d) to %s."),
-		    unit_name(punit->type), src_x, src_y, pcity->name);
+		    N_("Game: Teleported your %s from (%d, %d) to %S."),
+		    unit_name_orig(punit->type),
+		    src_x, src_y, pcity->name);
     }
 
     if (move_cost == -1)
@@ -1762,9 +1711,9 @@
 	  ITERATOR_NEXT((*iter));
 	}
 	notify_player_ex(unit_owner(punit), x, y, E_UNIT_LOST,
-			 _("Game: %s lost when %s was lost."),
-			 unit_type(pcargo)->name,
-			 unit_type(punit)->name);
+			 N_("Game: %s lost when %s was lost."),
+			 unit_name_orig(pcargo->type),
+			 unit_name_orig(punit->type));
 	gamelog(GAMELOG_UNITL, _("%s lose %s when %s lost"),
 		get_nation_name_plural(unit_owner(punit)->nation),
 		unit_type(pcargo)->name, unit_type(punit)->name);
@@ -1803,7 +1752,8 @@
   struct city   *incity    = map_get_city(punit->x, punit->y);
   struct player *pplayer   = unit_owner(punit);
   struct player *destroyer = unit_owner(pkiller);
-  char *loc_str = get_location_str_in(pplayer, punit->x, punit->y);
+  int loc_x = punit->x;
+  int loc_y = punit->y;
   int num_killed[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS];
   int ransom, unitcount = 0;
   
@@ -1813,7 +1763,8 @@
       && (is_ground_unit(pkiller) || is_heli_unit(pkiller)) ) {
     ransom = (pplayer->economic.gold >= 100)?100:pplayer->economic.gold;
     notify_player_ex(destroyer, pkiller->x, pkiller->y, E_UNIT_WIN_ATT,
-		     _("Game: Barbarian leader captured, %d gold ransom paid."),
+		     N_(
+		      "Game: Barbarian leader captured, %d gold ransom paid."),
                      ransom);
     destroyer->economic.gold += ransom;
     pplayer->economic.gold -= ransom;
@@ -1833,9 +1784,11 @@
       map_has_special(punit->x, punit->y, S_AIRBASE) ||
       unitcount == 1) {
     notify_player_ex(pplayer, punit->x, punit->y, E_UNIT_LOST,
-		     _("Game: %s lost to an attack by %s's %s%s."),
-		     unit_type(punit)->name, destroyer->name,
-		     unit_name(pkiller->type), loc_str);
+		     N_("Game: %s lost to an attack by %S's %s%L."),
+		     unit_name_orig(punit->type),
+		     destroyer->name,
+		     unit_name_orig(pkiller->type),
+		     loc_x, loc_y);
     gamelog(GAMELOG_UNITL, _("%s lose %s to the %s"),
 	    get_nation_name_plural(pplayer->nation), unit_type(punit)->name,
 	    get_nation_name_plural(destroyer->nation));
@@ -1861,13 +1814,15 @@
     for (i = 0; i<MAX_NUM_PLAYERS+MAX_NUM_BARBARIANS; i++) {
       if (num_killed[i]>0) {
 	notify_player_ex(get_player(i), punit->x, punit->y, E_UNIT_LOST,
-			 PL_("Game: You lost %d unit to an attack "
-			     "from %s's %s%s.",
+	                 N_("Game: %P."),
+			 NPL_("Game: You lost %d unit to an attack "
+			     "from %S's %s%L.",
 			     "Game: You lost %d units to an attack "
-			     "from %s's %s%s.",
+			     "from %S's %s%L.",
 			     num_killed[i]), num_killed[i],
-			 destroyer->name, unit_name(pkiller->type),
-			 loc_str);
+			 destroyer->name,
+			 unit_name_orig(pkiller->type),
+			 loc_x, loc_y);
       }
     }
 
@@ -1876,10 +1831,11 @@
       if (pplayers_at_war(unit_owner(pkiller), unit_owner(punit2))) {
 	notify_player_ex(unit_owner(punit2), 
 			 punit2->x, punit2->y, E_UNIT_LOST,
-			 _("Game: %s lost to an attack"
-			   " from %s's %s."),
-			 unit_type(punit2)->name, destroyer->name,
-			 unit_name(pkiller->type));
+			 N_("Game: %s lost to an attack"
+			   " from %S's %s."),
+			 unit_name_orig(punit2->type),
+			 destroyer->name,
+			 unit_name_orig(pkiller->type));
 	gamelog(GAMELOG_UNITL, _("%s lose %s to the %s"),
 		get_nation_name_plural(unit_owner(punit2)->nation),
 		unit_type(punit2)->name,
@@ -1961,7 +1917,7 @@
 							    x, y));
     bool outside_city =
 	((pplayer && pplayers_allied(unit_owner(punit), pplayer))
-	 || (!map_get_city(punit->x, punit->y) || !map_get_city(x, y)));
+	 || (!map_get_city(punit->x, punit->y) && !map_get_city(x, y)));
 
     if (!pplayer && !pconn->observer) {
       continue;
@@ -2052,33 +2008,41 @@
   struct city *pcity = map_get_city(x, y);
 
   unit_list_iterate(map_get_tile(x, y)->units, punit) {
-    notify_player_ex(unit_owner(punit),
-		     x, y, E_UNIT_LOST,
-		     _("Game: Your %s was nuked by %s."),
-		     unit_name(punit->type),
-		     pplayer == unit_owner(punit) ? _("yourself") : pplayer->name);
-    if (unit_owner(punit) != pplayer) {
+    if (pplayer == unit_owner(punit)) {
+      notify_player_ex(unit_owner(punit),
+                       x, y, E_UNIT_LOST,
+                       N_("Game: Your %s was nuked by yourself."),
+		       unit_name_orig(punit->type));
+    } else {
+      notify_player_ex(unit_owner(punit),
+                       x, y, E_UNIT_LOST,
+		       N_("Game: Your %s was nuked by %S."),
+		       unit_name_orig(punit->type),
+		       pplayer->name);
       notify_player_ex(pplayer,
 		       x, y, E_UNIT_WIN,
-		       _("Game: %s's %s was nuked."),
+		       N_("Game: %S's %s was nuked."),
 		       unit_owner(punit)->name,
-		       unit_name(punit->type));
+		       unit_name_orig(punit->type));
     }
     wipe_unit_spec_safe(punit, NULL, FALSE);
   } unit_list_iterate_end;
 
   if (pcity) {
-    notify_player_ex(city_owner(pcity),
-		     x, y, E_CITY_NUKED,
-		     _("Game: %s was nuked by %s."),
-		     pcity->name,
-		     pplayer == city_owner(pcity) ? _("yourself") : pplayer->name);
-
     if (city_owner(pcity) != pplayer) {
       notify_player_ex(pplayer,
-		       x, y, E_CITY_NUKED,
-		       _("Game: You nuked %s."),
-		       pcity->name);
+		        x, y, E_CITY_NUKED,
+		        N_("Game: You nuked %S."),
+		        pcity->name);
+      notify_player_ex(city_owner(pcity),
+                       x, y, E_CITY_NUKED,
+		       N_("Game: %S was nuked by %S."),
+                       pcity->name, pplayer->name);
+    } else {
+      notify_player_ex(city_owner(pcity),
+                       x, y, E_CITY_NUKED,
+		       N_("Game: %S was nuked by yourself."),
+                       pcity->name);
     }
 
     if (pcity->size > 1) { /* size zero cities are ridiculous -- Syela */
@@ -2114,7 +2078,7 @@
   } square_iterate_end;
 
   notify_conn_ex(&game.game_connections, x, y, E_NUKE,
-		 _("Game: %s detonated a nuke!"), pplayer->name);
+		  N_("Game: %S detonated a nuke!"), pplayer->name);
 }
 
 /**************************************************************************
@@ -2152,8 +2116,8 @@
   city2->airlift = FALSE;
 
   notify_player_ex(unit_owner(punit), city2->x, city2->y, E_NOEVENT,
-		   _("Game: %s transported succesfully."),
-		   unit_name(punit->type));
+		   N_("Game: %s transported succesfully."),
+		   unit_name_orig(punit->type));
 
   (void) move_unit(punit, city2->x, city2->y, FALSE, FALSE, punit->moves_left);
 
@@ -2176,7 +2140,7 @@
 
   if (!unit_flag(punit, F_PARATROOPERS)) {
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-                     _("Game: This unit type can not be paradropped."));
+                      N_("Game: This unit type can not be paradropped."));
     return FALSE;
   }
 
@@ -2185,13 +2149,13 @@
 
   if (!map_get_known(dest_x, dest_y, pplayer)) {
     notify_player_ex(pplayer, dest_x, dest_y, E_NOEVENT,
-                     _("Game: The destination location is not known."));
+                      N_("Game: The destination location is not known."));
     return FALSE;
   }
 
   if (is_ocean(map_get_player_tile(dest_x, dest_y, pplayer)->terrain)) {
     notify_player_ex(pplayer, dest_x, dest_y, E_NOEVENT,
-                     _("Game: Cannot paradrop into ocean."));
+                      N_("Game: Cannot paradrop into ocean."));
     return FALSE;    
   }
 
@@ -2199,7 +2163,7 @@
       && pplayers_non_attack(pplayer, city_owner(ptile->city))) 
       || is_non_attack_unit_tile(ptile, pplayer))) {
     notify_player_ex(pplayer, dest_x, dest_y, E_NOEVENT,
-                     _("Game: Cannot attack unless you declare war first."));
+                      N_("Game: Cannot attack unless you declare war first."));
     return FALSE;    
   }
 
@@ -2208,8 +2172,8 @@
     int distance = real_map_distance(punit->x, punit->y, dest_x, dest_y);
     if (distance > range) {
       notify_player_ex(pplayer, dest_x, dest_y, E_NOEVENT,
-                       _("Game: The distance to the target (%i) "
-                         "is greater than the unit's range (%i)."),
+                       N_("Game: The distance to the target (%d) "
+                         "is greater than the unit's range (%d)."),
                        distance, range);
       return FALSE;
     }
@@ -2220,9 +2184,9 @@
     show_area(pplayer, dest_x, dest_y, srange);
 
     notify_player_ex(pplayer, dest_x, dest_y, E_UNIT_LOST,
-                     _("Game: Your %s paradropped into the ocean "
-                       "and was lost."),
-                     unit_type(punit)->name);
+                     N_("Game: Your %s paradropped into the ocean "
+                        "and was lost."),
+                     unit_name_orig(punit->type));
     server_remove_unit(punit);
     return TRUE;
   }
@@ -2232,9 +2196,9 @@
     int srange = unit_type(punit)->vision_range;
     show_area(pplayer, dest_x, dest_y, srange);
     notify_player_ex(pplayer, dest_x, dest_y, E_UNIT_LOST_ATT,
-                     _("Game: Your %s was killed by enemy units at the "
-                       "paradrop destination."),
-                     unit_type(punit)->name);
+                     N_("Game: Your %s was killed by enemy units at the "
+                        "paradrop destination."),
+                     unit_name_orig(punit->type));
     server_remove_unit(punit);
     return TRUE;
   }
@@ -2244,9 +2208,9 @@
     show_area(pplayer, dest_x, dest_y, srange);
     make_contact(pplayer, city_owner(ptile->city), dest_x, dest_y);
     notify_player_ex(pplayer, dest_x, dest_y, E_UNIT_LOST_ATT,
-                     _("Game: Your %s was killed by enemy units at the "
-                       "paradrop destination."),
-                     unit_type(punit)->name);
+                     N_("Game: Your %s was killed by enemy units at the "
+                        "paradrop destination."),
+                     unit_name_orig(punit->type));
     server_remove_unit(punit);
     return TRUE;
   }
@@ -2267,7 +2231,7 @@
 {
   struct player *pplayer = unit_owner(punit);
   notify_player_ex(pplayer, punit->x, punit->y, E_HUT_GOLD,
-		   _("Game: You found %d gold."), cred);
+		    N_("Game: You found %d gold."), cred);
   pplayer->economic.gold += cred;
 }
 
@@ -2279,7 +2243,6 @@
   struct player *pplayer = unit_owner(punit);
   int res_ed, res_ing;
   Tech_Type_id new_tech;
-  const char *tech_name;
   
   /* Save old values, choose tech, then restore old values: */
   res_ed = pplayer->research.bulbs_researched;
@@ -2291,15 +2254,28 @@
   pplayer->research.bulbs_researched = res_ed;
   pplayer->research.researching = res_ing;
 
-  tech_name = get_tech_name(pplayer, new_tech);
-  notify_player_ex(pplayer, punit->x, punit->y, E_HUT_TECH,
-		   _("Game: You found %s in ancient scrolls of wisdom."),
-		   tech_name);
+  if (is_future_tech(new_tech)) {
+    notify_player_ex(pplayer, punit->x, punit->y, E_HUT_TECH,
+                     N_("Game: You found Future Tech. %d in ancient "
+		        "scrolls of wisdom."),
+		     pplayer->future_tech + 1);
+     notify_embassies(pplayer, NULL, 
+                      N_("Game: The %N have acquired Future Tech. %d"
+                         " from ancient scrolls of wisdom."),
+		      pplayer->nation, 
+		      pplayer->future_tech + 1);
+  } else {
+    notify_player_ex(pplayer, punit->x, punit->y, E_HUT_TECH,
+                     N_("Game: You found %s in ancient scrolls of wisdom."),
+		     advances[new_tech].name_orig);
+     notify_embassies(pplayer, NULL, N_("Game: The %N have acquired %s"
+				        " from ancient scrolls of wisdom."),
+		      pplayer->nation, 
+		      advances[new_tech].name_orig);
+  }
   gamelog(GAMELOG_TECH, _("%s discover %s (Hut)"),
-	  get_nation_name_plural(pplayer->nation), tech_name);
-  notify_embassies(pplayer, NULL, _("Game: The %s have acquired %s"
-				    " from ancient scrolls of wisdom."),
-		   get_nation_name_plural(pplayer->nation), tech_name);
+	  get_nation_name_plural(pplayer->nation), 
+	  get_tech_name(pplayer, new_tech));
 
   do_free_cost(pplayer);
   if (!is_future_tech(new_tech)) {
@@ -2317,7 +2293,8 @@
   struct player *pplayer = unit_owner(punit);
   
   notify_player_ex(pplayer, punit->x, punit->y, E_HUT_MERC,
-		   _("Game: A band of friendly mercenaries joins your cause."));
+		    N_("Game: A band of friendly "
+		       "mercenaries joins your cause."));
   (void) create_unit(pplayer, punit->x, punit->y,
 		     find_a_unit_type(L_HUT, L_HUT_TECH), FALSE,
 		     punit->homecity, -1);
@@ -2334,7 +2311,7 @@
 
   if (city_exists_within_city_radius(punit->x, punit->y, TRUE)) {
     notify_player_ex(pplayer, punit->x, punit->y, E_HUT_BARB_CITY_NEAR,
-		     _("Game: An abandoned village is here."));
+		      N_("Game: An abandoned village is here."));
   }
   else {
     /* save coords and type in case unit dies */
@@ -2346,11 +2323,11 @@
 
     if (ok) {
       notify_player_ex(pplayer, punit_x, punit_y, E_HUT_BARB,
-		       _("Game: You have unleashed a horde of barbarians!"));
+		        N_("Game: You have unleashed a horde of barbarians!"));
     } else {
       notify_player_ex(pplayer, punit_x, punit_y, E_HUT_BARB_KILLED,
-		       _("Game: Your %s has been killed by barbarians!"),
-		       unit_name(type));
+		       N_("Game: Your %s has been killed by barbarians!"),
+		       unit_name_orig(type));
     }
   }
   return ok;
@@ -2365,13 +2342,13 @@
   
   if (city_can_be_built_here(punit->x, punit->y)) {
     notify_player_ex(pplayer, punit->x, punit->y, E_HUT_CITY,
-		     _("Game: You found a friendly city."));
+		      N_("Game: You found a friendly city."));
     create_city(pplayer, punit->x, punit->y,
 		city_name_suggestion(pplayer, punit->x, punit->y));
   } else {
     notify_player_ex(pplayer, punit->x, punit->y, E_HUT_SETTLER,
-		     _("Game: Friendly nomads are impressed by you,"
-		       " and join you."));
+		      N_("Game: Friendly nomads are impressed by you,"
+		         " and join you."));
     (void) create_unit(pplayer, punit->x, punit->y, get_role_unit(F_CITIES,0),
 		FALSE, punit->homecity, -1);
   }
@@ -2395,8 +2372,8 @@
 
   if (game.rgame.hut_overflight==OVERFLIGHT_FRIGHTEN && is_air_unit(punit)) {
     notify_player_ex(pplayer, punit->x, punit->y, E_NOEVENT,
-		     _("Game: Your overflight frightens the tribe;"
-		       " they scatter in terror."));
+		      N_("Game: Your overflight frightens the tribe;"
+		         " they scatter in terror."));
     return ok;
   }
   
@@ -3046,8 +3023,8 @@
   if (cancel) {
     handle_unit_activity_request(punit, ACTIVITY_IDLE);
     notify_player_ex(unit_owner(punit), punit->x, punit->y, E_NOEVENT, 
-		     _("Game: Your %s cancelled patrol order because it "
-		       "encountered a foreign unit."), unit_name(punit->type));
+		      N_("Game: Your %s cancelled patrol order because it "
+		         "encountered a foreign unit."), unit_name(punit->type));
   }
 
   return cancel;
diff -ur --new-file -Xdiff_ignore freeorig/server/unittools.h freeciv/server/unittools.h
--- freeorig/server/unittools.h	2003-02-05 00:12:31.000000000 +0100
+++ freeciv/server/unittools.h	2003-02-13 15:30:40.000000000 +0100
@@ -36,8 +36,6 @@
 void update_unit_activities(struct player *pplayer);
 
 /* various */
-char *get_location_str_in(struct player *pplayer, int x, int y);
-char *get_location_str_at(struct player *pplayer, int x, int y);
 enum goto_move_restriction get_activity_move_restriction(enum unit_activity activity);
 void make_partisans(struct city *pcity);
 bool enemies_at(struct unit *punit, int x, int y);
