*** a/config/programs.m4
--- b/config/programs.m4
***************
*** 193,198 **** AC_DEFUN([PGAC_CHECK_GETTEXT],
--- 193,202 ----
  [
    AC_SEARCH_LIBS(bind_textdomain_codeset, intl, [],
                   [AC_MSG_ERROR([a gettext implementation is required for NLS])])
+   AC_SEARCH_LIBS(ngettext, intl,
+                  [AC_DEFINE(HAVE_NGETTEXT, 1,
+                             [Define to 1 if you have the ngettext function.])],
+                  [AC_MSG_WARN([NLS broken, plural forms support required for compile .po files])])
    AC_CHECK_HEADER([libintl.h], [],
                    [AC_MSG_ERROR([header file <libintl.h> is required for NLS])])
    AC_CHECK_PROGS(MSGFMT, msgfmt)
*** a/configure
--- b/configure
***************
*** 26022,26027 **** echo "$as_me: error: a gettext implementation is required for NLS" >&2;}
--- 26022,26117 ----
     { (exit 1); exit 1; }; }
  fi
  
+   { echo "$as_me:$LINENO: checking for library containing ngettext" >&5
+ echo $ECHO_N "checking for library containing ngettext... $ECHO_C" >&6; }
+ if test "${ac_cv_search_ngettext+set}" = set; then
+   echo $ECHO_N "(cached) $ECHO_C" >&6
+ else
+   ac_func_search_save_LIBS=$LIBS
+ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h.  */
+ _ACEOF
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h.  */
+ 
+ /* Override any GCC internal prototype to avoid an error.
+    Use char because int might match the return type of a GCC
+    builtin and then its argument prototype would still apply.  */
+ #ifdef __cplusplus
+ extern "C"
+ #endif
+ char ngettext ();
+ int
+ main ()
+ {
+ return ngettext ();
+   ;
+   return 0;
+ }
+ _ACEOF
+ for ac_lib in '' intl; do
+   if test -z "$ac_lib"; then
+     ac_res="none required"
+   else
+     ac_res=-l$ac_lib
+     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+   fi
+   rm -f conftest.$ac_objext conftest$ac_exeext
+ if { (ac_try="$ac_link"
+ case "(($ac_try" in
+   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+   *) ac_try_echo=$ac_try;;
+ esac
+ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+   (eval "$ac_link") 2>conftest.er1
+   ac_status=$?
+   grep -v '^ *+' conftest.er1 >conftest.err
+   rm -f conftest.er1
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && {
+ 	 test -z "$ac_c_werror_flag" ||
+ 	 test ! -s conftest.err
+        } && test -s conftest$ac_exeext &&
+        $as_test_x conftest$ac_exeext; then
+   ac_cv_search_ngettext=$ac_res
+ else
+   echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+ 
+ 
+ fi
+ 
+ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+       conftest$ac_exeext
+   if test "${ac_cv_search_ngettext+set}" = set; then
+   break
+ fi
+ done
+ if test "${ac_cv_search_ngettext+set}" = set; then
+   :
+ else
+   ac_cv_search_ngettext=no
+ fi
+ rm conftest.$ac_ext
+ LIBS=$ac_func_search_save_LIBS
+ fi
+ { echo "$as_me:$LINENO: result: $ac_cv_search_ngettext" >&5
+ echo "${ECHO_T}$ac_cv_search_ngettext" >&6; }
+ ac_res=$ac_cv_search_ngettext
+ if test "$ac_res" != no; then
+   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ 
+ cat >>confdefs.h <<\_ACEOF
+ #define HAVE_NGETTEXT 1
+ _ACEOF
+ 
+ else
+   { echo "$as_me:$LINENO: WARNING: NLS broken, plural forms support required for compile .po files" >&5
+ echo "$as_me: WARNING: NLS broken, plural forms support required for compile .po files" >&2;}
+ fi
+ 
    if test "${ac_cv_header_libintl_h+set}" = set; then
    { echo "$as_me:$LINENO: checking for libintl.h" >&5
  echo $ECHO_N "checking for libintl.h... $ECHO_C" >&6; }
*** a/src/bin/psql/print.c
--- b/src/bin/psql/print.c
***************
*** 2348,2357 **** printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, FILE *f
  		char		default_footer[100];
  
  		total_records = opt->topt.prior_records + cont.nrows;
! 		if (total_records == 1)
! 			snprintf(default_footer, 100, _("(1 row)"));
! 		else
! 			snprintf(default_footer, 100, _("(%lu rows)"), total_records);
  
  		printTableAddFooter(&cont, default_footer);
  	}
--- 2348,2354 ----
  		char		default_footer[100];
  
  		total_records = opt->topt.prior_records + cont.nrows;
! 		snprintf(default_footer, 100, _P("(%lu row)", "(%lu rows)", total_records), total_records);
  
  		printTableAddFooter(&cont, default_footer);
  	}
*** a/src/include/c.h
--- b/src/include/c.h
***************
*** 91,102 ****
--- 91,108 ----
  #include <locale.h>
  
  #define _(x) gettext(x)
+ #ifdef HAVE_NGETTEXT
+ #define _P(s,p,n) ngettext(s,p,n)
+ #else
+ #define _P(s,p,n) ((n) == 1 ? (s) : (p))
+ #endif
  
  #ifdef ENABLE_NLS
  #include <libintl.h>
  #else
  #define gettext(x) (x)
  #define dgettext(d,x) (x)
+ #define ngettext(s,p,n) ((n) == 1 ? (s) : (p))
  #endif
  
  /*
*** a/src/include/pg_config.h.in
--- b/src/include/pg_config.h.in
***************
*** 321,326 ****
--- 321,329 ----
  /* Define to 1 if you have the <netinet/tcp.h> header file. */
  #undef HAVE_NETINET_TCP_H
  
+ /* Define to 1 if you have the ngettext function. */
+ #undef HAVE_NGETTEXT
+ 
  /* Define to 1 if you have the `on_exit' function. */
  #undef HAVE_ON_EXIT
  
*** a/src/include/pg_config.h.win32
--- b/src/include/pg_config.h.win32
***************
*** 267,272 ****
--- 267,275 ----
  /* Define to 1 if you have the <netinet/tcp.h> header file. */
  /* #undef HAVE_NETINET_TCP_H */
  
+ /* Define to 1 if you have the 'ngettext' function. */
+ #define HAVE_NGETTEXT 1
+ 
  /* Define to 1 if you have the `on_exit' function. */
  /* #undef HAVE_ON_EXIT */
  
