[Tux4kids-commits] r888 - in tuxmath/trunk: . intl po

dbruce-guest at alioth.debian.org dbruce-guest at alioth.debian.org
Sun Feb 15 16:47:58 UTC 2009


Author: dbruce-guest
Date: 2009-02-15 16:47:57 +0000 (Sun, 15 Feb 2009)
New Revision: 888

Added:
   tuxmath/trunk/intl/
   tuxmath/trunk/intl/CMakeLists.txt
   tuxmath/trunk/intl/ChangeLog
   tuxmath/trunk/intl/Makefile.in
   tuxmath/trunk/intl/VERSION
   tuxmath/trunk/intl/bindtextdom.c
   tuxmath/trunk/intl/config.charset
   tuxmath/trunk/intl/dcgettext.c
   tuxmath/trunk/intl/dcigettext.c
   tuxmath/trunk/intl/dcngettext.c
   tuxmath/trunk/intl/dgettext.c
   tuxmath/trunk/intl/dngettext.c
   tuxmath/trunk/intl/eval-plural.h
   tuxmath/trunk/intl/explodename.c
   tuxmath/trunk/intl/export.h
   tuxmath/trunk/intl/finddomain.c
   tuxmath/trunk/intl/gettext.c
   tuxmath/trunk/intl/gettextP.h
   tuxmath/trunk/intl/gmo.h
   tuxmath/trunk/intl/hash-string.c
   tuxmath/trunk/intl/hash-string.h
   tuxmath/trunk/intl/intl-compat.c
   tuxmath/trunk/intl/intl-exports.c
   tuxmath/trunk/intl/intl_config.h.cmake
   tuxmath/trunk/intl/l10nflist.c
   tuxmath/trunk/intl/langprefs.c
   tuxmath/trunk/intl/libgnuintl.h.in
   tuxmath/trunk/intl/libintl.rc
   tuxmath/trunk/intl/loadinfo.h
   tuxmath/trunk/intl/loadmsgcat.c
   tuxmath/trunk/intl/localcharset.c
   tuxmath/trunk/intl/localcharset.h
   tuxmath/trunk/intl/locale.alias
   tuxmath/trunk/intl/localealias.c
   tuxmath/trunk/intl/localename.c
   tuxmath/trunk/intl/localename.c.orig
   tuxmath/trunk/intl/lock.c
   tuxmath/trunk/intl/lock.h
   tuxmath/trunk/intl/log.c
   tuxmath/trunk/intl/ngettext.c
   tuxmath/trunk/intl/os2compat.c
   tuxmath/trunk/intl/os2compat.h
   tuxmath/trunk/intl/osdep.c
   tuxmath/trunk/intl/plural-exp.c
   tuxmath/trunk/intl/plural-exp.h
   tuxmath/trunk/intl/plural.c
   tuxmath/trunk/intl/plural.y
   tuxmath/trunk/intl/printf-args.c
   tuxmath/trunk/intl/printf-args.h
   tuxmath/trunk/intl/printf-parse.c
   tuxmath/trunk/intl/printf-parse.h
   tuxmath/trunk/intl/printf.c
   tuxmath/trunk/intl/ref-add.sin
   tuxmath/trunk/intl/ref-del.sin
   tuxmath/trunk/intl/relocatable.c
   tuxmath/trunk/intl/relocatable.h
   tuxmath/trunk/intl/textdomain.c
   tuxmath/trunk/intl/tsearch.c
   tuxmath/trunk/intl/tsearch.h
   tuxmath/trunk/intl/vasnprintf.c
   tuxmath/trunk/intl/vasnprintf.h
   tuxmath/trunk/intl/vasnwprintf.h
   tuxmath/trunk/intl/version.c
   tuxmath/trunk/intl/wprintf-parse.h
   tuxmath/trunk/intl/xsize.h
   tuxmath/trunk/po/
   tuxmath/trunk/po/CMakeLists.txt
   tuxmath/trunk/po/ChangeLog
   tuxmath/trunk/po/LINGUAS
   tuxmath/trunk/po/Makefile.in.in
   tuxmath/trunk/po/Makevars
   tuxmath/trunk/po/Makevars.template
   tuxmath/trunk/po/POTFILES.in
   tuxmath/trunk/po/Rules-quot
   tuxmath/trunk/po/ar.gmo
   tuxmath/trunk/po/ar.po
   tuxmath/trunk/po/boldquot.sed
   tuxmath/trunk/po/cs.gmo
   tuxmath/trunk/po/cs.po
   tuxmath/trunk/po/de.gmo
   tuxmath/trunk/po/de.po
   tuxmath/trunk/po/en at boldquot.gmo
   tuxmath/trunk/po/en at boldquot.header
   tuxmath/trunk/po/en at boldquot.po
   tuxmath/trunk/po/en at quot.gmo
   tuxmath/trunk/po/en at quot.header
   tuxmath/trunk/po/en at quot.po
   tuxmath/trunk/po/en_GB.gmo
   tuxmath/trunk/po/en_GB.po
   tuxmath/trunk/po/es.gmo
   tuxmath/trunk/po/es.po
   tuxmath/trunk/po/fi.gmo
   tuxmath/trunk/po/fi.po
   tuxmath/trunk/po/fr.gmo
   tuxmath/trunk/po/fr.po
   tuxmath/trunk/po/ga.gmo
   tuxmath/trunk/po/ga.po
   tuxmath/trunk/po/he.gmo
   tuxmath/trunk/po/he.po
   tuxmath/trunk/po/hu.gmo
   tuxmath/trunk/po/hu.po
   tuxmath/trunk/po/insert-header.sin
   tuxmath/trunk/po/it.gmo
   tuxmath/trunk/po/it.po
   tuxmath/trunk/po/ja.gmo
   tuxmath/trunk/po/ja.po
   tuxmath/trunk/po/nb.gmo
   tuxmath/trunk/po/nb.po
   tuxmath/trunk/po/nl.gmo
   tuxmath/trunk/po/nl.po
   tuxmath/trunk/po/nn.gmo
   tuxmath/trunk/po/nn.po
   tuxmath/trunk/po/oc.gmo
   tuxmath/trunk/po/oc.po
   tuxmath/trunk/po/pl.gmo
   tuxmath/trunk/po/pl.po
   tuxmath/trunk/po/pt.gmo
   tuxmath/trunk/po/pt.po
   tuxmath/trunk/po/pt_BR.gmo
   tuxmath/trunk/po/pt_BR.po
   tuxmath/trunk/po/quot.sed
   tuxmath/trunk/po/remove-potcdate.sin
   tuxmath/trunk/po/ru.gmo
   tuxmath/trunk/po/ru.po
   tuxmath/trunk/po/sk.gmo
   tuxmath/trunk/po/sk.po
   tuxmath/trunk/po/sv.gmo
   tuxmath/trunk/po/sv.po
   tuxmath/trunk/po/tr.gmo
   tuxmath/trunk/po/tr.po
   tuxmath/trunk/po/tuxmath.pot
   tuxmath/trunk/po/zh_CN.gmo
   tuxmath/trunk/po/zh_CN.po
Log:
re-added intl and po


Added: tuxmath/trunk/intl/CMakeLists.txt
===================================================================
--- tuxmath/trunk/intl/CMakeLists.txt	                        (rev 0)
+++ tuxmath/trunk/intl/CMakeLists.txt	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,120 @@
+# Build script for libintl. This was copied, with only slight
+# modifications, from the LyX project---thanks!  See attribution below.
+#
+# Modifications by Timothy E. Holy, 2008
+
+# This file is part of LyX, the document processor.
+# Licence details can be found in the file COPYING.
+#
+# Copyright (c) 2006, Peter Kümmel, <syntheticpp at gmx.net>
+#
+
+# If you're building this as part of a larger package, the following
+# variables can be set upon entry:
+#   INTL_BINARY_DIR
+#   INTL_SOURCE_DIR
+#   LOCALE_DIR
+#   TOP_SRC_DIR  ?
+#   PREFIX    ?
+
+project(intl)
+
+set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
+include(CheckFunctionExists)
+
+# We require the iconv library to be available
+find_package(Iconv REQUIRED)
+#message("Iconv const: ${ICONV_SECOND_ARGUMENT_IS_CONST}")
+add_definitions(-DHAVE_ICONV=1)
+
+# This can either be called in standalone mode, or as part of a larger
+# project.  For that reason, we need to examine whether certain settings
+# have been made before, or not.
+if (NOT CONFIGURECHECKSINTL_DONE)
+  include(ConfigureChecksIntl)
+endif ()
+if (NOT INTL_BINARY_DIR)
+  set(INTL_BINARY_DIR ${CMAKE_BINARY_DIR})
+endif ()
+if (NOT INTL_SOURCE_DIR)
+  set(INTL_SOURCE_DIR ${CMAKE_SOURCE_DIR})
+endif ()
+
+# Generate the appropriate header files
+configure_file(libgnuintl.h.in ${INTL_BINARY_DIR}/libgnuintl.h)
+configure_file(${INTL_BINARY_DIR}/libgnuintl.h ${INTL_BINARY_DIR}/libintl.h COPYONLY)
+# Generate the appropriate config.h file
+configure_file(intl_config.h.cmake ${INTL_BINARY_DIR}/config.h)
+
+add_definitions(
+    -DHAVE_CONFIG_H=1
+    -DMAKE_INTL_LIB
+    -DIN_LIBINTL
+    -DENABLE_RELOCATABLE=1
+    -DIN_LIBRARY
+    -DNO_XMALLOC
+    -Dset_relocation_prefix=libintl_set_relocation_prefix
+    -Drelocate=libintl_relocate
+    -DDEPENDS_ON_LIBICONV=1
+    )
+    
+if (NOT APPLE)    
+add_definitions(
+		-DLOCALEDIR=\\"${LOCALE_DIR}\\" 
+		-DLOCALE_ALIAS_PATH=\\"${LOCALE_DIR}\\"
+		-DLIBDIR=\\"${TOP_SRC_DIR}\\"
+		-DINSTALLDIR=\\"${PREFIX}\\" 
+		)
+else (NOT APPLE) 
+add_definitions(
+		-DLOCALEDIR='\"${LOCALE_DIR}\"' 
+		-DLOCALE_ALIAS_PATH='\"${LOCALE_DIR}\"'
+		-DLIBDIR='\"${TOP_SRC_DIR}\"'
+		-DINSTALLDIR='\"${PREFIX}\"' 
+		)
+endif (NOT APPLE)
+
+file(GLOB INTL_HEADERS ${INTL_SOURCE_DIR}/*.h)
+
+set(INTL_SOURCES 
+      bindtextdom.c
+      dcgettext.c
+      dgettext.c
+      gettext.c
+      finddomain.c
+      loadmsgcat.c
+      localealias.c
+      textdomain.c
+      l10nflist.c
+      explodename.c
+      dcigettext.c
+      dcngettext.c
+      dngettext.c
+      hash-string.c
+      langprefs.c
+      ngettext.c
+      plural.c
+      plural-exp.c
+      localcharset.c
+      relocatable.c
+      localename.c
+      log.c
+      printf.c
+      osdep.c
+      intl-compat.c
+)
+
+include_directories(${INTL_BINARY_DIR} ${INTL_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+
+if(ICONV_FOUND)
+  include_directories(${ICONV_INCLUDE_DIR})
+endif(ICONV_FOUND)
+
+add_library(intl STATIC ${INTL_SOURCES} ${INTL_HEADERS})
+
+if(ICONV_FOUND)
+  target_link_libraries(intl ${ICONV_LIBRARY})
+endif(ICONV_FOUND)
+
+#project_source_group("${GROUP_CODE}" INTL_SOURCES INTL_HEADERS)
+

Added: tuxmath/trunk/intl/ChangeLog
===================================================================
--- tuxmath/trunk/intl/ChangeLog	                        (rev 0)
+++ tuxmath/trunk/intl/ChangeLog	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,4 @@
+2007-11-07  GNU  <bug-gnu-gettext at gnu.org>
+
+	* Version 0.17 released.
+

Added: tuxmath/trunk/intl/Makefile.in
===================================================================
--- tuxmath/trunk/intl/Makefile.in	                        (rev 0)
+++ tuxmath/trunk/intl/Makefile.in	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,587 @@
+# Makefile for directory with message catalog handling library of GNU gettext
+# Copyright (C) 1995-1998, 2000-2007 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+
+# The VPATH variables allows builds with $builddir != $srcdir, assuming a
+# 'make' program that supports VPATH (such as GNU make). This line is removed
+# by autoconf automatically when "$(srcdir)" = ".".
+# In this directory, the VPATH handling is particular:
+# 1. If INTL_LIBTOOL_SUFFIX_PREFIX is 'l' (indicating a build with libtool),
+#    the .c -> .lo rules carefully use $(srcdir), so that VPATH can be omitted.
+# 2. If PACKAGE = gettext-tools, VPATH _must_ be omitted, because otherwise
+#    'make' does the wrong thing if GNU gettext was configured with
+#    "./configure --srcdir=`pwd`", namely it gets confused by the .lo and .la
+#    files it finds in srcdir = ../../gettext-runtime/intl.
+VPATH = $(srcdir)
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = @libdir@
+includedir = @includedir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/intl
+aliaspath = $(localedir)
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+YACC = @INTLBISON@ -y -d
+YFLAGS = --name-prefix=__gettext
+WINDRES = @WINDRES@
+
+# -DBUILDING_LIBINTL: Change expansion of LIBINTL_DLL_EXPORTED macro.
+# -DBUILDING_DLL: Change expansion of RELOCATABLE_DLL_EXPORTED macro.
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+-DLIBDIR=\"$(libdir)\" -DBUILDING_LIBINTL -DBUILDING_DLL -DIN_LIBINTL \
+-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
+-Dset_relocation_prefix=libintl_set_relocation_prefix \
+-Drelocate=libintl_relocate \
+-DDEPENDS_ON_LIBICONV=1 @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@ @CFLAG_VISIBILITY@
+LDFLAGS = @LDFLAGS@ $(LDFLAGS_ at WOE32DLL@)
+LDFLAGS_yes = -Wl,--export-all-symbols
+LDFLAGS_no =
+LIBS = @LIBS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = \
+  gmo.h \
+  gettextP.h \
+  hash-string.h \
+  loadinfo.h \
+  plural-exp.h \
+  eval-plural.h \
+  localcharset.h \
+  lock.h \
+  relocatable.h \
+  tsearch.h tsearch.c \
+  xsize.h \
+  printf-args.h printf-args.c \
+  printf-parse.h wprintf-parse.h printf-parse.c \
+  vasnprintf.h vasnwprintf.h vasnprintf.c \
+  os2compat.h \
+  libgnuintl.h.in
+SOURCES = \
+  bindtextdom.c \
+  dcgettext.c \
+  dgettext.c \
+  gettext.c \
+  finddomain.c \
+  hash-string.c \
+  loadmsgcat.c \
+  localealias.c \
+  textdomain.c \
+  l10nflist.c \
+  explodename.c \
+  dcigettext.c \
+  dcngettext.c \
+  dngettext.c \
+  ngettext.c \
+  plural.y \
+  plural-exp.c \
+  localcharset.c \
+  lock.c \
+  relocatable.c \
+  langprefs.c \
+  localename.c \
+  log.c \
+  printf.c \
+  version.c \
+  osdep.c \
+  os2compat.c \
+  intl-exports.c \
+  intl-compat.c
+OBJECTS = \
+  bindtextdom.$lo \
+  dcgettext.$lo \
+  dgettext.$lo \
+  gettext.$lo \
+  finddomain.$lo \
+  hash-string.$lo \
+  loadmsgcat.$lo \
+  localealias.$lo \
+  textdomain.$lo \
+  l10nflist.$lo \
+  explodename.$lo \
+  dcigettext.$lo \
+  dcngettext.$lo \
+  dngettext.$lo \
+  ngettext.$lo \
+  plural.$lo \
+  plural-exp.$lo \
+  localcharset.$lo \
+  lock.$lo \
+  relocatable.$lo \
+  langprefs.$lo \
+  localename.$lo \
+  log.$lo \
+  printf.$lo \
+  version.$lo \
+  osdep.$lo \
+  intl-compat.$lo
+OBJECTS_RES_yes = libintl.res
+OBJECTS_RES_no =
+DISTFILES.common = Makefile.in \
+config.charset locale.alias ref-add.sin ref-del.sin export.h libintl.rc \
+$(HEADERS) $(SOURCES)
+DISTFILES.generated = plural.c
+DISTFILES.normal = VERSION
+DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc README.woe32
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
+COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h \
+libgnuintl.h_vms Makefile.vms libgnuintl.h.msvc-static \
+libgnuintl.h.msvc-shared Makefile.msvc
+
+all: all- at USE_INCLUDED_LIBINTL@
+all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+all-no: all-no- at BUILD_INCLUDED_LIBINTL@
+all-no-yes: libgnuintl.$la
+all-no-no:
+
+libintl.a libgnuintl.a: $(OBJECTS)
+	rm -f $@
+	$(AR) cru $@ $(OBJECTS)
+	$(RANLIB) $@
+
+libintl.la libgnuintl.la: $(OBJECTS) $(OBJECTS_RES_ at WOE32@)
+	$(LIBTOOL) --mode=link \
+	  $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+	  $(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) @LTLIBTHREAD@ @LTLIBC@ \
+	  $(OBJECTS_RES_ at WOE32@) \
+	  -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+	  -rpath $(libdir) \
+	  -no-undefined
+
+# Libtool's library version information for libintl.
+# Before making a gettext release, the gettext maintainer must change this
+# according to the libtool documentation, section "Library interface versions".
+# Maintainers of other packages that include the intl directory must *not*
+# change these values.
+LTV_CURRENT=8
+LTV_REVISION=2
+LTV_AGE=0
+
+.SUFFIXES:
+.SUFFIXES: .c .y .o .lo .sin .sed
+
+.c.o:
+	$(COMPILE) $<
+
+.y.c:
+	$(YACC) $(YFLAGS) --output $@ $<
+	rm -f $*.h
+
+bindtextdom.lo: $(srcdir)/bindtextdom.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
+dcgettext.lo: $(srcdir)/dcgettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
+dgettext.lo: $(srcdir)/dgettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c
+gettext.lo: $(srcdir)/gettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c
+finddomain.lo: $(srcdir)/finddomain.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c
+hash-string.lo: $(srcdir)/hash-string.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/hash-string.c
+loadmsgcat.lo: $(srcdir)/loadmsgcat.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
+localealias.lo: $(srcdir)/localealias.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c
+textdomain.lo: $(srcdir)/textdomain.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c
+l10nflist.lo: $(srcdir)/l10nflist.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
+explodename.lo: $(srcdir)/explodename.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c
+dcigettext.lo: $(srcdir)/dcigettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
+dcngettext.lo: $(srcdir)/dcngettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
+dngettext.lo: $(srcdir)/dngettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c
+ngettext.lo: $(srcdir)/ngettext.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c
+plural.lo: $(srcdir)/plural.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c
+plural-exp.lo: $(srcdir)/plural-exp.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
+localcharset.lo: $(srcdir)/localcharset.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c
+lock.lo: $(srcdir)/lock.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/lock.c
+relocatable.lo: $(srcdir)/relocatable.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c
+langprefs.lo: $(srcdir)/langprefs.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/langprefs.c
+localename.lo: $(srcdir)/localename.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c
+log.lo: $(srcdir)/log.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c
+printf.lo: $(srcdir)/printf.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c
+version.lo: $(srcdir)/version.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/version.c
+osdep.lo: $(srcdir)/osdep.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c
+intl-compat.lo: $(srcdir)/intl-compat.c
+	$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
+
+# This rule is executed only on Woe32 systems.
+# The following sed expressions come from the windres-options script. They are
+# inlined here, so that they can be written in a Makefile without requiring a
+# temporary file. They must contain literal newlines rather than semicolons,
+# so that they work with the sed-3.02 that is shipped with MSYS. We can use
+# GNU bash's $'\n' syntax to obtain such a newline.
+libintl.res: $(srcdir)/libintl.rc
+	nl=$$'\n'; \
+	sed_extract_major='/^[0-9]/{'$${nl}'s/^\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+	sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+	sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
+	$(WINDRES) \
+	  "-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \
+	  "-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_major"` \
+	  "-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_minor"` \
+	  "-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_subminor"` \
+	  -i $(srcdir)/libintl.rc -o libintl.res --output-format=coff
+
+ref-add.sed: $(srcdir)/ref-add.sin
+	sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
+	mv t-ref-add.sed ref-add.sed
+ref-del.sed: $(srcdir)/ref-del.sin
+	sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed
+	mv t-ref-del.sed ref-del.sed
+
+INCLUDES = -I. -I$(srcdir) -I..
+
+libgnuintl.h: $(srcdir)/libgnuintl.h.in
+	sed -e '/IN_LIBGLOCALE/d' \
+	    -e 's,@''HAVE_POSIX_PRINTF''@, at HAVE_POSIX_PRINTF@,g' \
+	    -e 's,@''HAVE_ASPRINTF''@, at HAVE_ASPRINTF@,g' \
+	    -e 's,@''HAVE_SNPRINTF''@, at HAVE_SNPRINTF@,g' \
+	    -e 's,@''HAVE_WPRINTF''@, at HAVE_WPRINTF@,g' \
+	  < $(srcdir)/libgnuintl.h.in \
+	| if test '@WOE32DLL@' = yes; then \
+	    sed -e 's/extern \([^()]*\);/extern __declspec (dllimport) \1;/'; \
+	  else \
+	    cat; \
+	  fi \
+	| sed -e 's/extern \([^"]\)/extern LIBINTL_DLL_EXPORTED \1/' \
+	      -e "/#define _LIBINTL_H/r $(srcdir)/export.h" \
+	| sed -e 's,@''HAVE_VISIBILITY''@, at HAVE_VISIBILITY@,g' \
+	  > libgnuintl.h
+
+libintl.h: $(srcdir)/libgnuintl.h.in
+	sed -e '/IN_LIBGLOCALE/d' \
+	    -e 's,@''HAVE_POSIX_PRINTF''@, at HAVE_POSIX_PRINTF@,g' \
+	    -e 's,@''HAVE_ASPRINTF''@, at HAVE_ASPRINTF@,g' \
+	    -e 's,@''HAVE_SNPRINTF''@, at HAVE_SNPRINTF@,g' \
+	    -e 's,@''HAVE_WPRINTF''@, at HAVE_WPRINTF@,g' \
+	  < $(srcdir)/libgnuintl.h.in > libintl.h
+
+charset.alias: $(srcdir)/config.charset
+	$(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+	mv t-$@ $@
+
+check: all
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the GNU gettext() function in its C library or in a
+# separate library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+	if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+	   && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+	  $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+	  $(LIBTOOL) --mode=install \
+	    $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+	  if test "@RELOCATABLE@" = yes; then \
+	    dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \
+	    if test -n "$$dependencies"; then \
+	      rm -f $(DESTDIR)$(libdir)/libintl.la; \
+	    fi; \
+	  fi; \
+	else \
+	  : ; \
+	fi
+	if test "$(PACKAGE)" = "gettext-tools" \
+	   && test '@USE_INCLUDED_LIBINTL@' = no \
+	   && test @GLIBC2@ != no; then \
+	  $(mkdir_p) $(DESTDIR)$(libdir); \
+	  $(LIBTOOL) --mode=install \
+	    $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \
+	  rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+	  $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+	  $(LIBTOOL) --mode=uninstall \
+	    rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \
+	else \
+	  : ; \
+	fi
+	if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  test @GLIBC21@ != no || $(mkdir_p) $(DESTDIR)$(libdir); \
+	  temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+	  dest=$(DESTDIR)$(libdir)/charset.alias; \
+	  if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+	    orig=$(DESTDIR)$(libdir)/charset.alias; \
+	    sed -f ref-add.sed $$orig > $$temp; \
+	    $(INSTALL_DATA) $$temp $$dest; \
+	    rm -f $$temp; \
+	  else \
+	    if test @GLIBC21@ = no; then \
+	      orig=charset.alias; \
+	      sed -f ref-add.sed $$orig > $$temp; \
+	      $(INSTALL_DATA) $$temp $$dest; \
+	      rm -f $$temp; \
+	    fi; \
+	  fi; \
+	  $(mkdir_p) $(DESTDIR)$(localedir); \
+	  test -f $(DESTDIR)$(localedir)/locale.alias \
+	    && orig=$(DESTDIR)$(localedir)/locale.alias \
+	    || orig=$(srcdir)/locale.alias; \
+	  temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+	  dest=$(DESTDIR)$(localedir)/locale.alias; \
+	  sed -f ref-add.sed $$orig > $$temp; \
+	  $(INSTALL_DATA) $$temp $$dest; \
+	  rm -f $$temp; \
+	else \
+	  : ; \
+	fi
+install-data: all
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	  $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+	  $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+	  dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
+	  for file in $$dists; do \
+	    $(INSTALL_DATA) $(srcdir)/$$file \
+			    $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	  chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+	  dists="$(DISTFILES.generated)"; \
+	  for file in $$dists; do \
+	    if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+	    $(INSTALL_DATA) $$dir/$$file \
+			    $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	  dists="$(DISTFILES.obsolete)"; \
+	  for file in $$dists; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+
+install-strip: install
+
+install-dvi install-html install-info install-ps install-pdf:
+
+installdirs:
+	if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+	   && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+	else \
+	  : ; \
+	fi
+	if test "$(PACKAGE)" = "gettext-tools" \
+	   && test '@USE_INCLUDED_LIBINTL@' = no \
+	   && test @GLIBC2@ != no; then \
+	  $(mkdir_p) $(DESTDIR)$(libdir); \
+	else \
+	  : ; \
+	fi
+	if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  test @GLIBC21@ != no || $(mkdir_p) $(DESTDIR)$(libdir); \
+	  $(mkdir_p) $(DESTDIR)$(localedir); \
+	else \
+	  : ; \
+	fi
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	else \
+	  : ; \
+	fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+	if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+	   && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  rm -f $(DESTDIR)$(includedir)/libintl.h; \
+	  $(LIBTOOL) --mode=uninstall \
+	    rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+	else \
+	  : ; \
+	fi
+	if test "$(PACKAGE)" = "gettext-tools" \
+	   && test '@USE_INCLUDED_LIBINTL@' = no \
+	   && test @GLIBC2@ != no; then \
+	  rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+	else \
+	  : ; \
+	fi
+	if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+	  if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+	    temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+	    dest=$(DESTDIR)$(libdir)/charset.alias; \
+	    sed -f ref-del.sed $$dest > $$temp; \
+	    if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+	      rm -f $$dest; \
+	    else \
+	      $(INSTALL_DATA) $$temp $$dest; \
+	    fi; \
+	    rm -f $$temp; \
+	  fi; \
+	  if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+	    temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+	    dest=$(DESTDIR)$(localedir)/locale.alias; \
+	    sed -f ref-del.sed $$dest > $$temp; \
+	    if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+	      rm -f $$dest; \
+	    else \
+	      $(INSTALL_DATA) $$temp $$dest; \
+	    fi; \
+	    rm -f $$temp; \
+	  fi; \
+	else \
+	  : ; \
+	fi
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+
+info dvi ps pdf html:
+
+$(OBJECTS): ../config.h libgnuintl.h
+bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
+hash-string.$lo dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
+explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
+dcigettext.$lo: $(srcdir)/eval-plural.h
+localcharset.$lo: $(srcdir)/localcharset.h
+bindtextdom.$lo dcigettext.$lo finddomain.$lo loadmsgcat.$lo localealias.$lo lock.$lo log.$lo: $(srcdir)/lock.h
+localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h
+printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c
+
+# A bison-2.1 generated plural.c includes <libintl.h> if ENABLE_NLS.
+PLURAL_DEPS_yes = libintl.h
+PLURAL_DEPS_no =
+plural.$lo: $(PLURAL_DEPS_ at USE_INCLUDED_LIBINTL@)
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+	here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+ctags: CTAGS
+
+CTAGS: $(HEADERS) $(SOURCES)
+	here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+	here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+	rm -f *.a *.la *.o *.obj *.lo libintl.res core core.*
+	rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
+	rm -f -r .libs _libs
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile ID TAGS
+	if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
+	  rm -f ChangeLog.inst $(DISTFILES.normal); \
+	else \
+	  : ; \
+	fi
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  : ; \
+	else \
+	  if test "$(PACKAGE)" = "gettext-runtime"; then \
+	    additional="$(DISTFILES.gettext)"; \
+	  else \
+	    additional="$(DISTFILES.normal)"; \
+	  fi; \
+	  $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+	  for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+	    if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+	    cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit 1; \
+	  done; \
+	fi
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	cd $(top_builddir) && $(SHELL) ./config.status
+# This would be more efficient, but doesn't work any more with autoconf-2.57,
+# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used.
+#	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: tuxmath/trunk/intl/VERSION
===================================================================
--- tuxmath/trunk/intl/VERSION	                        (rev 0)
+++ tuxmath/trunk/intl/VERSION	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.17

Added: tuxmath/trunk/intl/bindtextdom.c
===================================================================
--- tuxmath/trunk/intl/bindtextdom.c	                        (rev 0)
+++ tuxmath/trunk/intl/bindtextdom.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,340 @@
+/* Implementation of the bindtextdomain(3) function
+   Copyright (C) 1995-1998, 2000-2003, 2005-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+# define gl_rwlock_define __libc_rwlock_define
+# define gl_rwlock_wrlock __libc_rwlock_wrlock
+# define gl_rwlock_unlock __libc_rwlock_unlock
+#else
+# include "lock.h"
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN libintl_bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
+#endif
+
+/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
+   to be used for the DOMAINNAME message catalog.
+   If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+   modified, only the current value is returned.
+   If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+   modified nor returned.  */
+static void
+set_binding_values (const char *domainname,
+		    const char **dirnamep, const char **codesetp)
+{
+  struct binding *binding;
+  int modified;
+
+  /* Some sanity checks.  */
+  if (domainname == NULL || domainname[0] == '\0')
+    {
+      if (dirnamep)
+	*dirnamep = NULL;
+      if (codesetp)
+	*codesetp = NULL;
+      return;
+    }
+
+  gl_rwlock_wrlock (_nl_state_lock);
+
+  modified = 0;
+
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+	/* We found it!  */
+	break;
+      if (compare < 0)
+	{
+	  /* It is not in the list.  */
+	  binding = NULL;
+	  break;
+	}
+    }
+
+  if (binding != NULL)
+    {
+      if (dirnamep)
+	{
+	  const char *dirname = *dirnamep;
+
+	  if (dirname == NULL)
+	    /* The current binding has be to returned.  */
+	    *dirnamep = binding->dirname;
+	  else
+	    {
+	      /* The domain is already bound.  If the new value and the old
+		 one are equal we simply do nothing.  Otherwise replace the
+		 old binding.  */
+	      char *result = binding->dirname;
+	      if (strcmp (dirname, result) != 0)
+		{
+		  if (strcmp (dirname, _nl_default_dirname) == 0)
+		    result = (char *) _nl_default_dirname;
+		  else
+		    {
+#if defined _LIBC || defined HAVE_STRDUP
+		      result = strdup (dirname);
+#else
+		      size_t len = strlen (dirname) + 1;
+		      result = (char *) malloc (len);
+		      if (__builtin_expect (result != NULL, 1))
+			memcpy (result, dirname, len);
+#endif
+		    }
+
+		  if (__builtin_expect (result != NULL, 1))
+		    {
+		      if (binding->dirname != _nl_default_dirname)
+			free (binding->dirname);
+
+		      binding->dirname = result;
+		      modified = 1;
+		    }
+		}
+	      *dirnamep = result;
+	    }
+	}
+
+      if (codesetp)
+	{
+	  const char *codeset = *codesetp;
+
+	  if (codeset == NULL)
+	    /* The current binding has be to returned.  */
+	    *codesetp = binding->codeset;
+	  else
+	    {
+	      /* The domain is already bound.  If the new value and the old
+		 one are equal we simply do nothing.  Otherwise replace the
+		 old binding.  */
+	      char *result = binding->codeset;
+	      if (result == NULL || strcmp (codeset, result) != 0)
+		{
+#if defined _LIBC || defined HAVE_STRDUP
+		  result = strdup (codeset);
+#else
+		  size_t len = strlen (codeset) + 1;
+		  result = (char *) malloc (len);
+		  if (__builtin_expect (result != NULL, 1))
+		    memcpy (result, codeset, len);
+#endif
+
+		  if (__builtin_expect (result != NULL, 1))
+		    {
+		      if (binding->codeset != NULL)
+			free (binding->codeset);
+
+		      binding->codeset = result;
+		      modified = 1;
+		    }
+		}
+	      *codesetp = result;
+	    }
+	}
+    }
+  else if ((dirnamep == NULL || *dirnamep == NULL)
+	   && (codesetp == NULL || *codesetp == NULL))
+    {
+      /* Simply return the default values.  */
+      if (dirnamep)
+	*dirnamep = _nl_default_dirname;
+      if (codesetp)
+	*codesetp = NULL;
+    }
+  else
+    {
+      /* We have to create a new binding.  */
+      size_t len = strlen (domainname) + 1;
+      struct binding *new_binding =
+	(struct binding *) malloc (offsetof (struct binding, domainname) + len);
+
+      if (__builtin_expect (new_binding == NULL, 0))
+	goto failed;
+
+      memcpy (new_binding->domainname, domainname, len);
+
+      if (dirnamep)
+	{
+	  const char *dirname = *dirnamep;
+
+	  if (dirname == NULL)
+	    /* The default value.  */
+	    dirname = _nl_default_dirname;
+	  else
+	    {
+	      if (strcmp (dirname, _nl_default_dirname) == 0)
+		dirname = _nl_default_dirname;
+	      else
+		{
+		  char *result;
+#if defined _LIBC || defined HAVE_STRDUP
+		  result = strdup (dirname);
+		  if (__builtin_expect (result == NULL, 0))
+		    goto failed_dirname;
+#else
+		  size_t len = strlen (dirname) + 1;
+		  result = (char *) malloc (len);
+		  if (__builtin_expect (result == NULL, 0))
+		    goto failed_dirname;
+		  memcpy (result, dirname, len);
+#endif
+		  dirname = result;
+		}
+	    }
+	  *dirnamep = dirname;
+	  new_binding->dirname = (char *) dirname;
+	}
+      else
+	/* The default value.  */
+	new_binding->dirname = (char *) _nl_default_dirname;
+
+      if (codesetp)
+	{
+	  const char *codeset = *codesetp;
+
+	  if (codeset != NULL)
+	    {
+	      char *result;
+
+#if defined _LIBC || defined HAVE_STRDUP
+	      result = strdup (codeset);
+	      if (__builtin_expect (result == NULL, 0))
+		goto failed_codeset;
+#else
+	      size_t len = strlen (codeset) + 1;
+	      result = (char *) malloc (len);
+	      if (__builtin_expect (result == NULL, 0))
+		goto failed_codeset;
+	      memcpy (result, codeset, len);
+#endif
+	      codeset = result;
+	    }
+	  *codesetp = codeset;
+	  new_binding->codeset = (char *) codeset;
+	}
+      else
+	new_binding->codeset = NULL;
+
+      /* Now enqueue it.  */
+      if (_nl_domain_bindings == NULL
+	  || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+	{
+	  new_binding->next = _nl_domain_bindings;
+	  _nl_domain_bindings = new_binding;
+	}
+      else
+	{
+	  binding = _nl_domain_bindings;
+	  while (binding->next != NULL
+		 && strcmp (domainname, binding->next->domainname) > 0)
+	    binding = binding->next;
+
+	  new_binding->next = binding->next;
+	  binding->next = new_binding;
+	}
+
+      modified = 1;
+
+      /* Here we deal with memory allocation failures.  */
+      if (0)
+	{
+	failed_codeset:
+	  if (new_binding->dirname != _nl_default_dirname)
+	    free (new_binding->dirname);
+	failed_dirname:
+	  free (new_binding);
+	failed:
+	  if (dirnamep)
+	    *dirnamep = NULL;
+	  if (codesetp)
+	    *codesetp = NULL;
+	}
+    }
+
+  /* If we modified any binding, we flush the caches.  */
+  if (modified)
+    ++_nl_msg_cat_cntr;
+
+  gl_rwlock_unlock (_nl_state_lock);
+}
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+char *
+BINDTEXTDOMAIN (const char *domainname, const char *dirname)
+{
+  set_binding_values (domainname, &dirname, NULL);
+  return (char *) dirname;
+}
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+char *
+BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
+{
+  set_binding_values (domainname, NULL, &codeset);
+  return (char *) codeset;
+}
+
+#ifdef _LIBC
+/* Aliases for function names in GNU C Library.  */
+weak_alias (__bindtextdomain, bindtextdomain);
+weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+#endif

Added: tuxmath/trunk/intl/config.charset
===================================================================
--- tuxmath/trunk/intl/config.charset	                        (rev 0)
+++ tuxmath/trunk/intl/config.charset	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,640 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+#   Copyright (C) 2000-2004, 2006 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# The table consists of lines of the form
+#    ALIAS  CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+#       name              MIME?             used by which systems
+#   ASCII, ANSI_X3.4-1968       glibc solaris freebsd netbsd darwin
+#   ISO-8859-1              Y   glibc aix hpux irix osf solaris freebsd netbsd darwin
+#   ISO-8859-2              Y   glibc aix hpux irix osf solaris freebsd netbsd darwin
+#   ISO-8859-3              Y   glibc solaris
+#   ISO-8859-4              Y   osf solaris freebsd netbsd darwin
+#   ISO-8859-5              Y   glibc aix hpux irix osf solaris freebsd netbsd darwin
+#   ISO-8859-6              Y   glibc aix hpux solaris
+#   ISO-8859-7              Y   glibc aix hpux irix osf solaris netbsd darwin
+#   ISO-8859-8              Y   glibc aix hpux osf solaris
+#   ISO-8859-9              Y   glibc aix hpux irix osf solaris darwin
+#   ISO-8859-13                 glibc netbsd darwin
+#   ISO-8859-14                 glibc
+#   ISO-8859-15                 glibc aix osf solaris freebsd darwin
+#   KOI8-R                  Y   glibc solaris freebsd netbsd darwin
+#   KOI8-U                  Y   glibc freebsd netbsd darwin
+#   KOI8-T                      glibc
+#   CP437                       dos
+#   CP775                       dos
+#   CP850                       aix osf dos
+#   CP852                       dos
+#   CP855                       dos
+#   CP856                       aix
+#   CP857                       dos
+#   CP861                       dos
+#   CP862                       dos
+#   CP864                       dos
+#   CP865                       dos
+#   CP866                       freebsd netbsd darwin dos
+#   CP869                       dos
+#   CP874                       woe32 dos
+#   CP922                       aix
+#   CP932                       aix woe32 dos
+#   CP943                       aix
+#   CP949                       osf woe32 dos
+#   CP950                       woe32 dos
+#   CP1046                      aix
+#   CP1124                      aix
+#   CP1125                      dos
+#   CP1129                      aix
+#   CP1250                      woe32
+#   CP1251                      glibc solaris netbsd darwin woe32
+#   CP1252                      aix woe32
+#   CP1253                      woe32
+#   CP1254                      woe32
+#   CP1255                      glibc woe32
+#   CP1256                      woe32
+#   CP1257                      woe32
+#   GB2312                  Y   glibc aix hpux irix solaris freebsd netbsd darwin
+#   EUC-JP                  Y   glibc aix hpux irix osf solaris freebsd netbsd darwin
+#   EUC-KR                  Y   glibc aix hpux irix osf solaris freebsd netbsd darwin
+#   EUC-TW                      glibc aix hpux irix osf solaris netbsd
+#   BIG5                    Y   glibc aix hpux osf solaris freebsd netbsd darwin
+#   BIG5-HKSCS                  glibc solaris
+#   GBK                         glibc aix osf solaris woe32 dos
+#   GB18030                     glibc solaris netbsd
+#   SHIFT_JIS               Y   hpux osf solaris freebsd netbsd darwin
+#   JOHAB                       glibc solaris woe32
+#   TIS-620                     glibc aix hpux osf solaris
+#   VISCII                  Y   glibc
+#   TCVN5712-1                  glibc
+#   GEORGIAN-PS                 glibc
+#   HP-ROMAN8                   hpux
+#   HP-ARABIC8                  hpux
+#   HP-GREEK8                   hpux
+#   HP-HEBREW8                  hpux
+#   HP-TURKISH8                 hpux
+#   HP-KANA8                    hpux
+#   DEC-KANJI                   osf
+#   DEC-HANYU                   osf
+#   UTF-8                   Y   glibc aix hpux osf solaris netbsd darwin
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+    linux-gnulibc1*)
+	# Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+	# localcharset.c falls back to using the full locale name
+	# from the environment variables.
+	echo "C ASCII"
+	echo "POSIX ASCII"
+	for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+	         en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+	         en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+	         es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+	         et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+	         fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+	         it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+	         sv_FI sv_SE; do
+	  echo "$l ISO-8859-1"
+	  echo "$l.iso-8859-1 ISO-8859-1"
+	  echo "$l.iso-8859-15 ISO-8859-15"
+	  echo "$l.iso-8859-15 at euro ISO-8859-15"
+	  echo "$l at euro ISO-8859-15"
+	  echo "$l.cp-437 CP437"
+	  echo "$l.cp-850 CP850"
+	  echo "$l.cp-1252 CP1252"
+	  echo "$l.cp-1252 at euro CP1252"
+	  #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+	  echo "$l.utf-8 UTF-8"
+	  echo "$l.utf-8 at euro UTF-8"
+	done
+	for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+	         sl_SI sr sr_CS sr_YU; do
+	  echo "$l ISO-8859-2"
+	  echo "$l.iso-8859-2 ISO-8859-2"
+	  echo "$l.cp-852 CP852"
+	  echo "$l.cp-1250 CP1250"
+	  echo "$l.utf-8 UTF-8"
+	done
+	for l in mk mk_MK ru ru_RU; do
+	  echo "$l ISO-8859-5"
+	  echo "$l.iso-8859-5 ISO-8859-5"
+	  echo "$l.koi8-r KOI8-R"
+	  echo "$l.cp-866 CP866"
+	  echo "$l.cp-1251 CP1251"
+	  echo "$l.utf-8 UTF-8"
+	done
+	for l in ar ar_SA; do
+	  echo "$l ISO-8859-6"
+	  echo "$l.iso-8859-6 ISO-8859-6"
+	  echo "$l.cp-864 CP864"
+	  #echo "$l.cp-868 CP868" # not a commonly used encoding
+	  echo "$l.cp-1256 CP1256"
+	  echo "$l.utf-8 UTF-8"
+	done
+	for l in el el_GR gr gr_GR; do
+	  echo "$l ISO-8859-7"
+	  echo "$l.iso-8859-7 ISO-8859-7"
+	  echo "$l.cp-869 CP869"
+	  echo "$l.cp-1253 CP1253"
+	  echo "$l.cp-1253 at euro CP1253"
+	  echo "$l.utf-8 UTF-8"
+	  echo "$l.utf-8 at euro UTF-8"
+	done
+	for l in he he_IL iw iw_IL; do
+	  echo "$l ISO-8859-8"
+	  echo "$l.iso-8859-8 ISO-8859-8"
+	  echo "$l.cp-862 CP862"
+	  echo "$l.cp-1255 CP1255"
+	  echo "$l.utf-8 UTF-8"
+	done
+	for l in tr tr_TR; do
+	  echo "$l ISO-8859-9"
+	  echo "$l.iso-8859-9 ISO-8859-9"
+	  echo "$l.cp-857 CP857"
+	  echo "$l.cp-1254 CP1254"
+	  echo "$l.utf-8 UTF-8"
+	done
+	for l in lt lt_LT lv lv_LV; do
+	  #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+	  echo "$l ISO-8859-13"
+	done
+	for l in ru_UA uk uk_UA; do
+	  echo "$l KOI8-U"
+	done
+	for l in zh zh_CN; do
+	  #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+	  echo "$l GB2312"
+	done
+	for l in ja ja_JP ja_JP.EUC; do
+	  echo "$l EUC-JP"
+	done
+	for l in ko ko_KR; do
+	  echo "$l EUC-KR"
+	done
+	for l in th th_TH; do
+	  echo "$l TIS-620"
+	done
+	for l in fa fa_IR; do
+	  #echo "$l ISIRI-3342" # a broken encoding
+	  echo "$l.utf-8 UTF-8"
+	done
+	;;
+    linux* | *-gnu*)
+	# With glibc-2.1 or newer, we don't need any canonicalization,
+	# because glibc has iconv and both glibc and libiconv support all
+	# GNU canonical names directly. Therefore, the Makefile does not
+	# need to install the alias file at all.
+	# The following applies only to glibc-2.0.x and older libcs.
+	echo "ISO_646.IRV:1983 ASCII"
+	;;
+    aix*)
+	echo "ISO8859-1 ISO-8859-1"
+	echo "ISO8859-2 ISO-8859-2"
+	echo "ISO8859-5 ISO-8859-5"
+	echo "ISO8859-6 ISO-8859-6"
+	echo "ISO8859-7 ISO-8859-7"
+	echo "ISO8859-8 ISO-8859-8"
+	echo "ISO8859-9 ISO-8859-9"
+	echo "ISO8859-15 ISO-8859-15"
+	echo "IBM-850 CP850"
+	echo "IBM-856 CP856"
+	echo "IBM-921 ISO-8859-13"
+	echo "IBM-922 CP922"
+	echo "IBM-932 CP932"
+	echo "IBM-943 CP943"
+	echo "IBM-1046 CP1046"
+	echo "IBM-1124 CP1124"
+	echo "IBM-1129 CP1129"
+	echo "IBM-1252 CP1252"
+	echo "IBM-eucCN GB2312"
+	echo "IBM-eucJP EUC-JP"
+	echo "IBM-eucKR EUC-KR"
+	echo "IBM-eucTW EUC-TW"
+	echo "big5 BIG5"
+	echo "GBK GBK"
+	echo "TIS-620 TIS-620"
+	echo "UTF-8 UTF-8"
+	;;
+    hpux*)
+	echo "iso88591 ISO-8859-1"
+	echo "iso88592 ISO-8859-2"
+	echo "iso88595 ISO-8859-5"
+	echo "iso88596 ISO-8859-6"
+	echo "iso88597 ISO-8859-7"
+	echo "iso88598 ISO-8859-8"
+	echo "iso88599 ISO-8859-9"
+	echo "iso885915 ISO-8859-15"
+	echo "roman8 HP-ROMAN8"
+	echo "arabic8 HP-ARABIC8"
+	echo "greek8 HP-GREEK8"
+	echo "hebrew8 HP-HEBREW8"
+	echo "turkish8 HP-TURKISH8"
+	echo "kana8 HP-KANA8"
+	echo "tis620 TIS-620"
+	echo "big5 BIG5"
+	echo "eucJP EUC-JP"
+	echo "eucKR EUC-KR"
+	echo "eucTW EUC-TW"
+	echo "hp15CN GB2312"
+	#echo "ccdc ?" # what is this?
+	echo "SJIS SHIFT_JIS"
+	echo "utf8 UTF-8"
+	;;
+    irix*)
+	echo "ISO8859-1 ISO-8859-1"
+	echo "ISO8859-2 ISO-8859-2"
+	echo "ISO8859-5 ISO-8859-5"
+	echo "ISO8859-7 ISO-8859-7"
+	echo "ISO8859-9 ISO-8859-9"
+	echo "eucCN GB2312"
+	echo "eucJP EUC-JP"
+	echo "eucKR EUC-KR"
+	echo "eucTW EUC-TW"
+	;;
+    osf*)
+	echo "ISO8859-1 ISO-8859-1"
+	echo "ISO8859-2 ISO-8859-2"
+	echo "ISO8859-4 ISO-8859-4"
+	echo "ISO8859-5 ISO-8859-5"
+	echo "ISO8859-7 ISO-8859-7"
+	echo "ISO8859-8 ISO-8859-8"
+	echo "ISO8859-9 ISO-8859-9"
+	echo "ISO8859-15 ISO-8859-15"
+	echo "cp850 CP850"
+	echo "big5 BIG5"
+	echo "dechanyu DEC-HANYU"
+	echo "dechanzi GB2312"
+	echo "deckanji DEC-KANJI"
+	echo "deckorean EUC-KR"
+	echo "eucJP EUC-JP"
+	echo "eucKR EUC-KR"
+	echo "eucTW EUC-TW"
+	echo "GBK GBK"
+	echo "KSC5601 CP949"
+	echo "sdeckanji EUC-JP"
+	echo "SJIS SHIFT_JIS"
+	echo "TACTIS TIS-620"
+	echo "UTF-8 UTF-8"
+	;;
+    solaris*)
+	echo "646 ASCII"
+	echo "ISO8859-1 ISO-8859-1"
+	echo "ISO8859-2 ISO-8859-2"
+	echo "ISO8859-3 ISO-8859-3"
+	echo "ISO8859-4 ISO-8859-4"
+	echo "ISO8859-5 ISO-8859-5"
+	echo "ISO8859-6 ISO-8859-6"
+	echo "ISO8859-7 ISO-8859-7"
+	echo "ISO8859-8 ISO-8859-8"
+	echo "ISO8859-9 ISO-8859-9"
+	echo "ISO8859-15 ISO-8859-15"
+	echo "koi8-r KOI8-R"
+	echo "ansi-1251 CP1251"
+	echo "BIG5 BIG5"
+	echo "Big5-HKSCS BIG5-HKSCS"
+	echo "gb2312 GB2312"
+	echo "GBK GBK"
+	echo "GB18030 GB18030"
+	echo "cns11643 EUC-TW"
+	echo "5601 EUC-KR"
+	echo "ko_KR.johap92 JOHAB"
+	echo "eucJP EUC-JP"
+	echo "PCK SHIFT_JIS"
+	echo "TIS620.2533 TIS-620"
+	#echo "sun_eu_greek ?" # what is this?
+	echo "UTF-8 UTF-8"
+	;;
+    freebsd* | os2*)
+	# FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+	# localcharset.c falls back to using the full locale name
+	# from the environment variables.
+	# Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+	# reuse FreeBSD's locale data for OS/2.
+	echo "C ASCII"
+	echo "US-ASCII ASCII"
+	for l in la_LN lt_LN; do
+	  echo "$l.ASCII ASCII"
+	done
+	for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+	         fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+	         lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+	  echo "$l.ISO_8859-1 ISO-8859-1"
+	  echo "$l.DIS_8859-15 ISO-8859-15"
+	done
+	for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+	  echo "$l.ISO_8859-2 ISO-8859-2"
+	done
+	for l in la_LN lt_LT; do
+	  echo "$l.ISO_8859-4 ISO-8859-4"
+	done
+	for l in ru_RU ru_SU; do
+	  echo "$l.KOI8-R KOI8-R"
+	  echo "$l.ISO_8859-5 ISO-8859-5"
+	  echo "$l.CP866 CP866"
+	done
+	echo "uk_UA.KOI8-U KOI8-U"
+	echo "zh_TW.BIG5 BIG5"
+	echo "zh_TW.Big5 BIG5"
+	echo "zh_CN.EUC GB2312"
+	echo "ja_JP.EUC EUC-JP"
+	echo "ja_JP.SJIS SHIFT_JIS"
+	echo "ja_JP.Shift_JIS SHIFT_JIS"
+	echo "ko_KR.EUC EUC-KR"
+	;;
+    netbsd*)
+	echo "646 ASCII"
+	echo "ISO8859-1 ISO-8859-1"
+	echo "ISO8859-2 ISO-8859-2"
+	echo "ISO8859-4 ISO-8859-4"
+	echo "ISO8859-5 ISO-8859-5"
+	echo "ISO8859-7 ISO-8859-7"
+	echo "ISO8859-13 ISO-8859-13"
+	echo "ISO8859-15 ISO-8859-15"
+	echo "eucCN GB2312"
+	echo "eucJP EUC-JP"
+	echo "eucKR EUC-KR"
+	echo "eucTW EUC-TW"
+	echo "BIG5 BIG5"
+	echo "SJIS SHIFT_JIS"
+	;;
+    darwin[56]*)
+	# Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+	# localcharset.c falls back to using the full locale name
+	# from the environment variables.
+	echo "C ASCII"
+	for l in en_AU en_CA en_GB en_US la_LN; do
+	  echo "$l.US-ASCII ASCII"
+	done
+	for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+	         fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+	         nl_NL no_NO pt_PT sv_SE; do
+	  echo "$l ISO-8859-1"
+	  echo "$l.ISO8859-1 ISO-8859-1"
+	  echo "$l.ISO8859-15 ISO-8859-15"
+	done
+	for l in la_LN; do
+	  echo "$l.ISO8859-1 ISO-8859-1"
+	  echo "$l.ISO8859-15 ISO-8859-15"
+	done
+	for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+	  echo "$l.ISO8859-2 ISO-8859-2"
+	done
+	for l in la_LN lt_LT; do
+	  echo "$l.ISO8859-4 ISO-8859-4"
+	done
+	for l in ru_RU; do
+	  echo "$l.KOI8-R KOI8-R"
+	  echo "$l.ISO8859-5 ISO-8859-5"
+	  echo "$l.CP866 CP866"
+	done
+	for l in bg_BG; do
+	  echo "$l.CP1251 CP1251"
+	done
+	echo "uk_UA.KOI8-U KOI8-U"
+	echo "zh_TW.BIG5 BIG5"
+	echo "zh_TW.Big5 BIG5"
+	echo "zh_CN.EUC GB2312"
+	echo "ja_JP.EUC EUC-JP"
+	echo "ja_JP.SJIS SHIFT_JIS"
+	echo "ko_KR.EUC EUC-KR"
+	;;
+    darwin*)
+	# Darwin 7.5 has nl_langinfo(CODESET), but it is useless:
+	# - It returns the empty string when LANG is set to a locale of the
+	#   form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+	#   LC_CTYPE file.
+	# - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+	#   the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+	# - The documentation says:
+	#     "... all code that calls BSD system routines should ensure
+	#      that the const *char parameters of these routines are in UTF-8
+	#      encoding. All BSD system functions expect their string
+	#      parameters to be in UTF-8 encoding and nothing else."
+	#   It also says
+	#     "An additional caveat is that string parameters for files,
+	#      paths, and other file-system entities must be in canonical
+	#      UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+	#      characters are decomposed ..."
+	#   but this is not true: You can pass non-decomposed UTF-8 strings
+	#   to file system functions, and it is the OS which will convert
+	#   them to decomposed UTF-8 before accessing the file system.
+	# - The Apple Terminal application displays UTF-8 by default.
+	# - However, other applications are free to use different encodings:
+	#   - xterm uses ISO-8859-1 by default.
+	#   - TextEdit uses MacRoman by default.
+	# We prefer UTF-8 over decomposed UTF-8-MAC because one should
+	# minimize the use of decomposed Unicode. Unfortunately, through the
+	# Darwin file system, decomposed UTF-8 strings are leaked into user
+	# space nevertheless.
+	echo "* UTF-8"
+	;;
+    beos*)
+	# BeOS has a single locale, and it has UTF-8 encoding.
+	echo "* UTF-8"
+	;;
+    msdosdjgpp*)
+	# DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+	# localcharset.c falls back to using the full locale name
+	# from the environment variables.
+	echo "#"
+	echo "# The encodings given here may not all be correct."
+	echo "# If you find that the encoding given for your language and"
+	echo "# country is not the one your DOS machine actually uses, just"
+	echo "# correct it in this file, and send a mail to"
+	echo "# Juan Manuel Guerrero <juan.guerrero at gmx.de>"
+	echo "# and Bruno Haible <bruno at clisp.org>."
+	echo "#"
+	echo "C ASCII"
+	# ISO-8859-1 languages
+	echo "ca CP850"
+	echo "ca_ES CP850"
+	echo "da CP865"    # not CP850 ??
+	echo "da_DK CP865" # not CP850 ??
+	echo "de CP850"
+	echo "de_AT CP850"
+	echo "de_CH CP850"
+	echo "de_DE CP850"
+	echo "en CP850"
+	echo "en_AU CP850" # not CP437 ??
+	echo "en_CA CP850"
+	echo "en_GB CP850"
+	echo "en_NZ CP437"
+	echo "en_US CP437"
+	echo "en_ZA CP850" # not CP437 ??
+	echo "es CP850"
+	echo "es_AR CP850"
+	echo "es_BO CP850"
+	echo "es_CL CP850"
+	echo "es_CO CP850"
+	echo "es_CR CP850"
+	echo "es_CU CP850"
+	echo "es_DO CP850"
+	echo "es_EC CP850"
+	echo "es_ES CP850"
+	echo "es_GT CP850"
+	echo "es_HN CP850"
+	echo "es_MX CP850"
+	echo "es_NI CP850"
+	echo "es_PA CP850"
+	echo "es_PY CP850"
+	echo "es_PE CP850"
+	echo "es_SV CP850"
+	echo "es_UY CP850"
+	echo "es_VE CP850"
+	echo "et CP850"
+	echo "et_EE CP850"
+	echo "eu CP850"
+	echo "eu_ES CP850"
+	echo "fi CP850"
+	echo "fi_FI CP850"
+	echo "fr CP850"
+	echo "fr_BE CP850"
+	echo "fr_CA CP850"
+	echo "fr_CH CP850"
+	echo "fr_FR CP850"
+	echo "ga CP850"
+	echo "ga_IE CP850"
+	echo "gd CP850"
+	echo "gd_GB CP850"
+	echo "gl CP850"
+	echo "gl_ES CP850"
+	echo "id CP850"    # not CP437 ??
+	echo "id_ID CP850" # not CP437 ??
+	echo "is CP861"    # not CP850 ??
+	echo "is_IS CP861" # not CP850 ??
+	echo "it CP850"
+	echo "it_CH CP850"
+	echo "it_IT CP850"
+	echo "lt CP775"
+	echo "lt_LT CP775"
+	echo "lv CP775"
+	echo "lv_LV CP775"
+	echo "nb CP865"    # not CP850 ??
+	echo "nb_NO CP865" # not CP850 ??
+	echo "nl CP850"
+	echo "nl_BE CP850"
+	echo "nl_NL CP850"
+	echo "nn CP865"    # not CP850 ??
+	echo "nn_NO CP865" # not CP850 ??
+	echo "no CP865"    # not CP850 ??
+	echo "no_NO CP865" # not CP850 ??
+	echo "pt CP850"
+	echo "pt_BR CP850"
+	echo "pt_PT CP850"
+	echo "sv CP850"
+	echo "sv_SE CP850"
+	# ISO-8859-2 languages
+	echo "cs CP852"
+	echo "cs_CZ CP852"
+	echo "hr CP852"
+	echo "hr_HR CP852"
+	echo "hu CP852"
+	echo "hu_HU CP852"
+	echo "pl CP852"
+	echo "pl_PL CP852"
+	echo "ro CP852"
+	echo "ro_RO CP852"
+	echo "sk CP852"
+	echo "sk_SK CP852"
+	echo "sl CP852"
+	echo "sl_SI CP852"
+	echo "sq CP852"
+	echo "sq_AL CP852"
+	echo "sr CP852"    # CP852 or CP866 or CP855 ??
+	echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+	echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+	# ISO-8859-3 languages
+	echo "mt CP850"
+	echo "mt_MT CP850"
+	# ISO-8859-5 languages
+	echo "be CP866"
+	echo "be_BE CP866"
+	echo "bg CP866"    # not CP855 ??
+	echo "bg_BG CP866" # not CP855 ??
+	echo "mk CP866"    # not CP855 ??
+	echo "mk_MK CP866" # not CP855 ??
+	echo "ru CP866"
+	echo "ru_RU CP866"
+	echo "uk CP1125"
+	echo "uk_UA CP1125"
+	# ISO-8859-6 languages
+	echo "ar CP864"
+	echo "ar_AE CP864"
+	echo "ar_DZ CP864"
+	echo "ar_EG CP864"
+	echo "ar_IQ CP864"
+	echo "ar_IR CP864"
+	echo "ar_JO CP864"
+	echo "ar_KW CP864"
+	echo "ar_MA CP864"
+	echo "ar_OM CP864"
+	echo "ar_QA CP864"
+	echo "ar_SA CP864"
+	echo "ar_SY CP864"
+	# ISO-8859-7 languages
+	echo "el CP869"
+	echo "el_GR CP869"
+	# ISO-8859-8 languages
+	echo "he CP862"
+	echo "he_IL CP862"
+	# ISO-8859-9 languages
+	echo "tr CP857"
+	echo "tr_TR CP857"
+	# Japanese
+	echo "ja CP932"
+	echo "ja_JP CP932"
+	# Chinese
+	echo "zh_CN GBK"
+	echo "zh_TW CP950" # not CP938 ??
+	# Korean
+	echo "kr CP949"    # not CP934 ??
+	echo "kr_KR CP949" # not CP934 ??
+	# Thai
+	echo "th CP874"
+	echo "th_TH CP874"
+	# Other
+	echo "eo CP850"
+	echo "eo_EO CP850"
+	;;
+esac


Property changes on: tuxmath/trunk/intl/config.charset
___________________________________________________________________
Name: svn:executable
   + *

Added: tuxmath/trunk/intl/dcgettext.c
===================================================================
--- tuxmath/trunk/intl/dcgettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/dcgettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,56 @@
+/* Implementation of the dcgettext(3) function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCGETTEXT libintl_dcgettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCGETTEXT (const char *domainname, const char *msgid, int category)
+{
+  return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+INTDEF(__dcgettext)
+weak_alias (__dcgettext, dcgettext);
+#endif

Added: tuxmath/trunk/intl/dcigettext.c
===================================================================
--- tuxmath/trunk/intl/dcigettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/dcigettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1689 @@
+/* Implementation of the internal dcigettext function.
+   Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE	1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* NL_LOCALE_NAME does not work in glibc-2.4.  Ignore it.  */
+#undef HAVE_NL_LOCALE_NAME
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <locale.h>
+
+#ifdef _LIBC
+  /* Guess whether integer division by zero raises signal SIGFPE.
+     Set to 1 only if you know for sure.  In case of doubt, set to 0.  */
+# if defined __alpha__ || defined __arm__ || defined __i386__ \
+     || defined __m68k__ || defined __s390__
+#  define INTDIV0_RAISES_SIGFPE 1
+# else
+#  define INTDIV0_RAISES_SIGFPE 0
+# endif
+#endif
+#if !INTDIV0_RAISES_SIGFPE
+# include <signal.h>
+#endif
+
+#if defined HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+
+#if !defined _LIBC
+# if HAVE_NL_LOCALE_NAME
+#  include <langinfo.h>
+# endif
+# include "localcharset.h"
+#endif
+
+#include "gettextP.h"
+#include "plural-exp.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# ifdef IN_LIBGLOCALE
+#  include <libintl.h>
+# endif
+# include "libgnuintl.h"
+#endif
+#include "hash-string.h"
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+# define gl_rwlock_define_initialized __libc_rwlock_define_initialized
+# define gl_rwlock_rdlock __libc_rwlock_rdlock
+# define gl_rwlock_wrlock __libc_rwlock_wrlock
+# define gl_rwlock_unlock __libc_rwlock_unlock
+#else
+# include "lock.h"
+#endif
+
+/* Alignment of types.  */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define alignof(TYPE) __alignof__ (TYPE)
+#else
+# define alignof(TYPE) \
+    ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define getcwd __getcwd
+# ifndef stpcpy
+#  define stpcpy __stpcpy
+# endif
+# define tfind __tfind
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+#  define getcwd(buf, max) getwd (buf)
+# else
+#  if VMS
+#   define getcwd(buf, max) (getcwd) (buf, max, 0)
+#  else
+char *getcwd ();
+#  endif
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+# ifndef HAVE_MEMPCPY
+static void *mempcpy (void *dest, const void *src, size_t n);
+# endif
+#endif
+
+/* Use a replacement if the system does not provide the `tsearch' function
+   family.  */
+#if HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+#else
+# define tsearch libintl_tsearch
+# define tfind libintl_tfind
+# define tdelete libintl_tdelete
+# define twalk libintl_twalk
+# include "tsearch.h"
+#endif
+
+#ifdef _LIBC
+# define tsearch __tsearch
+#endif
+
+/* Amount to increase buffer size by in each try.  */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h.  */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+   PATH_MAX but might cause redefinition warnings when sys/param.h is
+   later included (as on MORE/BSD 4.3).  */
+#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been.  */
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#endif
+
+/* Whether to support different locales in different threads.  */
+#if defined _LIBC || HAVE_NL_LOCALE_NAME || (HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS) || defined IN_LIBGLOCALE
+# define HAVE_PER_THREAD_LOCALE
+#endif
+
+/* This is the type used for the search tree where known translations
+   are stored.  */
+struct known_translation_t
+{
+  /* Domain in which to search.  */
+  const char *domainname;
+
+  /* The category.  */
+  int category;
+
+#ifdef HAVE_PER_THREAD_LOCALE
+  /* Name of the relevant locale category, or "" for the global locale.  */
+  const char *localename;
+#endif
+
+#ifdef IN_LIBGLOCALE
+  /* The character encoding.  */
+  const char *encoding;
+#endif
+
+  /* State of the catalog counter at the point the string was found.  */
+  int counter;
+
+  /* Catalog where the string was found.  */
+  struct loaded_l10nfile *domain;
+
+  /* And finally the translation.  */
+  const char *translation;
+  size_t translation_length;
+
+  /* Pointer to the string in question.  */
+  char msgid[ZERO];
+};
+
+gl_rwlock_define_initialized (static, tree_lock)
+
+/* Root of the search tree with known translations.  */
+static void *root;
+
+/* Function to compare two entries in the table of known translations.  */
+static int
+transcmp (const void *p1, const void *p2)
+{
+  const struct known_translation_t *s1;
+  const struct known_translation_t *s2;
+  int result;
+
+  s1 = (const struct known_translation_t *) p1;
+  s2 = (const struct known_translation_t *) p2;
+
+  result = strcmp (s1->msgid, s2->msgid);
+  if (result == 0)
+    {
+      result = strcmp (s1->domainname, s2->domainname);
+      if (result == 0)
+	{
+#ifdef HAVE_PER_THREAD_LOCALE
+	  result = strcmp (s1->localename, s2->localename);
+	  if (result == 0)
+#endif
+	    {
+#ifdef IN_LIBGLOCALE
+	      result = strcmp (s1->encoding, s2->encoding);
+	      if (result == 0)
+#endif
+		/* We compare the category last (though this is the cheapest
+		   operation) since it is hopefully always the same (namely
+		   LC_MESSAGES).  */
+		result = s1->category - s2->category;
+	    }
+	}
+    }
+
+  return result;
+}
+
+/* Name of the default domain used for gettext(3) prior any call to
+   textdomain(3).  The default value for this is "messages".  */
+const char _nl_default_default_domain[] attribute_hidden = "messages";
+
+#ifndef IN_LIBGLOCALE
+/* Value used as the default domain for gettext(3).  */
+const char *_nl_current_default_domain attribute_hidden
+     = _nl_default_default_domain;
+#endif
+
+/* Contains the default location of the message catalogs.  */
+#if defined __EMX__
+extern const char _nl_default_dirname[];
+#else
+# ifdef _LIBC
+extern const char _nl_default_dirname[];
+libc_hidden_proto (_nl_default_dirname)
+# endif
+const char _nl_default_dirname[] = LOCALEDIR;
+# ifdef _LIBC
+libc_hidden_data_def (_nl_default_dirname)
+# endif
+#endif
+
+#ifndef IN_LIBGLOCALE
+/* List with bindings of specific domains created by bindtextdomain()
+   calls.  */
+struct binding *_nl_domain_bindings;
+#endif
+
+/* Prototypes for local functions.  */
+static char *plural_lookup (struct loaded_l10nfile *domain,
+			    unsigned long int n,
+			    const char *translation, size_t translation_len)
+     internal_function;
+
+#ifdef IN_LIBGLOCALE
+static const char *guess_category_value (int category,
+					 const char *categoryname,
+					 const char *localename)
+     internal_function;
+#else
+static const char *guess_category_value (int category,
+					 const char *categoryname)
+     internal_function;
+#endif
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# define category_to_name(category) \
+  _nl_category_names.str + _nl_category_name_idxs[category]
+#else
+static const char *category_to_name (int category) internal_function;
+#endif
+#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE
+static const char *get_output_charset (struct binding *domainbinding)
+     internal_function;
+#endif
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define freea(p) /* nothing */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)						      \
+  do {									      \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to	      \
+       the list.  */							      \
+    if (newp != NULL) {							      \
+      newp->address = (addr);						      \
+      newp->next = (list);						      \
+      (list) = newp;							      \
+    }									      \
+  } while (0)
+# define FREE_BLOCKS(list)						      \
+  do {									      \
+    while (list != NULL) {						      \
+      struct block_list *old = list;					      \
+      list = list->next;						      \
+      free (old->address);						      \
+      free (old);							      \
+    }									      \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+# define freea(p) free (p)
+#endif	/* have alloca */
+
+
+#ifdef _LIBC
+/* List of blocks allocated for translations.  */
+typedef struct transmem_list
+{
+  struct transmem_list *next;
+  char data[ZERO];
+} transmem_block_t;
+static struct transmem_list *transmem_list;
+#else
+typedef unsigned char transmem_block_t;
+#endif
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCIGETTEXT __dcigettext
+#else
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+gl_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+   easier methods therefore we make a difference here.  */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+# ifndef HAVE_GETUID
+#  define getuid() 0
+# endif
+# ifndef HAVE_GETGID
+#  define getgid() 0
+# endif
+# ifndef HAVE_GETEUID
+#  define geteuid() getuid()
+# endif
+# ifndef HAVE_GETEGID
+#  define getegid() getgid()
+# endif
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+  if (enable_secure == 0)						      \
+    {									      \
+      if (getuid () != geteuid () || getgid () != getegid ())		      \
+	enable_secure = 1;						      \
+      else								      \
+	enable_secure = -1;						      \
+    }
+#endif
+
+/* Get the function to evaluate the plural expression.  */
+#include "eval-plural.h"
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   CATEGORY locale and, if PLURAL is nonzero, search over string
+   depending on the plural form determined by N.  */
+#ifdef IN_LIBGLOCALE
+char *
+gl_dcigettext (const char *domainname,
+	       const char *msgid1, const char *msgid2,
+	       int plural, unsigned long int n,
+	       int category,
+	       const char *localename, const char *encoding)
+#else
+char *
+DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+	    int plural, unsigned long int n, int category)
+#endif
+{
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  struct loaded_l10nfile *domain;
+  struct binding *binding;
+  const char *categoryname;
+  const char *categoryvalue;
+  const char *dirname;
+  char *xdomainname;
+  char *single_locale;
+  char *retval;
+  size_t retlen;
+  int saved_errno;
+  struct known_translation_t *search;
+  struct known_translation_t **foundp = NULL;
+  size_t msgid_len;
+#if defined HAVE_PER_THREAD_LOCALE && !defined IN_LIBGLOCALE
+  const char *localename;
+#endif
+  size_t domainname_len;
+
+  /* If no real MSGID is given return NULL.  */
+  if (msgid1 == NULL)
+    return NULL;
+
+#ifdef _LIBC
+  if (category < 0 || category >= __LC_LAST || category == LC_ALL)
+    /* Bogus.  */
+    return (plural == 0
+	    ? (char *) msgid1
+	    /* Use the Germanic plural rule.  */
+	    : n == 1 ? (char *) msgid1 : (char *) msgid2);
+#endif
+
+  /* Preserve the `errno' value.  */
+  saved_errno = errno;
+
+  gl_rwlock_rdlock (_nl_state_lock);
+
+  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
+     CATEGORY is not LC_MESSAGES this might not make much sense but the
+     definition left this undefined.  */
+  if (domainname == NULL)
+    domainname = _nl_current_default_domain;
+
+  /* OS/2 specific: backward compatibility with older libintl versions  */
+#ifdef LC_MESSAGES_COMPAT
+  if (category == LC_MESSAGES_COMPAT)
+    category = LC_MESSAGES;
+#endif
+
+  msgid_len = strlen (msgid1) + 1;
+
+  /* Try to find the translation among those which we found at
+     some time.  */
+  search = (struct known_translation_t *)
+	   alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+  memcpy (search->msgid, msgid1, msgid_len);
+  search->domainname = domainname;
+  search->category = category;
+#ifdef HAVE_PER_THREAD_LOCALE
+# ifndef IN_LIBGLOCALE
+#  ifdef _LIBC
+  localename = __current_locale_name (category);
+#  else
+#   if HAVE_NL_LOCALE_NAME
+  /* NL_LOCALE_NAME is public glibc API introduced in glibc-2.4.  */
+  localename = nl_langinfo (NL_LOCALE_NAME (category));
+#   else
+#    if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS
+  /* The __names field is not public glibc API and must therefore not be used
+     in code that is installed in public locations.  */
+  {
+    locale_t thread_locale = uselocale (NULL);
+    if (thread_locale != LC_GLOBAL_LOCALE)
+      localename = thread_locale->__names[category];
+    else
+      localename = "";
+  }
+#    endif
+#   endif
+#  endif
+# endif
+  search->localename = localename;
+# ifdef IN_LIBGLOCALE
+  search->encoding = encoding;
+# endif
+
+  /* Since tfind/tsearch manage a balanced tree, concurrent tfind and
+     tsearch calls can be fatal.  */
+  gl_rwlock_rdlock (tree_lock);
+
+  foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+
+  gl_rwlock_unlock (tree_lock);
+
+  freea (search);
+  if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+    {
+      /* Now deal with plural.  */
+      if (plural)
+	retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+				(*foundp)->translation_length);
+      else
+	retval = (char *) (*foundp)->translation;
+
+      gl_rwlock_unlock (_nl_state_lock);
+      __set_errno (saved_errno);
+      return retval;
+    }
+#endif
+
+  /* See whether this is a SUID binary or not.  */
+  DETERMINE_SECURE;
+
+  /* First find matching binding.  */
+#ifdef IN_LIBGLOCALE
+  /* We can use a trivial binding, since _nl_find_msg will ignore it anyway,
+     and _nl_load_domain and _nl_find_domain just pass it through.  */
+  binding = NULL;
+  dirname = bindtextdomain (domainname, NULL);
+#else
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+	/* We found it!  */
+	break;
+      if (compare < 0)
+	{
+	  /* It is not in the list.  */
+	  binding = NULL;
+	  break;
+	}
+    }
+
+  if (binding == NULL)
+    dirname = _nl_default_dirname;
+  else
+    {
+      dirname = binding->dirname;
+#endif
+      if (!IS_ABSOLUTE_PATH (dirname))
+	{
+	  /* We have a relative path.  Make it absolute now.  */
+	  size_t dirname_len = strlen (dirname) + 1;
+	  size_t path_max;
+	  char *resolved_dirname;
+	  char *ret;
+
+	  path_max = (unsigned int) PATH_MAX;
+	  path_max += 2;		/* The getcwd docs say to do this.  */
+
+	  for (;;)
+	    {
+	      resolved_dirname = (char *) alloca (path_max + dirname_len);
+	      ADD_BLOCK (block_list, tmp_dirname);
+
+	      __set_errno (0);
+	      ret = getcwd (resolved_dirname, path_max);
+	      if (ret != NULL || errno != ERANGE)
+		break;
+
+	      path_max += path_max / 2;
+	      path_max += PATH_INCR;
+	    }
+
+	  if (ret == NULL)
+	    /* We cannot get the current working directory.  Don't signal an
+	       error but simply return the default string.  */
+	    goto return_untranslated;
+
+	  stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname);
+	  dirname = resolved_dirname;
+	}
+#ifndef IN_LIBGLOCALE
+    }
+#endif
+
+  /* Now determine the symbolic name of CATEGORY and its value.  */
+  categoryname = category_to_name (category);
+#ifdef IN_LIBGLOCALE
+  categoryvalue = guess_category_value (category, categoryname, localename);
+#else
+  categoryvalue = guess_category_value (category, categoryname);
+#endif
+
+  domainname_len = strlen (domainname);
+  xdomainname = (char *) alloca (strlen (categoryname)
+				 + domainname_len + 5);
+  ADD_BLOCK (block_list, xdomainname);
+
+  stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+			    domainname, domainname_len),
+	  ".mo");
+
+  /* Creating working area.  */
+  single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+  ADD_BLOCK (block_list, single_locale);
+
+
+  /* Search for the given string.  This is a loop because we perhaps
+     got an ordered list of languages to consider for the translation.  */
+  while (1)
+    {
+      /* Make CATEGORYVALUE point to the next element of the list.  */
+      while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+	++categoryvalue;
+      if (categoryvalue[0] == '\0')
+	{
+	  /* The whole contents of CATEGORYVALUE has been searched but
+	     no valid entry has been found.  We solve this situation
+	     by implicitly appending a "C" entry, i.e. no translation
+	     will take place.  */
+	  single_locale[0] = 'C';
+	  single_locale[1] = '\0';
+	}
+      else
+	{
+	  char *cp = single_locale;
+	  while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+	    *cp++ = *categoryvalue++;
+	  *cp = '\0';
+
+	  /* When this is a SUID binary we must not allow accessing files
+	     outside the dedicated directories.  */
+	  if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+	    /* Ingore this entry.  */
+	    continue;
+	}
+
+      /* If the current locale value is C (or POSIX) we don't load a
+	 domain.  Return the MSGID.  */
+      if (strcmp (single_locale, "C") == 0
+	  || strcmp (single_locale, "POSIX") == 0)
+	break;
+
+      /* Find structure describing the message catalog matching the
+	 DOMAINNAME and CATEGORY.  */
+      domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+
+      if (domain != NULL)
+	{
+#if defined IN_LIBGLOCALE
+	  retval = _nl_find_msg (domain, binding, encoding, msgid1, &retlen);
+#else
+	  retval = _nl_find_msg (domain, binding, msgid1, 1, &retlen);
+#endif
+
+	  if (retval == NULL)
+	    {
+	      int cnt;
+
+	      for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+		{
+#if defined IN_LIBGLOCALE
+		  retval = _nl_find_msg (domain->successor[cnt], binding,
+					 encoding, msgid1, &retlen);
+#else
+		  retval = _nl_find_msg (domain->successor[cnt], binding,
+					 msgid1, 1, &retlen);
+#endif
+
+		  if (retval != NULL)
+		    {
+		      domain = domain->successor[cnt];
+		      break;
+		    }
+		}
+	    }
+
+	  /* Returning -1 means that some resource problem exists
+	     (likely memory) and that the strings could not be
+	     converted.  Return the original strings.  */
+	  if (__builtin_expect (retval == (char *) -1, 0))
+	    break;
+
+	  if (retval != NULL)
+	    {
+	      /* Found the translation of MSGID1 in domain DOMAIN:
+		 starting at RETVAL, RETLEN bytes.  */
+	      FREE_BLOCKS (block_list);
+	      if (foundp == NULL)
+		{
+		  /* Create a new entry and add it to the search tree.  */
+		  size_t size;
+		  struct known_translation_t *newp;
+
+		  size = offsetof (struct known_translation_t, msgid)
+			 + msgid_len + domainname_len + 1;
+#ifdef HAVE_PER_THREAD_LOCALE
+		  size += strlen (localename) + 1;
+#endif
+		  newp = (struct known_translation_t *) malloc (size);
+		  if (newp != NULL)
+		    {
+		      char *new_domainname;
+#ifdef HAVE_PER_THREAD_LOCALE
+		      char *new_localename;
+#endif
+
+		      new_domainname =
+			(char *) mempcpy (newp->msgid, msgid1, msgid_len);
+		      memcpy (new_domainname, domainname, domainname_len + 1);
+#ifdef HAVE_PER_THREAD_LOCALE
+		      new_localename = new_domainname + domainname_len + 1;
+		      strcpy (new_localename, localename);
+#endif
+		      newp->domainname = new_domainname;
+		      newp->category = category;
+#ifdef HAVE_PER_THREAD_LOCALE
+		      newp->localename = new_localename;
+#endif
+#ifdef IN_LIBGLOCALE
+		      newp->encoding = encoding;
+#endif
+		      newp->counter = _nl_msg_cat_cntr;
+		      newp->domain = domain;
+		      newp->translation = retval;
+		      newp->translation_length = retlen;
+
+		      gl_rwlock_wrlock (tree_lock);
+
+		      /* Insert the entry in the search tree.  */
+		      foundp = (struct known_translation_t **)
+			tsearch (newp, &root, transcmp);
+
+		      gl_rwlock_unlock (tree_lock);
+
+		      if (foundp == NULL
+			  || __builtin_expect (*foundp != newp, 0))
+			/* The insert failed.  */
+			free (newp);
+		    }
+		}
+	      else
+		{
+		  /* We can update the existing entry.  */
+		  (*foundp)->counter = _nl_msg_cat_cntr;
+		  (*foundp)->domain = domain;
+		  (*foundp)->translation = retval;
+		  (*foundp)->translation_length = retlen;
+		}
+
+	      __set_errno (saved_errno);
+
+	      /* Now deal with plural.  */
+	      if (plural)
+		retval = plural_lookup (domain, n, retval, retlen);
+
+	      gl_rwlock_unlock (_nl_state_lock);
+	      return retval;
+	    }
+	}
+    }
+
+ return_untranslated:
+  /* Return the untranslated MSGID.  */
+  FREE_BLOCKS (block_list);
+  gl_rwlock_unlock (_nl_state_lock);
+#ifndef _LIBC
+  if (!ENABLE_SECURE)
+    {
+      extern void _nl_log_untranslated (const char *logfilename,
+					const char *domainname,
+					const char *msgid1, const char *msgid2,
+					int plural);
+      const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
+
+      if (logfilename != NULL && logfilename[0] != '\0')
+	_nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
+    }
+#endif
+  __set_errno (saved_errno);
+  return (plural == 0
+	  ? (char *) msgid1
+	  /* Use the Germanic plural rule.  */
+	  : n == 1 ? (char *) msgid1 : (char *) msgid2);
+}
+
+
+/* Look up the translation of msgid within DOMAIN_FILE and DOMAINBINDING.
+   Return it if found.  Return NULL if not found or in case of a conversion
+   failure (problem in the particular message catalog).  Return (char *) -1
+   in case of a memory allocation failure during conversion (only if
+   ENCODING != NULL resp. CONVERT == true).  */
+char *
+internal_function
+#ifdef IN_LIBGLOCALE
+_nl_find_msg (struct loaded_l10nfile *domain_file,
+	      struct binding *domainbinding, const char *encoding,
+	      const char *msgid,
+	      size_t *lengthp)
+#else
+_nl_find_msg (struct loaded_l10nfile *domain_file,
+	      struct binding *domainbinding,
+	      const char *msgid, int convert,
+	      size_t *lengthp)
+#endif
+{
+  struct loaded_domain *domain;
+  nls_uint32 nstrings;
+  size_t act;
+  char *result;
+  size_t resultlen;
+
+  if (domain_file->decided <= 0)
+    _nl_load_domain (domain_file, domainbinding);
+
+  if (domain_file->data == NULL)
+    return NULL;
+
+  domain = (struct loaded_domain *) domain_file->data;
+
+  nstrings = domain->nstrings;
+
+  /* Locate the MSGID and its translation.  */
+  if (domain->hash_tab != NULL)
+    {
+      /* Use the hashing table.  */
+      nls_uint32 len = strlen (msgid);
+      nls_uint32 hash_val = __hash_string (msgid);
+      nls_uint32 idx = hash_val % domain->hash_size;
+      nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+      while (1)
+	{
+	  nls_uint32 nstr =
+	    W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
+
+	  if (nstr == 0)
+	    /* Hash table entry is empty.  */
+	    return NULL;
+
+	  nstr--;
+
+	  /* Compare msgid with the original string at index nstr.
+	     We compare the lengths with >=, not ==, because plural entries
+	     are represented by strings with an embedded NUL.  */
+	  if (nstr < nstrings
+	      ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
+		&& (strcmp (msgid,
+			    domain->data + W (domain->must_swap,
+					      domain->orig_tab[nstr].offset))
+		    == 0)
+	      : domain->orig_sysdep_tab[nstr - nstrings].length > len
+		&& (strcmp (msgid,
+			    domain->orig_sysdep_tab[nstr - nstrings].pointer)
+		    == 0))
+	    {
+	      act = nstr;
+	      goto found;
+	    }
+
+	  if (idx >= domain->hash_size - incr)
+	    idx -= domain->hash_size - incr;
+	  else
+	    idx += incr;
+	}
+      /* NOTREACHED */
+    }
+  else
+    {
+      /* Try the default method:  binary search in the sorted array of
+	 messages.  */
+      size_t top, bottom;
+
+      bottom = 0;
+      top = nstrings;
+      while (bottom < top)
+	{
+	  int cmp_val;
+
+	  act = (bottom + top) / 2;
+	  cmp_val = strcmp (msgid, (domain->data
+				    + W (domain->must_swap,
+					 domain->orig_tab[act].offset)));
+	  if (cmp_val < 0)
+	    top = act;
+	  else if (cmp_val > 0)
+	    bottom = act + 1;
+	  else
+	    goto found;
+	}
+      /* No translation was found.  */
+      return NULL;
+    }
+
+ found:
+  /* The translation was found at index ACT.  If we have to convert the
+     string to use a different character set, this is the time.  */
+  if (act < nstrings)
+    {
+      result = (char *)
+	(domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
+      resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+    }
+  else
+    {
+      result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
+      resultlen = domain->trans_sysdep_tab[act - nstrings].length;
+    }
+
+#if defined _LIBC || HAVE_ICONV
+# ifdef IN_LIBGLOCALE
+  if (encoding != NULL)
+# else
+  if (convert)
+# endif
+    {
+      /* We are supposed to do a conversion.  */
+# ifndef IN_LIBGLOCALE
+      const char *encoding = get_output_charset (domainbinding);
+# endif
+      size_t nconversions;
+      struct converted_domain *convd;
+      size_t i;
+
+      /* Protect against reallocation of the table.  */
+      gl_rwlock_rdlock (domain->conversions_lock);
+
+      /* Search whether a table with converted translations for this
+	 encoding has already been allocated.  */
+      nconversions = domain->nconversions;
+      convd = NULL;
+
+      for (i = nconversions; i > 0; )
+	{
+	  i--;
+	  if (strcmp (domain->conversions[i].encoding, encoding) == 0)
+	    {
+	      convd = &domain->conversions[i];
+	      break;
+	    }
+	}
+
+      gl_rwlock_unlock (domain->conversions_lock);
+
+      if (convd == NULL)
+	{
+	  /* We have to allocate a new conversions table.  */
+	  gl_rwlock_wrlock (domain->conversions_lock);
+
+	  /* Maybe in the meantime somebody added the translation.
+	     Recheck.  */
+	  for (i = nconversions; i > 0; )
+	    {
+	      i--;
+	      if (strcmp (domain->conversions[i].encoding, encoding) == 0)
+		{
+		  convd = &domain->conversions[i];
+		  goto found_convd;
+		}
+	    }
+
+	  {
+	    /* Allocate a table for the converted translations for this
+	       encoding.  */
+	    struct converted_domain *new_conversions =
+	      (struct converted_domain *)
+	      (domain->conversions != NULL
+	       ? realloc (domain->conversions,
+			  (nconversions + 1) * sizeof (struct converted_domain))
+	       : malloc ((nconversions + 1) * sizeof (struct converted_domain)));
+
+	    if (__builtin_expect (new_conversions == NULL, 0))
+	      {
+		/* Nothing we can do, no more memory.  We cannot use the
+		   translation because it might be encoded incorrectly.  */
+	      unlock_fail:
+		gl_rwlock_unlock (domain->conversions_lock);
+		return (char *) -1;
+	      }
+
+	    domain->conversions = new_conversions;
+
+	    /* Copy the 'encoding' string to permanent storage.  */
+	    encoding = strdup (encoding);
+	    if (__builtin_expect (encoding == NULL, 0))
+	      /* Nothing we can do, no more memory.  We cannot use the
+		 translation because it might be encoded incorrectly.  */
+	      goto unlock_fail;
+
+	    convd = &new_conversions[nconversions];
+	    convd->encoding = encoding;
+
+	    /* Find out about the character set the file is encoded with.
+	       This can be found (in textual form) in the entry "".  If this
+	       entry does not exist or if this does not contain the 'charset='
+	       information, we will assume the charset matches the one the
+	       current locale and we don't have to perform any conversion.  */
+# ifdef _LIBC
+	    convd->conv = (__gconv_t) -1;
+# else
+#  if HAVE_ICONV
+	    convd->conv = (iconv_t) -1;
+#  endif
+# endif
+	    {
+	      char *nullentry;
+	      size_t nullentrylen;
+
+	      /* Get the header entry.  This is a recursion, but it doesn't
+		 reallocate domain->conversions because we pass
+		 encoding = NULL or convert = 0, respectively.  */
+	      nullentry =
+# ifdef IN_LIBGLOCALE
+		_nl_find_msg (domain_file, domainbinding, NULL, "",
+			      &nullentrylen);
+# else
+		_nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+# endif
+
+	      if (nullentry != NULL)
+		{
+		  const char *charsetstr;
+
+		  charsetstr = strstr (nullentry, "charset=");
+		  if (charsetstr != NULL)
+		    {
+		      size_t len;
+		      char *charset;
+		      const char *outcharset;
+
+		      charsetstr += strlen ("charset=");
+		      len = strcspn (charsetstr, " \t\n");
+
+		      charset = (char *) alloca (len + 1);
+# if defined _LIBC || HAVE_MEMPCPY
+		      *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+# else
+		      memcpy (charset, charsetstr, len);
+		      charset[len] = '\0';
+# endif
+
+		      outcharset = encoding;
+
+# ifdef _LIBC
+		      /* We always want to use transliteration.  */
+		      outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+		      charset = norm_add_slashes (charset, "");
+		      int r = __gconv_open (outcharset, charset, &convd->conv,
+					    GCONV_AVOID_NOCONV);
+		      if (__builtin_expect (r != __GCONV_OK, 0))
+			{
+			  /* If the output encoding is the same there is
+			     nothing to do.  Otherwise do not use the
+			     translation at all.  */
+			  if (__builtin_expect (r != __GCONV_NULCONV, 1))
+			    {
+			      gl_rwlock_unlock (domain->conversions_lock);
+			      free ((char *) encoding);
+			      return NULL;
+			    }
+
+			  convd->conv = (__gconv_t) -1;
+			}
+# else
+#  if HAVE_ICONV
+		      /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+			 we want to use transliteration.  */
+#   if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+       || _LIBICONV_VERSION >= 0x0105
+		      if (strchr (outcharset, '/') == NULL)
+			{
+			  char *tmp;
+
+			  len = strlen (outcharset);
+			  tmp = (char *) alloca (len + 10 + 1);
+			  memcpy (tmp, outcharset, len);
+			  memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+			  outcharset = tmp;
+
+			  convd->conv = iconv_open (outcharset, charset);
+
+			  freea (outcharset);
+			}
+		      else
+#   endif
+			convd->conv = iconv_open (outcharset, charset);
+#  endif
+# endif
+
+		      freea (charset);
+		    }
+		}
+	    }
+	    convd->conv_tab = NULL;
+	    /* Here domain->conversions is still == new_conversions.  */
+	    domain->nconversions++;
+	  }
+
+	found_convd:
+	  gl_rwlock_unlock (domain->conversions_lock);
+	}
+
+      if (
+# ifdef _LIBC
+	  convd->conv != (__gconv_t) -1
+# else
+#  if HAVE_ICONV
+	  convd->conv != (iconv_t) -1
+#  endif
+# endif
+	  )
+	{
+	  /* We are supposed to do a conversion.  First allocate an
+	     appropriate table with the same structure as the table
+	     of translations in the file, where we can put the pointers
+	     to the converted strings in.
+	     There is a slight complication with plural entries.  They
+	     are represented by consecutive NUL terminated strings.  We
+	     handle this case by converting RESULTLEN bytes, including
+	     NULs.  */
+
+	  if (convd->conv_tab == NULL
+	      && ((convd->conv_tab =
+		    (char **) calloc (nstrings + domain->n_sysdep_strings,
+				      sizeof (char *)))
+		  == NULL))
+	    /* Mark that we didn't succeed allocating a table.  */
+	    convd->conv_tab = (char **) -1;
+
+	  if (__builtin_expect (convd->conv_tab == (char **) -1, 0))
+	    /* Nothing we can do, no more memory.  We cannot use the
+	       translation because it might be encoded incorrectly.  */
+	    return (char *) -1;
+
+	  if (convd->conv_tab[act] == NULL)
+	    {
+	      /* We haven't used this string so far, so it is not
+		 translated yet.  Do this now.  */
+	      /* We use a bit more efficient memory handling.
+		 We allocate always larger blocks which get used over
+		 time.  This is faster than many small allocations.   */
+	      __libc_lock_define_initialized (static, lock)
+# define INITIAL_BLOCK_SIZE	4080
+	      static unsigned char *freemem;
+	      static size_t freemem_size;
+
+	      const unsigned char *inbuf;
+	      unsigned char *outbuf;
+	      int malloc_count;
+# ifndef _LIBC
+	      transmem_block_t *transmem_list = NULL;
+# endif
+
+	      __libc_lock_lock (lock);
+
+	      inbuf = (const unsigned char *) result;
+	      outbuf = freemem + sizeof (size_t);
+
+	      malloc_count = 0;
+	      while (1)
+		{
+		  transmem_block_t *newmem;
+# ifdef _LIBC
+		  size_t non_reversible;
+		  int res;
+
+		  if (freemem_size < sizeof (size_t))
+		    goto resize_freemem;
+
+		  res = __gconv (convd->conv,
+				 &inbuf, inbuf + resultlen,
+				 &outbuf,
+				 outbuf + freemem_size - sizeof (size_t),
+				 &non_reversible);
+
+		  if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+		    break;
+
+		  if (res != __GCONV_FULL_OUTPUT)
+		    {
+		      /* We should not use the translation at all, it
+			 is incorrectly encoded.  */
+		      __libc_lock_unlock (lock);
+		      return NULL;
+		    }
+
+		  inbuf = (const unsigned char *) result;
+# else
+#  if HAVE_ICONV
+		  const char *inptr = (const char *) inbuf;
+		  size_t inleft = resultlen;
+		  char *outptr = (char *) outbuf;
+		  size_t outleft;
+
+		  if (freemem_size < sizeof (size_t))
+		    goto resize_freemem;
+
+		  outleft = freemem_size - sizeof (size_t);
+		  if (iconv (convd->conv,
+			     (ICONV_CONST char **) &inptr, &inleft,
+			     &outptr, &outleft)
+		      != (size_t) (-1))
+		    {
+		      outbuf = (unsigned char *) outptr;
+		      break;
+		    }
+		  if (errno != E2BIG)
+		    {
+		      __libc_lock_unlock (lock);
+		      return NULL;
+		    }
+#  endif
+# endif
+
+		resize_freemem:
+		  /* We must allocate a new buffer or resize the old one.  */
+		  if (malloc_count > 0)
+		    {
+		      ++malloc_count;
+		      freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+		      newmem = (transmem_block_t *) realloc (transmem_list,
+							     freemem_size);
+# ifdef _LIBC
+		      if (newmem != NULL)
+			transmem_list = transmem_list->next;
+		      else
+			{
+			  struct transmem_list *old = transmem_list;
+
+			  transmem_list = transmem_list->next;
+			  free (old);
+			}
+# endif
+		    }
+		  else
+		    {
+		      malloc_count = 1;
+		      freemem_size = INITIAL_BLOCK_SIZE;
+		      newmem = (transmem_block_t *) malloc (freemem_size);
+		    }
+		  if (__builtin_expect (newmem == NULL, 0))
+		    {
+		      freemem = NULL;
+		      freemem_size = 0;
+		      __libc_lock_unlock (lock);
+		      return (char *) -1;
+		    }
+
+# ifdef _LIBC
+		  /* Add the block to the list of blocks we have to free
+		     at some point.  */
+		  newmem->next = transmem_list;
+		  transmem_list = newmem;
+
+		  freemem = (unsigned char *) newmem->data;
+		  freemem_size -= offsetof (struct transmem_list, data);
+# else
+		  transmem_list = newmem;
+		  freemem = newmem;
+# endif
+
+		  outbuf = freemem + sizeof (size_t);
+		}
+
+	      /* We have now in our buffer a converted string.  Put this
+		 into the table of conversions.  */
+	      *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+	      convd->conv_tab[act] = (char *) freemem;
+	      /* Shrink freemem, but keep it aligned.  */
+	      freemem_size -= outbuf - freemem;
+	      freemem = outbuf;
+	      freemem += freemem_size & (alignof (size_t) - 1);
+	      freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+
+	      __libc_lock_unlock (lock);
+	    }
+
+	  /* Now convd->conv_tab[act] contains the translation of all
+	     the plural variants.  */
+	  result = convd->conv_tab[act] + sizeof (size_t);
+	  resultlen = *(size_t *) convd->conv_tab[act];
+	}
+    }
+
+  /* The result string is converted.  */
+
+#endif /* _LIBC || HAVE_ICONV */
+
+  *lengthp = resultlen;
+  return result;
+}
+
+
+/* Look up a plural variant.  */
+static char *
+internal_function
+plural_lookup (struct loaded_l10nfile *domain, unsigned long int n,
+	       const char *translation, size_t translation_len)
+{
+  struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+  unsigned long int index;
+  const char *p;
+
+  index = plural_eval (domaindata->plural, n);
+  if (index >= domaindata->nplurals)
+    /* This should never happen.  It means the plural expression and the
+       given maximum value do not match.  */
+    index = 0;
+
+  /* Skip INDEX strings at TRANSLATION.  */
+  p = translation;
+  while (index-- > 0)
+    {
+#ifdef _LIBC
+      p = __rawmemchr (p, '\0');
+#else
+      p = strchr (p, '\0');
+#endif
+      /* And skip over the NUL byte.  */
+      p++;
+
+      if (p >= translation + translation_len)
+	/* This should never happen.  It means the plural expression
+	   evaluated to a value larger than the number of variants
+	   available for MSGID1.  */
+	return (char *) translation;
+    }
+  return (char *) p;
+}
+
+#ifndef _LIBC
+/* Return string representation of locale CATEGORY.  */
+static const char *
+internal_function
+category_to_name (int category)
+{
+  const char *retval;
+
+  switch (category)
+  {
+#ifdef LC_COLLATE
+  case LC_COLLATE:
+    retval = "LC_COLLATE";
+    break;
+#endif
+#ifdef LC_CTYPE
+  case LC_CTYPE:
+    retval = "LC_CTYPE";
+    break;
+#endif
+#ifdef LC_MONETARY
+  case LC_MONETARY:
+    retval = "LC_MONETARY";
+    break;
+#endif
+#ifdef LC_NUMERIC
+  case LC_NUMERIC:
+    retval = "LC_NUMERIC";
+    break;
+#endif
+#ifdef LC_TIME
+  case LC_TIME:
+    retval = "LC_TIME";
+    break;
+#endif
+#ifdef LC_MESSAGES
+  case LC_MESSAGES:
+    retval = "LC_MESSAGES";
+    break;
+#endif
+#ifdef LC_RESPONSE
+  case LC_RESPONSE:
+    retval = "LC_RESPONSE";
+    break;
+#endif
+#ifdef LC_ALL
+  case LC_ALL:
+    /* This might not make sense but is perhaps better than any other
+       value.  */
+    retval = "LC_ALL";
+    break;
+#endif
+  default:
+    /* If you have a better idea for a default value let me know.  */
+    retval = "LC_XXX";
+  }
+
+  return retval;
+}
+#endif
+
+/* Guess value of current locale from value of the environment variables
+   or system-dependent defaults.  */
+static const char *
+internal_function
+#ifdef IN_LIBGLOCALE
+guess_category_value (int category, const char *categoryname,
+		      const char *locale)
+
+#else
+guess_category_value (int category, const char *categoryname)
+#endif
+{
+  const char *language;
+#ifndef IN_LIBGLOCALE
+  const char *locale;
+# ifndef _LIBC
+  const char *language_default;
+  int locale_defaulted;
+# endif
+#endif
+
+  /* We use the settings in the following order:
+     1. The value of the environment variable 'LANGUAGE'.  This is a GNU
+        extension.  Its value can be a colon-separated list of locale names.
+     2. The value of the environment variable 'LC_ALL', 'LC_xxx', or 'LANG'.
+        More precisely, the first among these that is set to a non-empty value.
+        This is how POSIX specifies it.  The value is a single locale name.
+     3. A system-dependent preference list of languages.  Its value can be a
+        colon-separated list of locale names.
+     4. A system-dependent default locale name.
+     This way:
+       - System-dependent settings can be overridden by environment variables.
+       - If the system provides both a list of languages and a default locale,
+         the former is used.  */
+
+#ifndef IN_LIBGLOCALE
+  /* Fetch the locale name, through the POSIX method of looking to `LC_ALL',
+     `LC_xxx', and `LANG'.  On some systems this can be done by the
+     `setlocale' function itself.  */
+# ifdef _LIBC
+  locale = __current_locale_name (category);
+# else
+#  if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS
+  /* The __names field is not public glibc API and must therefore not be used
+     in code that is installed in public locations.  */
+  locale_t thread_locale = uselocale (NULL);
+  if (thread_locale != LC_GLOBAL_LOCALE)
+    {
+      locale = thread_locale->__names[category];
+      locale_defaulted = 0;
+    }
+  else
+#  endif
+    {
+      locale = _nl_locale_name_posix (category, categoryname);
+      locale_defaulted = 0;
+      if (locale == NULL)
+	{
+	  locale = _nl_locale_name_default ();
+	  locale_defaulted = 1;
+	}
+    }
+# endif
+#endif
+
+  /* Ignore LANGUAGE and its system-dependent analogon if the locale is set
+     to "C" because
+     1. "C" locale usually uses the ASCII encoding, and most international
+	messages use non-ASCII characters. These characters get displayed
+	as question marks (if using glibc's iconv()) or as invalid 8-bit
+	characters (because other iconv()s refuse to convert most non-ASCII
+	characters to ASCII). In any case, the output is ugly.
+     2. The precise output of some programs in the "C" locale is specified
+	by POSIX and should not depend on environment variables like
+	"LANGUAGE" or system-dependent information.  We allow such programs
+        to use gettext().  */
+  if (strcmp (locale, "C") == 0)
+    return locale;
+
+  /* The highest priority value is the value of the 'LANGUAGE' environment
+     variable.  */
+  language = getenv ("LANGUAGE");
+  if (language != NULL && language[0] != '\0')
+    return language;
+#if !defined IN_LIBGLOCALE && !defined _LIBC
+  /* The next priority value is the locale name, if not defaulted.  */
+  if (locale_defaulted)
+    {
+      /* The next priority value is the default language preferences list. */
+      language_default = _nl_language_preferences_default ();
+      if (language_default != NULL)
+        return language_default;
+    }
+  /* The least priority value is the locale name, if defaulted.  */
+#endif
+  return locale;
+}
+
+#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE
+/* Returns the output charset.  */
+static const char *
+internal_function
+get_output_charset (struct binding *domainbinding)
+{
+  /* The output charset should normally be determined by the locale.  But
+     sometimes the locale is not used or not correctly set up, so we provide
+     a possibility for the user to override this: the OUTPUT_CHARSET
+     environment variable.  Moreover, the value specified through
+     bind_textdomain_codeset overrides both.  */
+  if (domainbinding != NULL && domainbinding->codeset != NULL)
+    return domainbinding->codeset;
+  else
+    {
+      /* For speed reasons, we look at the value of OUTPUT_CHARSET only
+	 once.  This is a user variable that is not supposed to change
+	 during a program run.  */
+      static char *output_charset_cache;
+      static int output_charset_cached;
+
+      if (!output_charset_cached)
+	{
+	  const char *value = getenv ("OUTPUT_CHARSET");
+
+	  if (value != NULL && value[0] != '\0')
+	    {
+	      size_t len = strlen (value) + 1;
+	      char *value_copy = (char *) malloc (len);
+
+	      if (value_copy != NULL)
+		memcpy (value_copy, value, len);
+	      output_charset_cache = value_copy;
+	    }
+	  output_charset_cached = 1;
+	}
+
+      if (output_charset_cache != NULL)
+	return output_charset_cache;
+      else
+	{
+# ifdef _LIBC
+	  return _NL_CURRENT (LC_CTYPE, CODESET);
+# else
+#  if HAVE_ICONV
+	  return locale_charset ();
+#  endif
+# endif
+	}
+    }
+}
+#endif
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
+
+#if !_LIBC && !HAVE_MEMPCPY
+static void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+  return (void *) ((char *) memcpy (dest, src, n) + n);
+}
+#endif
+
+#if !_LIBC && !HAVE_TSEARCH
+# include "tsearch.c"
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+   program's end.  */
+libc_freeres_fn (free_mem)
+{
+  void *old;
+
+  while (_nl_domain_bindings != NULL)
+    {
+      struct binding *oldp = _nl_domain_bindings;
+      _nl_domain_bindings = _nl_domain_bindings->next;
+      if (oldp->dirname != _nl_default_dirname)
+	/* Yes, this is a pointer comparison.  */
+	free (oldp->dirname);
+      free (oldp->codeset);
+      free (oldp);
+    }
+
+  if (_nl_current_default_domain != _nl_default_default_domain)
+    /* Yes, again a pointer comparison.  */
+    free ((char *) _nl_current_default_domain);
+
+  /* Remove the search tree with the known translations.  */
+  __tdestroy (root, free);
+  root = NULL;
+
+  while (transmem_list != NULL)
+    {
+      old = transmem_list;
+      transmem_list = transmem_list->next;
+      free (old);
+    }
+}
+#endif

Added: tuxmath/trunk/intl/dcngettext.c
===================================================================
--- tuxmath/trunk/intl/dcngettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/dcngettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,57 @@
+/* Implementation of the dcngettext(3) function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCNGETTEXT __dcngettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCNGETTEXT libintl_dcngettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCNGETTEXT (const char *domainname,
+	    const char *msgid1, const char *msgid2, unsigned long int n,
+	    int category)
+{
+  return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dcngettext, dcngettext);
+#endif

Added: tuxmath/trunk/intl/dgettext.c
===================================================================
--- tuxmath/trunk/intl/dgettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/dgettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,58 @@
+/* Implementation of the dgettext(3) function.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define DGETTEXT libintl_dgettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale.  */
+char *
+DGETTEXT (const char *domainname, const char *msgid)
+{
+  return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dgettext, dgettext);
+#endif

Added: tuxmath/trunk/intl/dngettext.c
===================================================================
--- tuxmath/trunk/intl/dngettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/dngettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,59 @@
+/* Implementation of the dngettext(3) function.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DNGETTEXT __dngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define DNGETTEXT libintl_dngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale and skip message according to the plural form.  */
+char *
+DNGETTEXT (const char *domainname,
+	   const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dngettext, dngettext);
+#endif

Added: tuxmath/trunk/intl/eval-plural.h
===================================================================
--- tuxmath/trunk/intl/eval-plural.h	                        (rev 0)
+++ tuxmath/trunk/intl/eval-plural.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,108 @@
+/* Plural expression evaluation.
+   Copyright (C) 2000-2003, 2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+/* Evaluate the plural expression and return an index value.  */
+STATIC
+unsigned long int
+internal_function
+plural_eval (const struct expression *pexp, unsigned long int n)
+{
+  switch (pexp->nargs)
+    {
+    case 0:
+      switch (pexp->operation)
+	{
+	case var:
+	  return n;
+	case num:
+	  return pexp->val.num;
+	default:
+	  break;
+	}
+      /* NOTREACHED */
+      break;
+    case 1:
+      {
+	/* pexp->operation must be lnot.  */
+	unsigned long int arg = plural_eval (pexp->val.args[0], n);
+	return ! arg;
+      }
+    case 2:
+      {
+	unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
+	if (pexp->operation == lor)
+	  return leftarg || plural_eval (pexp->val.args[1], n);
+	else if (pexp->operation == land)
+	  return leftarg && plural_eval (pexp->val.args[1], n);
+	else
+	  {
+	    unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
+
+	    switch (pexp->operation)
+	      {
+	      case mult:
+		return leftarg * rightarg;
+	      case divide:
+#if !INTDIV0_RAISES_SIGFPE
+		if (rightarg == 0)
+		  raise (SIGFPE);
+#endif
+		return leftarg / rightarg;
+	      case module:
+#if !INTDIV0_RAISES_SIGFPE
+		if (rightarg == 0)
+		  raise (SIGFPE);
+#endif
+		return leftarg % rightarg;
+	      case plus:
+		return leftarg + rightarg;
+	      case minus:
+		return leftarg - rightarg;
+	      case less_than:
+		return leftarg < rightarg;
+	      case greater_than:
+		return leftarg > rightarg;
+	      case less_or_equal:
+		return leftarg <= rightarg;
+	      case greater_or_equal:
+		return leftarg >= rightarg;
+	      case equal:
+		return leftarg == rightarg;
+	      case not_equal:
+		return leftarg != rightarg;
+	      default:
+		break;
+	      }
+	  }
+	/* NOTREACHED */
+	break;
+      }
+    case 3:
+      {
+	/* pexp->operation must be qmop.  */
+	unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
+	return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
+      }
+    }
+  /* NOTREACHED */
+  return 0;
+}

Added: tuxmath/trunk/intl/explodename.c
===================================================================
--- tuxmath/trunk/intl/explodename.c	                        (rev 0)
+++ tuxmath/trunk/intl/explodename.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,135 @@
+/* Copyright (C) 1995-1998, 2000-2001, 2003, 2005, 2007 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Split a locale name NAME into a leading language part and all the
+   rest.  Return a pointer to the first character after the language,
+   i.e. to the first byte of the rest.  */
+static char *_nl_find_language (const char *name);
+
+static char *
+_nl_find_language (const char *name)
+{
+  while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '.')
+    ++name;
+
+  return (char *) name;
+}
+
+
+int
+_nl_explode_name (char *name,
+		  const char **language, const char **modifier,
+		  const char **territory, const char **codeset,
+		  const char **normalized_codeset)
+{
+  char *cp;
+  int mask;
+
+  *modifier = NULL;
+  *territory = NULL;
+  *codeset = NULL;
+  *normalized_codeset = NULL;
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_', '.', and `@'.  */
+  mask = 0;
+  *language = cp = name;
+  cp = _nl_find_language (*language);
+
+  if (*language == cp)
+    /* This does not make sense: language has to be specified.  Use
+       this entry as it is without exploding.  Perhaps it is an alias.  */
+    cp = strchr (*language, '\0');
+  else
+    {
+      if (cp[0] == '_')
+	{
+	  /* Next is the territory.  */
+	  cp[0] = '\0';
+	  *territory = ++cp;
+
+	  while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@')
+	    ++cp;
+
+	  mask |= XPG_TERRITORY;
+	}
+
+      if (cp[0] == '.')
+	{
+	  /* Next is the codeset.  */
+	  cp[0] = '\0';
+	  *codeset = ++cp;
+
+	  while (cp[0] != '\0' && cp[0] != '@')
+	    ++cp;
+
+	  mask |= XPG_CODESET;
+
+	  if (*codeset != cp && (*codeset)[0] != '\0')
+	    {
+	      *normalized_codeset = _nl_normalize_codeset (*codeset,
+							   cp - *codeset);
+	      if (*normalized_codeset == NULL)
+		return -1;
+	      else if (strcmp (*codeset, *normalized_codeset) == 0)
+		free ((char *) *normalized_codeset);
+	      else
+		mask |= XPG_NORM_CODESET;
+	    }
+	}
+    }
+
+  if (cp[0] == '@')
+    {
+      /* Next is the modifier.  */
+      cp[0] = '\0';
+      *modifier = ++cp;
+
+      if (cp[0] != '\0')
+	mask |= XPG_MODIFIER;
+    }
+
+  if (*territory != NULL && (*territory)[0] == '\0')
+    mask &= ~XPG_TERRITORY;
+
+  if (*codeset != NULL && (*codeset)[0] == '\0')
+    mask &= ~XPG_CODESET;
+
+  return mask;
+}

Added: tuxmath/trunk/intl/export.h
===================================================================
--- tuxmath/trunk/intl/export.h	                        (rev 0)
+++ tuxmath/trunk/intl/export.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,6 @@
+
+#if @HAVE_VISIBILITY@ && BUILDING_LIBINTL
+#define LIBINTL_DLL_EXPORTED __attribute__((__visibility__("default")))
+#else
+#define LIBINTL_DLL_EXPORTED
+#endif

Added: tuxmath/trunk/intl/finddomain.c
===================================================================
--- tuxmath/trunk/intl/finddomain.c	                        (rev 0)
+++ tuxmath/trunk/intl/finddomain.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,212 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995-1999, 2000-2001, 2003-2007 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at gnu.org>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+# define gl_rwlock_define_initialized __libc_rwlock_define_initialized
+# define gl_rwlock_rdlock __libc_rwlock_rdlock
+# define gl_rwlock_wrlock __libc_rwlock_wrlock
+# define gl_rwlock_unlock __libc_rwlock_unlock
+#else
+# include "lock.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains.  */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+   the DOMAINNAME and CATEGORY parameters with respect to the currently
+   established bindings.  */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (const char *dirname, char *locale,
+		 const char *domainname, struct binding *domainbinding)
+{
+  struct loaded_l10nfile *retval;
+  const char *language;
+  const char *modifier;
+  const char *territory;
+  const char *codeset;
+  const char *normalized_codeset;
+  const char *alias_value;
+  int mask;
+
+  /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+		language[_territory][.codeset][@modifier]
+
+     Beside the first part all of them are allowed to be missing.  If
+     the full specified locale is not found, the less specific one are
+     looked for.  The various parts will be stripped off according to
+     the following order:
+		(1) codeset
+		(2) normalized codeset
+		(3) territory
+		(4) modifier
+   */
+
+  /* We need to protect modifying the _NL_LOADED_DOMAINS data.  */
+  gl_rwlock_define_initialized (static, lock);
+  gl_rwlock_rdlock (lock);
+
+  /* If we have already tested for this locale entry there has to
+     be one data set in the list of loaded domains.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+			       strlen (dirname) + 1, 0, locale, NULL, NULL,
+			       NULL, NULL, domainname, 0);
+
+  gl_rwlock_unlock (lock);
+
+  if (retval != NULL)
+    {
+      /* We know something about this locale.  */
+      int cnt;
+
+      if (retval->decided <= 0)
+	_nl_load_domain (retval, domainbinding);
+
+      if (retval->data != NULL)
+	return retval;
+
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+	{
+	  if (retval->successor[cnt]->decided <= 0)
+	    _nl_load_domain (retval->successor[cnt], domainbinding);
+
+	  if (retval->successor[cnt]->data != NULL)
+	    break;
+	}
+
+      return retval;
+      /* NOTREACHED */
+    }
+
+  /* See whether the locale value is an alias.  If yes its value
+     *overwrites* the alias name.  No test for the original value is
+     done.  */
+  alias_value = _nl_expand_alias (locale);
+  if (alias_value != NULL)
+    {
+#if defined _LIBC || defined HAVE_STRDUP
+      locale = strdup (alias_value);
+      if (locale == NULL)
+	return NULL;
+#else
+      size_t len = strlen (alias_value) + 1;
+      locale = (char *) malloc (len);
+      if (locale == NULL)
+	return NULL;
+
+      memcpy (locale, alias_value, len);
+#endif
+    }
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_', '.', and `@'.  */
+  mask = _nl_explode_name (locale, &language, &modifier, &territory,
+			   &codeset, &normalized_codeset);
+  if (mask == -1)
+    /* This means we are out of core.  */
+    return NULL;
+
+  /* We need to protect modifying the _NL_LOADED_DOMAINS data.  */
+  gl_rwlock_wrlock (lock);
+
+  /* Create all possible locale entries which might be interested in
+     generalization.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+			       strlen (dirname) + 1, mask, language, territory,
+			       codeset, normalized_codeset, modifier,
+			       domainname, 1);
+
+  gl_rwlock_unlock (lock);
+
+  if (retval == NULL)
+    /* This means we are out of core.  */
+    goto out;
+
+  if (retval->decided <= 0)
+    _nl_load_domain (retval, domainbinding);
+  if (retval->data == NULL)
+    {
+      int cnt;
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+	{
+	  if (retval->successor[cnt]->decided <= 0)
+	    _nl_load_domain (retval->successor[cnt], domainbinding);
+	  if (retval->successor[cnt]->data != NULL)
+	    break;
+	}
+    }
+
+  /* The room for an alias was dynamically allocated.  Free it now.  */
+  if (alias_value != NULL)
+    free (locale);
+
+out:
+  /* The space for normalized_codeset is dynamically allocated.  Free it.  */
+  if (mask & XPG_NORM_CODESET)
+    free ((void *) normalized_codeset);
+
+  return retval;
+}
+
+
+#ifdef _LIBC
+/* This is called from iconv/gconv_db.c's free_mem, as locales must
+   be freed before freeing gconv steps arrays.  */
+void __libc_freeres_fn_section
+_nl_finddomain_subfreeres ()
+{
+  struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+  while (runp != NULL)
+    {
+      struct loaded_l10nfile *here = runp;
+      if (runp->data != NULL)
+	_nl_unload_domain ((struct loaded_domain *) runp->data);
+      runp = runp->next;
+      free ((char *) here->filename);
+      free (here);
+    }
+}
+#endif

Added: tuxmath/trunk/intl/gettext.c
===================================================================
--- tuxmath/trunk/intl/gettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/gettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,63 @@
+/* Implementation of gettext(3) function.
+   Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>		/* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define GETTEXT libintl_gettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+GETTEXT (const char *msgid)
+{
+  return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__gettext, gettext);
+#endif

Added: tuxmath/trunk/intl/gettextP.h
===================================================================
--- tuxmath/trunk/intl/gettextP.h	                        (rev 0)
+++ tuxmath/trunk/intl/gettextP.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,297 @@
+/* Header describing internals of libintl library.
+   Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at cygnus.com>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include <stddef.h>		/* Get size_t.  */
+
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+#  include <iconv.h>
+# endif
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+# define gl_rwlock_define __libc_rwlock_define
+#else
+# include "lock.h"
+#endif
+
+#ifdef _LIBC
+extern char *__gettext (const char *__msgid);
+extern char *__dgettext (const char *__domainname, const char *__msgid);
+extern char *__dcgettext (const char *__domainname, const char *__msgid,
+			  int __category);
+extern char *__ngettext (const char *__msgid1, const char *__msgid2,
+			 unsigned long int __n);
+extern char *__dngettext (const char *__domainname,
+			  const char *__msgid1, const char *__msgid2,
+			  unsigned long int n);
+extern char *__dcngettext (const char *__domainname,
+			   const char *__msgid1, const char *__msgid2,
+			   unsigned long int __n, int __category);
+extern char *__dcigettext (const char *__domainname,
+			   const char *__msgid1, const char *__msgid2,
+			   int __plural, unsigned long int __n,
+			   int __category);
+extern char *__textdomain (const char *__domainname);
+extern char *__bindtextdomain (const char *__domainname,
+			       const char *__dirname);
+extern char *__bind_textdomain_codeset (const char *__domainname,
+					const char *__codeset);
+extern void _nl_finddomain_subfreeres (void) attribute_hidden;
+extern void _nl_unload_domain (struct loaded_domain *__domain)
+     internal_function attribute_hidden;
+#else
+/* Declare the exported libintl_* functions, in a way that allows us to
+   call them under their real name.  */
+# undef _INTL_REDIRECT_INLINE
+# undef _INTL_REDIRECT_MACROS
+# define _INTL_REDIRECT_MACROS
+# include "libgnuintl.h"
+# ifdef IN_LIBGLOCALE
+extern char *gl_dcigettext (const char *__domainname,
+			    const char *__msgid1, const char *__msgid2,
+			    int __plural, unsigned long int __n,
+			    int __category,
+			    const char *__localename, const char *__encoding);
+# else
+extern char *libintl_dcigettext (const char *__domainname,
+				 const char *__msgid1, const char *__msgid2,
+				 int __plural, unsigned long int __n,
+				 int __category);
+# endif
+#endif
+
+#include "loadinfo.h"
+
+#include "gmo.h"		/* Get nls_uint32.  */
+
+/* @@ end of prolog @@ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static inline nls_uint32
+# ifdef __cplusplus
+SWAP (nls_uint32 i)
+# else
+SWAP (i)
+     nls_uint32 i;
+# endif
+{
+  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+/* In-memory representation of system dependent string.  */
+struct sysdep_string_desc
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  size_t length;
+  /* Pointer to addressed string.  */
+  const char *pointer;
+};
+
+/* Cache of translated strings after charset conversion.
+   Note: The strings are converted to the target encoding only on an as-needed
+   basis.  */
+struct converted_domain
+{
+  /* The target encoding name.  */
+  const char *encoding;
+  /* The descriptor for conversion from the message catalog's encoding to
+     this target encoding.  */
+#ifdef _LIBC
+  __gconv_t conv;
+#else
+# if HAVE_ICONV
+  iconv_t conv;
+# endif
+#endif
+  /* The table of translated strings after charset conversion.  */
+  char **conv_tab;
+};
+
+/* The representation of an opened message catalog.  */
+struct loaded_domain
+{
+  /* Pointer to memory containing the .mo file.  */
+  const char *data;
+  /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed.  */
+  int use_mmap;
+  /* Size of mmap()ed memory.  */
+  size_t mmap_size;
+  /* 1 if the .mo file uses a different endianness than this machine.  */
+  int must_swap;
+  /* Pointer to additional malloc()ed memory.  */
+  void *malloced;
+
+  /* Number of static strings pairs.  */
+  nls_uint32 nstrings;
+  /* Pointer to descriptors of original strings in the file.  */
+  const struct string_desc *orig_tab;
+  /* Pointer to descriptors of translated strings in the file.  */
+  const struct string_desc *trans_tab;
+
+  /* Number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Pointer to descriptors of original sysdep strings.  */
+  const struct sysdep_string_desc *orig_sysdep_tab;
+  /* Pointer to descriptors of translated sysdep strings.  */
+  const struct sysdep_string_desc *trans_sysdep_tab;
+
+  /* Size of hash table.  */
+  nls_uint32 hash_size;
+  /* Pointer to hash table.  */
+  const nls_uint32 *hash_tab;
+  /* 1 if the hash table uses a different endianness than this machine.  */
+  int must_swap_hash_tab;
+
+  /* Cache of charset conversions of the translated strings.  */
+  struct converted_domain *conversions;
+  size_t nconversions;
+  gl_rwlock_define (, conversions_lock)
+
+  const struct expression *plural;
+  unsigned long int nplurals;
+};
+
+/* We want to allocate a string at the end of the struct.  But ISO C
+   doesn't allow zero sized arrays.  */
+#ifdef __GNUC__
+# define ZERO 0
+#else
+# define ZERO 1
+#endif
+
+/* A set of settings bound to a message domain.  Used to store settings
+   from bindtextdomain() and bind_textdomain_codeset().  */
+struct binding
+{
+  struct binding *next;
+  char *dirname;
+  char *codeset;
+  char domainname[ZERO];
+};
+
+/* A counter which is incremented each time some previous translations
+   become invalid.
+   This variable is part of the external ABI of the GNU libintl.  */
+#ifdef IN_LIBGLOCALE
+# include <glocale/config.h>
+extern LIBGLOCALE_DLL_EXPORTED int _nl_msg_cat_cntr;
+#else
+extern LIBINTL_DLL_EXPORTED int _nl_msg_cat_cntr;
+#endif
+
+#ifndef _LIBC
+extern const char *_nl_language_preferences_default (void);
+# define gl_locale_name_canonicalize _nl_locale_name_canonicalize
+extern void _nl_locale_name_canonicalize (char *name);
+# define gl_locale_name_posix _nl_locale_name_posix
+extern const char *_nl_locale_name_posix (int category,
+					  const char *categoryname);
+# define gl_locale_name_default _nl_locale_name_default
+extern const char *_nl_locale_name_default (void);
+# define gl_locale_name _nl_locale_name
+extern const char *_nl_locale_name (int category, const char *categoryname);
+#endif
+
+struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
+					 const char *__domainname,
+					 struct binding *__domainbinding)
+     internal_function;
+void _nl_load_domain (struct loaded_l10nfile *__domain,
+		      struct binding *__domainbinding)
+     internal_function;
+
+#ifdef IN_LIBGLOCALE
+char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+		    struct binding *domainbinding, const char *encoding,
+		    const char *msgid,
+		    size_t *lengthp)
+     internal_function;
+#else
+char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+		    struct binding *domainbinding, const char *msgid,
+		    int convert, size_t *lengthp)
+     internal_function;
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Contains the default location of the message catalogs.  */
+extern const char _nl_default_dirname[];
+#ifdef _LIBC
+libc_hidden_proto (_nl_default_dirname)
+#endif
+
+/* List with bindings of specific domains.  */
+extern struct binding *_nl_domain_bindings;
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+#endif
+
+/* Name of the default text domain.  */
+extern const char _nl_default_default_domain[] attribute_hidden;
+
+/* Default text domain in which entries for gettext(3) are to be found.  */
+extern const char *_nl_current_default_domain attribute_hidden;
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h  */

Added: tuxmath/trunk/intl/gmo.h
===================================================================
--- tuxmath/trunk/intl/gmo.h	                        (rev 0)
+++ tuxmath/trunk/intl/gmo.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,152 @@
+/* Description of GNU message catalog format: general file layout.
+   Copyright (C) 1995, 1997, 2000-2002, 2004, 2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <limits.h>
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format.  */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format.  */
+#define MO_REVISION_NUMBER 0
+#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
+
+/* The following contortions are an attempt to use the C preprocessor
+   to determine an unsigned integral type that is 32 bits wide.  An
+   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+   as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+   when cross-compiling.  */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+   This should be valid for all systems GNU cares about because
+   that doesn't include 16-bit systems, and only modern systems
+   (that certainly have <limits.h>) have 64+-bit integral types.  */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+#  if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+#  else
+  /* The following line is intended to throw an error.  Using #error is
+     not portable enough.  */
+  "Cannot determine unsigned 32-bit data type."
+#  endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format.  */
+struct mo_file_header
+{
+  /* The magic number.  */
+  nls_uint32 magic;
+  /* The revision number of the file format.  */
+  nls_uint32 revision;
+
+  /* The following are only used in .mo files with major revision 0 or 1.  */
+
+  /* The number of strings pairs.  */
+  nls_uint32 nstrings;
+  /* Offset of table with start offsets of original strings.  */
+  nls_uint32 orig_tab_offset;
+  /* Offset of table with start offsets of translated strings.  */
+  nls_uint32 trans_tab_offset;
+  /* Size of hash table.  */
+  nls_uint32 hash_tab_size;
+  /* Offset of first hash table entry.  */
+  nls_uint32 hash_tab_offset;
+
+  /* The following are only used in .mo files with minor revision >= 1.  */
+
+  /* The number of system dependent segments.  */
+  nls_uint32 n_sysdep_segments;
+  /* Offset of table describing system dependent segments.  */
+  nls_uint32 sysdep_segments_offset;
+  /* The number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Offset of table with start offsets of original sysdep strings.  */
+  nls_uint32 orig_sysdep_tab_offset;
+  /* Offset of table with start offsets of translated sysdep strings.  */
+  nls_uint32 trans_sysdep_tab_offset;
+};
+
+/* Descriptor for static string contained in the binary .mo file.  */
+struct string_desc
+{
+  /* Length of addressed string, not including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* The following are only used in .mo files with minor revision >= 1.  */
+
+/* Descriptor for system dependent string segment.  */
+struct sysdep_segment
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* Pair of a static and a system dependent segment, in struct sysdep_string.  */
+struct segment_pair
+{
+  /* Size of static segment.  */
+  nls_uint32 segsize;
+  /* Reference to system dependent string segment, or ~0 at the end.  */
+  nls_uint32 sysdepref;
+};
+
+/* Descriptor for system dependent string.  */
+struct sysdep_string
+{
+  /* Offset of static string segments in file.  */
+  nls_uint32 offset;
+  /* Alternating sequence of static and system dependent segments.
+     The last segment is a static segment, including the trailing NUL.  */
+  struct segment_pair segments[1];
+};
+
+/* Marker for the end of the segments[] array.  This has the value 0xFFFFFFFF,
+   regardless whether 'int' is 16 bit, 32 bit, or 64 bit.  */
+#define SEGMENTS_END ((nls_uint32) ~0)
+
+/* @@ begin of epilog @@ */
+
+#endif	/* gettext.h  */

Added: tuxmath/trunk/intl/hash-string.c
===================================================================
--- tuxmath/trunk/intl/hash-string.c	                        (rev 0)
+++ tuxmath/trunk/intl/hash-string.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,51 @@
+/* Implements a string hashing function.
+   Copyright (C) 1995, 1997, 1998, 2000, 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include "hash-string.h"
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+unsigned long int
+__hash_string (const char *str_param)
+{
+  unsigned long int hval, g;
+  const char *str = str_param;
+
+  /* Compute the hash value for the given string.  */
+  hval = 0;
+  while (*str != '\0')
+    {
+      hval <<= 4;
+      hval += (unsigned char) *str++;
+      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+      if (g != 0)
+	{
+	  hval ^= g >> (HASHWORDBITS - 8);
+	  hval ^= g;
+	}
+    }
+  return hval;
+}

Added: tuxmath/trunk/intl/hash-string.h
===================================================================
--- tuxmath/trunk/intl/hash-string.h	                        (rev 0)
+++ tuxmath/trunk/intl/hash-string.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,36 @@
+/* Description of GNU message catalog format: string hashing function.
+   Copyright (C) 1995, 1997-1998, 2000-2003, 2005 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* @@ end of prolog @@ */
+
+/* We assume to have `unsigned long int' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+
+#ifndef _LIBC
+# ifdef IN_LIBINTL
+#  define __hash_string libintl_hash_string
+# else
+#  define __hash_string hash_string
+# endif
+#endif
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+extern unsigned long int __hash_string (const char *str_param);

Added: tuxmath/trunk/intl/intl-compat.c
===================================================================
--- tuxmath/trunk/intl/intl-compat.c	                        (rev 0)
+++ tuxmath/trunk/intl/intl-compat.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,133 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+   Library.
+   Copyright (C) 1995, 2000-2003, 2005 Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* This file redirects the gettext functions (without prefix) to those
+   defined in the included GNU libintl library (with "libintl_" prefix).
+   It is compiled into libintl in order to make the AM_GNU_GETTEXT test
+   of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
+   has the redirections primarily in the <libintl.h> include file.
+   It is also compiled into libgnuintl so that libgnuintl.so can be used
+   as LD_PRELOADable library on glibc systems, to provide the extra
+   features that the functions in the libc don't have (namely, logging).  */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef ngettext
+#undef dngettext
+#undef dcngettext
+#undef textdomain
+#undef bindtextdomain
+#undef bind_textdomain_codeset
+
+
+/* When building a DLL, we must export some functions.  Note that because
+   the functions are only defined for binary backward compatibility, we
+   don't need to use __declspec(dllimport) in any case.  */
+#if HAVE_VISIBILITY && BUILDING_DLL
+# define DLL_EXPORTED __attribute__((__visibility__("default")))
+#elif defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+
+DLL_EXPORTED
+char *
+gettext (const char *msgid)
+{
+  return libintl_gettext (msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dgettext (const char *domainname, const char *msgid)
+{
+  return libintl_dgettext (domainname, msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dcgettext (const char *domainname, const char *msgid, int category)
+{
+  return libintl_dcgettext (domainname, msgid, category);
+}
+
+
+DLL_EXPORTED
+char *
+ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return libintl_ngettext (msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dngettext (const char *domainname,
+	   const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return libintl_dngettext (domainname, msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dcngettext (const char *domainname,
+	    const char *msgid1, const char *msgid2, unsigned long int n,
+	    int category)
+{
+  return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
+}
+
+
+DLL_EXPORTED
+char *
+textdomain (const char *domainname)
+{
+  return libintl_textdomain (domainname);
+}
+
+
+DLL_EXPORTED
+char *
+bindtextdomain (const char *domainname, const char *dirname)
+{
+  return libintl_bindtextdomain (domainname, dirname);
+}
+
+
+DLL_EXPORTED
+char *
+bind_textdomain_codeset (const char *domainname, const char *codeset)
+{
+  return libintl_bind_textdomain_codeset (domainname, codeset);
+}

Added: tuxmath/trunk/intl/intl-exports.c
===================================================================
--- tuxmath/trunk/intl/intl-exports.c	                        (rev 0)
+++ tuxmath/trunk/intl/intl-exports.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,36 @@
+/* List of exported symbols of libintl on Cygwin.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno at clisp.org>, 2006.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+ /* IMP(x) is a symbol that contains the address of x.  */
+#define IMP(x) _imp__##x
+
+ /* Ensure that the variable x is exported from the library, and that a
+    pseudo-variable IMP(x) is available.  */
+#define VARIABLE(x) \
+ /* Export x without redefining x.  This code was found by compiling a	\
+    snippet:								\
+      extern __declspec(dllexport) int x; int x = 42;  */		\
+ asm (".section .drectve\n");						\
+ asm (".ascii \" -export:" #x ",data\"\n");				\
+ asm (".data\n");							\
+ /* Allocate a pseudo-variable IMP(x).  */				\
+ extern int x;								\
+ void * IMP(x) = &x;
+
+VARIABLE(libintl_version)

Added: tuxmath/trunk/intl/intl_config.h.cmake
===================================================================
--- tuxmath/trunk/intl/intl_config.h.cmake	                        (rev 0)
+++ tuxmath/trunk/intl/intl_config.h.cmake	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,54 @@
+/* Required headers */
+#cmakedefine HAVE_INTTYPES_H 1
+#cmakedefine HAVE_UNISTD_H 1
+#cmakedefine HAVE_INTTYPES_H_WITH_UINTMAX 1
+#cmakedefine HAVE_STDINT_H_WITH_UINTMAX 1
+#cmakedefine HAVE_TSEARCH 1
+
+/* Required functions */
+#cmakedefine HAVE_STPCPY 1
+#cmakedefine HAVE_MEMPCPY 1
+#cmakedefine HAVE_GETCWD 1
+
+/* Required definitions */
+#cmakedefine ICONV_SECOND_ARGUMENT_IS_CONST 1
+#ifdef ICONV_SECOND_ARGUMENT_IS_CONST
+#define ICONV_CONST const
+#else
+#define ICONV_CONST
+#endif
+#define ENABLE_NLS 1
+
+/* Stuff that may be optional */
+#cmakedefine HAVE_ALLOCA_H 1
+#cmakedefine HAVE_ALLOCA 1
+
+#define __libc_lock_t                   gl_lock_t
+#define __libc_lock_define              gl_lock_define
+#define __libc_lock_define_initialized  gl_lock_define_initialized
+#define __libc_lock_init                gl_lock_init
+#define __libc_lock_lock                gl_lock_lock
+#define __libc_lock_unlock              gl_lock_unlock
+#define __libc_lock_recursive_t                   gl_recursive_lock_t
+#define __libc_lock_define_recursive              gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive  gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive                gl_recursive_lock_init
+#define __libc_lock_lock_recursive                gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive              gl_recursive_lock_unlock
+#define glthread_in_use  libintl_thread_in_use
+#define glthread_lock_init     libintl_lock_init
+#define glthread_lock_lock     libintl_lock_lock
+#define glthread_lock_unlock   libintl_lock_unlock
+#define glthread_lock_destroy  libintl_lock_destroy
+#define glthread_rwlock_init     libintl_rwlock_init
+#define glthread_rwlock_rdlock   libintl_rwlock_rdlock
+#define glthread_rwlock_wrlock   libintl_rwlock_wrlock
+#define glthread_rwlock_unlock   libintl_rwlock_unlock
+#define glthread_rwlock_destroy  libintl_rwlock_destroy
+#define glthread_recursive_lock_init     libintl_recursive_lock_init
+#define glthread_recursive_lock_lock     libintl_recursive_lock_lock
+#define glthread_recursive_lock_unlock   libintl_recursive_lock_unlock
+#define glthread_recursive_lock_destroy  libintl_recursive_lock_destroy
+#define glthread_once                 libintl_once
+#define glthread_once_call            libintl_once_call
+#define glthread_once_singlethreaded  libintl_once_singlethreaded

Added: tuxmath/trunk/intl/l10nflist.c
===================================================================
--- tuxmath/trunk/intl/l10nflist.c	                        (rev 0)
+++ tuxmath/trunk/intl/l10nflist.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,400 @@
+/* Copyright (C) 1995-1999, 2000-2006 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE	1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# ifndef stpcpy
+#  define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+#endif
+
+/* Define function which are usually not available.  */
+
+#ifdef _LIBC
+# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
+#elif defined HAVE_ARGZ_COUNT
+# undef __argz_count
+# define __argz_count argz_count
+#else
+/* Returns the number of strings in ARGZ.  */
+static size_t
+argz_count__ (const char *argz, size_t len)
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif	/* !_LIBC && !HAVE_ARGZ_COUNT */
+
+#ifdef _LIBC
+# define __argz_stringify(argz, len, sep) \
+  INTUSE(__argz_stringify) (argz, len, sep)
+#elif defined HAVE_ARGZ_STRINGIFY
+# undef __argz_stringify
+# define __argz_stringify argz_stringify
+#else
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+   except the last into the character SEP.  */
+static void
+argz_stringify__ (char *argz, size_t len, int sep)
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len;
+      len -= part_len + 1;
+      if (len > 0)
+	*argz++ = sep;
+    }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif	/* !_LIBC && !HAVE_ARGZ_STRINGIFY */
+
+#ifdef _LIBC
+#elif defined HAVE_ARGZ_NEXT
+# undef __argz_next
+# define __argz_next argz_next
+#else
+static char *
+argz_next__ (char *argz, size_t argz_len, const char *entry)
+{
+  if (entry)
+    {
+      if (entry < argz + argz_len)
+        entry = strchr (entry, '\0') + 1;
+
+      return entry >= argz + argz_len ? NULL : (char *) entry;
+    }
+  else
+    if (argz_len > 0)
+      return argz;
+    else
+      return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif	/* !_LIBC && !HAVE_ARGZ_NEXT */
+
+
+/* Return number of bits set in X.  */
+static inline int
+pop (int x)
+{
+  /* We assume that no more than 16 bits are used.  */
+  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+  x = ((x >> 4) + x) & 0x0f0f;
+  x = ((x >> 8) + x) & 0xff;
+
+  return x;
+}
+
+
+struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+		    const char *dirlist, size_t dirlist_len,
+		    int mask, const char *language, const char *territory,
+		    const char *codeset, const char *normalized_codeset,
+		    const char *modifier,
+		    const char *filename, int do_allocate)
+{
+  char *abs_filename;
+  struct loaded_l10nfile **lastp;
+  struct loaded_l10nfile *retval;
+  char *cp;
+  size_t dirlist_count;
+  size_t entries;
+  int cnt;
+
+  /* If LANGUAGE contains an absolute directory specification, we ignore
+     DIRLIST.  */
+  if (IS_ABSOLUTE_PATH (language))
+    dirlist_len = 0;
+
+  /* Allocate room for the full file name.  */
+  abs_filename = (char *) malloc (dirlist_len
+				  + strlen (language)
+				  + ((mask & XPG_TERRITORY) != 0
+				     ? strlen (territory) + 1 : 0)
+				  + ((mask & XPG_CODESET) != 0
+				     ? strlen (codeset) + 1 : 0)
+				  + ((mask & XPG_NORM_CODESET) != 0
+				     ? strlen (normalized_codeset) + 1 : 0)
+				  + ((mask & XPG_MODIFIER) != 0
+				     ? strlen (modifier) + 1 : 0)
+				  + 1 + strlen (filename) + 1);
+
+  if (abs_filename == NULL)
+    return NULL;
+
+  /* Construct file name.  */
+  cp = abs_filename;
+  if (dirlist_len > 0)
+    {
+      memcpy (cp, dirlist, dirlist_len);
+      __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
+      cp += dirlist_len;
+      cp[-1] = '/';
+    }
+
+  cp = stpcpy (cp, language);
+
+  if ((mask & XPG_TERRITORY) != 0)
+    {
+      *cp++ = '_';
+      cp = stpcpy (cp, territory);
+    }
+  if ((mask & XPG_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, codeset);
+    }
+  if ((mask & XPG_NORM_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, normalized_codeset);
+    }
+  if ((mask & XPG_MODIFIER) != 0)
+    {
+      *cp++ = '@';
+      cp = stpcpy (cp, modifier);
+    }
+
+  *cp++ = '/';
+  stpcpy (cp, filename);
+
+  /* Look in list of already loaded domains whether it is already
+     available.  */
+  lastp = l10nfile_list;
+  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+    if (retval->filename != NULL)
+      {
+	int compare = strcmp (retval->filename, abs_filename);
+	if (compare == 0)
+	  /* We found it!  */
+	  break;
+	if (compare < 0)
+	  {
+	    /* It's not in the list.  */
+	    retval = NULL;
+	    break;
+	  }
+
+	lastp = &retval->next;
+      }
+
+  if (retval != NULL || do_allocate == 0)
+    {
+      free (abs_filename);
+      return retval;
+    }
+
+  dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
+
+  /* Allocate a new loaded_l10nfile.  */
+  retval =
+    (struct loaded_l10nfile *)
+    malloc (sizeof (*retval)
+	    + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
+	       * sizeof (struct loaded_l10nfile *)));
+  if (retval == NULL)
+    {
+      free (abs_filename);
+      return NULL;
+    }
+
+  retval->filename = abs_filename;
+
+  /* We set retval->data to NULL here; it is filled in later.
+     Setting retval->decided to 1 here means that retval does not
+     correspond to a real file (dirlist_count > 1) or is not worth
+     looking up (if an unnormalized codeset was specified).  */
+  retval->decided = (dirlist_count > 1
+		     || ((mask & XPG_CODESET) != 0
+			 && (mask & XPG_NORM_CODESET) != 0));
+  retval->data = NULL;
+
+  retval->next = *lastp;
+  *lastp = retval;
+
+  entries = 0;
+  /* Recurse to fill the inheritance list of RETVAL.
+     If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
+     entry does not correspond to a real file; retval->filename contains
+     colons.  In this case we loop across all elements of DIRLIST and
+     across all bit patterns dominated by MASK.
+     If the DIRLIST is a single directory or entirely redundant (i.e.
+     DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
+     MASK, excluding MASK itself.
+     In either case, we loop down from MASK to 0.  This has the effect
+     that the extra bits in the locale name are dropped in this order:
+     first the modifier, then the territory, then the codeset, then the
+     normalized_codeset.  */
+  for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
+    if ((cnt & ~mask) == 0
+	&& !((cnt & XPG_CODESET) != 0 && (cnt & XPG_NORM_CODESET) != 0))
+      {
+	if (dirlist_count > 1)
+	  {
+	    /* Iterate over all elements of the DIRLIST.  */
+	    char *dir = NULL;
+
+	    while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+		   != NULL)
+	      retval->successor[entries++]
+		= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
+				      cnt, language, territory, codeset,
+				      normalized_codeset, modifier, filename,
+				      1);
+	  }
+	else
+	  retval->successor[entries++]
+	    = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
+				  cnt, language, territory, codeset,
+				  normalized_codeset, modifier, filename, 1);
+      }
+  retval->successor[entries] = NULL;
+
+  return retval;
+}
+
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+const char *
+_nl_normalize_codeset (const char *codeset, size_t name_len)
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum ((unsigned char) codeset[cnt]))
+      {
+	++len;
+
+	if (isalpha ((unsigned char) codeset[cnt]))
+	  only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+	wp = stpcpy (retval, "iso");
+      else
+	wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+	if (isalpha ((unsigned char) codeset[cnt]))
+	  *wp++ = tolower ((unsigned char) codeset[cnt]);
+	else if (isdigit ((unsigned char) codeset[cnt]))
+	  *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif

Added: tuxmath/trunk/intl/langprefs.c
===================================================================
--- tuxmath/trunk/intl/langprefs.c	                        (rev 0)
+++ tuxmath/trunk/intl/langprefs.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,130 @@
+/* Determine the user's language preferences.
+   Copyright (C) 2004-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno at clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <string.h>
+# include <CoreFoundation/CFPreferences.h>
+# include <CoreFoundation/CFPropertyList.h>
+# include <CoreFoundation/CFArray.h>
+# include <CoreFoundation/CFString.h>
+extern void _nl_locale_name_canonicalize (char *name);
+#endif
+
+/* Determine the user's language preferences, as a colon separated list of
+   locale names in XPG syntax
+     language[_territory][.codeset][@modifier]
+   The result must not be freed; it is statically allocated.
+   The LANGUAGE environment variable does not need to be considered; it is
+   already taken into account by the caller.  */
+
+const char *
+_nl_language_preferences_default (void)
+{
+#if HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+  {
+    /* Cache the preferences list, since CoreFoundation calls are expensive.  */
+    static const char *cached_languages;
+    static int cache_initialized;
+
+    if (!cache_initialized)
+      {
+	CFTypeRef preferences =
+	  CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"),
+				     kCFPreferencesCurrentApplication);
+	if (preferences != NULL
+	    && CFGetTypeID (preferences) == CFArrayGetTypeID ())
+	  {
+	    CFArrayRef prefArray = (CFArrayRef)preferences;
+	    int n = CFArrayGetCount (prefArray);
+	    char buf[256];
+	    size_t size = 0;
+	    int i;
+
+	    for (i = 0; i < n; i++)
+	      {
+		CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i);
+		if (element != NULL
+		    && CFGetTypeID (element) == CFStringGetTypeID ()
+		    && CFStringGetCString ((CFStringRef)element,
+					   buf, sizeof (buf),
+					   kCFStringEncodingASCII))
+		  {
+		    _nl_locale_name_canonicalize (buf);
+		    size += strlen (buf) + 1;
+		    /* Most GNU programs use msgids in English and don't ship
+		       an en.mo message catalog.  Therefore when we see "en"
+		       in the preferences list, arrange for gettext() to
+		       return the msgid, and ignore all further elements of
+		       the preferences list.  */
+		    if (strcmp (buf, "en") == 0)
+		      break;
+		  }
+		else
+		  break;
+	      }
+	    if (size > 0)
+	      {
+		char *languages = (char *) malloc (size);
+
+		if (languages != NULL)
+		  {
+		    char *p = languages;
+
+		    for (i = 0; i < n; i++)
+		      {
+			CFTypeRef element =
+			  CFArrayGetValueAtIndex (prefArray, i);
+			if (element != NULL
+		            && CFGetTypeID (element) == CFStringGetTypeID ()
+			    && CFStringGetCString ((CFStringRef)element,
+						   buf, sizeof (buf),
+						   kCFStringEncodingASCII))
+			  {
+			    _nl_locale_name_canonicalize (buf);
+			    strcpy (p, buf);
+			    p += strlen (buf);
+			    *p++ = ':';
+			    if (strcmp (buf, "en") == 0)
+			      break;
+			  }
+			else
+			  break;
+		      }
+		    *--p = '\0';
+
+		    cached_languages = languages;
+		  }
+	      }
+	  }
+	cache_initialized = 1;
+      }
+    if (cached_languages != NULL)
+      return cached_languages;
+  }
+#endif
+
+  return NULL;
+}

Added: tuxmath/trunk/intl/libgnuintl.h.in
===================================================================
--- tuxmath/trunk/intl/libgnuintl.h.in	                        (rev 0)
+++ tuxmath/trunk/intl/libgnuintl.h.in	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,419 @@
+/* Message catalogs for internationalization.
+   Copyright (C) 1995-1997, 2000-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LIBINTL_H
+#define _LIBINTL_H	1
+
+#include <locale.h>
+
+/* The LC_MESSAGES locale category is the category used by the functions
+   gettext() and dgettext().  It is specified in POSIX, but not in ANSI C.
+   On systems that don't define it, use an arbitrary value instead.
+   On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
+   then includes <libintl.h> (i.e. this file!) and then only defines
+   LC_MESSAGES.  To avoid a redefinition warning, don't define LC_MESSAGES
+   in this case.  */
+#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
+# define LC_MESSAGES 1729
+#endif
+
+/* We define an additional symbol to signal that we use the GNU
+   implementation of gettext.  */
+#define __USE_GNU_GETTEXT 1
+
+/* Provide information about the supported file formats.  Returns the
+   maximum minor revision number supported for a given major revision.  */
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
+  ((major) == 0 || (major) == 1 ? 1 : -1)
+
+/* Resolve a platform specific conflict on DJGPP.  GNU gettext takes
+   precedence over _conio_gettext.  */
+#ifdef __DJGPP__
+# undef gettext
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Version number: (major<<16) + (minor<<8) + subminor */
+#define LIBINTL_VERSION 0x001100
+extern int libintl_version;
+
+
+/* We redirect the functions to those prefixed with "libintl_".  This is
+   necessary, because some systems define gettext/textdomain/... in the C
+   library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
+   If we used the unprefixed names, there would be cases where the
+   definition in the C library would override the one in the libintl.so
+   shared library.  Recall that on ELF systems, the symbols are looked
+   up in the following order:
+     1. in the executable,
+     2. in the shared libraries specified on the link command line, in order,
+     3. in the dependencies of the shared libraries specified on the link
+        command line,
+     4. in the dlopen()ed shared libraries, in the order in which they were
+        dlopen()ed.
+   The definition in the C library would override the one in libintl.so if
+   either
+     * -lc is given on the link command line and -lintl isn't, or
+     * -lc is given on the link command line before -lintl, or
+     * libintl.so is a dependency of a dlopen()ed shared library but not
+       linked to the executable at link time.
+   Since Solaris gettext() behaves differently than GNU gettext(), this
+   would be unacceptable.
+
+   The redirection happens by default through macros in C, so that &gettext
+   is independent of the compilation unit, but through inline functions in
+   C++, in order not to interfere with the name mangling of class fields or
+   class methods called 'gettext'.  */
+
+/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
+   If he doesn't, we choose the method.  A third possible method is
+   _INTL_REDIRECT_ASM, supported only by GCC.  */
+#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
+# if __GNUC__ >= 2 && !(__APPLE_CC__ > 1) && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
+#  define _INTL_REDIRECT_ASM
+# else
+#  ifdef __cplusplus
+#   define _INTL_REDIRECT_INLINE
+#  else
+#   define _INTL_REDIRECT_MACROS
+#  endif
+# endif
+#endif
+/* Auxiliary macros.  */
+#ifdef _INTL_REDIRECT_ASM
+# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
+# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
+# define _INTL_STRINGIFY(prefix) #prefix
+#else
+# define _INTL_ASM(cname)
+#endif
+
+/* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return
+   its n-th argument literally.  This enables GCC to warn for example about
+   printf (gettext ("foo %y")).  */
+#if __GNUC__ >= 3 && !(__APPLE_CC__ > 1 && defined __cplusplus)
+# define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n)))
+#else
+# define _INTL_MAY_RETURN_STRING_ARG(n)
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_gettext (const char *__msgid)
+       _INTL_MAY_RETURN_STRING_ARG (1);
+static inline char *gettext (const char *__msgid)
+{
+  return libintl_gettext (__msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define gettext libintl_gettext
+#endif
+extern char *gettext (const char *__msgid)
+       _INTL_ASM (libintl_gettext)
+       _INTL_MAY_RETURN_STRING_ARG (1);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   LC_MESSAGES locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dgettext (const char *__domainname, const char *__msgid)
+       _INTL_MAY_RETURN_STRING_ARG (2);
+static inline char *dgettext (const char *__domainname, const char *__msgid)
+{
+  return libintl_dgettext (__domainname, __msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dgettext libintl_dgettext
+#endif
+extern char *dgettext (const char *__domainname, const char *__msgid)
+       _INTL_ASM (libintl_dgettext)
+       _INTL_MAY_RETURN_STRING_ARG (2);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
+				int __category)
+       _INTL_MAY_RETURN_STRING_ARG (2);
+static inline char *dcgettext (const char *__domainname, const char *__msgid,
+			       int __category)
+{
+  return libintl_dcgettext (__domainname, __msgid, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcgettext libintl_dcgettext
+#endif
+extern char *dcgettext (const char *__domainname, const char *__msgid,
+			int __category)
+       _INTL_ASM (libintl_dcgettext)
+       _INTL_MAY_RETURN_STRING_ARG (2);
+#endif
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
+			       unsigned long int __n)
+       _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
+static inline char *ngettext (const char *__msgid1, const char *__msgid2,
+			      unsigned long int __n)
+{
+  return libintl_ngettext (__msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define ngettext libintl_ngettext
+#endif
+extern char *ngettext (const char *__msgid1, const char *__msgid2,
+		       unsigned long int __n)
+       _INTL_ASM (libintl_ngettext)
+       _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
+#endif
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
+				const char *__msgid2, unsigned long int __n)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+static inline char *dngettext (const char *__domainname, const char *__msgid1,
+			       const char *__msgid2, unsigned long int __n)
+{
+  return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dngettext libintl_dngettext
+#endif
+extern char *dngettext (const char *__domainname,
+			const char *__msgid1, const char *__msgid2,
+			unsigned long int __n)
+       _INTL_ASM (libintl_dngettext)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+#endif
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcngettext (const char *__domainname,
+				 const char *__msgid1, const char *__msgid2,
+				 unsigned long int __n, int __category)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+static inline char *dcngettext (const char *__domainname,
+				const char *__msgid1, const char *__msgid2,
+				unsigned long int __n, int __category)
+{
+  return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcngettext libintl_dcngettext
+#endif
+extern char *dcngettext (const char *__domainname,
+			 const char *__msgid1, const char *__msgid2,
+			 unsigned long int __n, int __category)
+       _INTL_ASM (libintl_dcngettext)
+       _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
+#endif
+
+
+#ifndef IN_LIBGLOCALE
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_textdomain (const char *__domainname);
+static inline char *textdomain (const char *__domainname)
+{
+  return libintl_textdomain (__domainname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define textdomain libintl_textdomain
+#endif
+extern char *textdomain (const char *__domainname)
+       _INTL_ASM (libintl_textdomain);
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bindtextdomain (const char *__domainname,
+				     const char *__dirname);
+static inline char *bindtextdomain (const char *__domainname,
+				    const char *__dirname)
+{
+  return libintl_bindtextdomain (__domainname, __dirname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bindtextdomain libintl_bindtextdomain
+#endif
+extern char *bindtextdomain (const char *__domainname, const char *__dirname)
+       _INTL_ASM (libintl_bindtextdomain);
+#endif
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bind_textdomain_codeset (const char *__domainname,
+					      const char *__codeset);
+static inline char *bind_textdomain_codeset (const char *__domainname,
+					     const char *__codeset)
+{
+  return libintl_bind_textdomain_codeset (__domainname, __codeset);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bind_textdomain_codeset libintl_bind_textdomain_codeset
+#endif
+extern char *bind_textdomain_codeset (const char *__domainname,
+				      const char *__codeset)
+       _INTL_ASM (libintl_bind_textdomain_codeset);
+#endif
+
+#endif /* IN_LIBGLOCALE */
+
+
+/* Support for format strings with positions in *printf(), following the
+   POSIX/XSI specification.
+   Note: These replacements for the *printf() functions are visible only
+   in source files that #include <libintl.h> or #include "gettext.h".
+   Packages that use *printf() in source files that don't refer to _()
+   or gettext() but for which the format string could be the return value
+   of _() or gettext() need to add this #include.  Oh well.  */
+
+#if !@HAVE_POSIX_PRINTF@
+
+#include <stdio.h>
+#include <stddef.h>
+
+/* Get va_list.  */
+#if __STDC__ || defined __cplusplus || defined _MSC_VER
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+
+#undef fprintf
+#define fprintf libintl_fprintf
+extern int fprintf (FILE *, const char *, ...);
+#undef vfprintf
+#define vfprintf libintl_vfprintf
+extern int vfprintf (FILE *, const char *, va_list);
+
+#undef printf
+#if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
+/* Don't break __attribute__((format(printf,M,N))).
+   This redefinition is only possible because the libc in NetBSD, Cygwin,
+   mingw does not have a function __printf__.  */
+# define libintl_printf __printf__
+#endif
+#define printf libintl_printf
+extern int printf (const char *, ...);
+#undef vprintf
+#define vprintf libintl_vprintf
+extern int vprintf (const char *, va_list);
+
+#undef sprintf
+#define sprintf libintl_sprintf
+extern int sprintf (char *, const char *, ...);
+#undef vsprintf
+#define vsprintf libintl_vsprintf
+extern int vsprintf (char *, const char *, va_list);
+
+#if @HAVE_SNPRINTF@
+
+#undef snprintf
+#define snprintf libintl_snprintf
+extern int snprintf (char *, size_t, const char *, ...);
+#undef vsnprintf
+#define vsnprintf libintl_vsnprintf
+extern int vsnprintf (char *, size_t, const char *, va_list);
+
+#endif
+
+#if @HAVE_ASPRINTF@
+
+#undef asprintf
+#define asprintf libintl_asprintf
+extern int asprintf (char **, const char *, ...);
+#undef vasprintf
+#define vasprintf libintl_vasprintf
+extern int vasprintf (char **, const char *, va_list);
+
+#endif
+
+#if @HAVE_WPRINTF@
+
+#undef fwprintf
+#define fwprintf libintl_fwprintf
+extern int fwprintf (FILE *, const wchar_t *, ...);
+#undef vfwprintf
+#define vfwprintf libintl_vfwprintf
+extern int vfwprintf (FILE *, const wchar_t *, va_list);
+
+#undef wprintf
+#define wprintf libintl_wprintf
+extern int wprintf (const wchar_t *, ...);
+#undef vwprintf
+#define vwprintf libintl_vwprintf
+extern int vwprintf (const wchar_t *, va_list);
+
+#undef swprintf
+#define swprintf libintl_swprintf
+extern int swprintf (wchar_t *, size_t, const wchar_t *, ...);
+#undef vswprintf
+#define vswprintf libintl_vswprintf
+extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
+
+#endif
+
+#endif
+
+
+/* Support for relocatable packages.  */
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+#define libintl_set_relocation_prefix libintl_set_relocation_prefix
+extern void
+       libintl_set_relocation_prefix (const char *orig_prefix,
+				      const char *curr_prefix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libintl.h */

Added: tuxmath/trunk/intl/libintl.rc
===================================================================
--- tuxmath/trunk/intl/libintl.rc	                        (rev 0)
+++ tuxmath/trunk/intl/libintl.rc	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,38 @@
+/* Resources for intl.dll */
+
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
+ PRODUCTVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
+ FILEFLAGSMASK 0x3fL /* VS_FFI_FILEFLAGSMASK */
+#ifdef _DEBUG
+ FILEFLAGS 0x1L  /* VS_FF_DEBUG */
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x10004L  /* VOS_DOS_WINDOWS32 */
+ FILETYPE 0x2L  /* VFT_DLL */
+ FILESUBTYPE 0x0L  /* VFT2_UNKNOWN */
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "04090000"  /* Lang = US English, Charset = ASCII */
+        BEGIN
+            VALUE "Comments", "This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\0"
+            VALUE "CompanyName", "Free Software Foundation\0"
+            VALUE "FileDescription", "LGPLed libintl for Windows NT/2000/XP/Vista and Windows 95/98/ME\0"
+            VALUE "FileVersion", PACKAGE_VERSION_STRING "\0"
+            VALUE "InternalName", "intl.dll\0"
+            VALUE "LegalCopyright", "Copyright (C) 1995-2007\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "intl.dll\0"
+            VALUE "ProductName", "libintl: accessing NLS message catalogs\0"
+            VALUE "ProductVersion", PACKAGE_VERSION_STRING "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0409, 0  /* US English, ASCII */
+    END
+END

Added: tuxmath/trunk/intl/loadinfo.h
===================================================================
--- tuxmath/trunk/intl/loadinfo.h	                        (rev 0)
+++ tuxmath/trunk/intl/loadinfo.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,132 @@
+/* Copyright (C) 1996-1999, 2000-2003, 2005-2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper at cygnus.com>, 1996.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LOADINFO_H
+#define _LOADINFO_H	1
+
+/* Declarations of locale dependent catalog lookup functions.
+   Implemented in
+
+     localealias.c    Possibly replace a locale name by another.
+     explodename.c    Split a locale name into its various fields.
+     l10nflist.c      Generate a list of filenames of possible message catalogs.
+     finddomain.c     Find and open the relevant message catalogs.
+
+   The main function _nl_find_domain() in finddomain.c is declared
+   in gettextP.h.
+ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef LIBINTL_DLL_EXPORTED
+# define LIBINTL_DLL_EXPORTED
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+/* Separator in PATH like lists of pathnames.  */
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+  /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Encoding of locale name parts.  */
+#define XPG_NORM_CODESET	1
+#define XPG_CODESET		2
+#define XPG_TERRITORY		4
+#define XPG_MODIFIER		8
+
+
+struct loaded_l10nfile
+{
+  const char *filename;
+  int decided;
+
+  const void *data;
+
+  struct loaded_l10nfile *next;
+  struct loaded_l10nfile *successor[1];
+};
+
+
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+extern const char *_nl_normalize_codeset (const char *codeset,
+					  size_t name_len);
+
+/* Lookup a locale dependent file.
+   *L10NFILE_LIST denotes a pool of lookup results of locale dependent
+   files of the same kind, sorted in decreasing order of ->filename.
+   DIRLIST and DIRLIST_LEN are an argz list of directories in which to
+   look, containing at least one directory (i.e. DIRLIST_LEN > 0).
+   MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER
+   are the pieces of the locale name, as produced by _nl_explode_name().
+   FILENAME is the filename suffix.
+   The return value is the lookup result, either found in *L10NFILE_LIST,
+   or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL.
+   If the return value is non-NULL, it is added to *L10NFILE_LIST, and
+   its ->next field denotes the chaining inside *L10NFILE_LIST, and
+   furthermore its ->successor[] field contains a list of other lookup
+   results from which this lookup result inherits.  */
+extern struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+		    const char *dirlist, size_t dirlist_len, int mask,
+		    const char *language, const char *territory,
+		    const char *codeset, const char *normalized_codeset,
+		    const char *modifier,
+		    const char *filename, int do_allocate);
+
+/* Lookup the real locale name for a locale alias NAME, or NULL if
+   NAME is not a locale alias (but possibly a real locale name).
+   The return value is statically allocated and must not be freed.  */
+/* Part of the libintl ABI only for the sake of the gettext.m4 macro.  */
+extern LIBINTL_DLL_EXPORTED const char *_nl_expand_alias (const char *name);
+
+/* Split a locale name NAME into its pieces: language, modifier,
+   territory, codeset.
+   NAME gets destructively modified: NUL bytes are inserted here and
+   there.  *LANGUAGE gets assigned NAME.  Each of *MODIFIER, *TERRITORY,
+   *CODESET gets assigned either a pointer into the old NAME string, or
+   NULL.  *NORMALIZED_CODESET gets assigned the expanded *CODESET, if it
+   is different from *CODESET; this one is dynamically allocated and has
+   to be freed by the caller.
+   The return value is a bitmask, where each bit corresponds to one
+   filled-in value:
+     XPG_MODIFIER                for *MODIFIER,
+     XPG_TERRITORY               for *TERRITORY,
+     XPG_CODESET                 for *CODESET,
+     XPG_NORM_CODESET            for *NORMALIZED_CODESET.
+ */
+extern int _nl_explode_name (char *name, const char **language,
+			     const char **modifier, const char **territory,
+			     const char **codeset,
+			     const char **normalized_codeset);
+
+#endif	/* loadinfo.h */

Added: tuxmath/trunk/intl/loadmsgcat.c
===================================================================
--- tuxmath/trunk/intl/loadmsgcat.c	                        (rev 0)
+++ tuxmath/trunk/intl/loadmsgcat.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1336 @@
+/* Load needed message catalogs.
+   Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+# undef  alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#ifdef _LIBC
+# include <langinfo.h>
+# include <locale.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+    || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP	1
+#else
+# undef HAVE_MMAP
+#endif
+
+#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
+# include <stdint.h>
+#endif
+#if defined HAVE_INTTYPES_H || defined _LIBC
+# include <inttypes.h>
+#endif
+
+#include "gmo.h"
+#include "gettextP.h"
+#include "hash-string.h"
+#include "plural-exp.h"
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# include <not-cancel.h>
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+# include "lock.h"
+#endif
+
+/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
+   Note that our fallback values need not be literal strings, because we don't
+   use them with preprocessor string concatenation.  */
+#if !defined PRId8 || PRI_MACROS_BROKEN
+# undef PRId8
+# define PRId8 "d"
+#endif
+#if !defined PRIi8 || PRI_MACROS_BROKEN
+# undef PRIi8
+# define PRIi8 "i"
+#endif
+#if !defined PRIo8 || PRI_MACROS_BROKEN
+# undef PRIo8
+# define PRIo8 "o"
+#endif
+#if !defined PRIu8 || PRI_MACROS_BROKEN
+# undef PRIu8
+# define PRIu8 "u"
+#endif
+#if !defined PRIx8 || PRI_MACROS_BROKEN
+# undef PRIx8
+# define PRIx8 "x"
+#endif
+#if !defined PRIX8 || PRI_MACROS_BROKEN
+# undef PRIX8
+# define PRIX8 "X"
+#endif
+#if !defined PRId16 || PRI_MACROS_BROKEN
+# undef PRId16
+# define PRId16 "d"
+#endif
+#if !defined PRIi16 || PRI_MACROS_BROKEN
+# undef PRIi16
+# define PRIi16 "i"
+#endif
+#if !defined PRIo16 || PRI_MACROS_BROKEN
+# undef PRIo16
+# define PRIo16 "o"
+#endif
+#if !defined PRIu16 || PRI_MACROS_BROKEN
+# undef PRIu16
+# define PRIu16 "u"
+#endif
+#if !defined PRIx16 || PRI_MACROS_BROKEN
+# undef PRIx16
+# define PRIx16 "x"
+#endif
+#if !defined PRIX16 || PRI_MACROS_BROKEN
+# undef PRIX16
+# define PRIX16 "X"
+#endif
+#if !defined PRId32 || PRI_MACROS_BROKEN
+# undef PRId32
+# define PRId32 "d"
+#endif
+#if !defined PRIi32 || PRI_MACROS_BROKEN
+# undef PRIi32
+# define PRIi32 "i"
+#endif
+#if !defined PRIo32 || PRI_MACROS_BROKEN
+# undef PRIo32
+# define PRIo32 "o"
+#endif
+#if !defined PRIu32 || PRI_MACROS_BROKEN
+# undef PRIu32
+# define PRIu32 "u"
+#endif
+#if !defined PRIx32 || PRI_MACROS_BROKEN
+# undef PRIx32
+# define PRIx32 "x"
+#endif
+#if !defined PRIX32 || PRI_MACROS_BROKEN
+# undef PRIX32
+# define PRIX32 "X"
+#endif
+#if !defined PRId64 || PRI_MACROS_BROKEN
+# undef PRId64
+# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
+#endif
+#if !defined PRIi64 || PRI_MACROS_BROKEN
+# undef PRIi64
+# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
+#endif
+#if !defined PRIo64 || PRI_MACROS_BROKEN
+# undef PRIo64
+# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
+#endif
+#if !defined PRIu64 || PRI_MACROS_BROKEN
+# undef PRIu64
+# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
+#endif
+#if !defined PRIx64 || PRI_MACROS_BROKEN
+# undef PRIx64
+# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
+#endif
+#if !defined PRIX64 || PRI_MACROS_BROKEN
+# undef PRIX64
+# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
+#endif
+#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+#endif
+#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+#endif
+#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+#endif
+#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+#endif
+#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+#endif
+#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+#endif
+#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
+# undef PRIdFAST8
+# define PRIdFAST8 "d"
+#endif
+#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
+# undef PRIiFAST8
+# define PRIiFAST8 "i"
+#endif
+#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
+# undef PRIoFAST8
+# define PRIoFAST8 "o"
+#endif
+#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
+# undef PRIuFAST8
+# define PRIuFAST8 "u"
+#endif
+#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
+# undef PRIxFAST8
+# define PRIxFAST8 "x"
+#endif
+#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
+# undef PRIXFAST8
+# define PRIXFAST8 "X"
+#endif
+#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
+# undef PRIdFAST16
+# define PRIdFAST16 "d"
+#endif
+#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
+# undef PRIiFAST16
+# define PRIiFAST16 "i"
+#endif
+#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
+# undef PRIoFAST16
+# define PRIoFAST16 "o"
+#endif
+#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
+# undef PRIuFAST16
+# define PRIuFAST16 "u"
+#endif
+#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
+# undef PRIxFAST16
+# define PRIxFAST16 "x"
+#endif
+#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
+# undef PRIXFAST16
+# define PRIXFAST16 "X"
+#endif
+#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
+# undef PRIdFAST32
+# define PRIdFAST32 "d"
+#endif
+#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
+# undef PRIiFAST32
+# define PRIiFAST32 "i"
+#endif
+#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
+# undef PRIoFAST32
+# define PRIoFAST32 "o"
+#endif
+#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
+# undef PRIuFAST32
+# define PRIuFAST32 "u"
+#endif
+#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
+# undef PRIxFAST32
+# define PRIxFAST32 "x"
+#endif
+#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
+# undef PRIXFAST32
+# define PRIXFAST32 "X"
+#endif
+#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+#endif
+#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+#endif
+#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+#endif
+#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+#endif
+#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+#endif
+#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+#endif
+#if !defined PRIdMAX || PRI_MACROS_BROKEN
+# undef PRIdMAX
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+#endif
+#if !defined PRIiMAX || PRI_MACROS_BROKEN
+# undef PRIiMAX
+# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
+#endif
+#if !defined PRIoMAX || PRI_MACROS_BROKEN
+# undef PRIoMAX
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+#endif
+#if !defined PRIuMAX || PRI_MACROS_BROKEN
+# undef PRIuMAX
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+#endif
+#if !defined PRIxMAX || PRI_MACROS_BROKEN
+# undef PRIxMAX
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+#endif
+#if !defined PRIXMAX || PRI_MACROS_BROKEN
+# undef PRIXMAX
+# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
+#endif
+#if !defined PRIdPTR || PRI_MACROS_BROKEN
+# undef PRIdPTR
+# define PRIdPTR \
+  (sizeof (void *) == sizeof (long) ? "ld" : \
+   sizeof (void *) == sizeof (int) ? "d" : \
+   "lld")
+#endif
+#if !defined PRIiPTR || PRI_MACROS_BROKEN
+# undef PRIiPTR
+# define PRIiPTR \
+  (sizeof (void *) == sizeof (long) ? "li" : \
+   sizeof (void *) == sizeof (int) ? "i" : \
+   "lli")
+#endif
+#if !defined PRIoPTR || PRI_MACROS_BROKEN
+# undef PRIoPTR
+# define PRIoPTR \
+  (sizeof (void *) == sizeof (long) ? "lo" : \
+   sizeof (void *) == sizeof (int) ? "o" : \
+   "llo")
+#endif
+#if !defined PRIuPTR || PRI_MACROS_BROKEN
+# undef PRIuPTR
+# define PRIuPTR \
+  (sizeof (void *) == sizeof (long) ? "lu" : \
+   sizeof (void *) == sizeof (int) ? "u" : \
+   "llu")
+#endif
+#if !defined PRIxPTR || PRI_MACROS_BROKEN
+# undef PRIxPTR
+# define PRIxPTR \
+  (sizeof (void *) == sizeof (long) ? "lx" : \
+   sizeof (void *) == sizeof (int) ? "x" : \
+   "llx")
+#endif
+#if !defined PRIXPTR || PRI_MACROS_BROKEN
+# undef PRIXPTR
+# define PRIXPTR \
+  (sizeof (void *) == sizeof (long) ? "lX" : \
+   sizeof (void *) == sizeof (int) ? "X" : \
+   "llX")
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions.  This is required by the standard
+   because some ISO C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define open(name, flags)	open_not_cancel_2 (name, flags)
+# define close(fd)		close_not_cancel_no_status (fd)
+# define read(fd, buf, n)	read_not_cancel (fd, buf, n)
+# define mmap(addr, len, prot, flags, fd, offset) \
+  __mmap (addr, len, prot, flags, fd, offset)
+# define munmap(addr, len)	__munmap (addr, len)
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+   O_BINARY is usually declared in <fcntl.h>. */
+#if !defined O_BINARY && defined _O_BINARY
+  /* For MSC-compatible compilers.  */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#ifdef __BEOS__
+  /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+/* On reasonable systems, binary I/O is the default.  */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+   with all translations.  This is important if the translations are
+   cached by one of GCC's features.  */
+int _nl_msg_cat_cntr;
+
+
+/* Expand a system dependent string segment.  Return NULL if unsupported.  */
+static const char *
+get_sysdep_segment_value (const char *name)
+{
+  /* Test for an ISO C 99 section 7.8.1 format string directive.
+     Syntax:
+     P R I { d | i | o | u | x | X }
+     { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */
+  /* We don't use a table of 14 times 6 'const char *' strings here, because
+     data relocations cost startup time.  */
+  if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
+    {
+      if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
+	  || name[3] == 'x' || name[3] == 'X')
+	{
+	  if (name[4] == '8' && name[5] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRId8;
+	      if (name[3] == 'i')
+		return PRIi8;
+	      if (name[3] == 'o')
+		return PRIo8;
+	      if (name[3] == 'u')
+		return PRIu8;
+	      if (name[3] == 'x')
+		return PRIx8;
+	      if (name[3] == 'X')
+		return PRIX8;
+	      abort ();
+	    }
+	  if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRId16;
+	      if (name[3] == 'i')
+		return PRIi16;
+	      if (name[3] == 'o')
+		return PRIo16;
+	      if (name[3] == 'u')
+		return PRIu16;
+	      if (name[3] == 'x')
+		return PRIx16;
+	      if (name[3] == 'X')
+		return PRIX16;
+	      abort ();
+	    }
+	  if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRId32;
+	      if (name[3] == 'i')
+		return PRIi32;
+	      if (name[3] == 'o')
+		return PRIo32;
+	      if (name[3] == 'u')
+		return PRIu32;
+	      if (name[3] == 'x')
+		return PRIx32;
+	      if (name[3] == 'X')
+		return PRIX32;
+	      abort ();
+	    }
+	  if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRId64;
+	      if (name[3] == 'i')
+		return PRIi64;
+	      if (name[3] == 'o')
+		return PRIo64;
+	      if (name[3] == 'u')
+		return PRIu64;
+	      if (name[3] == 'x')
+		return PRIx64;
+	      if (name[3] == 'X')
+		return PRIX64;
+	      abort ();
+	    }
+	  if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
+	      && name[7] == 'S' && name[8] == 'T')
+	    {
+	      if (name[9] == '8' && name[10] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdLEAST8;
+		  if (name[3] == 'i')
+		    return PRIiLEAST8;
+		  if (name[3] == 'o')
+		    return PRIoLEAST8;
+		  if (name[3] == 'u')
+		    return PRIuLEAST8;
+		  if (name[3] == 'x')
+		    return PRIxLEAST8;
+		  if (name[3] == 'X')
+		    return PRIXLEAST8;
+		  abort ();
+		}
+	      if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdLEAST16;
+		  if (name[3] == 'i')
+		    return PRIiLEAST16;
+		  if (name[3] == 'o')
+		    return PRIoLEAST16;
+		  if (name[3] == 'u')
+		    return PRIuLEAST16;
+		  if (name[3] == 'x')
+		    return PRIxLEAST16;
+		  if (name[3] == 'X')
+		    return PRIXLEAST16;
+		  abort ();
+		}
+	      if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdLEAST32;
+		  if (name[3] == 'i')
+		    return PRIiLEAST32;
+		  if (name[3] == 'o')
+		    return PRIoLEAST32;
+		  if (name[3] == 'u')
+		    return PRIuLEAST32;
+		  if (name[3] == 'x')
+		    return PRIxLEAST32;
+		  if (name[3] == 'X')
+		    return PRIXLEAST32;
+		  abort ();
+		}
+	      if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdLEAST64;
+		  if (name[3] == 'i')
+		    return PRIiLEAST64;
+		  if (name[3] == 'o')
+		    return PRIoLEAST64;
+		  if (name[3] == 'u')
+		    return PRIuLEAST64;
+		  if (name[3] == 'x')
+		    return PRIxLEAST64;
+		  if (name[3] == 'X')
+		    return PRIXLEAST64;
+		  abort ();
+		}
+	    }
+	  if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
+	      && name[7] == 'T')
+	    {
+	      if (name[8] == '8' && name[9] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdFAST8;
+		  if (name[3] == 'i')
+		    return PRIiFAST8;
+		  if (name[3] == 'o')
+		    return PRIoFAST8;
+		  if (name[3] == 'u')
+		    return PRIuFAST8;
+		  if (name[3] == 'x')
+		    return PRIxFAST8;
+		  if (name[3] == 'X')
+		    return PRIXFAST8;
+		  abort ();
+		}
+	      if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdFAST16;
+		  if (name[3] == 'i')
+		    return PRIiFAST16;
+		  if (name[3] == 'o')
+		    return PRIoFAST16;
+		  if (name[3] == 'u')
+		    return PRIuFAST16;
+		  if (name[3] == 'x')
+		    return PRIxFAST16;
+		  if (name[3] == 'X')
+		    return PRIXFAST16;
+		  abort ();
+		}
+	      if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdFAST32;
+		  if (name[3] == 'i')
+		    return PRIiFAST32;
+		  if (name[3] == 'o')
+		    return PRIoFAST32;
+		  if (name[3] == 'u')
+		    return PRIuFAST32;
+		  if (name[3] == 'x')
+		    return PRIxFAST32;
+		  if (name[3] == 'X')
+		    return PRIXFAST32;
+		  abort ();
+		}
+	      if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
+		{
+		  if (name[3] == 'd')
+		    return PRIdFAST64;
+		  if (name[3] == 'i')
+		    return PRIiFAST64;
+		  if (name[3] == 'o')
+		    return PRIoFAST64;
+		  if (name[3] == 'u')
+		    return PRIuFAST64;
+		  if (name[3] == 'x')
+		    return PRIxFAST64;
+		  if (name[3] == 'X')
+		    return PRIXFAST64;
+		  abort ();
+		}
+	    }
+	  if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
+	      && name[7] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRIdMAX;
+	      if (name[3] == 'i')
+		return PRIiMAX;
+	      if (name[3] == 'o')
+		return PRIoMAX;
+	      if (name[3] == 'u')
+		return PRIuMAX;
+	      if (name[3] == 'x')
+		return PRIxMAX;
+	      if (name[3] == 'X')
+		return PRIXMAX;
+	      abort ();
+	    }
+	  if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
+	      && name[7] == '\0')
+	    {
+	      if (name[3] == 'd')
+		return PRIdPTR;
+	      if (name[3] == 'i')
+		return PRIiPTR;
+	      if (name[3] == 'o')
+		return PRIoPTR;
+	      if (name[3] == 'u')
+		return PRIuPTR;
+	      if (name[3] == 'x')
+		return PRIxPTR;
+	      if (name[3] == 'X')
+		return PRIXPTR;
+	      abort ();
+	    }
+	}
+    }
+  /* Test for a glibc specific printf() format directive flag.  */
+  if (name[0] == 'I' && name[1] == '\0')
+    {
+#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+      /* The 'I' flag, in numeric format directives, replaces ASCII digits
+	 with the 'outdigits' defined in the LC_CTYPE locale facet.  This is
+	 used for Farsi (Persian) and maybe Arabic.  */
+      return "I";
+#else
+      return "";
+#endif
+    }
+  /* Other system dependent strings are not valid.  */
+  return NULL;
+}
+
+/* Load the message catalogs specified by FILENAME.  If it is no valid
+   message catalog do nothing.  */
+void
+internal_function
+_nl_load_domain (struct loaded_l10nfile *domain_file,
+		 struct binding *domainbinding)
+{
+  __libc_lock_define_initialized_recursive (static, lock)
+  int fd = -1;
+  size_t size;
+#ifdef _LIBC
+  struct stat64 st;
+#else
+  struct stat st;
+#endif
+  struct mo_file_header *data = (struct mo_file_header *) -1;
+  int use_mmap = 0;
+  struct loaded_domain *domain;
+  int revision;
+  const char *nullentry;
+  size_t nullentrylen;
+
+  __libc_lock_lock_recursive (lock);
+  if (domain_file->decided != 0)
+    {
+      /* There are two possibilities:
+
+	 + this is the same thread calling again during this initialization
+	   via _nl_find_msg.  We have initialized everything this call needs.
+
+	 + this is another thread which tried to initialize this object.
+	   Not necessary anymore since if the lock is available this
+	   is finished.
+      */
+      goto done;
+    }
+
+  domain_file->decided = -1;
+  domain_file->data = NULL;
+
+  /* Note that it would be useless to store domainbinding in domain_file
+     because domainbinding might be == NULL now but != NULL later (after
+     a call to bind_textdomain_codeset).  */
+
+  /* If the record does not represent a valid locale the FILENAME
+     might be NULL.  This can happen when according to the given
+     specification the locale file name is different for XPG and CEN
+     syntax.  */
+  if (domain_file->filename == NULL)
+    goto out;
+
+  /* Try to open the addressed file.  */
+  fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+  if (fd == -1)
+    goto out;
+
+  /* We must know about the size of the file.  */
+  if (
+#ifdef _LIBC
+      __builtin_expect (fstat64 (fd, &st) != 0, 0)
+#else
+      __builtin_expect (fstat (fd, &st) != 0, 0)
+#endif
+      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+      || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+    /* Something went wrong.  */
+    goto out;
+
+#ifdef HAVE_MMAP
+  /* Now we are ready to load the file.  If mmap() is available we try
+     this first.  If not available or it failed we try to load it.  */
+  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+					 MAP_PRIVATE, fd, 0);
+
+  if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+    {
+      /* mmap() call was successful.  */
+      close (fd);
+      fd = -1;
+      use_mmap = 1;
+    }
+#endif
+
+  /* If the data is not yet available (i.e. mmap'ed) we try to load
+     it manually.  */
+  if (data == (struct mo_file_header *) -1)
+    {
+      size_t to_read;
+      char *read_ptr;
+
+      data = (struct mo_file_header *) malloc (size);
+      if (data == NULL)
+	goto out;
+
+      to_read = size;
+      read_ptr = (char *) data;
+      do
+	{
+	  long int nb = (long int) read (fd, read_ptr, to_read);
+	  if (nb <= 0)
+	    {
+#ifdef EINTR
+	      if (nb == -1 && errno == EINTR)
+		continue;
+#endif
+	      goto out;
+	    }
+	  read_ptr += nb;
+	  to_read -= nb;
+	}
+      while (to_read > 0);
+
+      close (fd);
+      fd = -1;
+    }
+
+  /* Using the magic number we can test whether it really is a message
+     catalog file.  */
+  if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+			0))
+    {
+      /* The magic number is wrong: not a message catalog file.  */
+#ifdef HAVE_MMAP
+      if (use_mmap)
+	munmap ((caddr_t) data, size);
+      else
+#endif
+	free (data);
+      goto out;
+    }
+
+  domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+  if (domain == NULL)
+    goto out;
+  domain_file->data = domain;
+
+  domain->data = (char *) data;
+  domain->use_mmap = use_mmap;
+  domain->mmap_size = size;
+  domain->must_swap = data->magic != _MAGIC;
+  domain->malloced = NULL;
+
+  /* Fill in the information about the available tables.  */
+  revision = W (domain->must_swap, data->revision);
+  /* We support only the major revisions 0 and 1.  */
+  switch (revision >> 16)
+    {
+    case 0:
+    case 1:
+      domain->nstrings = W (domain->must_swap, data->nstrings);
+      domain->orig_tab = (const struct string_desc *)
+	((char *) data + W (domain->must_swap, data->orig_tab_offset));
+      domain->trans_tab = (const struct string_desc *)
+	((char *) data + W (domain->must_swap, data->trans_tab_offset));
+      domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+      domain->hash_tab =
+	(domain->hash_size > 2
+	 ? (const nls_uint32 *)
+	   ((char *) data + W (domain->must_swap, data->hash_tab_offset))
+	 : NULL);
+      domain->must_swap_hash_tab = domain->must_swap;
+
+      /* Now dispatch on the minor revision.  */
+      switch (revision & 0xffff)
+	{
+	case 0:
+	  domain->n_sysdep_strings = 0;
+	  domain->orig_sysdep_tab = NULL;
+	  domain->trans_sysdep_tab = NULL;
+	  break;
+	case 1:
+	default:
+	  {
+	    nls_uint32 n_sysdep_strings;
+
+	    if (domain->hash_tab == NULL)
+	      /* This is invalid.  These minor revisions need a hash table.  */
+	      goto invalid;
+
+	    n_sysdep_strings =
+	      W (domain->must_swap, data->n_sysdep_strings);
+	    if (n_sysdep_strings > 0)
+	      {
+		nls_uint32 n_sysdep_segments;
+		const struct sysdep_segment *sysdep_segments;
+		const char **sysdep_segment_values;
+		const nls_uint32 *orig_sysdep_tab;
+		const nls_uint32 *trans_sysdep_tab;
+		nls_uint32 n_inmem_sysdep_strings;
+		size_t memneed;
+		char *mem;
+		struct sysdep_string_desc *inmem_orig_sysdep_tab;
+		struct sysdep_string_desc *inmem_trans_sysdep_tab;
+		nls_uint32 *inmem_hash_tab;
+		unsigned int i, j;
+
+		/* Get the values of the system dependent segments.  */
+		n_sysdep_segments =
+		  W (domain->must_swap, data->n_sysdep_segments);
+		sysdep_segments = (const struct sysdep_segment *)
+		  ((char *) data
+		   + W (domain->must_swap, data->sysdep_segments_offset));
+		sysdep_segment_values =
+		  (const char **)
+		  alloca (n_sysdep_segments * sizeof (const char *));
+		for (i = 0; i < n_sysdep_segments; i++)
+		  {
+		    const char *name =
+		      (char *) data
+		      + W (domain->must_swap, sysdep_segments[i].offset);
+		    nls_uint32 namelen =
+		      W (domain->must_swap, sysdep_segments[i].length);
+
+		    if (!(namelen > 0 && name[namelen - 1] == '\0'))
+		      {
+			freea (sysdep_segment_values);
+			goto invalid;
+		      }
+
+		    sysdep_segment_values[i] = get_sysdep_segment_value (name);
+		  }
+
+		orig_sysdep_tab = (const nls_uint32 *)
+		  ((char *) data
+		   + W (domain->must_swap, data->orig_sysdep_tab_offset));
+		trans_sysdep_tab = (const nls_uint32 *)
+		  ((char *) data
+		   + W (domain->must_swap, data->trans_sysdep_tab_offset));
+
+		/* Compute the amount of additional memory needed for the
+		   system dependent strings and the augmented hash table.
+		   At the same time, also drop string pairs which refer to
+		   an undefined system dependent segment.  */
+		n_inmem_sysdep_strings = 0;
+		memneed = domain->hash_size * sizeof (nls_uint32);
+		for (i = 0; i < n_sysdep_strings; i++)
+		  {
+		    int valid = 1;
+		    size_t needs[2];
+
+		    for (j = 0; j < 2; j++)
+		      {
+			const struct sysdep_string *sysdep_string =
+			  (const struct sysdep_string *)
+			  ((char *) data
+			   + W (domain->must_swap,
+				j == 0
+				? orig_sysdep_tab[i]
+				: trans_sysdep_tab[i]));
+			size_t need = 0;
+			const struct segment_pair *p = sysdep_string->segments;
+
+			if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
+			  for (p = sysdep_string->segments;; p++)
+			    {
+			      nls_uint32 sysdepref;
+
+			      need += W (domain->must_swap, p->segsize);
+
+			      sysdepref = W (domain->must_swap, p->sysdepref);
+			      if (sysdepref == SEGMENTS_END)
+				break;
+
+			      if (sysdepref >= n_sysdep_segments)
+				{
+				  /* Invalid.  */
+				  freea (sysdep_segment_values);
+				  goto invalid;
+				}
+
+			      if (sysdep_segment_values[sysdepref] == NULL)
+				{
+				  /* This particular string pair is invalid.  */
+				  valid = 0;
+				  break;
+				}
+
+			      need += strlen (sysdep_segment_values[sysdepref]);
+			    }
+
+			needs[j] = need;
+			if (!valid)
+			  break;
+		      }
+
+		    if (valid)
+		      {
+			n_inmem_sysdep_strings++;
+			memneed += needs[0] + needs[1];
+		      }
+		  }
+		memneed += 2 * n_inmem_sysdep_strings
+			   * sizeof (struct sysdep_string_desc);
+
+		if (n_inmem_sysdep_strings > 0)
+		  {
+		    unsigned int k;
+
+		    /* Allocate additional memory.  */
+		    mem = (char *) malloc (memneed);
+		    if (mem == NULL)
+		      goto invalid;
+
+		    domain->malloced = mem;
+		    inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
+		    mem += n_inmem_sysdep_strings
+			   * sizeof (struct sysdep_string_desc);
+		    inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
+		    mem += n_inmem_sysdep_strings
+			   * sizeof (struct sysdep_string_desc);
+		    inmem_hash_tab = (nls_uint32 *) mem;
+		    mem += domain->hash_size * sizeof (nls_uint32);
+
+		    /* Compute the system dependent strings.  */
+		    k = 0;
+		    for (i = 0; i < n_sysdep_strings; i++)
+		      {
+			int valid = 1;
+
+			for (j = 0; j < 2; j++)
+			  {
+			    const struct sysdep_string *sysdep_string =
+			      (const struct sysdep_string *)
+			      ((char *) data
+			       + W (domain->must_swap,
+				    j == 0
+				    ? orig_sysdep_tab[i]
+				    : trans_sysdep_tab[i]));
+			    const struct segment_pair *p =
+			      sysdep_string->segments;
+
+			    if (W (domain->must_swap, p->sysdepref)
+				!= SEGMENTS_END)
+			      for (p = sysdep_string->segments;; p++)
+				{
+				  nls_uint32 sysdepref;
+
+				  sysdepref =
+				    W (domain->must_swap, p->sysdepref);
+				  if (sysdepref == SEGMENTS_END)
+				    break;
+
+				  if (sysdep_segment_values[sysdepref] == NULL)
+				    {
+				      /* This particular string pair is
+					 invalid.  */
+				      valid = 0;
+				      break;
+				    }
+				}
+
+			    if (!valid)
+			      break;
+			  }
+
+			if (valid)
+			  {
+			    for (j = 0; j < 2; j++)
+			      {
+				const struct sysdep_string *sysdep_string =
+				  (const struct sysdep_string *)
+				  ((char *) data
+				   + W (domain->must_swap,
+					j == 0
+					? orig_sysdep_tab[i]
+					: trans_sysdep_tab[i]));
+				const char *static_segments =
+				  (char *) data
+				  + W (domain->must_swap, sysdep_string->offset);
+				const struct segment_pair *p =
+				  sysdep_string->segments;
+
+				/* Concatenate the segments, and fill
+				   inmem_orig_sysdep_tab[k] (for j == 0) and
+				   inmem_trans_sysdep_tab[k] (for j == 1).  */
+
+				struct sysdep_string_desc *inmem_tab_entry =
+				  (j == 0
+				   ? inmem_orig_sysdep_tab
+				   : inmem_trans_sysdep_tab)
+				  + k;
+
+				if (W (domain->must_swap, p->sysdepref)
+				    == SEGMENTS_END)
+				  {
+				    /* Only one static segment.  */
+				    inmem_tab_entry->length =
+				      W (domain->must_swap, p->segsize);
+				    inmem_tab_entry->pointer = static_segments;
+				  }
+				else
+				  {
+				    inmem_tab_entry->pointer = mem;
+
+				    for (p = sysdep_string->segments;; p++)
+				      {
+					nls_uint32 segsize =
+					  W (domain->must_swap, p->segsize);
+					nls_uint32 sysdepref =
+					  W (domain->must_swap, p->sysdepref);
+					size_t n;
+
+					if (segsize > 0)
+					  {
+					    memcpy (mem, static_segments, segsize);
+					    mem += segsize;
+					    static_segments += segsize;
+					  }
+
+					if (sysdepref == SEGMENTS_END)
+					  break;
+
+					n = strlen (sysdep_segment_values[sysdepref]);
+					memcpy (mem, sysdep_segment_values[sysdepref], n);
+					mem += n;
+				      }
+
+				    inmem_tab_entry->length =
+				      mem - inmem_tab_entry->pointer;
+				  }
+			      }
+
+			    k++;
+			  }
+		      }
+		    if (k != n_inmem_sysdep_strings)
+		      abort ();
+
+		    /* Compute the augmented hash table.  */
+		    for (i = 0; i < domain->hash_size; i++)
+		      inmem_hash_tab[i] =
+			W (domain->must_swap_hash_tab, domain->hash_tab[i]);
+		    for (i = 0; i < n_inmem_sysdep_strings; i++)
+		      {
+			const char *msgid = inmem_orig_sysdep_tab[i].pointer;
+			nls_uint32 hash_val = __hash_string (msgid);
+			nls_uint32 idx = hash_val % domain->hash_size;
+			nls_uint32 incr =
+			  1 + (hash_val % (domain->hash_size - 2));
+
+			for (;;)
+			  {
+			    if (inmem_hash_tab[idx] == 0)
+			      {
+				/* Hash table entry is empty.  Use it.  */
+				inmem_hash_tab[idx] = 1 + domain->nstrings + i;
+				break;
+			      }
+
+			    if (idx >= domain->hash_size - incr)
+			      idx -= domain->hash_size - incr;
+			    else
+			      idx += incr;
+			  }
+		      }
+
+		    domain->n_sysdep_strings = n_inmem_sysdep_strings;
+		    domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
+		    domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
+
+		    domain->hash_tab = inmem_hash_tab;
+		    domain->must_swap_hash_tab = 0;
+		  }
+		else
+		  {
+		    domain->n_sysdep_strings = 0;
+		    domain->orig_sysdep_tab = NULL;
+		    domain->trans_sysdep_tab = NULL;
+		  }
+
+		freea (sysdep_segment_values);
+	      }
+	    else
+	      {
+		domain->n_sysdep_strings = 0;
+		domain->orig_sysdep_tab = NULL;
+		domain->trans_sysdep_tab = NULL;
+	      }
+	  }
+	  break;
+	}
+      break;
+    default:
+      /* This is an invalid revision.  */
+    invalid:
+      /* This is an invalid .mo file.  */
+      if (domain->malloced)
+	free (domain->malloced);
+#ifdef HAVE_MMAP
+      if (use_mmap)
+	munmap ((caddr_t) data, size);
+      else
+#endif
+	free (data);
+      free (domain);
+      domain_file->data = NULL;
+      goto out;
+    }
+
+  /* No caches of converted translations so far.  */
+  domain->conversions = NULL;
+  domain->nconversions = 0;
+  gl_rwlock_init (domain->conversions_lock);
+
+  /* Get the header entry and look for a plural specification.  */
+#ifdef IN_LIBGLOCALE
+  nullentry =
+    _nl_find_msg (domain_file, domainbinding, NULL, "", &nullentrylen);
+#else
+  nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
+#endif
+  EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
+
+ out:
+  if (fd != -1)
+    close (fd);
+
+  domain_file->decided = 1;
+
+ done:
+  __libc_lock_unlock_recursive (lock);
+}
+
+
+#ifdef _LIBC
+void
+internal_function __libc_freeres_fn_section
+_nl_unload_domain (struct loaded_domain *domain)
+{
+  size_t i;
+
+  if (domain->plural != &__gettext_germanic_plural)
+    __gettext_free_exp ((struct expression *) domain->plural);
+
+  for (i = 0; i < domain->nconversions; i++)
+    {
+      struct converted_domain *convd = &domain->conversions[i];
+
+      free (convd->encoding);
+      if (convd->conv_tab != NULL && convd->conv_tab != (char **) -1)
+	free (convd->conv_tab);
+      if (convd->conv != (__gconv_t) -1)
+	__gconv_close (convd->conv);
+    }
+  if (domain->conversions != NULL)
+    free (domain->conversions);
+  __libc_rwlock_fini (domain->conversions_lock);
+
+  if (domain->malloced)
+    free (domain->malloced);
+
+# ifdef _POSIX_MAPPED_FILES
+  if (domain->use_mmap)
+    munmap ((caddr_t) domain->data, domain->mmap_size);
+  else
+# endif	/* _POSIX_MAPPED_FILES */
+    free ((void *) domain->data);
+
+  free (domain);
+}
+#endif

Added: tuxmath/trunk/intl/localcharset.c
===================================================================
--- tuxmath/trunk/intl/localcharset.c	                        (rev 0)
+++ tuxmath/trunk/intl/localcharset.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,461 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+   Copyright (C) 2000-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno at clisp.org>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "localcharset.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS.  */
+# define OS2
+#endif
+
+#if !defined WIN32_NATIVE
+# if HAVE_LANGINFO_CODESET
+#  include <langinfo.h>
+# else
+#  if 0 /* see comment below */
+#   include <locale.h>
+#  endif
+# endif
+# ifdef __CYGWIN__
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+# endif
+#elif defined WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* Get LIBDIR.  */
+#ifndef LIBDIR
+# include "configmake.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+   possible multithread problem in the function get_charset_aliases. If we
+   are running in a threaded environment, and if two threads initialize
+   'charset_aliases' simultaneously, both will produce the same value,
+   and everything will be ok if the two assignments to 'charset_aliases'
+   are atomic. But I don't know what will happen if the two assignments mix.  */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+   read, else NULL.  Its format is:
+   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file.  */
+static const char *
+get_charset_aliases (void)
+{
+  const char *cp;
+
+  cp = charset_aliases;
+  if (cp == NULL)
+    {
+#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
+      FILE *fp;
+      const char *dir;
+      const char *base = "charset.alias";
+      char *file_name;
+
+      /* Make it possible to override the charset.alias location.  This is
+	 necessary for running the testsuite before "make install".  */
+      dir = getenv ("CHARSETALIASDIR");
+      if (dir == NULL || dir[0] == '\0')
+	dir = relocate (LIBDIR);
+
+      /* Concatenate dir and base into freshly allocated file_name.  */
+      {
+	size_t dir_len = strlen (dir);
+	size_t base_len = strlen (base);
+	int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+	file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+	if (file_name != NULL)
+	  {
+	    memcpy (file_name, dir, dir_len);
+	    if (add_slash)
+	      file_name[dir_len] = DIRECTORY_SEPARATOR;
+	    memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+	  }
+      }
+
+      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+	/* Out of memory or file not found, treat it as empty.  */
+	cp = "";
+      else
+	{
+	  /* Parse the file's contents.  */
+	  char *res_ptr = NULL;
+	  size_t res_size = 0;
+
+	  for (;;)
+	    {
+	      int c;
+	      char buf1[50+1];
+	      char buf2[50+1];
+	      size_t l1, l2;
+	      char *old_res_ptr;
+
+	      c = getc (fp);
+	      if (c == EOF)
+		break;
+	      if (c == '\n' || c == ' ' || c == '\t')
+		continue;
+	      if (c == '#')
+		{
+		  /* Skip comment, to end of line.  */
+		  do
+		    c = getc (fp);
+		  while (!(c == EOF || c == '\n'));
+		  if (c == EOF)
+		    break;
+		  continue;
+		}
+	      ungetc (c, fp);
+	      if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+		break;
+	      l1 = strlen (buf1);
+	      l2 = strlen (buf2);
+	      old_res_ptr = res_ptr;
+	      if (res_size == 0)
+		{
+		  res_size = l1 + 1 + l2 + 1;
+		  res_ptr = (char *) malloc (res_size + 1);
+		}
+	      else
+		{
+		  res_size += l1 + 1 + l2 + 1;
+		  res_ptr = (char *) realloc (res_ptr, res_size + 1);
+		}
+	      if (res_ptr == NULL)
+		{
+		  /* Out of memory. */
+		  res_size = 0;
+		  if (old_res_ptr != NULL)
+		    free (old_res_ptr);
+		  break;
+		}
+	      strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+	      strcpy (res_ptr + res_size - (l2 + 1), buf2);
+	    }
+	  fclose (fp);
+	  if (res_size == 0)
+	    cp = "";
+	  else
+	    {
+	      *(res_ptr + res_size) = '\0';
+	      cp = res_ptr;
+	    }
+	}
+
+      if (file_name != NULL)
+	free (file_name);
+
+#else
+
+# if defined VMS
+      /* To avoid the troubles of an extra file charset.alias_vms in the
+	 sources of many GNU packages, simply inline the aliases here.  */
+      /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+	 "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+	 section 10.7 "Handling Different Character Sets".  */
+      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+	   "ISO8859-2" "\0" "ISO-8859-2" "\0"
+	   "ISO8859-5" "\0" "ISO-8859-5" "\0"
+	   "ISO8859-7" "\0" "ISO-8859-7" "\0"
+	   "ISO8859-8" "\0" "ISO-8859-8" "\0"
+	   "ISO8859-9" "\0" "ISO-8859-9" "\0"
+	   /* Japanese */
+	   "eucJP" "\0" "EUC-JP" "\0"
+	   "SJIS" "\0" "SHIFT_JIS" "\0"
+	   "DECKANJI" "\0" "DEC-KANJI" "\0"
+	   "SDECKANJI" "\0" "EUC-JP" "\0"
+	   /* Chinese */
+	   "eucTW" "\0" "EUC-TW" "\0"
+	   "DECHANYU" "\0" "DEC-HANYU" "\0"
+	   "DECHANZI" "\0" "GB2312" "\0"
+	   /* Korean */
+	   "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32_NATIVE || defined __CYGWIN__
+      /* To avoid the troubles of installing a separate file in the same
+	 directory as the DLL and of retrieving the DLL's directory at
+	 runtime, simply inline the aliases here.  */
+
+      cp = "CP936" "\0" "GBK" "\0"
+	   "CP1361" "\0" "JOHAB" "\0"
+	   "CP20127" "\0" "ASCII" "\0"
+	   "CP20866" "\0" "KOI8-R" "\0"
+	   "CP20936" "\0" "GB2312" "\0"
+	   "CP21866" "\0" "KOI8-RU" "\0"
+	   "CP28591" "\0" "ISO-8859-1" "\0"
+	   "CP28592" "\0" "ISO-8859-2" "\0"
+	   "CP28593" "\0" "ISO-8859-3" "\0"
+	   "CP28594" "\0" "ISO-8859-4" "\0"
+	   "CP28595" "\0" "ISO-8859-5" "\0"
+	   "CP28596" "\0" "ISO-8859-6" "\0"
+	   "CP28597" "\0" "ISO-8859-7" "\0"
+	   "CP28598" "\0" "ISO-8859-8" "\0"
+	   "CP28599" "\0" "ISO-8859-9" "\0"
+	   "CP28605" "\0" "ISO-8859-15" "\0"
+	   "CP38598" "\0" "ISO-8859-8" "\0"
+	   "CP51932" "\0" "EUC-JP" "\0"
+	   "CP51936" "\0" "GB2312" "\0"
+	   "CP51949" "\0" "EUC-KR" "\0"
+	   "CP51950" "\0" "EUC-TW" "\0"
+	   "CP54936" "\0" "GB18030" "\0"
+	   "CP65001" "\0" "UTF-8" "\0";
+# endif
+#endif
+
+      charset_aliases = cp;
+    }
+
+  return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+  const char *codeset;
+  const char *aliases;
+
+#if !(defined WIN32_NATIVE || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+  /* Most systems support nl_langinfo (CODESET) nowadays.  */
+  codeset = nl_langinfo (CODESET);
+
+#  ifdef __CYGWIN__
+  /* Cygwin 2006 does not have locales.  nl_langinfo (CODESET) always
+     returns "US-ASCII".  As long as this is not fixed, return the suffix
+     of the locale name from the environment variables (if present) or
+     the codepage as a number.  */
+  if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+    {
+      const char *locale;
+      static char buf[2 + 10 + 1];
+
+      locale = getenv ("LC_ALL");
+      if (locale == NULL || locale[0] == '\0')
+	{
+	  locale = getenv ("LC_CTYPE");
+	  if (locale == NULL || locale[0] == '\0')
+	    locale = getenv ("LANG");
+	}
+      if (locale != NULL && locale[0] != '\0')
+	{
+	  /* If the locale name contains an encoding after the dot, return
+	     it.  */
+	  const char *dot = strchr (locale, '.');
+
+	  if (dot != NULL)
+	    {
+	      const char *modifier;
+
+	      dot++;
+	      /* Look for the possible @... trailer and remove it, if any.  */
+	      modifier = strchr (dot, '@');
+	      if (modifier == NULL)
+		return dot;
+	      if (modifier - dot < sizeof (buf))
+		{
+		  memcpy (buf, dot, modifier - dot);
+		  buf [modifier - dot] = '\0';
+		  return buf;
+		}
+	    }
+	}
+
+      /* Woe32 has a function returning the locale's codepage as a number.  */
+      sprintf (buf, "CP%u", GetACP ());
+      codeset = buf;
+    }
+#  endif
+
+# else
+
+  /* On old systems which lack it, use setlocale or getenv.  */
+  const char *locale = NULL;
+
+  /* But most old systems don't have a complete set of locales.  Some
+     (like SunOS 4 or DJGPP) have only the C locale.  Therefore we don't
+     use setlocale here; it would return "C" when it doesn't support the
+     locale name the user has set.  */
+#  if 0
+  locale = setlocale (LC_CTYPE, NULL);
+#  endif
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_ALL");
+      if (locale == NULL || locale[0] == '\0')
+	{
+	  locale = getenv ("LC_CTYPE");
+	  if (locale == NULL || locale[0] == '\0')
+	    locale = getenv ("LANG");
+	}
+    }
+
+  /* On some old systems, one used to set locale = "iso8859_1". On others,
+     you set it to "language_COUNTRY.charset". In any case, we resolve it
+     through the charset.alias file.  */
+  codeset = locale;
+
+# endif
+
+#elif defined WIN32_NATIVE
+
+  static char buf[2 + 10 + 1];
+
+  /* Woe32 has a function returning the locale's codepage as a number.  */
+  sprintf (buf, "CP%u", GetACP ());
+  codeset = buf;
+
+#elif defined OS2
+
+  const char *locale;
+  static char buf[2 + 10 + 1];
+  ULONG cp[3];
+  ULONG cplen;
+
+  /* Allow user to override the codeset, as set in the operating system,
+     with standard language environment variables.  */
+  locale = getenv ("LC_ALL");
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_CTYPE");
+      if (locale == NULL || locale[0] == '\0')
+	locale = getenv ("LANG");
+    }
+  if (locale != NULL && locale[0] != '\0')
+    {
+      /* If the locale name contains an encoding after the dot, return it.  */
+      const char *dot = strchr (locale, '.');
+
+      if (dot != NULL)
+	{
+	  const char *modifier;
+
+	  dot++;
+	  /* Look for the possible @... trailer and remove it, if any.  */
+	  modifier = strchr (dot, '@');
+	  if (modifier == NULL)
+	    return dot;
+	  if (modifier - dot < sizeof (buf))
+	    {
+	      memcpy (buf, dot, modifier - dot);
+	      buf [modifier - dot] = '\0';
+	      return buf;
+	    }
+	}
+
+      /* Resolve through the charset.alias file.  */
+      codeset = locale;
+    }
+  else
+    {
+      /* OS/2 has a function returning the locale's codepage as a number.  */
+      if (DosQueryCp (sizeof (cp), cp, &cplen))
+	codeset = "";
+      else
+	{
+	  sprintf (buf, "CP%u", cp[0]);
+	  codeset = buf;
+	}
+    }
+
+#endif
+
+  if (codeset == NULL)
+    /* The canonical name cannot be determined.  */
+    codeset = "";
+
+  /* Resolve alias. */
+  for (aliases = get_charset_aliases ();
+       *aliases != '\0';
+       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+    if (strcmp (codeset, aliases) == 0
+	|| (aliases[0] == '*' && aliases[1] == '\0'))
+      {
+	codeset = aliases + strlen (aliases) + 1;
+	break;
+      }
+
+  /* Don't return an empty string.  GNU libc and GNU libiconv interpret
+     the empty string as denoting "the locale's character encoding",
+     thus GNU libiconv would call this function a second time.  */
+  if (codeset[0] == '\0')
+    codeset = "ASCII";
+
+  return codeset;
+}

Added: tuxmath/trunk/intl/localcharset.h
===================================================================
--- tuxmath/trunk/intl/localcharset.h	                        (rev 0)
+++ tuxmath/trunk/intl/localcharset.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,42 @@
+/* Determine a canonical name for the current locale's character encoding.
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU CHARSET Library.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */

Added: tuxmath/trunk/intl/locale.alias
===================================================================
--- tuxmath/trunk/intl/locale.alias	                        (rev 0)
+++ tuxmath/trunk/intl/locale.alias	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,77 @@
+# Locale name alias data base.
+# Copyright (C) 1996-2001,2003,2007 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+# The format of this file is the same as for the corresponding file of
+# the X Window System, which normally can be found in
+#	/usr/lib/X11/locale/locale.alias
+# A single line contains two fields: an alias and a substitution value.
+# All entries are case independent.
+
+# Note: This file is obsolete and is kept around for the time being for
+# backward compatibility.  Nobody should rely on the names defined here.
+# Locales should always be specified by their full name.
+
+# Packages using this file: 
+
+bokmal		nb_NO.ISO-8859-1
+bokmål		nb_NO.ISO-8859-1
+catalan		ca_ES.ISO-8859-1
+croatian	hr_HR.ISO-8859-2
+czech		cs_CZ.ISO-8859-2
+danish          da_DK.ISO-8859-1
+dansk		da_DK.ISO-8859-1
+deutsch		de_DE.ISO-8859-1
+dutch		nl_NL.ISO-8859-1
+eesti		et_EE.ISO-8859-1
+estonian	et_EE.ISO-8859-1
+finnish         fi_FI.ISO-8859-1
+français	fr_FR.ISO-8859-1
+french		fr_FR.ISO-8859-1
+galego		gl_ES.ISO-8859-1
+galician	gl_ES.ISO-8859-1
+german		de_DE.ISO-8859-1
+greek           el_GR.ISO-8859-7
+hebrew          he_IL.ISO-8859-8
+hrvatski	hr_HR.ISO-8859-2
+hungarian       hu_HU.ISO-8859-2
+icelandic       is_IS.ISO-8859-1
+italian         it_IT.ISO-8859-1
+japanese	ja_JP.eucJP
+japanese.euc	ja_JP.eucJP
+ja_JP		ja_JP.eucJP
+ja_JP.ujis	ja_JP.eucJP
+japanese.sjis	ja_JP.SJIS
+korean		ko_KR.eucKR
+korean.euc 	ko_KR.eucKR
+ko_KR		ko_KR.eucKR
+lithuanian      lt_LT.ISO-8859-13
+no_NO		nb_NO.ISO-8859-1
+no_NO.ISO-8859-1 nb_NO.ISO-8859-1
+norwegian       nb_NO.ISO-8859-1
+nynorsk		nn_NO.ISO-8859-1
+polish          pl_PL.ISO-8859-2
+portuguese      pt_PT.ISO-8859-1
+romanian        ro_RO.ISO-8859-2
+russian         ru_RU.ISO-8859-5
+slovak          sk_SK.ISO-8859-2
+slovene         sl_SI.ISO-8859-2
+slovenian       sl_SI.ISO-8859-2
+spanish         es_ES.ISO-8859-1
+swedish         sv_SE.ISO-8859-1
+thai		th_TH.TIS-620
+turkish         tr_TR.ISO-8859-9

Added: tuxmath/trunk/intl/localealias.c
===================================================================
--- tuxmath/trunk/intl/localealias.c	                        (rev 0)
+++ tuxmath/trunk/intl/localealias.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,439 @@
+/* Handle aliases for locale names.
+   Copyright (C) 1995-1999, 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#if defined _LIBC || defined HAVE___FSETLOCKING
+# include <stdio_ext.h>
+#endif
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# undef alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+#  define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY	1
+# define HAVE___FSETLOCKING	1
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+# include "lock.h"
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Some optimizations for glibc.  */
+#ifdef _LIBC
+# define FEOF(fp)		feof_unlocked (fp)
+# define FGETS(buf, n, fp)	fgets_unlocked (buf, n, fp)
+#else
+# define FEOF(fp)		feof (fp)
+# define FGETS(buf, n, fp)	fgets (buf, n, fp)
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+__libc_lock_define_initialized (static, lock)
+
+
+struct alias_map
+{
+  const char *alias;
+  const char *value;
+};
+
+
+#ifndef _LIBC
+# define libc_freeres_ptr(decl) decl
+#endif
+
+libc_freeres_ptr (static char *string_space);
+static size_t string_space_act;
+static size_t string_space_max;
+libc_freeres_ptr (static struct alias_map *map);
+static size_t nmap;
+static size_t maxmap;
+
+
+/* Prototypes for local functions.  */
+static size_t read_alias_file (const char *fname, int fname_len)
+     internal_function;
+static int extend_alias_table (void);
+static int alias_compare (const struct alias_map *map1,
+			  const struct alias_map *map2);
+
+
+const char *
+_nl_expand_alias (const char *name)
+{
+  static const char *locale_alias_path;
+  struct alias_map *retval;
+  const char *result = NULL;
+  size_t added;
+
+  __libc_lock_lock (lock);
+
+  if (locale_alias_path == NULL)
+    locale_alias_path = LOCALE_ALIAS_PATH;
+
+  do
+    {
+      struct alias_map item;
+
+      item.alias = name;
+
+      if (nmap > 0)
+	retval = (struct alias_map *) bsearch (&item, map, nmap,
+					       sizeof (struct alias_map),
+					       (int (*) (const void *,
+							 const void *)
+						) alias_compare);
+      else
+	retval = NULL;
+
+      /* We really found an alias.  Return the value.  */
+      if (retval != NULL)
+	{
+	  result = retval->value;
+	  break;
+	}
+
+      /* Perhaps we can find another alias file.  */
+      added = 0;
+      while (added == 0 && locale_alias_path[0] != '\0')
+	{
+	  const char *start;
+
+	  while (locale_alias_path[0] == PATH_SEPARATOR)
+	    ++locale_alias_path;
+	  start = locale_alias_path;
+
+	  while (locale_alias_path[0] != '\0'
+		 && locale_alias_path[0] != PATH_SEPARATOR)
+	    ++locale_alias_path;
+
+	  if (start < locale_alias_path)
+	    added = read_alias_file (start, locale_alias_path - start);
+	}
+    }
+  while (added != 0);
+
+  __libc_lock_unlock (lock);
+
+  return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (const char *fname, int fname_len)
+{
+  FILE *fp;
+  char *full_fname;
+  size_t added;
+  static const char aliasfile[] = "/locale.alias";
+
+  full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+#ifdef HAVE_MEMPCPY
+  mempcpy (mempcpy (full_fname, fname, fname_len),
+	   aliasfile, sizeof aliasfile);
+#else
+  memcpy (full_fname, fname, fname_len);
+  memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+#ifdef _LIBC
+  /* Note the file is opened with cancellation in the I/O functions
+     disabled.  */
+  fp = fopen (relocate (full_fname), "rc");
+#else
+  fp = fopen (relocate (full_fname), "r");
+#endif
+  freea (full_fname);
+  if (fp == NULL)
+    return 0;
+
+#ifdef HAVE___FSETLOCKING
+  /* No threads present.  */
+  __fsetlocking (fp, FSETLOCKING_BYCALLER);
+#endif
+
+  added = 0;
+  while (!FEOF (fp))
+    {
+      /* It is a reasonable approach to use a fix buffer here because
+	 a) we are only interested in the first two fields
+	 b) these fields must be usable as file names and so must not
+	    be that long
+	 We avoid a multi-kilobyte buffer here since this would use up
+	 stack space which we might not have if the program ran out of
+	 memory.  */
+      char buf[400];
+      char *alias;
+      char *value;
+      char *cp;
+      int complete_line;
+
+      if (FGETS (buf, sizeof buf, fp) == NULL)
+	/* EOF reached.  */
+	break;
+
+      /* Determine whether the line is complete.  */
+      complete_line = strchr (buf, '\n') != NULL;
+
+      cp = buf;
+      /* Ignore leading white space.  */
+      while (isspace ((unsigned char) cp[0]))
+	++cp;
+
+      /* A leading '#' signals a comment line.  */
+      if (cp[0] != '\0' && cp[0] != '#')
+	{
+	  alias = cp++;
+	  while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+	    ++cp;
+	  /* Terminate alias name.  */
+	  if (cp[0] != '\0')
+	    *cp++ = '\0';
+
+	  /* Now look for the beginning of the value.  */
+	  while (isspace ((unsigned char) cp[0]))
+	    ++cp;
+
+	  if (cp[0] != '\0')
+	    {
+	      value = cp++;
+	      while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+		++cp;
+	      /* Terminate value.  */
+	      if (cp[0] == '\n')
+		{
+		  /* This has to be done to make the following test
+		     for the end of line possible.  We are looking for
+		     the terminating '\n' which do not overwrite here.  */
+		  *cp++ = '\0';
+		  *cp = '\n';
+		}
+	      else if (cp[0] != '\0')
+		*cp++ = '\0';
+
+#ifdef IN_LIBGLOCALE
+	      /* glibc's locale.alias contains entries for ja_JP and ko_KR
+		 that make it impossible to use a Japanese or Korean UTF-8
+		 locale under the name "ja_JP" or "ko_KR".  Ignore these
+		 entries.  */
+	      if (strchr (alias, '_') == NULL)
+#endif
+		{
+		  size_t alias_len;
+		  size_t value_len;
+
+		  if (nmap >= maxmap)
+		    if (__builtin_expect (extend_alias_table (), 0))
+		      goto out;
+
+		  alias_len = strlen (alias) + 1;
+		  value_len = strlen (value) + 1;
+
+		  if (string_space_act + alias_len + value_len > string_space_max)
+		    {
+		      /* Increase size of memory pool.  */
+		      size_t new_size = (string_space_max
+					 + (alias_len + value_len > 1024
+					    ? alias_len + value_len : 1024));
+		      char *new_pool = (char *) realloc (string_space, new_size);
+		      if (new_pool == NULL)
+			goto out;
+
+		      if (__builtin_expect (string_space != new_pool, 0))
+			{
+			  size_t i;
+
+			  for (i = 0; i < nmap; i++)
+			    {
+			      map[i].alias += new_pool - string_space;
+			      map[i].value += new_pool - string_space;
+			    }
+			}
+
+		      string_space = new_pool;
+		      string_space_max = new_size;
+		    }
+
+		  map[nmap].alias =
+		    (const char *) memcpy (&string_space[string_space_act],
+					   alias, alias_len);
+		  string_space_act += alias_len;
+
+		  map[nmap].value =
+		    (const char *) memcpy (&string_space[string_space_act],
+					   value, value_len);
+		  string_space_act += value_len;
+
+		  ++nmap;
+		  ++added;
+		}
+	    }
+	}
+
+      /* Possibly not the whole line fits into the buffer.  Ignore
+	 the rest of the line.  */
+      if (! complete_line)
+	do
+	  if (FGETS (buf, sizeof buf, fp) == NULL)
+	    /* Make sure the inner loop will be left.  The outer loop
+	       will exit at the `feof' test.  */
+	    break;
+	while (strchr (buf, '\n') == NULL);
+    }
+
+ out:
+  /* Should we test for ferror()?  I think we have to silently ignore
+     errors.  --drepper  */
+  fclose (fp);
+
+  if (added > 0)
+    qsort (map, nmap, sizeof (struct alias_map),
+	   (int (*) (const void *, const void *)) alias_compare);
+
+  return added;
+}
+
+
+static int
+extend_alias_table ()
+{
+  size_t new_size;
+  struct alias_map *new_map;
+
+  new_size = maxmap == 0 ? 100 : 2 * maxmap;
+  new_map = (struct alias_map *) realloc (map, (new_size
+						* sizeof (struct alias_map)));
+  if (new_map == NULL)
+    /* Simply don't extend: we don't have any more core.  */
+    return -1;
+
+  map = new_map;
+  maxmap = new_size;
+  return 0;
+}
+
+
+static int
+alias_compare (const struct alias_map *map1, const struct alias_map *map2)
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+  return strcasecmp (map1->alias, map2->alias);
+#else
+  const unsigned char *p1 = (const unsigned char *) map1->alias;
+  const unsigned char *p2 = (const unsigned char *) map2->alias;
+  unsigned char c1, c2;
+
+  if (p1 == p2)
+    return 0;
+
+  do
+    {
+      /* I know this seems to be odd but the tolower() function in
+	 some systems libc cannot handle nonalpha characters.  */
+      c1 = isupper (*p1) ? tolower (*p1) : *p1;
+      c2 = isupper (*p2) ? tolower (*p2) : *p2;
+      if (c1 == '\0')
+	break;
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+#endif
+}

Added: tuxmath/trunk/intl/localename.c
===================================================================
--- tuxmath/trunk/intl/localename.c	                        (rev 0)
+++ tuxmath/trunk/intl/localename.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1507 @@
+/* Determine name of the currently selected locale.
+   Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Ulrich Drepper <drepper at gnu.org>, 1995.  */
+/* Win32 code written by Tor Lillqvist <tml at iki.fi>.  */
+/* MacOS X code written by Bruno Haible <bruno at clisp.org>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#ifdef IN_LIBINTL
+# include "gettextP.h"
+#else
+# include "localename.h"
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <string.h>
+# include <CoreFoundation/CFString.h>
+# if HAVE_CFLOCALECOPYCURRENT
+#  include <CoreFoundation/CFLocale.h>
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE
+#  include <CoreFoundation/CFPreferences.h>
+# endif
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+   0x01 LANG_ARABIC
+   0x02 LANG_BULGARIAN
+   0x03 LANG_CATALAN
+   0x04 LANG_CHINESE
+   0x05 LANG_CZECH
+   0x06 LANG_DANISH
+   0x07 LANG_GERMAN
+   0x08 LANG_GREEK
+   0x09 LANG_ENGLISH
+   0x0a LANG_SPANISH
+   0x0b LANG_FINNISH
+   0x0c LANG_FRENCH
+   0x0d LANG_HEBREW
+   0x0e LANG_HUNGARIAN
+   0x0f LANG_ICELANDIC
+   0x10 LANG_ITALIAN
+   0x11 LANG_JAPANESE
+   0x12 LANG_KOREAN
+   0x13 LANG_DUTCH
+   0x14 LANG_NORWEGIAN
+   0x15 LANG_POLISH
+   0x16 LANG_PORTUGUESE
+   0x17 LANG_RHAETO_ROMANCE
+   0x18 LANG_ROMANIAN
+   0x19 LANG_RUSSIAN
+   0x1a LANG_CROATIAN == LANG_SERBIAN
+   0x1b LANG_SLOVAK
+   0x1c LANG_ALBANIAN
+   0x1d LANG_SWEDISH
+   0x1e LANG_THAI
+   0x1f LANG_TURKISH
+   0x20 LANG_URDU
+   0x21 LANG_INDONESIAN
+   0x22 LANG_UKRAINIAN
+   0x23 LANG_BELARUSIAN
+   0x24 LANG_SLOVENIAN
+   0x25 LANG_ESTONIAN
+   0x26 LANG_LATVIAN
+   0x27 LANG_LITHUANIAN
+   0x28 LANG_TAJIK
+   0x29 LANG_FARSI
+   0x2a LANG_VIETNAMESE
+   0x2b LANG_ARMENIAN
+   0x2c LANG_AZERI
+   0x2d LANG_BASQUE
+   0x2e LANG_SORBIAN
+   0x2f LANG_MACEDONIAN
+   0x30 LANG_SUTU
+   0x31 LANG_TSONGA
+   0x32 LANG_TSWANA
+   0x33 LANG_VENDA
+   0x34 LANG_XHOSA
+   0x35 LANG_ZULU
+   0x36 LANG_AFRIKAANS
+   0x37 LANG_GEORGIAN
+   0x38 LANG_FAEROESE
+   0x39 LANG_HINDI
+   0x3a LANG_MALTESE
+   0x3b LANG_SAAMI
+   0x3c LANG_GAELIC
+   0x3d LANG_YIDDISH
+   0x3e LANG_MALAY
+   0x3f LANG_KAZAK
+   0x40 LANG_KYRGYZ
+   0x41 LANG_SWAHILI
+   0x42 LANG_TURKMEN
+   0x43 LANG_UZBEK
+   0x44 LANG_TATAR
+   0x45 LANG_BENGALI
+   0x46 LANG_PUNJABI
+   0x47 LANG_GUJARATI
+   0x48 LANG_ORIYA
+   0x49 LANG_TAMIL
+   0x4a LANG_TELUGU
+   0x4b LANG_KANNADA
+   0x4c LANG_MALAYALAM
+   0x4d LANG_ASSAMESE
+   0x4e LANG_MARATHI
+   0x4f LANG_SANSKRIT
+   0x50 LANG_MONGOLIAN
+   0x51 LANG_TIBETAN
+   0x52 LANG_WELSH
+   0x53 LANG_CAMBODIAN
+   0x54 LANG_LAO
+   0x55 LANG_BURMESE
+   0x56 LANG_GALICIAN
+   0x57 LANG_KONKANI
+   0x58 LANG_MANIPURI
+   0x59 LANG_SINDHI
+   0x5a LANG_SYRIAC
+   0x5b LANG_SINHALESE
+   0x5c LANG_CHEROKEE
+   0x5d LANG_INUKTITUT
+   0x5e LANG_AMHARIC
+   0x5f LANG_TAMAZIGHT
+   0x60 LANG_KASHMIRI
+   0x61 LANG_NEPALI
+   0x62 LANG_FRISIAN
+   0x63 LANG_PASHTO
+   0x64 LANG_TAGALOG
+   0x65 LANG_DIVEHI
+   0x66 LANG_EDO
+   0x67 LANG_FULFULDE
+   0x68 LANG_HAUSA
+   0x69 LANG_IBIBIO
+   0x6a LANG_YORUBA
+   0x70 LANG_IGBO
+   0x71 LANG_KANURI
+   0x72 LANG_OROMO
+   0x73 LANG_TIGRINYA
+   0x74 LANG_GUARANI
+   0x75 LANG_HAWAIIAN
+   0x76 LANG_LATIN
+   0x77 LANG_SOMALI
+   0x78 LANG_YI
+   0x79 LANG_PAPIAMENTU
+*/
+/* Mingw headers don't have latest language and sublanguage codes.  */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_RHAETO_ROMANCE
+# define LANG_RHAETO_ROMANCE 0x17
+# endif
+# ifndef LANG_SAAMI
+# define LANG_SAAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x01
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x02
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x01
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x02
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_SINDHI_AFGHANISTAN
+# define SUBLANG_SINDHI_AFGHANISTAN 0x02
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ALGERIA_LATIN
+# define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02
+# endif
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x01
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x02
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+#endif
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+/* MacOS X 10.2 or newer */
+
+/* Canonicalize a MacOS X locale name to a Unix locale name.
+   NAME is a sufficiently large buffer.
+   On input, it contains the MacOS X locale name.
+   On output, it contains the Unix locale name.  */
+#  if !defined IN_LIBINTL
+static
+#  endif
+void
+gl_locale_name_canonicalize (char *name)
+{
+  /* This conversion is based on a posting by
+     Deborah GoldSmith <goldsmit at apple.com> on 2005-03-08,
+     http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */
+
+  /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and
+     ISO 3166) names.  Prior to MacOS X 10.3, there is no API for doing this.
+     Therefore we do it ourselves, using a table based on the results of the
+     MacOS X 10.3.8 function
+     CFLocaleCreateCanonicalLocaleIdentifierFromString().  */
+  typedef struct { const char legacy[21+1]; const char unixy[5+1]; }
+	  legacy_entry;
+  static const legacy_entry legacy_table[] = {
+    { "Afrikaans",             "af" },
+    { "Albanian",              "sq" },
+    { "Amharic",               "am" },
+    { "Arabic",                "ar" },
+    { "Armenian",              "hy" },
+    { "Assamese",              "as" },
+    { "Aymara",                "ay" },
+    { "Azerbaijani",           "az" },
+    { "Basque",                "eu" },
+    { "Belarusian",            "be" },
+    { "Belorussian",           "be" },
+    { "Bengali",               "bn" },
+    { "Brazilian Portugese",   "pt_BR" },
+    { "Brazilian Portuguese",  "pt_BR" },
+    { "Breton",                "br" },
+    { "Bulgarian",             "bg" },
+    { "Burmese",               "my" },
+    { "Byelorussian",          "be" },
+    { "Catalan",               "ca" },
+    { "Chewa",                 "ny" },
+    { "Chichewa",              "ny" },
+    { "Chinese",               "zh" },
+    { "Chinese, Simplified",   "zh_CN" },
+    { "Chinese, Traditional",  "zh_TW" },
+    { "Chinese, Tradtional",   "zh_TW" },
+    { "Croatian",              "hr" },
+    { "Czech",                 "cs" },
+    { "Danish",                "da" },
+    { "Dutch",                 "nl" },
+    { "Dzongkha",              "dz" },
+    { "English",               "en" },
+    { "Esperanto",             "eo" },
+    { "Estonian",              "et" },
+    { "Faroese",               "fo" },
+    { "Farsi",                 "fa" },
+    { "Finnish",               "fi" },
+    { "Flemish",               "nl_BE" },
+    { "French",                "fr" },
+    { "Galician",              "gl" },
+    { "Gallegan",              "gl" },
+    { "Georgian",              "ka" },
+    { "German",                "de" },
+    { "Greek",                 "el" },
+    { "Greenlandic",           "kl" },
+    { "Guarani",               "gn" },
+    { "Gujarati",              "gu" },
+    { "Hawaiian",              "haw" }, /* Yes, "haw", not "cpe".  */
+    { "Hebrew",                "he" },
+    { "Hindi",                 "hi" },
+    { "Hungarian",             "hu" },
+    { "Icelandic",             "is" },
+    { "Indonesian",            "id" },
+    { "Inuktitut",             "iu" },
+    { "Irish",                 "ga" },
+    { "Italian",               "it" },
+    { "Japanese",              "ja" },
+    { "Javanese",              "jv" },
+    { "Kalaallisut",           "kl" },
+    { "Kannada",               "kn" },
+    { "Kashmiri",              "ks" },
+    { "Kazakh",                "kk" },
+    { "Khmer",                 "km" },
+    { "Kinyarwanda",           "rw" },
+    { "Kirghiz",               "ky" },
+    { "Korean",                "ko" },
+    { "Kurdish",               "ku" },
+    { "Latin",                 "la" },
+    { "Latvian",               "lv" },
+    { "Lithuanian",            "lt" },
+    { "Macedonian",            "mk" },
+    { "Malagasy",              "mg" },
+    { "Malay",                 "ms" },
+    { "Malayalam",             "ml" },
+    { "Maltese",               "mt" },
+    { "Manx",                  "gv" },
+    { "Marathi",               "mr" },
+    { "Moldavian",             "mo" },
+    { "Mongolian",             "mn" },
+    { "Nepali",                "ne" },
+    { "Norwegian",             "nb" }, /* Yes, "nb", not the obsolete "no".  */
+    { "Nyanja",                "ny" },
+    { "Nynorsk",               "nn" },
+    { "Oriya",                 "or" },
+    { "Oromo",                 "om" },
+    { "Panjabi",               "pa" },
+    { "Pashto",                "ps" },
+    { "Persian",               "fa" },
+    { "Polish",                "pl" },
+    { "Portuguese",            "pt" },
+    { "Portuguese, Brazilian", "pt_BR" },
+    { "Punjabi",               "pa" },
+    { "Pushto",                "ps" },
+    { "Quechua",               "qu" },
+    { "Romanian",              "ro" },
+    { "Ruanda",                "rw" },
+    { "Rundi",                 "rn" },
+    { "Russian",               "ru" },
+    { "Sami",                  "se_NO" }, /* Not just "se".  */
+    { "Sanskrit",              "sa" },
+    { "Scottish",              "gd" },
+    { "Serbian",               "sr" },
+    { "Simplified Chinese",    "zh_CN" },
+    { "Sindhi",                "sd" },
+    { "Sinhalese",             "si" },
+    { "Slovak",                "sk" },
+    { "Slovenian",             "sl" },
+    { "Somali",                "so" },
+    { "Spanish",               "es" },
+    { "Sundanese",             "su" },
+    { "Swahili",               "sw" },
+    { "Swedish",               "sv" },
+    { "Tagalog",               "tl" },
+    { "Tajik",                 "tg" },
+    { "Tajiki",                "tg" },
+    { "Tamil",                 "ta" },
+    { "Tatar",                 "tt" },
+    { "Telugu",                "te" },
+    { "Thai",                  "th" },
+    { "Tibetan",               "bo" },
+    { "Tigrinya",              "ti" },
+    { "Tongan",                "to" },
+    { "Traditional Chinese",   "zh_TW" },
+    { "Turkish",               "tr" },
+    { "Turkmen",               "tk" },
+    { "Uighur",                "ug" },
+    { "Ukrainian",             "uk" },
+    { "Urdu",                  "ur" },
+    { "Uzbek",                 "uz" },
+    { "Vietnamese",            "vi" },
+    { "Welsh",                 "cy" },
+    { "Yiddish",               "yi" }
+  };
+
+  /* Convert new-style locale names with language tags (ISO 639 and ISO 15924)
+     to Unix (ISO 639 and ISO 3166) names.  */
+  typedef struct { const char langtag[7+1]; const char unixy[12+1]; }
+	  langtag_entry;
+  static const langtag_entry langtag_table[] = {
+    /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".
+       The default script for az on Unix is Latin.  */
+    { "az-Latn", "az" },
+    /* MacOS X has "ga-dots".  Does not yet exist on Unix.  */
+    { "ga-dots", "ga" },
+    /* MacOS X has "kk-Cyrl".  Does not yet exist on Unix.  */
+    /* MacOS X has "mn-Cyrl", "mn-Mong".
+       The default script for mn on Unix is Cyrillic.  */
+    { "mn-Cyrl", "mn" },
+    /* MacOS X has "ms-Arab", "ms-Latn".
+       The default script for ms on Unix is Latin.  */
+    { "ms-Latn", "ms" },
+    /* MacOS X has "tg-Cyrl".
+       The default script for tg on Unix is Cyrillic.  */
+    { "tg-Cyrl", "tg" },
+    /* MacOS X has "tk-Cyrl".  Does not yet exist on Unix.  */
+    /* MacOS X has "tt-Cyrl".
+       The default script for tt on Unix is Cyrillic.  */
+    { "tt-Cyrl", "tt" },
+    /* MacOS X has "zh-Hans", "zh-Hant".
+       Country codes are used to distinguish these on Unix.  */
+    { "zh-Hans", "zh_CN" },
+    { "zh-Hant", "zh_TW" }
+  };
+
+  /* Convert script names (ISO 15924) to Unix conventions.
+     See http://www.unicode.org/iso15924/iso15924-codes.html  */
+  typedef struct { const char script[4+1]; const char unixy[9+1]; }
+	  script_entry;
+  static const script_entry script_table[] = {
+    { "Arab", "arabic" },
+    { "Cyrl", "cyrillic" },
+    { "Mong", "mongolian" }
+  };
+
+  /* Step 1: Convert using legacy_table.  */
+  if (name[0] >= 'A' && name[0] <= 'Z')
+    {
+      unsigned int i1, i2;
+      i1 = 0;
+      i2 = sizeof (legacy_table) / sizeof (legacy_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if name occurs in legacy_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const legacy_entry *p = &legacy_table[i];
+	  if (strcmp (name, p->legacy) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name, legacy_table[i1].legacy) == 0)
+	{
+	  strcpy (name, legacy_table[i1].unixy);
+	  return;
+	}
+    }
+
+  /* Step 2: Convert using langtag_table and script_table.  */
+  if (strlen (name) == 7 && name[2] == '-')
+    {
+      unsigned int i1, i2;
+      i1 = 0;
+      i2 = sizeof (langtag_table) / sizeof (langtag_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if name occurs in langtag_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const langtag_entry *p = &langtag_table[i];
+	  if (strcmp (name, p->langtag) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name, langtag_table[i1].langtag) == 0)
+	{
+	  strcpy (name, langtag_table[i1].unixy);
+	  return;
+	}
+
+      i1 = 0;
+      i2 = sizeof (script_table) / sizeof (script_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if (name + 3) occurs in script_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const script_entry *p = &script_table[i];
+	  if (strcmp (name + 3, p->script) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name + 3, script_table[i1].script) == 0)
+	{
+	  name[2] = '@';
+	  strcpy (name + 3, script_table[i1].unixy);
+	  return;
+	}
+    }
+
+  /* Step 3: Convert new-style dash to Unix underscore. */
+  {
+    char *p;
+    for (p = name; *p != '\0'; p++)
+      if (*p == '-')
+	*p = '_';
+  }
+}
+
+#endif
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+   "Directs 'setlocale()' to query 'category' and return the current
+    setting of 'local'."
+   However it does not specify the exact format.  Neither do SUSV2 and
+   ISO C 99.  So we can use this feature only on selected systems (e.g.
+   those using GNU C Library).  */
+#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+     language[_territory][.codeset][@modifier]
+   The codeset part in the result is not reliable; the locale_charset()
+   should be used for codeset information instead.
+   The result must not be freed; it is statically allocated.  */
+
+const char *
+gl_locale_name_posix (int category, const char *categoryname)
+{
+  /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+     On some systems this can be done by the 'setlocale' function itself.  */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+  return setlocale (category, NULL);
+#else
+  const char *retval;
+
+  /* Setting of LC_ALL overrides all other.  */
+  retval = getenv ("LC_ALL");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  /* Next comes the name of the desired category.  */
+  retval = getenv (categoryname);
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  /* Last possibility is the LANG environment variable.  */
+  retval = getenv ("LANG");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  return NULL;
+#endif
+}
+
+const char *
+gl_locale_name_default (void)
+{
+  /* POSIX:2001 says:
+     "All implementations shall define a locale as the default locale, to be
+      invoked when no environment variables are set, or set to the empty
+      string.  This default locale can be the POSIX locale or any other
+      implementation-defined locale.  Some implementations may provide
+      facilities for local installation administrators to set the default
+      locale, customizing it for each location.  POSIX:2001 does not require
+      such a facility.  */
+
+#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32_NATIVE))
+
+  /* The system does not have a way of setting the locale, other than the
+     POSIX specified environment variables.  We use C as default locale.  */
+  return "C";
+
+#else
+
+  /* Return an XPG style locale name language[_territory][@modifier].
+     Don't even bother determining the codeset; it's not useful in this
+     context, because message catalogs are not specific to a single
+     codeset.  */
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+  /* MacOS X 10.2 or newer */
+  {
+    /* Cache the locale name, since CoreFoundation calls are expensive.  */
+    static const char *cached_localename;
+
+    if (cached_localename == NULL)
+      {
+	char namebuf[256];
+#  if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */
+	CFLocaleRef locale = CFLocaleCopyCurrent ();
+	CFStringRef name = CFLocaleGetIdentifier (locale);
+
+	if (CFStringGetCString (name, namebuf, sizeof(namebuf),
+				kCFStringEncodingASCII))
+	  {
+	    gl_locale_name_canonicalize (namebuf);
+	    cached_localename = strdup (namebuf);
+	  }
+	CFRelease (locale);
+#  elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+	CFTypeRef value =
+	  CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),
+				     kCFPreferencesCurrentApplication);
+	if (value != NULL
+	    && CFGetTypeID (value) == CFStringGetTypeID ()
+	    && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf),
+				   kCFStringEncodingASCII))
+	  {
+	    gl_locale_name_canonicalize (namebuf);
+	    cached_localename = strdup (namebuf);
+	  }
+#  endif
+	if (cached_localename == NULL)
+	  cached_localename = "C";
+      }
+    return cached_localename;
+  }
+
+# endif
+
+# if defined(WIN32_NATIVE) /* WIN32, not Cygwin */
+  {
+    LCID lcid;
+    LANGID langid;
+    int primary, sub;
+
+    /* Use native Win32 API locale ID.  */
+    lcid = GetThreadLocale ();
+
+    /* Strip off the sorting rules, keep only the language part.  */
+    langid = LANGIDFROMLCID (lcid);
+
+    /* Split into language and territory part.  */
+    primary = PRIMARYLANGID (langid);
+    sub = SUBLANGID (langid);
+
+    /* Dispatch on language.
+       See also http://www.unicode.org/unicode/onlinedat/languages.html .
+       For details about languages, see http://www.ethnologue.com/ .  */
+    switch (primary)
+      {
+      case LANG_AFRIKAANS: return "af_ZA";
+      case LANG_ALBANIAN: return "sq_AL";
+      case LANG_AMHARIC: return "am_ET";
+      case LANG_ARABIC:
+	switch (sub)
+	  {
+	  case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+	  case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+	  case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+	  case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+	  case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+	  case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+	  case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+	  case SUBLANG_ARABIC_OMAN: return "ar_OM";
+	  case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+	  case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+	  case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+	  case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+	  case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+	  case SUBLANG_ARABIC_UAE: return "ar_AE";
+	  case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+	  case SUBLANG_ARABIC_QATAR: return "ar_QA";
+	  }
+	return "ar";
+      case LANG_ARMENIAN: return "hy_AM";
+      case LANG_ASSAMESE: return "as_IN";
+      case LANG_AZERI:
+	switch (sub)
+	  {
+	  /* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
+	  case SUBLANG_AZERI_LATIN: return "az_AZ at latin";
+	  case SUBLANG_AZERI_CYRILLIC: return "az_AZ at cyrillic";
+	  }
+	return "az";
+      case LANG_BASQUE:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "eu_ES";
+	  }
+	return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
+      case LANG_BELARUSIAN: return "be_BY";
+      case LANG_BENGALI:
+	switch (sub)
+	  {
+	  case SUBLANG_BENGALI_INDIA: return "bn_IN";
+	  case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+	  }
+	return "bn";
+      case LANG_BULGARIAN: return "bg_BG";
+      case LANG_BURMESE: return "my_MM";
+      case LANG_CAMBODIAN: return "km_KH";
+      case LANG_CATALAN: return "ca_ES";
+      case LANG_CHEROKEE: return "chr_US";
+      case LANG_CHINESE:
+	switch (sub)
+	  {
+	  case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+	  case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+	  case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+	  case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+	  case SUBLANG_CHINESE_MACAU: return "zh_MO";
+	  }
+	return "zh";
+      case LANG_CROATIAN:       /* LANG_CROATIAN == LANG_SERBIAN
+				 * What used to be called Serbo-Croatian
+				 * should really now be two separate
+				 * languages because of political reasons.
+				 * (Says tml, who knows nothing about Serbian
+				 * or Croatian.)
+				 * (I can feel those flames coming already.)
+				 */
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "hr_HR";
+	  case SUBLANG_SERBIAN_LATIN: return "sr_CS";
+	  case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS at cyrillic";
+	  }
+	return "hr";
+      case LANG_CZECH: return "cs_CZ";
+      case LANG_DANISH: return "da_DK";
+      case LANG_DIVEHI: return "dv_MV";
+      case LANG_DUTCH:
+	switch (sub)
+	  {
+	  case SUBLANG_DUTCH: return "nl_NL";
+	  case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+	  }
+	return "nl";
+      case LANG_EDO: return "bin_NG";
+      case LANG_ENGLISH:
+	switch (sub)
+	  {
+	  /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+	   * English was the language spoken in England.
+	   * Oh well.
+	   */
+	  case SUBLANG_ENGLISH_US: return "en_US";
+	  case SUBLANG_ENGLISH_UK: return "en_GB";
+	  case SUBLANG_ENGLISH_AUS: return "en_AU";
+	  case SUBLANG_ENGLISH_CAN: return "en_CA";
+	  case SUBLANG_ENGLISH_NZ: return "en_NZ";
+	  case SUBLANG_ENGLISH_EIRE: return "en_IE";
+	  case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+	  case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+	  case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+	  case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+	  case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+	  case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+	  case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+	  case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+	  case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+	  case SUBLANG_ENGLISH_INDIA: return "en_IN";
+	  case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+	  case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+	  }
+	return "en";
+      case LANG_ESTONIAN: return "et_EE";
+      case LANG_FAEROESE: return "fo_FO";
+      case LANG_FARSI: return "fa_IR";
+      case LANG_FINNISH: return "fi_FI";
+      case LANG_FRENCH:
+	switch (sub)
+	  {
+	  case SUBLANG_FRENCH: return "fr_FR";
+	  case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+	  case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+	  case SUBLANG_FRENCH_SWISS: return "fr_CH";
+	  case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+	  case SUBLANG_FRENCH_MONACO: return "fr_MC";
+	  case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+	  case SUBLANG_FRENCH_REUNION: return "fr_RE";
+	  case SUBLANG_FRENCH_CONGO: return "fr_CG";
+	  case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+	  case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+	  case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+	  case SUBLANG_FRENCH_MALI: return "fr_ML";
+	  case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+	  case SUBLANG_FRENCH_HAITI: return "fr_HT";
+	  }
+	return "fr";
+      case LANG_FRISIAN: return "fy_NL";
+      case LANG_FULFULDE:
+	/* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin.  */
+	return "ff_NG";
+      case LANG_GAELIC:
+	switch (sub)
+	  {
+	  case 0x01: /* SCOTTISH */ return "gd_GB";
+	  case 0x02: /* IRISH */ return "ga_IE";
+	  }
+	return "C";
+      case LANG_GALICIAN: return "gl_ES";
+      case LANG_GEORGIAN: return "ka_GE";
+      case LANG_GERMAN:
+	switch (sub)
+	  {
+	  case SUBLANG_GERMAN: return "de_DE";
+	  case SUBLANG_GERMAN_SWISS: return "de_CH";
+	  case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+	  case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+	  case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+	  }
+	return "de";
+      case LANG_GREEK: return "el_GR";
+      case LANG_GUARANI: return "gn_PY";
+      case LANG_GUJARATI: return "gu_IN";
+      case LANG_HAUSA: return "ha_NG";
+      case LANG_HAWAIIAN:
+	/* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+	   or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
+	return "cpe_US";
+      case LANG_HEBREW: return "he_IL";
+      case LANG_HINDI: return "hi_IN";
+      case LANG_HUNGARIAN: return "hu_HU";
+      case LANG_IBIBIO: return "nic_NG";
+      case LANG_ICELANDIC: return "is_IS";
+      case LANG_IGBO: return "ig_NG";
+      case LANG_INDONESIAN: return "id_ID";
+      case LANG_INUKTITUT: return "iu_CA";
+      case LANG_ITALIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_ITALIAN: return "it_IT";
+	  case SUBLANG_ITALIAN_SWISS: return "it_CH";
+	  }
+	return "it";
+      case LANG_JAPANESE: return "ja_JP";
+      case LANG_KANNADA: return "kn_IN";
+      case LANG_KANURI: return "kr_NG";
+      case LANG_KASHMIRI:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ks_PK";
+	  case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+	  }
+	return "ks";
+      case LANG_KAZAK: return "kk_KZ";
+      case LANG_KONKANI:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "kok_IN";
+      case LANG_KOREAN: return "ko_KR";
+      case LANG_KYRGYZ: return "ky_KG";
+      case LANG_LAO: return "lo_LA";
+      case LANG_LATIN: return "la_VA";
+      case LANG_LATVIAN: return "lv_LV";
+      case LANG_LITHUANIAN: return "lt_LT";
+      case LANG_MACEDONIAN: return "mk_MK";
+      case LANG_MALAY:
+	switch (sub)
+	  {
+	  case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+	  case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+	  }
+	return "ms";
+      case LANG_MALAYALAM: return "ml_IN";
+      case LANG_MALTESE: return "mt_MT";
+      case LANG_MANIPURI:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "mni_IN";
+      case LANG_MARATHI: return "mr_IN";
+      case LANG_MONGOLIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "mn_MN";
+	  }
+	return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
+      case LANG_NEPALI:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ne_NP";
+	  case SUBLANG_NEPALI_INDIA: return "ne_IN";
+	  }
+	return "ne";
+      case LANG_NORWEGIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";
+	  case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+	  }
+	return "no";
+      case LANG_ORIYA: return "or_IN";
+      case LANG_OROMO: return "om_ET";
+      case LANG_PAPIAMENTU: return "pap_AN";
+      case LANG_PASHTO:
+	return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
+      case LANG_POLISH: return "pl_PL";
+      case LANG_PORTUGUESE:
+	switch (sub)
+	  {
+	  case SUBLANG_PORTUGUESE: return "pt_PT";
+	  /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+	     Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+	  case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+	  }
+	return "pt";
+      case LANG_PUNJABI:
+	switch (sub)
+	  {
+	  case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+	  case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+	  }
+	return "pa";
+      case LANG_RHAETO_ROMANCE: return "rm_CH";
+      case LANG_ROMANIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+	  case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+	  }
+	return "ro";
+      case LANG_RUSSIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ru_RU";
+	  }
+	return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD".  */
+      case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
+      case LANG_SANSKRIT: return "sa_IN";
+      case LANG_SINDHI:
+	switch (sub)
+	  {
+	  case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+	  case SUBLANG_SINDHI_AFGHANISTAN: return "sd_AF";
+	  }
+	return "sd";
+      case LANG_SINHALESE: return "si_LK";
+      case LANG_SLOVAK: return "sk_SK";
+      case LANG_SLOVENIAN: return "sl_SI";
+      case LANG_SOMALI: return "so_SO";
+      case LANG_SORBIAN:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "wen_DE";
+      case LANG_SPANISH:
+	switch (sub)
+	  {
+	  case SUBLANG_SPANISH: return "es_ES";
+	  case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+	  case SUBLANG_SPANISH_MODERN:
+	    return "es_ES at modern";	/* not seen on Unix */
+	  case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+	  case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+	  case SUBLANG_SPANISH_PANAMA: return "es_PA";
+	  case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+	  case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+	  case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+	  case SUBLANG_SPANISH_PERU: return "es_PE";
+	  case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+	  case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+	  case SUBLANG_SPANISH_CHILE: return "es_CL";
+	  case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+	  case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+	  case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+	  case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+	  case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+	  case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+	  case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+	  }
+	return "es";
+      case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+      case LANG_SWAHILI: return "sw_KE";
+      case LANG_SWEDISH:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "sv_SE";
+	  case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+	  }
+	return "sv";
+      case LANG_SYRIAC: return "syr_TR"; /* An extinct language.  */
+      case LANG_TAGALOG: return "tl_PH";
+      case LANG_TAJIK: return "tg_TJ";
+      case LANG_TAMAZIGHT:
+	switch (sub)
+	  {
+	  /* FIXME: Adjust this when Tamazight locales appear on Unix.  */
+	  case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA at arabic";
+	  case SUBLANG_TAMAZIGHT_ALGERIA_LATIN: return "ber_DZ at latin";
+	  }
+	return "ber_MA";
+      case LANG_TAMIL:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ta_IN";
+	  }
+	return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
+      case LANG_TATAR: return "tt_RU";
+      case LANG_TELUGU: return "te_IN";
+      case LANG_THAI: return "th_TH";
+      case LANG_TIBETAN: return "bo_CN";
+      case LANG_TIGRINYA:
+	switch (sub)
+	  {
+	  case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+	  case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+	  }
+	return "ti";
+      case LANG_TSONGA: return "ts_ZA";
+      case LANG_TSWANA: return "tn_BW";
+      case LANG_TURKISH: return "tr_TR";
+      case LANG_TURKMEN: return "tk_TM";
+      case LANG_UKRAINIAN: return "uk_UA";
+      case LANG_URDU:
+	switch (sub)
+	  {
+	  case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+	  case SUBLANG_URDU_INDIA: return "ur_IN";
+	  }
+	return "ur";
+      case LANG_UZBEK:
+	switch (sub)
+	  {
+	  case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+	  case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ at cyrillic";
+	  }
+	return "uz";
+      case LANG_VENDA: return "ve_ZA";
+      case LANG_VIETNAMESE: return "vi_VN";
+      case LANG_WELSH: return "cy_GB";
+      case LANG_XHOSA: return "xh_ZA";
+      case LANG_YI: return "sit_CN";
+      case LANG_YIDDISH: return "yi_IL";
+      case LANG_YORUBA: return "yo_NG";
+      case LANG_ZULU: return "zu_ZA";
+      default: return "C";
+      }
+  }
+# endif
+#endif
+}
+
+const char *
+gl_locale_name (int category, const char *categoryname)
+{
+  const char *retval;
+
+  retval = gl_locale_name_posix (category, categoryname);
+  if (retval != NULL)
+    return retval;
+
+  return gl_locale_name_default ();
+}

Added: tuxmath/trunk/intl/localename.c.orig
===================================================================
--- tuxmath/trunk/intl/localename.c.orig	                        (rev 0)
+++ tuxmath/trunk/intl/localename.c.orig	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1499 @@
+/* Determine the current selected locale.
+   Copyright (C) 1995-1999, 2000-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Ulrich Drepper <drepper at gnu.org>, 1995.  */
+/* Win32 code written by Tor Lillqvist <tml at iki.fi>.  */
+/* MacOS X code written by Bruno Haible <bruno at clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+
+#if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+# include <string.h>
+# include <CoreFoundation/CFString.h>
+# if HAVE_CFLOCALECOPYCURRENT
+#  include <CoreFoundation/CFLocale.h>
+# elif HAVE_CFPREFERENCESCOPYAPPVALUE
+#  include <CoreFoundation/CFPreferences.h>
+# endif
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+   0x01 LANG_ARABIC
+   0x02 LANG_BULGARIAN
+   0x03 LANG_CATALAN
+   0x04 LANG_CHINESE
+   0x05 LANG_CZECH
+   0x06 LANG_DANISH
+   0x07 LANG_GERMAN
+   0x08 LANG_GREEK
+   0x09 LANG_ENGLISH
+   0x0a LANG_SPANISH
+   0x0b LANG_FINNISH
+   0x0c LANG_FRENCH
+   0x0d LANG_HEBREW
+   0x0e LANG_HUNGARIAN
+   0x0f LANG_ICELANDIC
+   0x10 LANG_ITALIAN
+   0x11 LANG_JAPANESE
+   0x12 LANG_KOREAN
+   0x13 LANG_DUTCH
+   0x14 LANG_NORWEGIAN
+   0x15 LANG_POLISH
+   0x16 LANG_PORTUGUESE
+   0x17 LANG_RHAETO_ROMANCE
+   0x18 LANG_ROMANIAN
+   0x19 LANG_RUSSIAN
+   0x1a LANG_CROATIAN == LANG_SERBIAN
+   0x1b LANG_SLOVAK
+   0x1c LANG_ALBANIAN
+   0x1d LANG_SWEDISH
+   0x1e LANG_THAI
+   0x1f LANG_TURKISH
+   0x20 LANG_URDU
+   0x21 LANG_INDONESIAN
+   0x22 LANG_UKRAINIAN
+   0x23 LANG_BELARUSIAN
+   0x24 LANG_SLOVENIAN
+   0x25 LANG_ESTONIAN
+   0x26 LANG_LATVIAN
+   0x27 LANG_LITHUANIAN
+   0x28 LANG_TAJIK
+   0x29 LANG_FARSI
+   0x2a LANG_VIETNAMESE
+   0x2b LANG_ARMENIAN
+   0x2c LANG_AZERI
+   0x2d LANG_BASQUE
+   0x2e LANG_SORBIAN
+   0x2f LANG_MACEDONIAN
+   0x30 LANG_SUTU
+   0x31 LANG_TSONGA
+   0x32 LANG_TSWANA
+   0x33 LANG_VENDA
+   0x34 LANG_XHOSA
+   0x35 LANG_ZULU
+   0x36 LANG_AFRIKAANS
+   0x37 LANG_GEORGIAN
+   0x38 LANG_FAEROESE
+   0x39 LANG_HINDI
+   0x3a LANG_MALTESE
+   0x3b LANG_SAAMI
+   0x3c LANG_GAELIC
+   0x3d LANG_YIDDISH
+   0x3e LANG_MALAY
+   0x3f LANG_KAZAK
+   0x40 LANG_KYRGYZ
+   0x41 LANG_SWAHILI
+   0x42 LANG_TURKMEN
+   0x43 LANG_UZBEK
+   0x44 LANG_TATAR
+   0x45 LANG_BENGALI
+   0x46 LANG_PUNJABI
+   0x47 LANG_GUJARATI
+   0x48 LANG_ORIYA
+   0x49 LANG_TAMIL
+   0x4a LANG_TELUGU
+   0x4b LANG_KANNADA
+   0x4c LANG_MALAYALAM
+   0x4d LANG_ASSAMESE
+   0x4e LANG_MARATHI
+   0x4f LANG_SANSKRIT
+   0x50 LANG_MONGOLIAN
+   0x51 LANG_TIBETAN
+   0x52 LANG_WELSH
+   0x53 LANG_CAMBODIAN
+   0x54 LANG_LAO
+   0x55 LANG_BURMESE
+   0x56 LANG_GALICIAN
+   0x57 LANG_KONKANI
+   0x58 LANG_MANIPURI
+   0x59 LANG_SINDHI
+   0x5a LANG_SYRIAC
+   0x5b LANG_SINHALESE
+   0x5c LANG_CHEROKEE
+   0x5d LANG_INUKTITUT
+   0x5e LANG_AMHARIC
+   0x5f LANG_TAMAZIGHT
+   0x60 LANG_KASHMIRI
+   0x61 LANG_NEPALI
+   0x62 LANG_FRISIAN
+   0x63 LANG_PASHTO
+   0x64 LANG_TAGALOG
+   0x65 LANG_DIVEHI
+   0x66 LANG_EDO
+   0x67 LANG_FULFULDE
+   0x68 LANG_HAUSA
+   0x69 LANG_IBIBIO
+   0x6a LANG_YORUBA
+   0x70 LANG_IGBO
+   0x71 LANG_KANURI
+   0x72 LANG_OROMO
+   0x73 LANG_TIGRINYA
+   0x74 LANG_GUARANI
+   0x75 LANG_HAWAIIAN
+   0x76 LANG_LATIN
+   0x77 LANG_SOMALI
+   0x78 LANG_YI
+   0x79 LANG_PAPIAMENTU
+*/
+/* Mingw headers don't have latest language and sublanguage codes.  */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_RHAETO_ROMANCE
+# define LANG_RHAETO_ROMANCE 0x17
+# endif
+# ifndef LANG_SAAMI
+# define LANG_SAAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x00
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x01
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x00
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x00
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x01
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_INDIA
+# define SUBLANG_SINDHI_INDIA 0x00
+# endif
+# ifndef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_LATIN
+# define SUBLANG_TAMAZIGHT_LATIN 0x02
+# endif
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x00
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x01
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+#endif
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+/* MacOS X 10.2 or newer */
+
+/* Canonicalize a MacOS X locale name to a Unix locale name.
+   NAME is a sufficiently large buffer.
+   On input, it contains the MacOS X locale name.
+   On output, it contains the Unix locale name.  */
+void
+_nl_locale_name_canonicalize (char *name)
+{
+  /* This conversion is based on a posting by
+     Deborah GoldSmith <goldsmit at apple.com> on 2005-03-08,
+     http://lists.apple.com/archives/carbon-dev/2005/Mar/msg00293.html */
+
+  /* Convert legacy (NeXTstep inherited) English names to Unix (ISO 639 and
+     ISO 3166) names.  Prior to MacOS X 10.3, there is no API for doing this.
+     Therefore we do it ourselves, using a table based on the results of the
+     MacOS X 10.3.8 function
+     CFLocaleCreateCanonicalLocaleIdentifierFromString().  */
+  typedef struct { const char legacy[21+1]; const char unixy[5+1]; }
+	  legacy_entry;
+  static const legacy_entry legacy_table[] = {
+    { "Afrikaans",             "af" },
+    { "Albanian",              "sq" },
+    { "Amharic",               "am" },
+    { "Arabic",                "ar" },
+    { "Armenian",              "hy" },
+    { "Assamese",              "as" },
+    { "Aymara",                "ay" },
+    { "Azerbaijani",           "az" },
+    { "Basque",                "eu" },
+    { "Belarusian",            "be" },
+    { "Belorussian",           "be" },
+    { "Bengali",               "bn" },
+    { "Brazilian Portugese",   "pt_BR" },
+    { "Brazilian Portuguese",  "pt_BR" },
+    { "Breton",                "br" },
+    { "Bulgarian",             "bg" },
+    { "Burmese",               "my" },
+    { "Byelorussian",          "be" },
+    { "Catalan",               "ca" },
+    { "Chewa",                 "ny" },
+    { "Chichewa",              "ny" },
+    { "Chinese",               "zh" },
+    { "Chinese, Simplified",   "zh_CN" },
+    { "Chinese, Traditional",  "zh_TW" },
+    { "Chinese, Tradtional",   "zh_TW" },
+    { "Croatian",              "hr" },
+    { "Czech",                 "cs" },
+    { "Danish",                "da" },
+    { "Dutch",                 "nl" },
+    { "Dzongkha",              "dz" },
+    { "English",               "en" },
+    { "Esperanto",             "eo" },
+    { "Estonian",              "et" },
+    { "Faroese",               "fo" },
+    { "Farsi",                 "fa" },
+    { "Finnish",               "fi" },
+    { "Flemish",               "nl_BE" },
+    { "French",                "fr" },
+    { "Galician",              "gl" },
+    { "Gallegan",              "gl" },
+    { "Georgian",              "ka" },
+    { "German",                "de" },
+    { "Greek",                 "el" },
+    { "Greenlandic",           "kl" },
+    { "Guarani",               "gn" },
+    { "Gujarati",              "gu" },
+    { "Hawaiian",              "haw" }, /* Yes, "haw", not "cpe".  */
+    { "Hebrew",                "he" },
+    { "Hindi",                 "hi" },
+    { "Hungarian",             "hu" },
+    { "Icelandic",             "is" },
+    { "Indonesian",            "id" },
+    { "Inuktitut",             "iu" },
+    { "Irish",                 "ga" },
+    { "Italian",               "it" },
+    { "Japanese",              "ja" },
+    { "Javanese",              "jv" },
+    { "Kalaallisut",           "kl" },
+    { "Kannada",               "kn" },
+    { "Kashmiri",              "ks" },
+    { "Kazakh",                "kk" },
+    { "Khmer",                 "km" },
+    { "Kinyarwanda",           "rw" },
+    { "Kirghiz",               "ky" },
+    { "Korean",                "ko" },
+    { "Kurdish",               "ku" },
+    { "Latin",                 "la" },
+    { "Latvian",               "lv" },
+    { "Lithuanian",            "lt" },
+    { "Macedonian",            "mk" },
+    { "Malagasy",              "mg" },
+    { "Malay",                 "ms" },
+    { "Malayalam",             "ml" },
+    { "Maltese",               "mt" },
+    { "Manx",                  "gv" },
+    { "Marathi",               "mr" },
+    { "Moldavian",             "mo" },
+    { "Mongolian",             "mn" },
+    { "Nepali",                "ne" },
+    { "Norwegian",             "nb" }, /* Yes, "nb", not the obsolete "no".  */
+    { "Nyanja",                "ny" },
+    { "Nynorsk",               "nn" },
+    { "Oriya",                 "or" },
+    { "Oromo",                 "om" },
+    { "Panjabi",               "pa" },
+    { "Pashto",                "ps" },
+    { "Persian",               "fa" },
+    { "Polish",                "pl" },
+    { "Portuguese",            "pt" },
+    { "Portuguese, Brazilian", "pt_BR" },
+    { "Punjabi",               "pa" },
+    { "Pushto",                "ps" },
+    { "Quechua",               "qu" },
+    { "Romanian",              "ro" },
+    { "Ruanda",                "rw" },
+    { "Rundi",                 "rn" },
+    { "Russian",               "ru" },
+    { "Sami",                  "se_NO" }, /* Not just "se".  */
+    { "Sanskrit",              "sa" },
+    { "Scottish",              "gd" },
+    { "Serbian",               "sr" },
+    { "Simplified Chinese",    "zh_CN" },
+    { "Sindhi",                "sd" },
+    { "Sinhalese",             "si" },
+    { "Slovak",                "sk" },
+    { "Slovenian",             "sl" },
+    { "Somali",                "so" },
+    { "Spanish",               "es" },
+    { "Sundanese",             "su" },
+    { "Swahili",               "sw" },
+    { "Swedish",               "sv" },
+    { "Tagalog",               "tl" },
+    { "Tajik",                 "tg" },
+    { "Tajiki",                "tg" },
+    { "Tamil",                 "ta" },
+    { "Tatar",                 "tt" },
+    { "Telugu",                "te" },
+    { "Thai",                  "th" },
+    { "Tibetan",               "bo" },
+    { "Tigrinya",              "ti" },
+    { "Tongan",                "to" },
+    { "Traditional Chinese",   "zh_TW" },
+    { "Turkish",               "tr" },
+    { "Turkmen",               "tk" },
+    { "Uighur",                "ug" },
+    { "Ukrainian",             "uk" },
+    { "Urdu",                  "ur" },
+    { "Uzbek",                 "uz" },
+    { "Vietnamese",            "vi" },
+    { "Welsh",                 "cy" },
+    { "Yiddish",               "yi" }
+  };
+
+  /* Convert new-style locale names with language tags (ISO 639 and ISO 15924)
+     to Unix (ISO 639 and ISO 3166) names.  */
+  typedef struct { const char langtag[7+1]; const char unixy[12+1]; }
+	  langtag_entry;
+  static const langtag_entry langtag_table[] = {
+    /* MacOS X has "az-Arab", "az-Cyrl", "az-Latn".
+       The default script for az on Unix is Latin.  */
+    { "az-Latn", "az" },
+    /* MacOS X has "ga-dots".  Does not yet exist on Unix.  */
+    { "ga-dots", "ga" },
+    /* MacOS X has "kk-Cyrl".  Does not yet exist on Unix.  */
+    /* MacOS X has "mn-Cyrl", "mn-Mong".
+       The default script for mn on Unix is Cyrillic.  */
+    { "mn-Cyrl", "mn" },
+    /* MacOS X has "ms-Arab", "ms-Latn".
+       The default script for ms on Unix is Latin.  */
+    { "ms-Latn", "ms" },
+    /* MacOS X has "tg-Cyrl".
+       The default script for tg on Unix is Cyrillic.  */
+    { "tg-Cyrl", "tg" },
+    /* MacOS X has "tk-Cyrl".  Does not yet exist on Unix.  */
+    /* MacOS X has "tt-Cyrl".
+       The default script for tt on Unix is Cyrillic.  */
+    { "tt-Cyrl", "tt" },
+    /* MacOS X has "zh-Hans", "zh-Hant".
+       Country codes are used to distinguish these on Unix.  */
+    { "zh-Hans", "zh_CN" },
+    { "zh-Hant", "zh_TW" }
+  };
+
+  /* Convert script names (ISO 15924) to Unix conventions.
+     See http://www.unicode.org/iso15924/iso15924-codes.html  */
+  typedef struct { const char script[4+1]; const char unixy[9+1]; }
+	  script_entry;
+  static const script_entry script_table[] = {
+    { "Arab", "arabic" },
+    { "Cyrl", "cyrillic" },
+    { "Mong", "mongolian" }
+  };
+
+  /* Step 1: Convert using legacy_table.  */
+  if (name[0] >= 'A' && name[0] <= 'Z')
+    {
+      unsigned int i1, i2;
+      i1 = 0;
+      i2 = sizeof (legacy_table) / sizeof (legacy_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if name occurs in legacy_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const legacy_entry *p = &legacy_table[i];
+	  if (strcmp (name, p->legacy) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name, legacy_table[i1].legacy) == 0)
+	{
+	  strcpy (name, legacy_table[i1].unixy);
+	  return;
+	}
+    }
+
+  /* Step 2: Convert using langtag_table and script_table.  */
+  if (strlen (name) == 7 && name[2] == '-')
+    {
+      unsigned int i1, i2;
+      i1 = 0;
+      i2 = sizeof (langtag_table) / sizeof (langtag_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if name occurs in langtag_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const langtag_entry *p = &langtag_table[i];
+	  if (strcmp (name, p->langtag) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name, langtag_table[i1].langtag) == 0)
+	{
+	  strcpy (name, langtag_table[i1].unixy);
+	  return;
+	}
+
+      i1 = 0;
+      i2 = sizeof (script_table) / sizeof (script_entry);
+      while (i2 - i1 > 1)
+	{
+	  /* At this point we know that if (name + 3) occurs in script_table,
+	     its index must be >= i1 and < i2.  */
+	  unsigned int i = (i1 + i2) >> 1;
+	  const script_entry *p = &script_table[i];
+	  if (strcmp (name + 3, p->script) < 0)
+	    i2 = i;
+	  else
+	    i1 = i;
+	}
+      if (strcmp (name + 3, script_table[i1].script) == 0)
+	{
+	  name[2] = '@';
+	  strcpy (name + 3, script_table[i1].unixy);
+	  return;
+	}
+    }
+
+  /* Step 3: Convert new-style dash to Unix underscore. */
+  {
+    char *p;
+    for (p = name; *p != '\0'; p++)
+      if (*p == '-')
+	*p = '_';
+  }
+}
+
+#endif
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+   "Directs 'setlocale()' to query 'category' and return the current
+    setting of 'local'."
+   However it does not specify the exact format.  Neither do SUSV2 and
+   ISO C 99.  So we can use this feature only on selected systems (e.g.
+   those using GNU C Library).  */
+#if defined _LIBC || (defined __GLIBC__ && __GLIBC__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+     language[_territory][.codeset][@modifier]
+   The codeset part in the result is not reliable; the locale_charset()
+   should be used for codeset information instead.
+   The result must not be freed; it is statically allocated.  */
+
+const char *
+_nl_locale_name_posix (int category, const char *categoryname)
+{
+  /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+     On some systems this can be done by the 'setlocale' function itself.  */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+  return setlocale (category, NULL);
+#else
+  const char *retval;
+
+  /* Setting of LC_ALL overrides all other.  */
+  retval = getenv ("LC_ALL");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  /* Next comes the name of the desired category.  */
+  retval = getenv (categoryname);
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  /* Last possibility is the LANG environment variable.  */
+  retval = getenv ("LANG");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  return NULL;
+#endif
+}
+
+const char *
+_nl_locale_name_default (void)
+{
+  /* POSIX:2001 says:
+     "All implementations shall define a locale as the default locale, to be
+      invoked when no environment variables are set, or set to the empty
+      string.  This default locale can be the POSIX locale or any other
+      implementation-defined locale.  Some implementations may provide
+      facilities for local installation administrators to set the default
+      locale, customizing it for each location.  POSIX:2001 does not require
+      such a facility.  */
+
+#if !(HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE || defined(WIN32_NATIVE))
+
+  /* The system does not have a way of setting the locale, other than the
+     POSIX specified environment variables.  We use C as default locale.  */
+  return "C";
+
+#else
+
+  /* Return an XPG style locale name language[_territory][@modifier].
+     Don't even bother determining the codeset; it's not useful in this
+     context, because message catalogs are not specific to a single
+     codeset.  */
+
+# if HAVE_CFLOCALECOPYCURRENT || HAVE_CFPREFERENCESCOPYAPPVALUE
+  /* MacOS X 10.2 or newer */
+  {
+    /* Cache the locale name, since CoreFoundation calls are expensive.  */
+    static const char *cached_localename;
+
+    if (cached_localename == NULL)
+      {
+	char namebuf[256];
+#  if HAVE_CFLOCALECOPYCURRENT /* MacOS X 10.3 or newer */
+	CFLocaleRef locale = CFLocaleCopyCurrent ();
+	CFStringRef name = CFLocaleGetIdentifier (locale);
+
+	if (CFStringGetCString (name, namebuf, sizeof(namebuf),
+				kCFStringEncodingASCII))
+	  {
+	    _nl_locale_name_canonicalize (namebuf);
+	    cached_localename = strdup (namebuf);
+	  }
+	CFRelease (locale);
+#  elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.2 or newer */
+	CFTypeRef value =
+	  CFPreferencesCopyAppValue (CFSTR ("AppleLocale"),
+				     kCFPreferencesCurrentApplication);
+	if (value != NULL
+	    && CFGetTypeID (value) == CFStringGetTypeID ()
+	    && CFStringGetCString ((CFStringRef)value, namebuf, sizeof(namebuf),
+				   kCFStringEncodingASCII))
+	  {
+	    _nl_locale_name_canonicalize (namebuf);
+	    cached_localename = strdup (namebuf);
+	  }
+#  endif
+	if (cached_localename == NULL)
+	  cached_localename = "C";
+      }
+    return cached_localename;
+  }
+
+# endif
+
+# if defined(WIN32_NATIVE) /* WIN32, not Cygwin */
+  {
+    LCID lcid;
+    LANGID langid;
+    int primary, sub;
+
+    /* Use native Win32 API locale ID.  */
+    lcid = GetThreadLocale ();
+
+    /* Strip off the sorting rules, keep only the language part.  */
+    langid = LANGIDFROMLCID (lcid);
+
+    /* Split into language and territory part.  */
+    primary = PRIMARYLANGID (langid);
+    sub = SUBLANGID (langid);
+
+    /* Dispatch on language.
+       See also http://www.unicode.org/unicode/onlinedat/languages.html .
+       For details about languages, see http://www.ethnologue.com/ .  */
+    switch (primary)
+      {
+      case LANG_AFRIKAANS: return "af_ZA";
+      case LANG_ALBANIAN: return "sq_AL";
+      case LANG_AMHARIC: return "am_ET";
+      case LANG_ARABIC:
+	switch (sub)
+	  {
+	  case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+	  case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+	  case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+	  case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+	  case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+	  case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+	  case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+	  case SUBLANG_ARABIC_OMAN: return "ar_OM";
+	  case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+	  case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+	  case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+	  case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+	  case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+	  case SUBLANG_ARABIC_UAE: return "ar_AE";
+	  case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+	  case SUBLANG_ARABIC_QATAR: return "ar_QA";
+	  }
+	return "ar";
+      case LANG_ARMENIAN: return "hy_AM";
+      case LANG_ASSAMESE: return "as_IN";
+      case LANG_AZERI:
+	switch (sub)
+	  {
+	  /* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
+	  case SUBLANG_AZERI_LATIN: return "az_AZ at latin";
+	  case SUBLANG_AZERI_CYRILLIC: return "az_AZ at cyrillic";
+	  }
+	return "az";
+      case LANG_BASQUE:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "eu_ES";
+	  }
+	return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
+      case LANG_BELARUSIAN: return "be_BY";
+      case LANG_BENGALI:
+	switch (sub)
+	  {
+	  case SUBLANG_BENGALI_INDIA: return "bn_IN";
+	  case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+	  }
+	return "bn";
+      case LANG_BULGARIAN: return "bg_BG";
+      case LANG_BURMESE: return "my_MM";
+      case LANG_CAMBODIAN: return "km_KH";
+      case LANG_CATALAN: return "ca_ES";
+      case LANG_CHEROKEE: return "chr_US";
+      case LANG_CHINESE:
+	switch (sub)
+	  {
+	  case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+	  case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+	  case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+	  case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+	  case SUBLANG_CHINESE_MACAU: return "zh_MO";
+	  }
+	return "zh";
+      case LANG_CROATIAN:       /* LANG_CROATIAN == LANG_SERBIAN
+				 * What used to be called Serbo-Croatian
+				 * should really now be two separate
+				 * languages because of political reasons.
+				 * (Says tml, who knows nothing about Serbian
+				 * or Croatian.)
+				 * (I can feel those flames coming already.)
+				 */
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "hr_HR";
+	  case SUBLANG_SERBIAN_LATIN: return "sr_CS";
+	  case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS at cyrillic";
+	  }
+	return "hr";
+      case LANG_CZECH: return "cs_CZ";
+      case LANG_DANISH: return "da_DK";
+      case LANG_DIVEHI: return "dv_MV";
+      case LANG_DUTCH:
+	switch (sub)
+	  {
+	  case SUBLANG_DUTCH: return "nl_NL";
+	  case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+	  }
+	return "nl";
+      case LANG_EDO: return "bin_NG";
+      case LANG_ENGLISH:
+	switch (sub)
+	  {
+	  /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+	   * English was the language spoken in England.
+	   * Oh well.
+	   */
+	  case SUBLANG_ENGLISH_US: return "en_US";
+	  case SUBLANG_ENGLISH_UK: return "en_GB";
+	  case SUBLANG_ENGLISH_AUS: return "en_AU";
+	  case SUBLANG_ENGLISH_CAN: return "en_CA";
+	  case SUBLANG_ENGLISH_NZ: return "en_NZ";
+	  case SUBLANG_ENGLISH_EIRE: return "en_IE";
+	  case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+	  case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+	  case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+	  case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+	  case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+	  case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+	  case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+	  case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+	  case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+	  case SUBLANG_ENGLISH_INDIA: return "en_IN";
+	  case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+	  case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+	  }
+	return "en";
+      case LANG_ESTONIAN: return "et_EE";
+      case LANG_FAEROESE: return "fo_FO";
+      case LANG_FARSI: return "fa_IR";
+      case LANG_FINNISH: return "fi_FI";
+      case LANG_FRENCH:
+	switch (sub)
+	  {
+	  case SUBLANG_FRENCH: return "fr_FR";
+	  case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+	  case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+	  case SUBLANG_FRENCH_SWISS: return "fr_CH";
+	  case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+	  case SUBLANG_FRENCH_MONACO: return "fr_MC";
+	  case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+	  case SUBLANG_FRENCH_REUNION: return "fr_RE";
+	  case SUBLANG_FRENCH_CONGO: return "fr_CG";
+	  case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+	  case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+	  case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+	  case SUBLANG_FRENCH_MALI: return "fr_ML";
+	  case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+	  case SUBLANG_FRENCH_HAITI: return "fr_HT";
+	  }
+	return "fr";
+      case LANG_FRISIAN: return "fy_NL";
+      case LANG_FULFULDE:
+	/* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin.  */
+	return "ff_NG";
+      case LANG_GAELIC:
+	switch (sub)
+	  {
+	  case 0x01: /* SCOTTISH */ return "gd_GB";
+	  case 0x02: /* IRISH */ return "ga_IE";
+	  }
+	return "C";
+      case LANG_GALICIAN: return "gl_ES";
+      case LANG_GEORGIAN: return "ka_GE";
+      case LANG_GERMAN:
+	switch (sub)
+	  {
+	  case SUBLANG_GERMAN: return "de_DE";
+	  case SUBLANG_GERMAN_SWISS: return "de_CH";
+	  case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+	  case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+	  case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+	  }
+	return "de";
+      case LANG_GREEK: return "el_GR";
+      case LANG_GUARANI: return "gn_PY";
+      case LANG_GUJARATI: return "gu_IN";
+      case LANG_HAUSA: return "ha_NG";
+      case LANG_HAWAIIAN:
+	/* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+	   or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
+	return "cpe_US";
+      case LANG_HEBREW: return "he_IL";
+      case LANG_HINDI: return "hi_IN";
+      case LANG_HUNGARIAN: return "hu_HU";
+      case LANG_IBIBIO: return "nic_NG";
+      case LANG_ICELANDIC: return "is_IS";
+      case LANG_IGBO: return "ig_NG";
+      case LANG_INDONESIAN: return "id_ID";
+      case LANG_INUKTITUT: return "iu_CA";
+      case LANG_ITALIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_ITALIAN: return "it_IT";
+	  case SUBLANG_ITALIAN_SWISS: return "it_CH";
+	  }
+	return "it";
+      case LANG_JAPANESE: return "ja_JP";
+      case LANG_KANNADA: return "kn_IN";
+      case LANG_KANURI: return "kr_NG";
+      case LANG_KASHMIRI:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ks_PK";
+	  case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+	  }
+	return "ks";
+      case LANG_KAZAK: return "kk_KZ";
+      case LANG_KONKANI:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "kok_IN";
+      case LANG_KOREAN: return "ko_KR";
+      case LANG_KYRGYZ: return "ky_KG";
+      case LANG_LAO: return "lo_LA";
+      case LANG_LATIN: return "la_VA";
+      case LANG_LATVIAN: return "lv_LV";
+      case LANG_LITHUANIAN: return "lt_LT";
+      case LANG_MACEDONIAN: return "mk_MK";
+      case LANG_MALAY:
+	switch (sub)
+	  {
+	  case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+	  case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+	  }
+	return "ms";
+      case LANG_MALAYALAM: return "ml_IN";
+      case LANG_MALTESE: return "mt_MT";
+      case LANG_MANIPURI:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "mni_IN";
+      case LANG_MARATHI: return "mr_IN";
+      case LANG_MONGOLIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "mn_MN";
+	  }
+	return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
+      case LANG_NEPALI:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ne_NP";
+	  case SUBLANG_NEPALI_INDIA: return "ne_IN";
+	  }
+	return "ne";
+      case LANG_NORWEGIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_NORWEGIAN_BOKMAL: return "nb_NO";
+	  case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+	  }
+	return "no";
+      case LANG_ORIYA: return "or_IN";
+      case LANG_OROMO: return "om_ET";
+      case LANG_PAPIAMENTU: return "pap_AN";
+      case LANG_PASHTO:
+	return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
+      case LANG_POLISH: return "pl_PL";
+      case LANG_PORTUGUESE:
+	switch (sub)
+	  {
+	  case SUBLANG_PORTUGUESE: return "pt_PT";
+	  /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+	     Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+	  case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+	  }
+	return "pt";
+      case LANG_PUNJABI:
+	switch (sub)
+	  {
+	  case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+	  case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+	  }
+	return "pa";
+      case LANG_RHAETO_ROMANCE: return "rm_CH";
+      case LANG_ROMANIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+	  case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+	  }
+	return "ro";
+      case LANG_RUSSIAN:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ru_RU";
+	  }
+	return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD".  */
+      case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
+      case LANG_SANSKRIT: return "sa_IN";
+      case LANG_SINDHI:
+	switch (sub)
+	  {
+	  case SUBLANG_SINDHI_INDIA: return "sd_IN";
+	  case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+	  }
+	return "sd";
+      case LANG_SINHALESE: return "si_LK";
+      case LANG_SLOVAK: return "sk_SK";
+      case LANG_SLOVENIAN: return "sl_SI";
+      case LANG_SOMALI: return "so_SO";
+      case LANG_SORBIAN:
+	/* FIXME: Adjust this when such locales appear on Unix.  */
+	return "wen_DE";
+      case LANG_SPANISH:
+	switch (sub)
+	  {
+	  case SUBLANG_SPANISH: return "es_ES";
+	  case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+	  case SUBLANG_SPANISH_MODERN:
+	    return "es_ES at modern";	/* not seen on Unix */
+	  case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+	  case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+	  case SUBLANG_SPANISH_PANAMA: return "es_PA";
+	  case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+	  case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+	  case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+	  case SUBLANG_SPANISH_PERU: return "es_PE";
+	  case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+	  case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+	  case SUBLANG_SPANISH_CHILE: return "es_CL";
+	  case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+	  case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+	  case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+	  case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+	  case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+	  case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+	  case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+	  }
+	return "es";
+      case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+      case LANG_SWAHILI: return "sw_KE";
+      case LANG_SWEDISH:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "sv_SE";
+	  case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+	  }
+	return "sv";
+      case LANG_SYRIAC: return "syr_TR"; /* An extinct language.  */
+      case LANG_TAGALOG: return "tl_PH";
+      case LANG_TAJIK: return "tg_TJ";
+      case LANG_TAMAZIGHT:
+	switch (sub)
+	  {
+	  /* FIXME: Adjust this when Tamazight locales appear on Unix.  */
+	  case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA at arabic";
+	  case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA at latin";
+	  }
+	return "ber_MA";
+      case LANG_TAMIL:
+	switch (sub)
+	  {
+	  case SUBLANG_DEFAULT: return "ta_IN";
+	  }
+	return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
+      case LANG_TATAR: return "tt_RU";
+      case LANG_TELUGU: return "te_IN";
+      case LANG_THAI: return "th_TH";
+      case LANG_TIBETAN: return "bo_CN";
+      case LANG_TIGRINYA:
+	switch (sub)
+	  {
+	  case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+	  case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+	  }
+	return "ti";
+      case LANG_TSONGA: return "ts_ZA";
+      case LANG_TSWANA: return "tn_BW";
+      case LANG_TURKISH: return "tr_TR";
+      case LANG_TURKMEN: return "tk_TM";
+      case LANG_UKRAINIAN: return "uk_UA";
+      case LANG_URDU:
+	switch (sub)
+	  {
+	  case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+	  case SUBLANG_URDU_INDIA: return "ur_IN";
+	  }
+	return "ur";
+      case LANG_UZBEK:
+	switch (sub)
+	  {
+	  case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+	  case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ at cyrillic";
+	  }
+	return "uz";
+      case LANG_VENDA: return "ve_ZA";
+      case LANG_VIETNAMESE: return "vi_VN";
+      case LANG_WELSH: return "cy_GB";
+      case LANG_XHOSA: return "xh_ZA";
+      case LANG_YI: return "sit_CN";
+      case LANG_YIDDISH: return "yi_IL";
+      case LANG_YORUBA: return "yo_NG";
+      case LANG_ZULU: return "zu_ZA";
+      default: return "C";
+      }
+  }
+# endif
+#endif
+}
+
+const char *
+_nl_locale_name (int category, const char *categoryname)
+{
+  const char *retval;
+
+  retval = _nl_locale_name_posix (category, categoryname);
+  if (retval != NULL)
+    return retval;
+
+  return _nl_locale_name_default ();
+}

Added: tuxmath/trunk/intl/lock.c
===================================================================
--- tuxmath/trunk/intl/lock.c	                        (rev 0)
+++ tuxmath/trunk/intl/lock.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,922 @@
+/* Locking in multithreaded situations.
+   Copyright (C) 2005-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno at clisp.org>, 2005.
+   Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+   gthr-win32.h.  */
+
+#include <config.h>
+
+#include "lock.h"
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library.  */
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The function to be executed by a dummy thread.  */
+static void *
+dummy_thread_func (void *arg)
+{
+  return arg;
+}
+
+int
+glthread_in_use (void)
+{
+  static int tested;
+  static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+  if (!tested)
+    {
+      pthread_t thread;
+
+      if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
+	/* Thread creation failed.  */
+	result = 0;
+      else
+	{
+	  /* Thread creation works.  */
+	  void *retval;
+	  if (pthread_join (thread, &retval) != 0)
+	    abort ();
+	  result = 1;
+	}
+      tested = 1;
+    }
+  return result;
+}
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+#  if !defined PTHREAD_RWLOCK_INITIALIZER
+
+void
+glthread_rwlock_init (gl_rwlock_t *lock)
+{
+  if (pthread_rwlock_init (&lock->rwlock, NULL) != 0)
+    abort ();
+  lock->initialized = 1;
+}
+
+void
+glthread_rwlock_rdlock (gl_rwlock_t *lock)
+{
+  if (!lock->initialized)
+    {
+      if (pthread_mutex_lock (&lock->guard) != 0)
+	abort ();
+      if (!lock->initialized)
+	glthread_rwlock_init (lock);
+      if (pthread_mutex_unlock (&lock->guard) != 0)
+	abort ();
+    }
+  if (pthread_rwlock_rdlock (&lock->rwlock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_wrlock (gl_rwlock_t *lock)
+{
+  if (!lock->initialized)
+    {
+      if (pthread_mutex_lock (&lock->guard) != 0)
+	abort ();
+      if (!lock->initialized)
+	glthread_rwlock_init (lock);
+      if (pthread_mutex_unlock (&lock->guard) != 0)
+	abort ();
+    }
+  if (pthread_rwlock_wrlock (&lock->rwlock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_unlock (gl_rwlock_t *lock)
+{
+  if (!lock->initialized)
+    abort ();
+  if (pthread_rwlock_unlock (&lock->rwlock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_destroy (gl_rwlock_t *lock)
+{
+  if (!lock->initialized)
+    abort ();
+  if (pthread_rwlock_destroy (&lock->rwlock) != 0)
+    abort ();
+  lock->initialized = 0;
+}
+
+#  endif
+
+# else
+
+void
+glthread_rwlock_init (gl_rwlock_t *lock)
+{
+  if (pthread_mutex_init (&lock->lock, NULL) != 0)
+    abort ();
+  if (pthread_cond_init (&lock->waiting_readers, NULL) != 0)
+    abort ();
+  if (pthread_cond_init (&lock->waiting_writers, NULL) != 0)
+    abort ();
+  lock->waiting_writers_count = 0;
+  lock->runcount = 0;
+}
+
+void
+glthread_rwlock_rdlock (gl_rwlock_t *lock)
+{
+  if (pthread_mutex_lock (&lock->lock) != 0)
+    abort ();
+  /* Test whether only readers are currently running, and whether the runcount
+     field will not overflow.  */
+  /* POSIX says: "It is implementation-defined whether the calling thread
+     acquires the lock when a writer does not hold the lock and there are
+     writers blocked on the lock."  Let's say, no: give the writers a higher
+     priority.  */
+  while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+    {
+      /* This thread has to wait for a while.  Enqueue it among the
+	 waiting_readers.  */
+      if (pthread_cond_wait (&lock->waiting_readers, &lock->lock) != 0)
+	abort ();
+    }
+  lock->runcount++;
+  if (pthread_mutex_unlock (&lock->lock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_wrlock (gl_rwlock_t *lock)
+{
+  if (pthread_mutex_lock (&lock->lock) != 0)
+    abort ();
+  /* Test whether no readers or writers are currently running.  */
+  while (!(lock->runcount == 0))
+    {
+      /* This thread has to wait for a while.  Enqueue it among the
+	 waiting_writers.  */
+      lock->waiting_writers_count++;
+      if (pthread_cond_wait (&lock->waiting_writers, &lock->lock) != 0)
+	abort ();
+      lock->waiting_writers_count--;
+    }
+  lock->runcount--; /* runcount becomes -1 */
+  if (pthread_mutex_unlock (&lock->lock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_unlock (gl_rwlock_t *lock)
+{
+  if (pthread_mutex_lock (&lock->lock) != 0)
+    abort ();
+  if (lock->runcount < 0)
+    {
+      /* Drop a writer lock.  */
+      if (!(lock->runcount == -1))
+	abort ();
+      lock->runcount = 0;
+    }
+  else
+    {
+      /* Drop a reader lock.  */
+      if (!(lock->runcount > 0))
+	abort ();
+      lock->runcount--;
+    }
+  if (lock->runcount == 0)
+    {
+      /* POSIX recommends that "write locks shall take precedence over read
+	 locks", to avoid "writer starvation".  */
+      if (lock->waiting_writers_count > 0)
+	{
+	  /* Wake up one of the waiting writers.  */
+	  if (pthread_cond_signal (&lock->waiting_writers) != 0)
+	    abort ();
+	}
+      else
+	{
+	  /* Wake up all waiting readers.  */
+	  if (pthread_cond_broadcast (&lock->waiting_readers) != 0)
+	    abort ();
+	}
+    }
+  if (pthread_mutex_unlock (&lock->lock) != 0)
+    abort ();
+}
+
+void
+glthread_rwlock_destroy (gl_rwlock_t *lock)
+{
+  if (pthread_mutex_destroy (&lock->lock) != 0)
+    abort ();
+  if (pthread_cond_destroy (&lock->waiting_readers) != 0)
+    abort ();
+  if (pthread_cond_destroy (&lock->waiting_writers) != 0)
+    abort ();
+}
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+#  if !(defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
+
+void
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+  pthread_mutexattr_t attributes;
+
+  if (pthread_mutexattr_init (&attributes) != 0)
+    abort ();
+  if (pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE) != 0)
+    abort ();
+  if (pthread_mutex_init (&lock->recmutex, &attributes) != 0)
+    abort ();
+  if (pthread_mutexattr_destroy (&attributes) != 0)
+    abort ();
+  lock->initialized = 1;
+}
+
+void
+glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+{
+  if (!lock->initialized)
+    {
+      if (pthread_mutex_lock (&lock->guard) != 0)
+	abort ();
+      if (!lock->initialized)
+	glthread_recursive_lock_init (lock);
+      if (pthread_mutex_unlock (&lock->guard) != 0)
+	abort ();
+    }
+  if (pthread_mutex_lock (&lock->recmutex) != 0)
+    abort ();
+}
+
+void
+glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+{
+  if (!lock->initialized)
+    abort ();
+  if (pthread_mutex_unlock (&lock->recmutex) != 0)
+    abort ();
+}
+
+void
+glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+{
+  if (!lock->initialized)
+    abort ();
+  if (pthread_mutex_destroy (&lock->recmutex) != 0)
+    abort ();
+  lock->initialized = 0;
+}
+
+#  endif
+
+# else
+
+void
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+  if (pthread_mutex_init (&lock->mutex, NULL) != 0)
+    abort ();
+  lock->owner = (pthread_t) 0;
+  lock->depth = 0;
+}
+
+void
+glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+{
+  pthread_t self = pthread_self ();
+  if (lock->owner != self)
+    {
+      if (pthread_mutex_lock (&lock->mutex) != 0)
+	abort ();
+      lock->owner = self;
+    }
+  if (++(lock->depth) == 0) /* wraparound? */
+    abort ();
+}
+
+void
+glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != pthread_self ())
+    abort ();
+  if (lock->depth == 0)
+    abort ();
+  if (--(lock->depth) == 0)
+    {
+      lock->owner = (pthread_t) 0;
+      if (pthread_mutex_unlock (&lock->mutex) != 0)
+	abort ();
+    }
+}
+
+void
+glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != (pthread_t) 0)
+    abort ();
+  if (pthread_mutex_destroy (&lock->mutex) != 0)
+    abort ();
+}
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT;
+
+int
+glthread_once_singlethreaded (pthread_once_t *once_control)
+{
+  /* We don't know whether pthread_once_t is an integer type, a floating-point
+     type, a pointer type, or a structure type.  */
+  char *firstbyte = (char *)once_control;
+  if (*firstbyte == *(const char *)&fresh_once)
+    {
+      /* First time use of once_control.  Invert the first byte.  */
+      *firstbyte = ~ *(const char *)&fresh_once;
+      return 1;
+    }
+  else
+    return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library.  */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+void
+glthread_once_call (void *arg)
+{
+  void (**gl_once_temp_addr) (void) = (void (**) (void)) arg;
+  void (*initfunction) (void) = *gl_once_temp_addr;
+  initfunction ();
+}
+
+int
+glthread_once_singlethreaded (pth_once_t *once_control)
+{
+  /* We know that pth_once_t is an integer type.  */
+  if (*once_control == PTH_ONCE_INIT)
+    {
+      /* First time use of once_control.  Invert the marker.  */
+      *once_control = ~ PTH_ONCE_INIT;
+      return 1;
+    }
+  else
+    return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library.  */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+void
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+  if (mutex_init (&lock->mutex, USYNC_THREAD, NULL) != 0)
+    abort ();
+  lock->owner = (thread_t) 0;
+  lock->depth = 0;
+}
+
+void
+glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+{
+  thread_t self = thr_self ();
+  if (lock->owner != self)
+    {
+      if (mutex_lock (&lock->mutex) != 0)
+	abort ();
+      lock->owner = self;
+    }
+  if (++(lock->depth) == 0) /* wraparound? */
+    abort ();
+}
+
+void
+glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != thr_self ())
+    abort ();
+  if (lock->depth == 0)
+    abort ();
+  if (--(lock->depth) == 0)
+    {
+      lock->owner = (thread_t) 0;
+      if (mutex_unlock (&lock->mutex) != 0)
+	abort ();
+    }
+}
+
+void
+glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != (thread_t) 0)
+    abort ();
+  if (mutex_destroy (&lock->mutex) != 0)
+    abort ();
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+void
+glthread_once (gl_once_t *once_control, void (*initfunction) (void))
+{
+  if (!once_control->inited)
+    {
+      /* Use the mutex to guarantee that if another thread is already calling
+	 the initfunction, this thread waits until it's finished.  */
+      if (mutex_lock (&once_control->mutex) != 0)
+	abort ();
+      if (!once_control->inited)
+	{
+	  once_control->inited = 1;
+	  initfunction ();
+	}
+      if (mutex_unlock (&once_control->mutex) != 0)
+	abort ();
+    }
+}
+
+int
+glthread_once_singlethreaded (gl_once_t *once_control)
+{
+  /* We know that gl_once_t contains an integer type.  */
+  if (!once_control->inited)
+    {
+      /* First time use of once_control.  Invert the marker.  */
+      once_control->inited = ~ 0;
+      return 1;
+    }
+  else
+    return 0;
+}
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+void
+glthread_lock_init (gl_lock_t *lock)
+{
+  InitializeCriticalSection (&lock->lock);
+  lock->guard.done = 1;
+}
+
+void
+glthread_lock_lock (gl_lock_t *lock)
+{
+  if (!lock->guard.done)
+    {
+      if (InterlockedIncrement (&lock->guard.started) == 0)
+	/* This thread is the first one to need this lock.  Initialize it.  */
+	glthread_lock_init (lock);
+      else
+	/* Yield the CPU while waiting for another thread to finish
+	   initializing this lock.  */
+	while (!lock->guard.done)
+	  Sleep (0);
+    }
+  EnterCriticalSection (&lock->lock);
+}
+
+void
+glthread_lock_unlock (gl_lock_t *lock)
+{
+  if (!lock->guard.done)
+    abort ();
+  LeaveCriticalSection (&lock->lock);
+}
+
+void
+glthread_lock_destroy (gl_lock_t *lock)
+{
+  if (!lock->guard.done)
+    abort ();
+  DeleteCriticalSection (&lock->lock);
+  lock->guard.done = 0;
+}
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+static inline void
+gl_waitqueue_init (gl_waitqueue_t *wq)
+{
+  wq->array = NULL;
+  wq->count = 0;
+  wq->alloc = 0;
+  wq->offset = 0;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+   Returns INVALID_HANDLE_VALUE if an allocation failure occurs.  */
+static HANDLE
+gl_waitqueue_add (gl_waitqueue_t *wq)
+{
+  HANDLE event;
+  unsigned int index;
+
+  if (wq->count == wq->alloc)
+    {
+      unsigned int new_alloc = 2 * wq->alloc + 1;
+      HANDLE *new_array =
+	(HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE));
+      if (new_array == NULL)
+	/* No more memory.  */
+	return INVALID_HANDLE_VALUE;
+      /* Now is a good opportunity to rotate the array so that its contents
+	 starts at offset 0.  */
+      if (wq->offset > 0)
+	{
+	  unsigned int old_count = wq->count;
+	  unsigned int old_alloc = wq->alloc;
+	  unsigned int old_offset = wq->offset;
+	  unsigned int i;
+	  if (old_offset + old_count > old_alloc)
+	    {
+	      unsigned int limit = old_offset + old_count - old_alloc;
+	      for (i = 0; i < limit; i++)
+		new_array[old_alloc + i] = new_array[i];
+	    }
+	  for (i = 0; i < old_count; i++)
+	    new_array[i] = new_array[old_offset + i];
+	  wq->offset = 0;
+	}
+      wq->array = new_array;
+      wq->alloc = new_alloc;
+    }
+  event = CreateEvent (NULL, TRUE, FALSE, NULL);
+  if (event == INVALID_HANDLE_VALUE)
+    /* No way to allocate an event.  */
+    return INVALID_HANDLE_VALUE;
+  index = wq->offset + wq->count;
+  if (index >= wq->alloc)
+    index -= wq->alloc;
+  wq->array[index] = event;
+  wq->count++;
+  return event;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it.  */
+static inline void
+gl_waitqueue_notify_first (gl_waitqueue_t *wq)
+{
+  SetEvent (wq->array[wq->offset + 0]);
+  wq->offset++;
+  wq->count--;
+  if (wq->count == 0 || wq->offset == wq->alloc)
+    wq->offset = 0;
+}
+
+/* Notifies all threads from a wait queue and dequeues them all.  */
+static inline void
+gl_waitqueue_notify_all (gl_waitqueue_t *wq)
+{
+  unsigned int i;
+
+  for (i = 0; i < wq->count; i++)
+    {
+      unsigned int index = wq->offset + i;
+      if (index >= wq->alloc)
+	index -= wq->alloc;
+      SetEvent (wq->array[index]);
+    }
+  wq->count = 0;
+  wq->offset = 0;
+}
+
+void
+glthread_rwlock_init (gl_rwlock_t *lock)
+{
+  InitializeCriticalSection (&lock->lock);
+  gl_waitqueue_init (&lock->waiting_readers);
+  gl_waitqueue_init (&lock->waiting_writers);
+  lock->runcount = 0;
+  lock->guard.done = 1;
+}
+
+void
+glthread_rwlock_rdlock (gl_rwlock_t *lock)
+{
+  if (!lock->guard.done)
+    {
+      if (InterlockedIncrement (&lock->guard.started) == 0)
+	/* This thread is the first one to need this lock.  Initialize it.  */
+	glthread_rwlock_init (lock);
+      else
+	/* Yield the CPU while waiting for another thread to finish
+	   initializing this lock.  */
+	while (!lock->guard.done)
+	  Sleep (0);
+    }
+  EnterCriticalSection (&lock->lock);
+  /* Test whether only readers are currently running, and whether the runcount
+     field will not overflow.  */
+  if (!(lock->runcount + 1 > 0))
+    {
+      /* This thread has to wait for a while.  Enqueue it among the
+	 waiting_readers.  */
+      HANDLE event = gl_waitqueue_add (&lock->waiting_readers);
+      if (event != INVALID_HANDLE_VALUE)
+	{
+	  DWORD result;
+	  LeaveCriticalSection (&lock->lock);
+	  /* Wait until another thread signals this event.  */
+	  result = WaitForSingleObject (event, INFINITE);
+	  if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+	    abort ();
+	  CloseHandle (event);
+	  /* The thread which signalled the event already did the bookkeeping:
+	     removed us from the waiting_readers, incremented lock->runcount.  */
+	  if (!(lock->runcount > 0))
+	    abort ();
+	  return;
+	}
+      else
+	{
+	  /* Allocation failure.  Weird.  */
+	  do
+	    {
+	      LeaveCriticalSection (&lock->lock);
+	      Sleep (1);
+	      EnterCriticalSection (&lock->lock);
+	    }
+	  while (!(lock->runcount + 1 > 0));
+	}
+    }
+  lock->runcount++;
+  LeaveCriticalSection (&lock->lock);
+}
+
+void
+glthread_rwlock_wrlock (gl_rwlock_t *lock)
+{
+  if (!lock->guard.done)
+    {
+      if (InterlockedIncrement (&lock->guard.started) == 0)
+	/* This thread is the first one to need this lock.  Initialize it.  */
+	glthread_rwlock_init (lock);
+      else
+	/* Yield the CPU while waiting for another thread to finish
+	   initializing this lock.  */
+	while (!lock->guard.done)
+	  Sleep (0);
+    }
+  EnterCriticalSection (&lock->lock);
+  /* Test whether no readers or writers are currently running.  */
+  if (!(lock->runcount == 0))
+    {
+      /* This thread has to wait for a while.  Enqueue it among the
+	 waiting_writers.  */
+      HANDLE event = gl_waitqueue_add (&lock->waiting_writers);
+      if (event != INVALID_HANDLE_VALUE)
+	{
+	  DWORD result;
+	  LeaveCriticalSection (&lock->lock);
+	  /* Wait until another thread signals this event.  */
+	  result = WaitForSingleObject (event, INFINITE);
+	  if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+	    abort ();
+	  CloseHandle (event);
+	  /* The thread which signalled the event already did the bookkeeping:
+	     removed us from the waiting_writers, set lock->runcount = -1.  */
+	  if (!(lock->runcount == -1))
+	    abort ();
+	  return;
+	}
+      else
+	{
+	  /* Allocation failure.  Weird.  */
+	  do
+	    {
+	      LeaveCriticalSection (&lock->lock);
+	      Sleep (1);
+	      EnterCriticalSection (&lock->lock);
+	    }
+	  while (!(lock->runcount == 0));
+	}
+    }
+  lock->runcount--; /* runcount becomes -1 */
+  LeaveCriticalSection (&lock->lock);
+}
+
+void
+glthread_rwlock_unlock (gl_rwlock_t *lock)
+{
+  if (!lock->guard.done)
+    abort ();
+  EnterCriticalSection (&lock->lock);
+  if (lock->runcount < 0)
+    {
+      /* Drop a writer lock.  */
+      if (!(lock->runcount == -1))
+	abort ();
+      lock->runcount = 0;
+    }
+  else
+    {
+      /* Drop a reader lock.  */
+      if (!(lock->runcount > 0))
+	abort ();
+      lock->runcount--;
+    }
+  if (lock->runcount == 0)
+    {
+      /* POSIX recommends that "write locks shall take precedence over read
+	 locks", to avoid "writer starvation".  */
+      if (lock->waiting_writers.count > 0)
+	{
+	  /* Wake up one of the waiting writers.  */
+	  lock->runcount--;
+	  gl_waitqueue_notify_first (&lock->waiting_writers);
+	}
+      else
+	{
+	  /* Wake up all waiting readers.  */
+	  lock->runcount += lock->waiting_readers.count;
+	  gl_waitqueue_notify_all (&lock->waiting_readers);
+	}
+    }
+  LeaveCriticalSection (&lock->lock);
+}
+
+void
+glthread_rwlock_destroy (gl_rwlock_t *lock)
+{
+  if (!lock->guard.done)
+    abort ();
+  if (lock->runcount != 0)
+    abort ();
+  DeleteCriticalSection (&lock->lock);
+  if (lock->waiting_readers.array != NULL)
+    free (lock->waiting_readers.array);
+  if (lock->waiting_writers.array != NULL)
+    free (lock->waiting_writers.array);
+  lock->guard.done = 0;
+}
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+void
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+  lock->owner = 0;
+  lock->depth = 0;
+  InitializeCriticalSection (&lock->lock);
+  lock->guard.done = 1;
+}
+
+void
+glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+{
+  if (!lock->guard.done)
+    {
+      if (InterlockedIncrement (&lock->guard.started) == 0)
+	/* This thread is the first one to need this lock.  Initialize it.  */
+	glthread_recursive_lock_init (lock);
+      else
+	/* Yield the CPU while waiting for another thread to finish
+	   initializing this lock.  */
+	while (!lock->guard.done)
+	  Sleep (0);
+    }
+  {
+    DWORD self = GetCurrentThreadId ();
+    if (lock->owner != self)
+      {
+	EnterCriticalSection (&lock->lock);
+	lock->owner = self;
+      }
+    if (++(lock->depth) == 0) /* wraparound? */
+      abort ();
+  }
+}
+
+void
+glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != GetCurrentThreadId ())
+    abort ();
+  if (lock->depth == 0)
+    abort ();
+  if (--(lock->depth) == 0)
+    {
+      lock->owner = 0;
+      LeaveCriticalSection (&lock->lock);
+    }
+}
+
+void
+glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+{
+  if (lock->owner != 0)
+    abort ();
+  DeleteCriticalSection (&lock->lock);
+  lock->guard.done = 0;
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+void
+glthread_once (gl_once_t *once_control, void (*initfunction) (void))
+{
+  if (once_control->inited <= 0)
+    {
+      if (InterlockedIncrement (&once_control->started) == 0)
+	{
+	  /* This thread is the first one to come to this once_control.  */
+	  InitializeCriticalSection (&once_control->lock);
+	  EnterCriticalSection (&once_control->lock);
+	  once_control->inited = 0;
+	  initfunction ();
+	  once_control->inited = 1;
+	  LeaveCriticalSection (&once_control->lock);
+	}
+      else
+	{
+	  /* Undo last operation.  */
+	  InterlockedDecrement (&once_control->started);
+	  /* Some other thread has already started the initialization.
+	     Yield the CPU while waiting for the other thread to finish
+	     initializing and taking the lock.  */
+	  while (once_control->inited < 0)
+	    Sleep (0);
+	  if (once_control->inited <= 0)
+	    {
+	      /* Take the lock.  This blocks until the other thread has
+		 finished calling the initfunction.  */
+	      EnterCriticalSection (&once_control->lock);
+	      LeaveCriticalSection (&once_control->lock);
+	      if (!(once_control->inited > 0))
+		abort ();
+	    }
+	}
+    }
+}
+
+#endif
+
+/* ========================================================================= */

Added: tuxmath/trunk/intl/lock.h
===================================================================
--- tuxmath/trunk/intl/lock.h	                        (rev 0)
+++ tuxmath/trunk/intl/lock.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1105 @@
+/* Locking in multithreaded situations.
+   Copyright (C) 2005-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno at clisp.org>, 2005.
+   Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-solaris.h,
+   gthr-win32.h.  */
+
+/* This file contains locking primitives for use with a given thread library.
+   It does not contain primitives for creating threads or for other
+   synchronization primitives.
+
+   Normal (non-recursive) locks:
+     Type:                gl_lock_t
+     Declaration:         gl_lock_define(extern, name)
+     Initializer:         gl_lock_define_initialized(, name)
+     Initialization:      gl_lock_init (name);
+     Taking the lock:     gl_lock_lock (name);
+     Releasing the lock:  gl_lock_unlock (name);
+     De-initialization:   gl_lock_destroy (name);
+
+   Read-Write (non-recursive) locks:
+     Type:                gl_rwlock_t
+     Declaration:         gl_rwlock_define(extern, name)
+     Initializer:         gl_rwlock_define_initialized(, name)
+     Initialization:      gl_rwlock_init (name);
+     Taking the lock:     gl_rwlock_rdlock (name);
+                          gl_rwlock_wrlock (name);
+     Releasing the lock:  gl_rwlock_unlock (name);
+     De-initialization:   gl_rwlock_destroy (name);
+
+   Recursive locks:
+     Type:                gl_recursive_lock_t
+     Declaration:         gl_recursive_lock_define(extern, name)
+     Initializer:         gl_recursive_lock_define_initialized(, name)
+     Initialization:      gl_recursive_lock_init (name);
+     Taking the lock:     gl_recursive_lock_lock (name);
+     Releasing the lock:  gl_recursive_lock_unlock (name);
+     De-initialization:   gl_recursive_lock_destroy (name);
+
+  Once-only execution:
+     Type:                gl_once_t
+     Initializer:         gl_once_define(extern, name)
+     Execution:           gl_once (name, initfunction);
+*/
+
+
+#ifndef _LOCK_H
+#define _LOCK_H
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library.  */
+
+# include <pthread.h>
+# include <stdlib.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime.  */
+#  define pthread_in_use() \
+     glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library.  */
+
+/* Weak references avoid dragging in external libraries if the other parts
+   of the program don't use them.  Here we use them, because we don't want
+   every program that uses libintl to depend on libpthread.  This assumes
+   that libpthread would not be loaded after libintl; i.e. if libintl is
+   loaded first, by an executable that does not depend on libpthread, and
+   then a module is dynamically loaded that depends on libpthread, libintl
+   will not be multithread-safe.  */
+
+/* The way to test at runtime whether libpthread is present is to test
+   whether a function pointer's value, such as &pthread_mutex_init, is
+   non-NULL.  However, some versions of GCC have a bug through which, in
+   PIC mode, &foo != NULL always evaluates to true if there is a direct
+   call to foo(...) in the same function.  To avoid this, we test the
+   address of a function in libpthread that we don't use.  */
+
+#  pragma weak pthread_mutex_init
+#  pragma weak pthread_mutex_lock
+#  pragma weak pthread_mutex_unlock
+#  pragma weak pthread_mutex_destroy
+#  pragma weak pthread_rwlock_init
+#  pragma weak pthread_rwlock_rdlock
+#  pragma weak pthread_rwlock_wrlock
+#  pragma weak pthread_rwlock_unlock
+#  pragma weak pthread_rwlock_destroy
+#  pragma weak pthread_once
+#  pragma weak pthread_cond_init
+#  pragma weak pthread_cond_wait
+#  pragma weak pthread_cond_signal
+#  pragma weak pthread_cond_broadcast
+#  pragma weak pthread_cond_destroy
+#  pragma weak pthread_mutexattr_init
+#  pragma weak pthread_mutexattr_settype
+#  pragma weak pthread_mutexattr_destroy
+#  ifndef pthread_self
+#   pragma weak pthread_self
+#  endif
+
+#  if !PTHREAD_IN_USE_DETECTION_HARD
+#   pragma weak pthread_cancel
+#   define pthread_in_use() (pthread_cancel != NULL)
+#  endif
+
+# else
+
+#  if !PTHREAD_IN_USE_DETECTION_HARD
+#   define pthread_in_use() 1
+#  endif
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pthread_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS pthread_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+    PTHREAD_MUTEX_INITIALIZER
+# define gl_lock_init(NAME) \
+    do                                                                  \
+      {                                                                 \
+        if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) \
+          abort ();                                                     \
+      }                                                                 \
+    while (0)
+# define gl_lock_lock(NAME) \
+    do                                                            \
+      {                                                           \
+        if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) \
+          abort ();                                               \
+      }                                                           \
+    while (0)
+# define gl_lock_unlock(NAME) \
+    do                                                              \
+      {                                                             \
+        if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) \
+          abort ();                                                 \
+      }                                                             \
+    while (0)
+# define gl_lock_destroy(NAME) \
+    do                                                               \
+      {                                                              \
+        if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) \
+          abort ();                                                  \
+      }                                                              \
+    while (0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK
+
+#  ifdef PTHREAD_RWLOCK_INITIALIZER
+
+typedef pthread_rwlock_t gl_rwlock_t;
+#   define gl_rwlock_define(STORAGECLASS, NAME) \
+      STORAGECLASS pthread_rwlock_t NAME;
+#   define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+      STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
+#   define gl_rwlock_initializer \
+      PTHREAD_RWLOCK_INITIALIZER
+#   define gl_rwlock_init(NAME) \
+      do                                                                   \
+        {                                                                  \
+          if (pthread_in_use () && pthread_rwlock_init (&NAME, NULL) != 0) \
+            abort ();                                                      \
+        }                                                                  \
+      while (0)
+#   define gl_rwlock_rdlock(NAME) \
+      do                                                               \
+        {                                                              \
+          if (pthread_in_use () && pthread_rwlock_rdlock (&NAME) != 0) \
+            abort ();                                                  \
+        }                                                              \
+      while (0)
+#   define gl_rwlock_wrlock(NAME) \
+      do                                                               \
+        {                                                              \
+          if (pthread_in_use () && pthread_rwlock_wrlock (&NAME) != 0) \
+            abort ();                                                  \
+        }                                                              \
+      while (0)
+#   define gl_rwlock_unlock(NAME) \
+      do                                                               \
+        {                                                              \
+          if (pthread_in_use () && pthread_rwlock_unlock (&NAME) != 0) \
+            abort ();                                                  \
+        }                                                              \
+      while (0)
+#   define gl_rwlock_destroy(NAME) \
+      do                                                                \
+        {                                                               \
+          if (pthread_in_use () && pthread_rwlock_destroy (&NAME) != 0) \
+            abort ();                                                   \
+        }                                                               \
+      while (0)
+
+#  else
+
+typedef struct
+        {
+          int initialized;
+          pthread_mutex_t guard;   /* protects the initialization */
+          pthread_rwlock_t rwlock; /* read-write lock */
+        }
+        gl_rwlock_t;
+#   define gl_rwlock_define(STORAGECLASS, NAME) \
+      STORAGECLASS gl_rwlock_t NAME;
+#   define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+      STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+#   define gl_rwlock_initializer \
+      { 0, PTHREAD_MUTEX_INITIALIZER }
+#   define gl_rwlock_init(NAME) \
+      do                                  \
+        {                                 \
+          if (pthread_in_use ())          \
+            glthread_rwlock_init (&NAME); \
+        }                                 \
+      while (0)
+#   define gl_rwlock_rdlock(NAME) \
+      do                                    \
+        {                                   \
+          if (pthread_in_use ())            \
+            glthread_rwlock_rdlock (&NAME); \
+        }                                   \
+      while (0)
+#   define gl_rwlock_wrlock(NAME) \
+      do                                    \
+        {                                   \
+          if (pthread_in_use ())            \
+            glthread_rwlock_wrlock (&NAME); \
+        }                                   \
+      while (0)
+#   define gl_rwlock_unlock(NAME) \
+      do                                    \
+        {                                   \
+          if (pthread_in_use ())            \
+            glthread_rwlock_unlock (&NAME); \
+        }                                   \
+      while (0)
+#   define gl_rwlock_destroy(NAME) \
+      do                                     \
+        {                                    \
+          if (pthread_in_use ())             \
+            glthread_rwlock_destroy (&NAME); \
+        }                                    \
+      while (0)
+extern void glthread_rwlock_init (gl_rwlock_t *lock);
+extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+
+#  endif
+
+# else
+
+typedef struct
+        {
+          pthread_mutex_t lock; /* protects the remaining fields */
+          pthread_cond_t waiting_readers; /* waiting readers */
+          pthread_cond_t waiting_writers; /* waiting writers */
+          unsigned int waiting_writers_count; /* number of waiting writers */
+          int runcount; /* number of readers running, or -1 when a writer runs */
+        }
+        gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+    { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
+# define gl_rwlock_init(NAME) \
+    do                                  \
+      {                                 \
+        if (pthread_in_use ())          \
+          glthread_rwlock_init (&NAME); \
+      }                                 \
+    while (0)
+# define gl_rwlock_rdlock(NAME) \
+    do                                    \
+      {                                   \
+        if (pthread_in_use ())            \
+          glthread_rwlock_rdlock (&NAME); \
+      }                                   \
+    while (0)
+# define gl_rwlock_wrlock(NAME) \
+    do                                    \
+      {                                   \
+        if (pthread_in_use ())            \
+          glthread_rwlock_wrlock (&NAME); \
+      }                                   \
+    while (0)
+# define gl_rwlock_unlock(NAME) \
+    do                                    \
+      {                                   \
+        if (pthread_in_use ())            \
+          glthread_rwlock_unlock (&NAME); \
+      }                                   \
+    while (0)
+# define gl_rwlock_destroy(NAME) \
+    do                                     \
+      {                                    \
+        if (pthread_in_use ())             \
+          glthread_rwlock_destroy (&NAME); \
+      }                                    \
+    while (0)
+extern void glthread_rwlock_init (gl_rwlock_t *lock);
+extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+#  if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+typedef pthread_mutex_t gl_recursive_lock_t;
+#   define gl_recursive_lock_define(STORAGECLASS, NAME) \
+      STORAGECLASS pthread_mutex_t NAME;
+#   define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+      STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer;
+#   ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+#    define gl_recursive_lock_initializer \
+       PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+#   else
+#    define gl_recursive_lock_initializer \
+       PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+#   endif
+#   define gl_recursive_lock_init(NAME) \
+      do                                                                  \
+        {                                                                 \
+          if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) \
+            abort ();                                                     \
+        }                                                                 \
+      while (0)
+#   define gl_recursive_lock_lock(NAME) \
+      do                                                            \
+        {                                                           \
+          if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) \
+            abort ();                                               \
+        }                                                           \
+      while (0)
+#   define gl_recursive_lock_unlock(NAME) \
+      do                                                              \
+        {                                                             \
+          if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) \
+            abort ();                                                 \
+        }                                                             \
+      while (0)
+#   define gl_recursive_lock_destroy(NAME) \
+      do                                                               \
+        {                                                              \
+          if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) \
+            abort ();                                                  \
+        }                                                              \
+      while (0)
+
+#  else
+
+typedef struct
+        {
+          pthread_mutex_t recmutex; /* recursive mutex */
+          pthread_mutex_t guard;    /* protects the initialization */
+          int initialized;
+        }
+        gl_recursive_lock_t;
+#   define gl_recursive_lock_define(STORAGECLASS, NAME) \
+      STORAGECLASS gl_recursive_lock_t NAME;
+#   define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+      STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+#   define gl_recursive_lock_initializer \
+      { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
+#   define gl_recursive_lock_init(NAME) \
+      do                                          \
+        {                                         \
+          if (pthread_in_use ())                  \
+            glthread_recursive_lock_init (&NAME); \
+        }                                         \
+      while (0)
+#   define gl_recursive_lock_lock(NAME) \
+      do                                          \
+        {                                         \
+          if (pthread_in_use ())                  \
+            glthread_recursive_lock_lock (&NAME); \
+        }                                         \
+      while (0)
+#   define gl_recursive_lock_unlock(NAME) \
+      do                                            \
+        {                                           \
+          if (pthread_in_use ())                    \
+            glthread_recursive_lock_unlock (&NAME); \
+        }                                           \
+      while (0)
+#   define gl_recursive_lock_destroy(NAME) \
+      do                                             \
+        {                                            \
+          if (pthread_in_use ())                     \
+            glthread_recursive_lock_destroy (&NAME); \
+        }                                            \
+      while (0)
+extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+
+#  endif
+
+# else
+
+/* Old versions of POSIX threads on Solaris did not have recursive locks.
+   We have to implement them ourselves.  */
+
+typedef struct
+        {
+          pthread_mutex_t mutex;
+          pthread_t owner;
+          unsigned long depth;
+        }
+        gl_recursive_lock_t;
+#  define gl_recursive_lock_define(STORAGECLASS, NAME) \
+     STORAGECLASS gl_recursive_lock_t NAME;
+#  define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+     STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+#  define gl_recursive_lock_initializer \
+     { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
+#  define gl_recursive_lock_init(NAME) \
+     do                                          \
+       {                                         \
+         if (pthread_in_use ())                  \
+           glthread_recursive_lock_init (&NAME); \
+       }                                         \
+     while (0)
+#  define gl_recursive_lock_lock(NAME) \
+     do                                          \
+       {                                         \
+         if (pthread_in_use ())                  \
+           glthread_recursive_lock_lock (&NAME); \
+       }                                         \
+     while (0)
+#  define gl_recursive_lock_unlock(NAME) \
+     do                                            \
+       {                                           \
+         if (pthread_in_use ())                    \
+           glthread_recursive_lock_unlock (&NAME); \
+       }                                           \
+     while (0)
+#  define gl_recursive_lock_destroy(NAME) \
+     do                                             \
+       {                                            \
+         if (pthread_in_use ())                     \
+           glthread_recursive_lock_destroy (&NAME); \
+       }                                            \
+     while (0)
+extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pthread_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+    STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
+# define gl_once(NAME, INITFUNCTION) \
+    do                                                   \
+      {                                                  \
+        if (pthread_in_use ())                           \
+          {                                              \
+            if (pthread_once (&NAME, INITFUNCTION) != 0) \
+              abort ();                                  \
+          }                                              \
+        else                                             \
+          {                                              \
+            if (glthread_once_singlethreaded (&NAME))    \
+              INITFUNCTION ();                           \
+          }                                              \
+      }                                                  \
+    while (0)
+extern int glthread_once_singlethreaded (pthread_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_PTH_THREADS
+
+/* Use the GNU Pth threads library.  */
+
+# include <pth.h>
+# include <stdlib.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_PTH_THREADS_WEAK
+
+/* Use weak references to the GNU Pth threads library.  */
+
+#  pragma weak pth_mutex_init
+#  pragma weak pth_mutex_acquire
+#  pragma weak pth_mutex_release
+#  pragma weak pth_rwlock_init
+#  pragma weak pth_rwlock_acquire
+#  pragma weak pth_rwlock_release
+#  pragma weak pth_once
+
+#  pragma weak pth_cancel
+#  define pth_in_use() (pth_cancel != NULL)
+
+# else
+
+#  define pth_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pth_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS pth_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS pth_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+    PTH_MUTEX_INIT
+# define gl_lock_init(NAME) \
+    do                                               \
+      {                                              \
+        if (pth_in_use() && !pth_mutex_init (&NAME)) \
+          abort ();                                  \
+      }                                              \
+    while (0)
+# define gl_lock_lock(NAME) \
+    do                                                           \
+      {                                                          \
+        if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) \
+          abort ();                                              \
+      }                                                          \
+    while (0)
+# define gl_lock_unlock(NAME) \
+    do                                                  \
+      {                                                 \
+        if (pth_in_use() && !pth_mutex_release (&NAME)) \
+          abort ();                                     \
+      }                                                 \
+    while (0)
+# define gl_lock_destroy(NAME) \
+    (void)(&NAME)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef pth_rwlock_t gl_rwlock_t;
+#  define gl_rwlock_define(STORAGECLASS, NAME) \
+     STORAGECLASS pth_rwlock_t NAME;
+#  define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+     STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer;
+#  define gl_rwlock_initializer \
+     PTH_RWLOCK_INIT
+#  define gl_rwlock_init(NAME) \
+     do                                                \
+       {                                               \
+         if (pth_in_use() && !pth_rwlock_init (&NAME)) \
+           abort ();                                   \
+       }                                               \
+     while (0)
+#  define gl_rwlock_rdlock(NAME) \
+     do                                                              \
+       {                                                             \
+         if (pth_in_use()                                            \
+             && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RD, 0, NULL)) \
+           abort ();                                                 \
+       }                                                             \
+     while (0)
+#  define gl_rwlock_wrlock(NAME) \
+     do                                                              \
+       {                                                             \
+         if (pth_in_use()                                            \
+             && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RW, 0, NULL)) \
+           abort ();                                                 \
+       }                                                             \
+     while (0)
+#  define gl_rwlock_unlock(NAME) \
+     do                                                   \
+       {                                                  \
+         if (pth_in_use() && !pth_rwlock_release (&NAME)) \
+           abort ();                                      \
+       }                                                  \
+     while (0)
+#  define gl_rwlock_destroy(NAME) \
+     (void)(&NAME)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* In Pth, mutexes are recursive by default.  */
+typedef pth_mutex_t gl_recursive_lock_t;
+#  define gl_recursive_lock_define(STORAGECLASS, NAME) \
+     STORAGECLASS pth_mutex_t NAME;
+#  define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+     STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer;
+#  define gl_recursive_lock_initializer \
+     PTH_MUTEX_INIT
+#  define gl_recursive_lock_init(NAME) \
+     do                                               \
+       {                                              \
+         if (pth_in_use() && !pth_mutex_init (&NAME)) \
+           abort ();                                  \
+       }                                              \
+     while (0)
+#  define gl_recursive_lock_lock(NAME) \
+     do                                                           \
+       {                                                          \
+         if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) \
+           abort ();                                              \
+       }                                                          \
+     while (0)
+#  define gl_recursive_lock_unlock(NAME) \
+     do                                                  \
+       {                                                 \
+         if (pth_in_use() && !pth_mutex_release (&NAME)) \
+           abort ();                                     \
+       }                                                 \
+     while (0)
+#  define gl_recursive_lock_destroy(NAME) \
+     (void)(&NAME)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pth_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+    STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT;
+# define gl_once(NAME, INITFUNCTION) \
+    do                                                                \
+      {                                                               \
+        if (pth_in_use ())                                            \
+          {                                                           \
+            void (*gl_once_temp) (void) = INITFUNCTION;               \
+            if (!pth_once (&NAME, glthread_once_call, &gl_once_temp)) \
+              abort ();                                               \
+          }                                                           \
+        else                                                          \
+          {                                                           \
+            if (glthread_once_singlethreaded (&NAME))                 \
+              INITFUNCTION ();                                        \
+          }                                                           \
+      }                                                               \
+    while (0)
+extern void glthread_once_call (void *arg);
+extern int glthread_once_singlethreaded (pth_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_SOLARIS_THREADS
+
+/* Use the old Solaris threads library.  */
+
+# include <thread.h>
+# include <synch.h>
+# include <stdlib.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_SOLARIS_THREADS_WEAK
+
+/* Use weak references to the old Solaris threads library.  */
+
+#  pragma weak mutex_init
+#  pragma weak mutex_lock
+#  pragma weak mutex_unlock
+#  pragma weak mutex_destroy
+#  pragma weak rwlock_init
+#  pragma weak rw_rdlock
+#  pragma weak rw_wrlock
+#  pragma weak rw_unlock
+#  pragma weak rwlock_destroy
+#  pragma weak thr_self
+
+#  pragma weak thr_suspend
+#  define thread_in_use() (thr_suspend != NULL)
+
+# else
+
+#  define thread_in_use() 1
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+    DEFAULTMUTEX
+# define gl_lock_init(NAME) \
+    do                                                                       \
+      {                                                                      \
+        if (thread_in_use () && mutex_init (&NAME, USYNC_THREAD, NULL) != 0) \
+          abort ();                                                          \
+      }                                                                      \
+    while (0)
+# define gl_lock_lock(NAME) \
+    do                                                   \
+      {                                                  \
+        if (thread_in_use () && mutex_lock (&NAME) != 0) \
+          abort ();                                      \
+      }                                                  \
+    while (0)
+# define gl_lock_unlock(NAME) \
+    do                                                     \
+      {                                                    \
+        if (thread_in_use () && mutex_unlock (&NAME) != 0) \
+          abort ();                                        \
+      }                                                    \
+    while (0)
+# define gl_lock_destroy(NAME) \
+    do                                                      \
+      {                                                     \
+        if (thread_in_use () && mutex_destroy (&NAME) != 0) \
+          abort ();                                         \
+      }                                                     \
+    while (0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+    STORAGECLASS rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+    DEFAULTRWLOCK
+# define gl_rwlock_init(NAME) \
+    do                                                                        \
+      {                                                                       \
+        if (thread_in_use () && rwlock_init (&NAME, USYNC_THREAD, NULL) != 0) \
+          abort ();                                                           \
+      }                                                                       \
+    while (0)
+# define gl_rwlock_rdlock(NAME) \
+    do                                                  \
+      {                                                 \
+        if (thread_in_use () && rw_rdlock (&NAME) != 0) \
+          abort ();                                     \
+      }                                                 \
+    while (0)
+# define gl_rwlock_wrlock(NAME) \
+    do                                                  \
+      {                                                 \
+        if (thread_in_use () && rw_wrlock (&NAME) != 0) \
+          abort ();                                     \
+      }                                                 \
+    while (0)
+# define gl_rwlock_unlock(NAME) \
+    do                                                  \
+      {                                                 \
+        if (thread_in_use () && rw_unlock (&NAME) != 0) \
+          abort ();                                     \
+      }                                                 \
+    while (0)
+# define gl_rwlock_destroy(NAME) \
+    do                                                       \
+      {                                                      \
+        if (thread_in_use () && rwlock_destroy (&NAME) != 0) \
+          abort ();                                          \
+      }                                                      \
+    while (0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* Old Solaris threads did not have recursive locks.
+   We have to implement them ourselves.  */
+
+typedef struct
+        {
+          mutex_t mutex;
+          thread_t owner;
+          unsigned long depth;
+        }
+        gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+    { DEFAULTMUTEX, (thread_t) 0, 0 }
+# define gl_recursive_lock_init(NAME) \
+    do                                          \
+      {                                         \
+        if (thread_in_use ())                   \
+          glthread_recursive_lock_init (&NAME); \
+      }                                         \
+    while (0)
+# define gl_recursive_lock_lock(NAME) \
+    do                                          \
+      {                                         \
+        if (thread_in_use ())                   \
+          glthread_recursive_lock_lock (&NAME); \
+      }                                         \
+    while (0)
+# define gl_recursive_lock_unlock(NAME) \
+    do                                            \
+      {                                           \
+        if (thread_in_use ())                     \
+          glthread_recursive_lock_unlock (&NAME); \
+      }                                           \
+    while (0)
+# define gl_recursive_lock_destroy(NAME) \
+    do                                             \
+      {                                            \
+        if (thread_in_use ())                      \
+          glthread_recursive_lock_destroy (&NAME); \
+      }                                            \
+    while (0)
+extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+        {
+          volatile int inited;
+          mutex_t mutex;
+        }
+        gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX };
+# define gl_once(NAME, INITFUNCTION) \
+    do                                                \
+      {                                               \
+        if (thread_in_use ())                         \
+          {                                           \
+            glthread_once (&NAME, INITFUNCTION);      \
+          }                                           \
+        else                                          \
+          {                                           \
+            if (glthread_once_singlethreaded (&NAME)) \
+              INITFUNCTION ();                        \
+          }                                           \
+      }                                               \
+    while (0)
+extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void));
+extern int glthread_once_singlethreaded (gl_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WIN32_THREADS
+
+# include <windows.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* We can use CRITICAL_SECTION directly, rather than the Win32 Event, Mutex,
+   Semaphore types, because
+     - we need only to synchronize inside a single process (address space),
+       not inter-process locking,
+     - we don't need to support trylock operations.  (TryEnterCriticalSection
+       does not work on Windows 95/98/ME.  Packages that need trylock usually
+       define their own mutex type.)  */
+
+/* There is no way to statically initialize a CRITICAL_SECTION.  It needs
+   to be done lazily, once only.  For this we need spinlocks.  */
+
+typedef struct { volatile int done; volatile long started; } gl_spinlock_t;
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef struct
+        {
+          gl_spinlock_t guard; /* protects the initialization */
+          CRITICAL_SECTION lock;
+        }
+        gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_lock_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+    { { 0, -1 } }
+# define gl_lock_init(NAME) \
+    glthread_lock_init (&NAME)
+# define gl_lock_lock(NAME) \
+    glthread_lock_lock (&NAME)
+# define gl_lock_unlock(NAME) \
+    glthread_lock_unlock (&NAME)
+# define gl_lock_destroy(NAME) \
+    glthread_lock_destroy (&NAME)
+extern void glthread_lock_init (gl_lock_t *lock);
+extern void glthread_lock_lock (gl_lock_t *lock);
+extern void glthread_lock_unlock (gl_lock_t *lock);
+extern void glthread_lock_destroy (gl_lock_t *lock);
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+/* It is impossible to implement read-write locks using plain locks, without
+   introducing an extra thread dedicated to managing read-write locks.
+   Therefore here we need to use the low-level Event type.  */
+
+typedef struct
+        {
+          HANDLE *array; /* array of waiting threads, each represented by an event */
+          unsigned int count; /* number of waiting threads */
+          unsigned int alloc; /* length of allocated array */
+          unsigned int offset; /* index of first waiting thread in array */
+        }
+        gl_waitqueue_t;
+typedef struct
+        {
+          gl_spinlock_t guard; /* protects the initialization */
+          CRITICAL_SECTION lock; /* protects the remaining fields */
+          gl_waitqueue_t waiting_readers; /* waiting readers */
+          gl_waitqueue_t waiting_writers; /* waiting writers */
+          int runcount; /* number of readers running, or -1 when a writer runs */
+        }
+        gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+    { { 0, -1 } }
+# define gl_rwlock_init(NAME) \
+    glthread_rwlock_init (&NAME)
+# define gl_rwlock_rdlock(NAME) \
+    glthread_rwlock_rdlock (&NAME)
+# define gl_rwlock_wrlock(NAME) \
+    glthread_rwlock_wrlock (&NAME)
+# define gl_rwlock_unlock(NAME) \
+    glthread_rwlock_unlock (&NAME)
+# define gl_rwlock_destroy(NAME) \
+    glthread_rwlock_destroy (&NAME)
+extern void glthread_rwlock_init (gl_rwlock_t *lock);
+extern void glthread_rwlock_rdlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_wrlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_unlock (gl_rwlock_t *lock);
+extern void glthread_rwlock_destroy (gl_rwlock_t *lock);
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+/* The Win32 documentation says that CRITICAL_SECTION already implements a
+   recursive lock.  But we need not rely on it: It's easy to implement a
+   recursive lock without this assumption.  */
+
+typedef struct
+        {
+          gl_spinlock_t guard; /* protects the initialization */
+          DWORD owner;
+          unsigned long depth;
+          CRITICAL_SECTION lock;
+        }
+        gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+    STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+    { { 0, -1 }, 0, 0 }
+# define gl_recursive_lock_init(NAME) \
+    glthread_recursive_lock_init (&NAME)
+# define gl_recursive_lock_lock(NAME) \
+    glthread_recursive_lock_lock (&NAME)
+# define gl_recursive_lock_unlock(NAME) \
+    glthread_recursive_lock_unlock (&NAME)
+# define gl_recursive_lock_destroy(NAME) \
+    glthread_recursive_lock_destroy (&NAME)
+extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef struct
+        {
+          volatile int inited;
+          volatile long started;
+          CRITICAL_SECTION lock;
+        }
+        gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_once_t NAME = { -1, -1 };
+# define gl_once(NAME, INITFUNCTION) \
+    glthread_once (&NAME, INITFUNCTION)
+extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void));
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_POSIX_THREADS || USE_PTH_THREADS || USE_SOLARIS_THREADS || USE_WIN32_THREADS)
+
+/* Provide dummy implementation if threads are not supported.  */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef int gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME)
+# define gl_lock_define_initialized(STORAGECLASS, NAME)
+# define gl_lock_init(NAME)
+# define gl_lock_lock(NAME)
+# define gl_lock_unlock(NAME)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef int gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME)
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME)
+# define gl_rwlock_init(NAME)
+# define gl_rwlock_rdlock(NAME)
+# define gl_rwlock_wrlock(NAME)
+# define gl_rwlock_unlock(NAME)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef int gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME)
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
+# define gl_recursive_lock_init(NAME)
+# define gl_recursive_lock_lock(NAME)
+# define gl_recursive_lock_unlock(NAME)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef int gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+    STORAGECLASS gl_once_t NAME = 0;
+# define gl_once(NAME, INITFUNCTION) \
+    do                       \
+      {                      \
+        if (NAME == 0)       \
+          {                  \
+            NAME = ~ 0;      \
+            INITFUNCTION (); \
+          }                  \
+      }                      \
+    while (0)
+
+#endif
+
+/* ========================================================================= */
+
+#endif /* _LOCK_H */

Added: tuxmath/trunk/intl/log.c
===================================================================
--- tuxmath/trunk/intl/log.c	                        (rev 0)
+++ tuxmath/trunk/intl/log.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,116 @@
+/* Log file output.
+   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno at clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+# include "lock.h"
+#endif
+
+/* Print an ASCII string with quotes and escape sequences where needed.  */
+static void
+print_escaped (FILE *stream, const char *str)
+{
+  putc ('"', stream);
+  for (; *str != '\0'; str++)
+    if (*str == '\n')
+      {
+	fputs ("\\n\"", stream);
+	if (str[1] == '\0')
+	  return;
+	fputs ("\n\"", stream);
+      }
+    else
+      {
+	if (*str == '"' || *str == '\\')
+	  putc ('\\', stream);
+	putc (*str, stream);
+      }
+  putc ('"', stream);
+}
+
+static char *last_logfilename = NULL;
+static FILE *last_logfile = NULL;
+__libc_lock_define_initialized (static, lock)
+
+static inline void
+_nl_log_untranslated_locked (const char *logfilename, const char *domainname,
+			     const char *msgid1, const char *msgid2, int plural)
+{
+  FILE *logfile;
+
+  /* Can we reuse the last opened logfile?  */
+  if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
+    {
+      /* Close the last used logfile.  */
+      if (last_logfilename != NULL)
+	{
+	  if (last_logfile != NULL)
+	    {
+	      fclose (last_logfile);
+	      last_logfile = NULL;
+	    }
+	  free (last_logfilename);
+	  last_logfilename = NULL;
+	}
+      /* Open the logfile.  */
+      last_logfilename = (char *) malloc (strlen (logfilename) + 1);
+      if (last_logfilename == NULL)
+	return;
+      strcpy (last_logfilename, logfilename);
+      last_logfile = fopen (logfilename, "a");
+      if (last_logfile == NULL)
+	return;
+    }
+  logfile = last_logfile;
+
+  fprintf (logfile, "domain ");
+  print_escaped (logfile, domainname);
+  fprintf (logfile, "\nmsgid ");
+  print_escaped (logfile, msgid1);
+  if (plural)
+    {
+      fprintf (logfile, "\nmsgid_plural ");
+      print_escaped (logfile, msgid2);
+      fprintf (logfile, "\nmsgstr[0] \"\"\n");
+    }
+  else
+    fprintf (logfile, "\nmsgstr \"\"\n");
+  putc ('\n', logfile);
+}
+
+/* Add to the log file an entry denoting a failed translation.  */
+void
+_nl_log_untranslated (const char *logfilename, const char *domainname,
+		      const char *msgid1, const char *msgid2, int plural)
+{
+  __libc_lock_lock (lock);
+  _nl_log_untranslated_locked (logfilename, domainname, msgid1, msgid2, plural);
+  __libc_lock_unlock (lock);
+}

Added: tuxmath/trunk/intl/ngettext.c
===================================================================
--- tuxmath/trunk/intl/ngettext.c	                        (rev 0)
+++ tuxmath/trunk/intl/ngettext.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,65 @@
+/* Implementation of ngettext(3) function.
+   Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>		/* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+#include <locale.h>
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define NGETTEXT __ngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define NGETTEXT libintl_ngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__ngettext, ngettext);
+#endif

Added: tuxmath/trunk/intl/os2compat.c
===================================================================
--- tuxmath/trunk/intl/os2compat.c	                        (rev 0)
+++ tuxmath/trunk/intl/os2compat.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,98 @@
+/* OS/2 compatibility functions.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#define OS2_AWARE
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+/* A version of getenv() that works from DLLs */
+extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue);
+
+char *
+_nl_getenv (const char *name)
+{
+  unsigned char *value;
+  if (DosScanEnv (name, &value))
+    return NULL;
+  else
+    return value;
+}
+
+/* A fixed size buffer.  */
+char libintl_nl_default_dirname[MAXPATHLEN+1];
+
+char *_nlos2_libdir = NULL;
+char *_nlos2_localealiaspath = NULL;
+char *_nlos2_localedir = NULL;
+
+static __attribute__((constructor)) void
+nlos2_initialize ()
+{
+  char *root = getenv ("UNIXROOT");
+  char *gnulocaledir = getenv ("GNULOCALEDIR");
+
+  _nlos2_libdir = gnulocaledir;
+  if (!_nlos2_libdir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1);
+          memcpy (_nlos2_libdir, root, sl);
+          memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1);
+        }
+      else
+        _nlos2_libdir = LIBDIR;
+    }
+
+  _nlos2_localealiaspath = gnulocaledir;
+  if (!_nlos2_localealiaspath)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1);
+          memcpy (_nlos2_localealiaspath, root, sl);
+          memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1);
+        }
+     else
+        _nlos2_localealiaspath = LOCALE_ALIAS_PATH;
+    }
+
+  _nlos2_localedir = gnulocaledir;
+  if (!_nlos2_localedir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1);
+          memcpy (_nlos2_localedir, root, sl);
+          memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1);
+        }
+      else
+        _nlos2_localedir = LOCALEDIR;
+    }
+
+  if (strlen (_nlos2_localedir) <= MAXPATHLEN)
+    strcpy (libintl_nl_default_dirname, _nlos2_localedir);
+}

Added: tuxmath/trunk/intl/os2compat.h
===================================================================
--- tuxmath/trunk/intl/os2compat.h	                        (rev 0)
+++ tuxmath/trunk/intl/os2compat.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,46 @@
+/* OS/2 compatibility defines.
+   This file is intended to be included from config.h
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* When included from os2compat.h we need all the original definitions */
+#ifndef OS2_AWARE
+
+#undef LIBDIR
+#define LIBDIR			_nlos2_libdir
+extern char *_nlos2_libdir;
+
+#undef LOCALEDIR
+#define LOCALEDIR		_nlos2_localedir
+extern char *_nlos2_localedir;
+
+#undef LOCALE_ALIAS_PATH
+#define LOCALE_ALIAS_PATH	_nlos2_localealiaspath
+extern char *_nlos2_localealiaspath;
+
+#endif
+
+#undef HAVE_STRCASECMP
+#define HAVE_STRCASECMP 1
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+
+/* We have our own getenv() which works even if library is compiled as DLL */
+#define getenv _nl_getenv
+
+/* Older versions of gettext used -1 as the value of LC_MESSAGES */
+#define LC_MESSAGES_COMPAT (-1)

Added: tuxmath/trunk/intl/osdep.c
===================================================================
--- tuxmath/trunk/intl/osdep.c	                        (rev 0)
+++ tuxmath/trunk/intl/osdep.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,26 @@
+/* OS dependent parts of libintl.
+   Copyright (C) 2001-2002, 2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#if defined __CYGWIN__
+# include "intl-exports.c"
+#elif defined __EMX__
+# include "os2compat.c"
+#else
+/* Avoid AIX compiler warning.  */
+typedef int dummy;
+#endif

Added: tuxmath/trunk/intl/plural-exp.c
===================================================================
--- tuxmath/trunk/intl/plural-exp.c	                        (rev 0)
+++ tuxmath/trunk/intl/plural-exp.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,155 @@
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003, 2005-2007 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plural-exp.h"
+
+#if (defined __GNUC__ && !(__APPLE_CC__ > 1) && !defined __cplusplus) \
+    || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+
+/* These structs are the constant expression for the germanic plural
+   form determination.  It represents the expression  "n != 1".  */
+static const struct expression plvar =
+{
+  .nargs = 0,
+  .operation = var,
+};
+static const struct expression plone =
+{
+  .nargs = 0,
+  .operation = num,
+  .val =
+  {
+    .num = 1
+  }
+};
+struct expression GERMANIC_PLURAL =
+{
+  .nargs = 2,
+  .operation = not_equal,
+  .val =
+  {
+    .args =
+    {
+      [0] = (struct expression *) &plvar,
+      [1] = (struct expression *) &plone
+    }
+  }
+};
+
+# define INIT_GERMANIC_PLURAL()
+
+#else
+
+/* For compilers without support for ISO C 99 struct/union initializers:
+   Initialization at run-time.  */
+
+static struct expression plvar;
+static struct expression plone;
+struct expression GERMANIC_PLURAL;
+
+static void
+init_germanic_plural ()
+{
+  if (plone.val.num == 0)
+    {
+      plvar.nargs = 0;
+      plvar.operation = var;
+
+      plone.nargs = 0;
+      plone.operation = num;
+      plone.val.num = 1;
+
+      GERMANIC_PLURAL.nargs = 2;
+      GERMANIC_PLURAL.operation = not_equal;
+      GERMANIC_PLURAL.val.args[0] = &plvar;
+      GERMANIC_PLURAL.val.args[1] = &plone;
+    }
+}
+
+# define INIT_GERMANIC_PLURAL() init_germanic_plural ()
+
+#endif
+
+void
+internal_function
+EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+			   const struct expression **pluralp,
+			   unsigned long int *npluralsp)
+{
+  if (nullentry != NULL)
+    {
+      const char *plural;
+      const char *nplurals;
+
+      plural = strstr (nullentry, "plural=");
+      nplurals = strstr (nullentry, "nplurals=");
+      if (plural == NULL || nplurals == NULL)
+	goto no_plural;
+      else
+	{
+	  char *endp;
+	  unsigned long int n;
+	  struct parse_args args;
+
+	  /* First get the number.  */
+	  nplurals += 9;
+	  while (*nplurals != '\0' && isspace ((unsigned char) *nplurals))
+	    ++nplurals;
+	  if (!(*nplurals >= '0' && *nplurals <= '9'))
+	    goto no_plural;
+#if defined HAVE_STRTOUL || defined _LIBC
+	  n = strtoul (nplurals, &endp, 10);
+#else
+	  for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++)
+	    n = n * 10 + (*endp - '0');
+#endif
+	  if (nplurals == endp)
+	    goto no_plural;
+	  *npluralsp = n;
+
+	  /* Due to the restrictions bison imposes onto the interface of the
+	     scanner function we have to put the input string and the result
+	     passed up from the parser into the same structure which address
+	     is passed down to the parser.  */
+	  plural += 7;
+	  args.cp = plural;
+	  if (PLURAL_PARSE (&args) != 0)
+	    goto no_plural;
+	  *pluralp = args.res;
+	}
+    }
+  else
+    {
+      /* By default we are using the Germanic form: singular form only
+         for `one', the plural form otherwise.  Yes, this is also what
+         English is using since English is a Germanic language.  */
+    no_plural:
+      INIT_GERMANIC_PLURAL ();
+      *pluralp = &GERMANIC_PLURAL;
+      *npluralsp = 2;
+    }
+}

Added: tuxmath/trunk/intl/plural-exp.h
===================================================================
--- tuxmath/trunk/intl/plural-exp.h	                        (rev 0)
+++ tuxmath/trunk/intl/plural-exp.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,129 @@
+/* Expression parsing and evaluation for plural form selection.
+   Copyright (C) 2000-2003, 2005-2007 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PLURAL_EXP_H
+#define _PLURAL_EXP_H
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+enum expression_operator
+{
+  /* Without arguments:  */
+  var,				/* The variable "n".  */
+  num,				/* Decimal number.  */
+  /* Unary operators:  */
+  lnot,				/* Logical NOT.  */
+  /* Binary operators:  */
+  mult,				/* Multiplication.  */
+  divide,			/* Division.  */
+  module,			/* Modulo operation.  */
+  plus,				/* Addition.  */
+  minus,			/* Subtraction.  */
+  less_than,			/* Comparison.  */
+  greater_than,			/* Comparison.  */
+  less_or_equal,		/* Comparison.  */
+  greater_or_equal,		/* Comparison.  */
+  equal,			/* Comparison for equality.  */
+  not_equal,			/* Comparison for inequality.  */
+  land,				/* Logical AND.  */
+  lor,				/* Logical OR.  */
+  /* Ternary operators:  */
+  qmop				/* Question mark operator.  */
+};
+
+/* This is the representation of the expressions to determine the
+   plural form.  */
+struct expression
+{
+  int nargs;			/* Number of arguments.  */
+  enum expression_operator operation;
+  union
+  {
+    unsigned long int num;	/* Number value for `num'.  */
+    struct expression *args[3];	/* Up to three arguments.  */
+  } val;
+};
+
+/* This is the data structure to pass information to the parser and get
+   the result in a thread-safe way.  */
+struct parse_args
+{
+  const char *cp;
+  struct expression *res;
+};
+
+
+/* Names for the libintl functions are a problem.  This source code is used
+   1. in the GNU C Library library,
+   2. in the GNU libintl library,
+   3. in the GNU gettext tools.
+   The function names in each situation must be different, to allow for
+   binary incompatible changes in 'struct expression'.  Furthermore,
+   1. in the GNU C Library library, the names have a __ prefix,
+   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
+         must follow ANSI C and not start with __.
+   So we have to distinguish the three cases.  */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+# define PLURAL_PARSE __gettextparse
+# define GERMANIC_PLURAL __gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
+#elif defined (IN_LIBINTL)
+# define FREE_EXPRESSION libintl_gettext_free_exp
+# define PLURAL_PARSE libintl_gettextparse
+# define GERMANIC_PLURAL libintl_gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
+#else
+# define FREE_EXPRESSION free_plural_expression
+# define PLURAL_PARSE parse_plural_expression
+# define GERMANIC_PLURAL germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
+#endif
+
+extern void FREE_EXPRESSION (struct expression *exp)
+     internal_function;
+extern int PLURAL_PARSE (void *arg);
+extern struct expression GERMANIC_PLURAL attribute_hidden;
+extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+				       const struct expression **pluralp,
+				       unsigned long int *npluralsp)
+     internal_function;
+
+#if !defined (_LIBC) && !defined (IN_LIBINTL) && !defined (IN_LIBGLOCALE)
+extern unsigned long int plural_eval (const struct expression *pexp,
+				      unsigned long int n);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PLURAL_EXP_H */

Added: tuxmath/trunk/intl/plural.c
===================================================================
--- tuxmath/trunk/intl/plural.c	                        (rev 0)
+++ tuxmath/trunk/intl/plural.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,1961 @@
+/* A Bison parser, made by GNU Bison 2.3a.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+
+   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.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.3a"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 1
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse __gettextparse
+#define yylex   __gettextlex
+#define yyerror __gettexterror
+#define yylval  __gettextlval
+#define yychar  __gettextchar
+#define yydebug __gettextdebug
+#define yynerrs __gettextnerrs
+
+
+/* Copy the first part of user declarations.  */
+/* Line 164 of yacc.c.  */
+#line 1 "plural.y"
+
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* For bison < 2.0, the bison generated parser uses alloca.  AIX 3 forces us
+   to put this declaration at the beginning of the file.  The declaration in
+   bison's skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.
+   This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM	&((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM	arg
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     EQUOP2 = 258,
+     CMPOP2 = 259,
+     ADDOP2 = 260,
+     MULOP2 = 261,
+     NUMBER = 262
+   };
+#endif
+/* Tokens.  */
+#define EQUOP2 258
+#define CMPOP2 259
+#define ADDOP2 260
+#define MULOP2 261
+#define NUMBER 262
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{/* Line 191 of yacc.c.  */
+#line 51 "plural.y"
+
+  unsigned long int num;
+  enum expression_operator op;
+  struct expression *exp;
+}
+/* Line 191 of yacc.c.  */
+#line 175 "plural.c"
+	YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
+/* Copy the second part of user declarations.  */
+/* Line 221 of yacc.c.  */
+#line 57 "plural.y"
+
+/* Prototypes for local functions.  */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (int nargs, enum expression_operator op,
+	 struct expression * const *args)
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+	newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum expression_operator op)
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum expression_operator op, struct expression *right)
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum expression_operator op, struct expression *left,
+	   struct expression *right)
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum expression_operator op, struct expression *bexp,
+	   struct expression *tbranch, struct expression *fbranch)
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+
+/* Line 221 of yacc.c.  */
+#line 265 "plural.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)					\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack, Stack, yysize);				\
+	Stack = &yyptr->Stack;						\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  9
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   54
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  16
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  3
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  13
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  27
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   262
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    10,     2,     2,     2,     2,     5,     2,
+      14,    15,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    12,     2,
+       2,     2,     2,     3,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      13,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     4,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     6,     7,
+       8,     9,    11
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint8 yyprhs[] =
+{
+       0,     0,     3,     5,    11,    15,    19,    23,    27,    31,
+      35,    38,    40,    42
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
+{
+      17,     0,    -1,    18,    -1,    18,     3,    18,    12,    18,
+      -1,    18,     4,    18,    -1,    18,     5,    18,    -1,    18,
+       6,    18,    -1,    18,     7,    18,    -1,    18,     8,    18,
+      -1,    18,     9,    18,    -1,    10,    18,    -1,    13,    -1,
+      11,    -1,    14,    18,    15,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint8 yyrline[] =
+{
+       0,   154,   154,   162,   166,   170,   174,   178,   182,   186,
+     190,   194,   198,   203
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2",
+  "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'",
+  "$accept", "start", "exp", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,    63,   124,    38,   258,   259,   260,   261,
+      33,   262,    58,   110,    40,    41
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    16,    17,    18,    18,    18,    18,    18,    18,    18,
+      18,    18,    18,    18
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     1,     5,     3,     3,     3,     3,     3,     3,
+       2,     1,     1,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       0,     0,    12,    11,     0,     0,     2,    10,     0,     1,
+       0,     0,     0,     0,     0,     0,     0,    13,     0,     4,
+       5,     6,     7,     8,     9,     0,     3
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
+{
+      -1,     5,     6
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -10
+static const yytype_int8 yypact[] =
+{
+      -9,    -9,   -10,   -10,    -9,     8,    36,   -10,    13,   -10,
+      -9,    -9,    -9,    -9,    -9,    -9,    -9,   -10,    26,    41,
+      45,    18,    -2,    14,   -10,    -9,    36
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
+{
+     -10,   -10,    -1
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
+static const yytype_uint8 yytable[] =
+{
+       7,     1,     2,     8,     3,     4,    15,    16,     9,    18,
+      19,    20,    21,    22,    23,    24,    10,    11,    12,    13,
+      14,    15,    16,    16,    26,    14,    15,    16,    17,    10,
+      11,    12,    13,    14,    15,    16,     0,     0,    25,    10,
+      11,    12,    13,    14,    15,    16,    12,    13,    14,    15,
+      16,    13,    14,    15,    16
+};
+
+static const yytype_int8 yycheck[] =
+{
+       1,    10,    11,     4,    13,    14,     8,     9,     0,    10,
+      11,    12,    13,    14,    15,    16,     3,     4,     5,     6,
+       7,     8,     9,     9,    25,     7,     8,     9,    15,     3,
+       4,     5,     6,     7,     8,     9,    -1,    -1,    12,     3,
+       4,     5,     6,     7,     8,     9,     5,     6,     7,     8,
+       9,     6,     7,     8,     9
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,    10,    11,    13,    14,    17,    18,    18,    18,     0,
+       3,     4,     5,     6,     7,     8,     9,    15,    18,    18,
+      18,    18,    18,    18,    18,    12,    18
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK (1);						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (YYID (0))
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (YYID (N))                                                    \
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval)
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      fprintf (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+	break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  /* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+  int yystate;
+  int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack.  Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	yytype_int16 *yyss1 = yyss;
+
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	yytype_int16 *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss);
+	YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+/* Line 1269 of yacc.c.  */
+#line 155 "plural.y"
+    {
+	    if ((yyvsp[(1) - (1)].exp) == NULL)
+	      YYABORT;
+	    ((struct parse_args *) arg)->res = (yyvsp[(1) - (1)].exp);
+	  }
+    break;
+
+  case 3:
+/* Line 1269 of yacc.c.  */
+#line 163 "plural.y"
+    {
+	    (yyval.exp) = new_exp_3 (qmop, (yyvsp[(1) - (5)].exp), (yyvsp[(3) - (5)].exp), (yyvsp[(5) - (5)].exp));
+	  }
+    break;
+
+  case 4:
+/* Line 1269 of yacc.c.  */
+#line 167 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 (lor, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 5:
+/* Line 1269 of yacc.c.  */
+#line 171 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 (land, (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 6:
+/* Line 1269 of yacc.c.  */
+#line 175 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 7:
+/* Line 1269 of yacc.c.  */
+#line 179 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 8:
+/* Line 1269 of yacc.c.  */
+#line 183 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 9:
+/* Line 1269 of yacc.c.  */
+#line 187 "plural.y"
+    {
+	    (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].exp), (yyvsp[(3) - (3)].exp));
+	  }
+    break;
+
+  case 10:
+/* Line 1269 of yacc.c.  */
+#line 191 "plural.y"
+    {
+	    (yyval.exp) = new_exp_1 (lnot, (yyvsp[(2) - (2)].exp));
+	  }
+    break;
+
+  case 11:
+/* Line 1269 of yacc.c.  */
+#line 195 "plural.y"
+    {
+	    (yyval.exp) = new_exp_0 (var);
+	  }
+    break;
+
+  case 12:
+/* Line 1269 of yacc.c.  */
+#line 199 "plural.y"
+    {
+	    if (((yyval.exp) = new_exp_0 (num)) != NULL)
+	      (yyval.exp)->val.num = (yyvsp[(1) - (1)].num);
+	  }
+    break;
+
+  case 13:
+/* Line 1269 of yacc.c.  */
+#line 204 "plural.y"
+    {
+	    (yyval.exp) = (yyvsp[(2) - (3)].exp);
+	  }
+    break;
+
+
+/* Line 1269 of yacc.c.  */
+#line 1572 "plural.c"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
+	      YYSTACK_FREE (yymsg);
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
+	      goto yyexhaustedlab;
+	  }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+	{
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+	}
+      else
+	{
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+/* Line 1486 of yacc.c.  */
+#line 209 "plural.y"
+
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+	{
+	  *pexp = exp;
+	  return YYEOF;
+	}
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+	break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+	unsigned long int n = result - '0';
+	while (exp[0] >= '0' && exp[0] <= '9')
+	  {
+	    n *= 10;
+	    n += exp[0] - '0';
+	    ++exp;
+	  }
+	lval->num = n;
+	result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = equal;
+	  result = EQUOP2;
+	}
+      else
+	result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = not_equal;
+	  result = EQUOP2;
+	}
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+	++exp;
+      else
+	result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = less_or_equal;
+	}
+      else
+	lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = greater_or_equal;
+	}
+      else
+	lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+  /* Do nothing.  We don't print error messages here.  */
+}
+

Added: tuxmath/trunk/intl/plural.y
===================================================================
--- tuxmath/trunk/intl/plural.y	                        (rev 0)
+++ tuxmath/trunk/intl/plural.y	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,385 @@
+%{
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper at cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* For bison < 2.0, the bison generated parser uses alloca.  AIX 3 forces us
+   to put this declaration at the beginning of the file.  The declaration in
+   bison's skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.
+   This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM	&((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM	arg
+%}
+%pure_parser
+%expect 7
+
+%union {
+  unsigned long int num;
+  enum expression_operator op;
+  struct expression *exp;
+}
+
+%{
+/* Prototypes for local functions.  */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (int nargs, enum expression_operator op,
+	 struct expression * const *args)
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+	newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum expression_operator op)
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum expression_operator op, struct expression *right)
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum expression_operator op, struct expression *left,
+	   struct expression *right)
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum expression_operator op, struct expression *bexp,
+	   struct expression *tbranch, struct expression *fbranch)
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+%}
+
+/* This declares that all operators have the same associativity and the
+   precedence order as in C.  See [Harbison, Steele: C, A Reference Manual].
+   There is no unary minus and no bitwise operators.
+   Operators with the same syntactic behaviour have been merged into a single
+   token, to save space in the array generated by bison.  */
+%right '?'		/*   ?		*/
+%left '|'		/*   ||		*/
+%left '&'		/*   &&		*/
+%left EQUOP2		/*   == !=	*/
+%left CMPOP2		/*   < > <= >=	*/
+%left ADDOP2		/*   + -	*/
+%left MULOP2		/*   * / %	*/
+%right '!'		/*   !		*/
+
+%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+%token <num> NUMBER
+%type <exp> exp
+
+%%
+
+start:	  exp
+	  {
+	    if ($1 == NULL)
+	      YYABORT;
+	    ((struct parse_args *) arg)->res = $1;
+	  }
+	;
+
+exp:	  exp '?' exp ':' exp
+	  {
+	    $$ = new_exp_3 (qmop, $1, $3, $5);
+	  }
+	| exp '|' exp
+	  {
+	    $$ = new_exp_2 (lor, $1, $3);
+	  }
+	| exp '&' exp
+	  {
+	    $$ = new_exp_2 (land, $1, $3);
+	  }
+	| exp EQUOP2 exp
+	  {
+	    $$ = new_exp_2 ($2, $1, $3);
+	  }
+	| exp CMPOP2 exp
+	  {
+	    $$ = new_exp_2 ($2, $1, $3);
+	  }
+	| exp ADDOP2 exp
+	  {
+	    $$ = new_exp_2 ($2, $1, $3);
+	  }
+	| exp MULOP2 exp
+	  {
+	    $$ = new_exp_2 ($2, $1, $3);
+	  }
+	| '!' exp
+	  {
+	    $$ = new_exp_1 (lnot, $2);
+	  }
+	| 'n'
+	  {
+	    $$ = new_exp_0 (var);
+	  }
+	| NUMBER
+	  {
+	    if (($$ = new_exp_0 (num)) != NULL)
+	      $$->val.num = $1;
+	  }
+	| '(' exp ')'
+	  {
+	    $$ = $2;
+	  }
+	;
+
+%%
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+	{
+	  *pexp = exp;
+	  return YYEOF;
+	}
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+	break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+	unsigned long int n = result - '0';
+	while (exp[0] >= '0' && exp[0] <= '9')
+	  {
+	    n *= 10;
+	    n += exp[0] - '0';
+	    ++exp;
+	  }
+	lval->num = n;
+	result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = equal;
+	  result = EQUOP2;
+	}
+      else
+	result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = not_equal;
+	  result = EQUOP2;
+	}
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+	++exp;
+      else
+	result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = less_or_equal;
+	}
+      else
+	lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+	{
+	  ++exp;
+	  lval->op = greater_or_equal;
+	}
+      else
+	lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+  /* Do nothing.  We don't print error messages here.  */
+}

Added: tuxmath/trunk/intl/printf-args.c
===================================================================
--- tuxmath/trunk/intl/printf-args.c	                        (rev 0)
+++ tuxmath/trunk/intl/printf-args.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,188 @@
+/* Decomposed printf argument list.
+   Copyright (C) 1999, 2002-2003, 2005-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* This file can be parametrized with the following macros:
+     ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
+     PRINTF_FETCHARGS   Name of the function to be defined.
+     STATIC             Set to 'static' to declare the function static.  */
+
+#ifndef PRINTF_FETCHARGS
+# include <config.h>
+#endif
+
+/* Specification.  */
+#ifndef PRINTF_FETCHARGS
+# include "printf-args.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_FETCHARGS (va_list args, arguments *a)
+{
+  size_t i;
+  argument *ap;
+
+  for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+    switch (ap->type)
+      {
+      case TYPE_SCHAR:
+	ap->a.a_schar = va_arg (args, /*signed char*/ int);
+	break;
+      case TYPE_UCHAR:
+	ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+	break;
+      case TYPE_SHORT:
+	ap->a.a_short = va_arg (args, /*short*/ int);
+	break;
+      case TYPE_USHORT:
+	ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+	break;
+      case TYPE_INT:
+	ap->a.a_int = va_arg (args, int);
+	break;
+      case TYPE_UINT:
+	ap->a.a_uint = va_arg (args, unsigned int);
+	break;
+      case TYPE_LONGINT:
+	ap->a.a_longint = va_arg (args, long int);
+	break;
+      case TYPE_ULONGINT:
+	ap->a.a_ulongint = va_arg (args, unsigned long int);
+	break;
+#if HAVE_LONG_LONG_INT
+      case TYPE_LONGLONGINT:
+	ap->a.a_longlongint = va_arg (args, long long int);
+	break;
+      case TYPE_ULONGLONGINT:
+	ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+	break;
+#endif
+      case TYPE_DOUBLE:
+	ap->a.a_double = va_arg (args, double);
+	break;
+      case TYPE_LONGDOUBLE:
+	ap->a.a_longdouble = va_arg (args, long double);
+	break;
+      case TYPE_CHAR:
+	ap->a.a_char = va_arg (args, int);
+	break;
+#if HAVE_WINT_T
+      case TYPE_WIDE_CHAR:
+	/* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+	   default argument promotions", this is not the case in mingw32,
+	   where wint_t is 'unsigned short'.  */
+	ap->a.a_wide_char =
+	  (sizeof (wint_t) < sizeof (int)
+	   ? va_arg (args, int)
+	   : va_arg (args, wint_t));
+	break;
+#endif
+      case TYPE_STRING:
+	ap->a.a_string = va_arg (args, const char *);
+	/* A null pointer is an invalid argument for "%s", but in practice
+	   it occurs quite frequently in printf statements that produce
+	   debug output.  Use a fallback in this case.  */
+	if (ap->a.a_string == NULL)
+	  ap->a.a_string = "(NULL)";
+	break;
+#if HAVE_WCHAR_T
+      case TYPE_WIDE_STRING:
+	ap->a.a_wide_string = va_arg (args, const wchar_t *);
+	/* A null pointer is an invalid argument for "%ls", but in practice
+	   it occurs quite frequently in printf statements that produce
+	   debug output.  Use a fallback in this case.  */
+	if (ap->a.a_wide_string == NULL)
+	  {
+	    static const wchar_t wide_null_string[] =
+	      {
+		(wchar_t)'(',
+		(wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+		(wchar_t)')',
+		(wchar_t)0
+	      };
+	    ap->a.a_wide_string = wide_null_string;
+	  }
+	break;
+#endif
+      case TYPE_POINTER:
+	ap->a.a_pointer = va_arg (args, void *);
+	break;
+      case TYPE_COUNT_SCHAR_POINTER:
+	ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+	break;
+      case TYPE_COUNT_SHORT_POINTER:
+	ap->a.a_count_short_pointer = va_arg (args, short *);
+	break;
+      case TYPE_COUNT_INT_POINTER:
+	ap->a.a_count_int_pointer = va_arg (args, int *);
+	break;
+      case TYPE_COUNT_LONGINT_POINTER:
+	ap->a.a_count_longint_pointer = va_arg (args, long int *);
+	break;
+#if HAVE_LONG_LONG_INT
+      case TYPE_COUNT_LONGLONGINT_POINTER:
+	ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+	break;
+#endif
+#if ENABLE_UNISTDIO
+      /* The unistdio extensions.  */
+      case TYPE_U8_STRING:
+	ap->a.a_u8_string = va_arg (args, const uint8_t *);
+	/* A null pointer is an invalid argument for "%U", but in practice
+	   it occurs quite frequently in printf statements that produce
+	   debug output.  Use a fallback in this case.  */
+	if (ap->a.a_u8_string == NULL)
+	  {
+	    static const uint8_t u8_null_string[] =
+	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
+	    ap->a.a_u8_string = u8_null_string;
+	  }
+	break;
+      case TYPE_U16_STRING:
+	ap->a.a_u16_string = va_arg (args, const uint16_t *);
+	/* A null pointer is an invalid argument for "%lU", but in practice
+	   it occurs quite frequently in printf statements that produce
+	   debug output.  Use a fallback in this case.  */
+	if (ap->a.a_u16_string == NULL)
+	  {
+	    static const uint16_t u16_null_string[] =
+	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
+	    ap->a.a_u16_string = u16_null_string;
+	  }
+	break;
+      case TYPE_U32_STRING:
+	ap->a.a_u32_string = va_arg (args, const uint32_t *);
+	/* A null pointer is an invalid argument for "%llU", but in practice
+	   it occurs quite frequently in printf statements that produce
+	   debug output.  Use a fallback in this case.  */
+	if (ap->a.a_u32_string == NULL)
+	  {
+	    static const uint32_t u32_null_string[] =
+	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
+	    ap->a.a_u32_string = u32_null_string;
+	  }
+	break;
+#endif
+      default:
+	/* Unknown type.  */
+	return -1;
+      }
+  return 0;
+}

Added: tuxmath/trunk/intl/printf-args.h
===================================================================
--- tuxmath/trunk/intl/printf-args.h	                        (rev 0)
+++ tuxmath/trunk/intl/printf-args.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,155 @@
+/* Decomposed printf argument list.
+   Copyright (C) 1999, 2002-2003, 2006-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* This file can be parametrized with the following macros:
+     ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
+     PRINTF_FETCHARGS   Name of the function to be declared.
+     STATIC             Set to 'static' to declare the function static.  */
+
+/* Default parameters.  */
+#ifndef PRINTF_FETCHARGS
+# define PRINTF_FETCHARGS printf_fetchargs
+#endif
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Get wchar_t.  */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t.  */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+  TYPE_NONE,
+  TYPE_SCHAR,
+  TYPE_UCHAR,
+  TYPE_SHORT,
+  TYPE_USHORT,
+  TYPE_INT,
+  TYPE_UINT,
+  TYPE_LONGINT,
+  TYPE_ULONGINT,
+#if HAVE_LONG_LONG_INT
+  TYPE_LONGLONGINT,
+  TYPE_ULONGLONGINT,
+#endif
+  TYPE_DOUBLE,
+  TYPE_LONGDOUBLE,
+  TYPE_CHAR,
+#if HAVE_WINT_T
+  TYPE_WIDE_CHAR,
+#endif
+  TYPE_STRING,
+#if HAVE_WCHAR_T
+  TYPE_WIDE_STRING,
+#endif
+  TYPE_POINTER,
+  TYPE_COUNT_SCHAR_POINTER,
+  TYPE_COUNT_SHORT_POINTER,
+  TYPE_COUNT_INT_POINTER,
+  TYPE_COUNT_LONGINT_POINTER
+#if HAVE_LONG_LONG_INT
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+#if ENABLE_UNISTDIO
+  /* The unistdio extensions.  */
+, TYPE_U8_STRING
+, TYPE_U16_STRING
+, TYPE_U32_STRING
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+  arg_type type;
+  union
+  {
+    signed char			a_schar;
+    unsigned char		a_uchar;
+    short			a_short;
+    unsigned short		a_ushort;
+    int				a_int;
+    unsigned int		a_uint;
+    long int			a_longint;
+    unsigned long int		a_ulongint;
+#if HAVE_LONG_LONG_INT
+    long long int		a_longlongint;
+    unsigned long long int	a_ulonglongint;
+#endif
+    float			a_float;
+    double			a_double;
+    long double			a_longdouble;
+    int				a_char;
+#if HAVE_WINT_T
+    wint_t			a_wide_char;
+#endif
+    const char*			a_string;
+#if HAVE_WCHAR_T
+    const wchar_t*		a_wide_string;
+#endif
+    void*			a_pointer;
+    signed char *		a_count_schar_pointer;
+    short *			a_count_short_pointer;
+    int *			a_count_int_pointer;
+    long int *			a_count_longint_pointer;
+#if HAVE_LONG_LONG_INT
+    long long int *		a_count_longlongint_pointer;
+#endif
+#if ENABLE_UNISTDIO
+    /* The unistdio extensions.  */
+    const uint8_t *		a_u8_string;
+    const uint16_t *		a_u16_string;
+    const uint32_t *		a_u32_string;
+#endif
+  }
+  a;
+}
+argument;
+
+typedef struct
+{
+  size_t count;
+  argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int PRINTF_FETCHARGS (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */

Added: tuxmath/trunk/intl/printf-parse.c
===================================================================
--- tuxmath/trunk/intl/printf-parse.c	                        (rev 0)
+++ tuxmath/trunk/intl/printf-parse.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,590 @@
+/* Formatted output to strings.
+   Copyright (C) 1999-2000, 2002-2003, 2006-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* This file can be parametrized with the following macros:
+     CHAR_T             The element type of the format string.
+     CHAR_T_ONLY_ASCII  Set to 1 to enable verification that all characters
+                        in the format string are ASCII.
+     DIRECTIVE          Structure denoting a format directive.
+                        Depends on CHAR_T.
+     DIRECTIVES         Structure denoting the set of format directives of a
+                        format string.  Depends on CHAR_T.
+     PRINTF_PARSE       Function that parses a format string.
+                        Depends on CHAR_T.
+     STATIC             Set to 'static' to declare the function static.
+     ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.  */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
+
+/* Specification.  */
+#ifndef PRINTF_PARSE
+# include "printf-parse.h"
+#endif
+
+/* Default parameters.  */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+/* Get size_t, NULL.  */
+#include <stddef.h>
+
+/* Get intmax_t.  */
+#if defined IN_LIBINTL || defined IN_LIBASPRINTF
+# if HAVE_STDINT_H_WITH_UINTMAX
+#  include <stdint.h>
+# endif
+# if HAVE_INTTYPES_H_WITH_UINTMAX
+#  include <inttypes.h>
+# endif
+#else
+# include <stdint.h>
+#endif
+
+/* malloc(), realloc(), free().  */
+#include <stdlib.h>
+
+/* errno.  */
+#include <errno.h>
+
+/* Checked size_t computations.  */
+#include "xsize.h"
+
+#if CHAR_T_ONLY_ASCII
+/* c_isascii().  */
+# include "c-ctype.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+  const CHAR_T *cp = format;		/* pointer into format */
+  size_t arg_posn = 0;		/* number of regular arguments consumed */
+  size_t d_allocated;			/* allocated elements of d->dir */
+  size_t a_allocated;			/* allocated elements of a->arg */
+  size_t max_width_length = 0;
+  size_t max_precision_length = 0;
+
+  d->count = 0;
+  d_allocated = 1;
+  d->dir = (DIRECTIVE *) malloc (d_allocated * sizeof (DIRECTIVE));
+  if (d->dir == NULL)
+    /* Out of memory.  */
+    goto out_of_memory_1;
+
+  a->count = 0;
+  a_allocated = 0;
+  a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+  {									\
+    size_t n = (_index_);						\
+    if (n >= a_allocated)						\
+      {									\
+	size_t memory_size;						\
+	argument *memory;						\
+									\
+	a_allocated = xtimes (a_allocated, 2);				\
+	if (a_allocated <= n)						\
+	  a_allocated = xsum (n, 1);					\
+	memory_size = xtimes (a_allocated, sizeof (argument));		\
+	if (size_overflow_p (memory_size))				\
+	  /* Overflow, would lead to out of memory.  */			\
+	  goto out_of_memory;						\
+	memory = (argument *) (a->arg					\
+			       ? realloc (a->arg, memory_size)		\
+			       : malloc (memory_size));			\
+	if (memory == NULL)						\
+	  /* Out of memory.  */						\
+	  goto out_of_memory;						\
+	a->arg = memory;						\
+      }									\
+    while (a->count <= n)						\
+      a->arg[a->count++].type = TYPE_NONE;				\
+    if (a->arg[n].type == TYPE_NONE)					\
+      a->arg[n].type = (_type_);					\
+    else if (a->arg[n].type != (_type_))				\
+      /* Ambiguous type for positional argument.  */			\
+      goto error;							\
+  }
+
+  while (*cp != '\0')
+    {
+      CHAR_T c = *cp++;
+      if (c == '%')
+	{
+	  size_t arg_index = ARG_NONE;
+	  DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
+
+	  /* Initialize the next directive.  */
+	  dp->dir_start = cp - 1;
+	  dp->flags = 0;
+	  dp->width_start = NULL;
+	  dp->width_end = NULL;
+	  dp->width_arg_index = ARG_NONE;
+	  dp->precision_start = NULL;
+	  dp->precision_end = NULL;
+	  dp->precision_arg_index = ARG_NONE;
+	  dp->arg_index = ARG_NONE;
+
+	  /* Test for positional argument.  */
+	  if (*cp >= '0' && *cp <= '9')
+	    {
+	      const CHAR_T *np;
+
+	      for (np = cp; *np >= '0' && *np <= '9'; np++)
+		;
+	      if (*np == '$')
+		{
+		  size_t n = 0;
+
+		  for (np = cp; *np >= '0' && *np <= '9'; np++)
+		    n = xsum (xtimes (n, 10), *np - '0');
+		  if (n == 0)
+		    /* Positional argument 0.  */
+		    goto error;
+		  if (size_overflow_p (n))
+		    /* n too large, would lead to out of memory later.  */
+		    goto error;
+		  arg_index = n - 1;
+		  cp = np + 1;
+		}
+	    }
+
+	  /* Read the flags.  */
+	  for (;;)
+	    {
+	      if (*cp == '\'')
+		{
+		  dp->flags |= FLAG_GROUP;
+		  cp++;
+		}
+	      else if (*cp == '-')
+		{
+		  dp->flags |= FLAG_LEFT;
+		  cp++;
+		}
+	      else if (*cp == '+')
+		{
+		  dp->flags |= FLAG_SHOWSIGN;
+		  cp++;
+		}
+	      else if (*cp == ' ')
+		{
+		  dp->flags |= FLAG_SPACE;
+		  cp++;
+		}
+	      else if (*cp == '#')
+		{
+		  dp->flags |= FLAG_ALT;
+		  cp++;
+		}
+	      else if (*cp == '0')
+		{
+		  dp->flags |= FLAG_ZERO;
+		  cp++;
+		}
+	      else
+		break;
+	    }
+
+	  /* Parse the field width.  */
+	  if (*cp == '*')
+	    {
+	      dp->width_start = cp;
+	      cp++;
+	      dp->width_end = cp;
+	      if (max_width_length < 1)
+		max_width_length = 1;
+
+	      /* Test for positional argument.  */
+	      if (*cp >= '0' && *cp <= '9')
+		{
+		  const CHAR_T *np;
+
+		  for (np = cp; *np >= '0' && *np <= '9'; np++)
+		    ;
+		  if (*np == '$')
+		    {
+		      size_t n = 0;
+
+		      for (np = cp; *np >= '0' && *np <= '9'; np++)
+			n = xsum (xtimes (n, 10), *np - '0');
+		      if (n == 0)
+			/* Positional argument 0.  */
+			goto error;
+		      if (size_overflow_p (n))
+			/* n too large, would lead to out of memory later.  */
+			goto error;
+		      dp->width_arg_index = n - 1;
+		      cp = np + 1;
+		    }
+		}
+	      if (dp->width_arg_index == ARG_NONE)
+		{
+		  dp->width_arg_index = arg_posn++;
+		  if (dp->width_arg_index == ARG_NONE)
+		    /* arg_posn wrapped around.  */
+		    goto error;
+		}
+	      REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+	    }
+	  else if (*cp >= '0' && *cp <= '9')
+	    {
+	      size_t width_length;
+
+	      dp->width_start = cp;
+	      for (; *cp >= '0' && *cp <= '9'; cp++)
+		;
+	      dp->width_end = cp;
+	      width_length = dp->width_end - dp->width_start;
+	      if (max_width_length < width_length)
+		max_width_length = width_length;
+	    }
+
+	  /* Parse the precision.  */
+	  if (*cp == '.')
+	    {
+	      cp++;
+	      if (*cp == '*')
+		{
+		  dp->precision_start = cp - 1;
+		  cp++;
+		  dp->precision_end = cp;
+		  if (max_precision_length < 2)
+		    max_precision_length = 2;
+
+		  /* Test for positional argument.  */
+		  if (*cp >= '0' && *cp <= '9')
+		    {
+		      const CHAR_T *np;
+
+		      for (np = cp; *np >= '0' && *np <= '9'; np++)
+			;
+		      if (*np == '$')
+			{
+			  size_t n = 0;
+
+			  for (np = cp; *np >= '0' && *np <= '9'; np++)
+			    n = xsum (xtimes (n, 10), *np - '0');
+			  if (n == 0)
+			    /* Positional argument 0.  */
+			    goto error;
+			  if (size_overflow_p (n))
+			    /* n too large, would lead to out of memory
+			       later.  */
+			    goto error;
+			  dp->precision_arg_index = n - 1;
+			  cp = np + 1;
+			}
+		    }
+		  if (dp->precision_arg_index == ARG_NONE)
+		    {
+		      dp->precision_arg_index = arg_posn++;
+		      if (dp->precision_arg_index == ARG_NONE)
+			/* arg_posn wrapped around.  */
+			goto error;
+		    }
+		  REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+		}
+	      else
+		{
+		  size_t precision_length;
+
+		  dp->precision_start = cp - 1;
+		  for (; *cp >= '0' && *cp <= '9'; cp++)
+		    ;
+		  dp->precision_end = cp;
+		  precision_length = dp->precision_end - dp->precision_start;
+		  if (max_precision_length < precision_length)
+		    max_precision_length = precision_length;
+		}
+	    }
+
+	  {
+	    arg_type type;
+
+	    /* Parse argument type/size specifiers.  */
+	    {
+	      int flags = 0;
+
+	      for (;;)
+		{
+		  if (*cp == 'h')
+		    {
+		      flags |= (1 << (flags & 1));
+		      cp++;
+		    }
+		  else if (*cp == 'L')
+		    {
+		      flags |= 4;
+		      cp++;
+		    }
+		  else if (*cp == 'l')
+		    {
+		      flags += 8;
+		      cp++;
+		    }
+		  else if (*cp == 'j')
+		    {
+		      if (sizeof (intmax_t) > sizeof (long))
+			{
+			  /* intmax_t = long long */
+			  flags += 16;
+			}
+		      else if (sizeof (intmax_t) > sizeof (int))
+			{
+			  /* intmax_t = long */
+			  flags += 8;
+			}
+		      cp++;
+		    }
+		  else if (*cp == 'z' || *cp == 'Z')
+		    {
+		      /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+			 because the warning facility in gcc-2.95.2 understands
+			 only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784).  */
+		      if (sizeof (size_t) > sizeof (long))
+			{
+			  /* size_t = long long */
+			  flags += 16;
+			}
+		      else if (sizeof (size_t) > sizeof (int))
+			{
+			  /* size_t = long */
+			  flags += 8;
+			}
+		      cp++;
+		    }
+		  else if (*cp == 't')
+		    {
+		      if (sizeof (ptrdiff_t) > sizeof (long))
+			{
+			  /* ptrdiff_t = long long */
+			  flags += 16;
+			}
+		      else if (sizeof (ptrdiff_t) > sizeof (int))
+			{
+			  /* ptrdiff_t = long */
+			  flags += 8;
+			}
+		      cp++;
+		    }
+		  else
+		    break;
+		}
+
+	      /* Read the conversion character.  */
+	      c = *cp++;
+	      switch (c)
+		{
+		case 'd': case 'i':
+#if HAVE_LONG_LONG_INT
+		  /* If 'long long' exists and is larger than 'long':  */
+		  if (flags >= 16 || (flags & 4))
+		    type = TYPE_LONGLONGINT;
+		  else
+#endif
+		  /* If 'long long' exists and is the same as 'long', we parse
+		     "lld" into TYPE_LONGINT.  */
+		  if (flags >= 8)
+		    type = TYPE_LONGINT;
+		  else if (flags & 2)
+		    type = TYPE_SCHAR;
+		  else if (flags & 1)
+		    type = TYPE_SHORT;
+		  else
+		    type = TYPE_INT;
+		  break;
+		case 'o': case 'u': case 'x': case 'X':
+#if HAVE_LONG_LONG_INT
+		  /* If 'long long' exists and is larger than 'long':  */
+		  if (flags >= 16 || (flags & 4))
+		    type = TYPE_ULONGLONGINT;
+		  else
+#endif
+		  /* If 'unsigned long long' exists and is the same as
+		     'unsigned long', we parse "llu" into TYPE_ULONGINT.  */
+		  if (flags >= 8)
+		    type = TYPE_ULONGINT;
+		  else if (flags & 2)
+		    type = TYPE_UCHAR;
+		  else if (flags & 1)
+		    type = TYPE_USHORT;
+		  else
+		    type = TYPE_UINT;
+		  break;
+		case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+		case 'a': case 'A':
+		  if (flags >= 16 || (flags & 4))
+		    type = TYPE_LONGDOUBLE;
+		  else
+		    type = TYPE_DOUBLE;
+		  break;
+		case 'c':
+		  if (flags >= 8)
+#if HAVE_WINT_T
+		    type = TYPE_WIDE_CHAR;
+#else
+		    goto error;
+#endif
+		  else
+		    type = TYPE_CHAR;
+		  break;
+#if HAVE_WINT_T
+		case 'C':
+		  type = TYPE_WIDE_CHAR;
+		  c = 'c';
+		  break;
+#endif
+		case 's':
+		  if (flags >= 8)
+#if HAVE_WCHAR_T
+		    type = TYPE_WIDE_STRING;
+#else
+		    goto error;
+#endif
+		  else
+		    type = TYPE_STRING;
+		  break;
+#if HAVE_WCHAR_T
+		case 'S':
+		  type = TYPE_WIDE_STRING;
+		  c = 's';
+		  break;
+#endif
+		case 'p':
+		  type = TYPE_POINTER;
+		  break;
+		case 'n':
+#if HAVE_LONG_LONG_INT
+		  /* If 'long long' exists and is larger than 'long':  */
+		  if (flags >= 16 || (flags & 4))
+		    type = TYPE_COUNT_LONGLONGINT_POINTER;
+		  else
+#endif
+		  /* If 'long long' exists and is the same as 'long', we parse
+		     "lln" into TYPE_COUNT_LONGINT_POINTER.  */
+		  if (flags >= 8)
+		    type = TYPE_COUNT_LONGINT_POINTER;
+		  else if (flags & 2)
+		    type = TYPE_COUNT_SCHAR_POINTER;
+		  else if (flags & 1)
+		    type = TYPE_COUNT_SHORT_POINTER;
+		  else
+		    type = TYPE_COUNT_INT_POINTER;
+		  break;
+#if ENABLE_UNISTDIO
+		/* The unistdio extensions.  */
+		case 'U':
+		  if (flags >= 16)
+		    type = TYPE_U32_STRING;
+		  else if (flags >= 8)
+		    type = TYPE_U16_STRING;
+		  else
+		    type = TYPE_U8_STRING;
+		  break;
+#endif
+		case '%':
+		  type = TYPE_NONE;
+		  break;
+		default:
+		  /* Unknown conversion character.  */
+		  goto error;
+		}
+	    }
+
+	    if (type != TYPE_NONE)
+	      {
+		dp->arg_index = arg_index;
+		if (dp->arg_index == ARG_NONE)
+		  {
+		    dp->arg_index = arg_posn++;
+		    if (dp->arg_index == ARG_NONE)
+		      /* arg_posn wrapped around.  */
+		      goto error;
+		  }
+		REGISTER_ARG (dp->arg_index, type);
+	      }
+	    dp->conversion = c;
+	    dp->dir_end = cp;
+	  }
+
+	  d->count++;
+	  if (d->count >= d_allocated)
+	    {
+	      size_t memory_size;
+	      DIRECTIVE *memory;
+
+	      d_allocated = xtimes (d_allocated, 2);
+	      memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+	      if (size_overflow_p (memory_size))
+		/* Overflow, would lead to out of memory.  */
+		goto out_of_memory;
+	      memory = (DIRECTIVE *) realloc (d->dir, memory_size);
+	      if (memory == NULL)
+		/* Out of memory.  */
+		goto out_of_memory;
+	      d->dir = memory;
+	    }
+	}
+#if CHAR_T_ONLY_ASCII
+      else if (!c_isascii (c))
+	{
+	  /* Non-ASCII character.  Not supported.  */
+	  goto error;
+	}
+#endif
+    }
+  d->dir[d->count].dir_start = cp;
+
+  d->max_width_length = max_width_length;
+  d->max_precision_length = max_precision_length;
+  return 0;
+
+error:
+  if (a->arg)
+    free (a->arg);
+  if (d->dir)
+    free (d->dir);
+  errno = EINVAL;
+  return -1;
+
+out_of_memory:
+  if (a->arg)
+    free (a->arg);
+  if (d->dir)
+    free (d->dir);
+out_of_memory_1:
+  errno = ENOMEM;
+  return -1;
+}
+
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
+#undef CHAR_T

Added: tuxmath/trunk/intl/printf-parse.h
===================================================================
--- tuxmath/trunk/intl/printf-parse.h	                        (rev 0)
+++ tuxmath/trunk/intl/printf-parse.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP	 1	/* ' flag */
+#define FLAG_LEFT	 2	/* - flag */
+#define FLAG_SHOWSIGN	 4	/* + flag */
+#define FLAG_SPACE	 8	/* space flag */
+#define FLAG_ALT	16	/* # flag */
+#define FLAG_ZERO	32
+
+/* arg_index value indicating that no argument is consumed.  */
+#define ARG_NONE	(~(size_t)0)
+
+/* A parsed directive.  */
+typedef struct
+{
+  const char* dir_start;
+  const char* dir_end;
+  int flags;
+  const char* width_start;
+  const char* width_end;
+  size_t width_arg_index;
+  const char* precision_start;
+  const char* precision_end;
+  size_t precision_arg_index;
+  char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+  size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string.  */
+typedef struct
+{
+  size_t count;
+  char_directive *dir;
+  size_t max_width_length;
+  size_t max_precision_length;
+}
+char_directives;
+
+
+/* Parses the format string.  Fills in the number N of directives, and fills
+   in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+   to the end of the format string.  Also fills in the arg_type fields of the
+   arguments and the needed count of arguments.  */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+
+#endif /* _PRINTF_PARSE_H */

Added: tuxmath/trunk/intl/printf.c
===================================================================
--- tuxmath/trunk/intl/printf.c	                        (rev 0)
+++ tuxmath/trunk/intl/printf.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,427 @@
+/* Formatted output to strings, using POSIX/XSI format strings with positions.
+   Copyright (C) 2003, 2006-2007 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno at clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdio.h>
+
+#if !HAVE_POSIX_PRINTF
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW.  */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
+/* When building a DLL, we must export some functions.  Note that because
+   the functions are only defined for binary backward compatibility, we
+   don't need to use __declspec(dllimport) in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+#define STATIC static
+
+/* This needs to be consistent with libgnuintl.h.in.  */
+#if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
+/* Don't break __attribute__((format(printf,M,N))).
+   This redefinition is only possible because the libc in NetBSD, Cygwin,
+   mingw does not have a function __printf__.  */
+# define libintl_printf __printf__
+#endif
+
+/* Define auxiliary functions declared in "printf-args.h".  */
+#include "printf-args.c"
+
+/* Define auxiliary functions declared in "printf-parse.h".  */
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h".  */
+#define vasnprintf libintl_vasnprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnprintf libintl_asnprintf
+#include "asnprintf.c"
+#endif
+
+DLL_EXPORTED
+int
+libintl_vfprintf (FILE *stream, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return vfprintf (stream, format, args);
+  else
+    {
+      size_t length;
+      char *result = libintl_vasnprintf (NULL, &length, format, args);
+      int retval = -1;
+      if (result != NULL)
+	{
+	  size_t written = fwrite (result, 1, length, stream);
+	  free (result);
+	  if (written == length)
+	    {
+	      if (length > INT_MAX)
+		errno = EOVERFLOW;
+	      else
+		retval = length;
+	    }
+	}
+      return retval;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_fprintf (FILE *stream, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vfprintf (stream, format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vprintf (const char *format, va_list args)
+{
+  return libintl_vfprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_printf (const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vprintf (format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vsprintf (char *resultbuf, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return vsprintf (resultbuf, format, args);
+  else
+    {
+      size_t length = (size_t) ~0 / (4 * sizeof (char));
+      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+	{
+	  free (result);
+	  return -1;
+	}
+      if (length > INT_MAX)
+	{
+	  errno = EOVERFLOW;
+	  return -1;
+	}
+      else
+	return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_sprintf (char *resultbuf, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vsprintf (resultbuf, format, args);
+  va_end (args);
+  return retval;
+}
+
+#if HAVE_SNPRINTF
+
+# if HAVE_DECL__SNPRINTF
+   /* Windows.  */
+#  define system_vsnprintf _vsnprintf
+# else
+   /* Unix.  */
+#  define system_vsnprintf vsnprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return system_vsnprintf (resultbuf, length, format, args);
+  else
+    {
+      size_t maxlength = length;
+      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+	{
+	  if (maxlength > 0)
+	    {
+	      size_t pruned_length =
+		(length < maxlength ? length : maxlength - 1);
+	      memcpy (resultbuf, result, pruned_length);
+	      resultbuf[pruned_length] = '\0';
+	    }
+	  free (result);
+	}
+      if (length > INT_MAX)
+	{
+	  errno = EOVERFLOW;
+	  return -1;
+	}
+      else
+	return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vsnprintf (resultbuf, length, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#if HAVE_ASPRINTF
+
+DLL_EXPORTED
+int
+libintl_vasprintf (char **resultp, const char *format, va_list args)
+{
+  size_t length;
+  char *result = libintl_vasnprintf (NULL, &length, format, args);
+  if (result == NULL)
+    return -1;
+  if (length > INT_MAX)
+    {
+      free (result);
+      errno = EOVERFLOW;
+      return -1;
+    }
+  *resultp = result;
+  return length;
+}
+
+DLL_EXPORTED
+int
+libintl_asprintf (char **resultp, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vasprintf (resultp, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#if HAVE_FWPRINTF
+
+#include <wchar.h>
+
+#define WIDE_CHAR_VERSION 1
+
+#include "wprintf-parse.h"
+/* Define auxiliary functions declared in "wprintf-parse.h".  */
+#define CHAR_T wchar_t
+#define DIRECTIVE wchar_t_directive
+#define DIRECTIVES wchar_t_directives
+#define PRINTF_PARSE wprintf_parse
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h".  */
+#define vasnwprintf libintl_vasnwprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnwprintf libintl_asnwprintf
+#include "asnprintf.c"
+#endif
+
+# if HAVE_DECL__SNWPRINTF
+   /* Windows.  */
+#  define system_vswprintf _vsnwprintf
+# else
+   /* Unix.  */
+#  define system_vswprintf vswprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
+{
+  if (wcschr (format, '$') == NULL)
+    return vfwprintf (stream, format, args);
+  else
+    {
+      size_t length;
+      wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
+      int retval = -1;
+      if (result != NULL)
+	{
+	  size_t i;
+	  for (i = 0; i < length; i++)
+	    if (fputwc (result[i], stream) == WEOF)
+	      break;
+	  free (result);
+	  if (i == length)
+	    {
+	      if (length > INT_MAX)
+		errno = EOVERFLOW;
+	      else
+		retval = length;
+	    }
+	}
+      return retval;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_fwprintf (FILE *stream, const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vfwprintf (stream, format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vwprintf (const wchar_t *format, va_list args)
+{
+  return libintl_vfwprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_wprintf (const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vwprintf (format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
+{
+  if (wcschr (format, '$') == NULL)
+    return system_vswprintf (resultbuf, length, format, args);
+  else
+    {
+      size_t maxlength = length;
+      wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+	{
+	  if (maxlength > 0)
+	    {
+	      size_t pruned_length =
+		(length < maxlength ? length : maxlength - 1);
+	      memcpy (resultbuf, result, pruned_length * sizeof (wchar_t));
+	      resultbuf[pruned_length] = 0;
+	    }
+	  free (result);
+	  /* Unlike vsnprintf, which has to return the number of character that
+	     would have been produced if the resultbuf had been sufficiently
+	     large, the vswprintf function has to return a negative value if
+	     the resultbuf was not sufficiently large.  */
+	  if (length >= maxlength)
+	    return -1;
+	}
+      if (length > INT_MAX)
+	{
+	  errno = EOVERFLOW;
+	  return -1;
+	}
+      else
+	return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vswprintf (resultbuf, length, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#endif

Added: tuxmath/trunk/intl/ref-add.sin
===================================================================
--- tuxmath/trunk/intl/ref-add.sin	                        (rev 0)
+++ tuxmath/trunk/intl/ref-add.sin	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# Written by Bruno Haible <haible at clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  ta
+  :a
+  s/ @PACKAGE@ / @PACKAGE@ /
+  tb
+  s/ $/ @PACKAGE@ /
+  :b
+  s/^/# Packages using this file:/
+}

Added: tuxmath/trunk/intl/ref-del.sin
===================================================================
--- tuxmath/trunk/intl/ref-del.sin	                        (rev 0)
+++ tuxmath/trunk/intl/ref-del.sin	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# Written by Bruno Haible <haible at clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  s/ @PACKAGE@ / /
+  s/^/# Packages using this file:/
+}

Added: tuxmath/trunk/intl/relocatable.c
===================================================================
--- tuxmath/trunk/intl/relocatable.c	                        (rev 0)
+++ tuxmath/trunk/intl/relocatable.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,468 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003-2006 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno at clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE	1
+#endif
+
+#include <config.h>
+
+/* Specification.  */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xalloc.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'.  */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Original installation prefix.  */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix.  */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash.  Anything that will be concatenated
+   to them must start with a slash.  */
+
+/* Sets the original and the current installation prefix of this module.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+			    const char *curr_prefix_arg)
+{
+  if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+      /* Optimization: if orig_prefix and curr_prefix are equal, the
+	 relocation is a nop.  */
+      && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+    {
+      /* Duplicate the argument strings.  */
+      char *memory;
+
+      orig_prefix_len = strlen (orig_prefix_arg);
+      curr_prefix_len = strlen (curr_prefix_arg);
+      memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (memory != NULL)
+#endif
+	{
+	  memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+	  orig_prefix = memory;
+	  memory += orig_prefix_len + 1;
+	  memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+	  curr_prefix = memory;
+	  return;
+	}
+    }
+  orig_prefix = NULL;
+  curr_prefix = NULL;
+  /* Don't worry about wasted memory here - this function is usually only
+     called once.  */
+}
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+  set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+  /* Now notify all dependent libraries.  */
+#if DEPENDS_ON_LIBCHARSET
+  libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+  libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+  libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+const char *
+compute_curr_prefix (const char *orig_installprefix,
+		     const char *orig_installdir,
+		     const char *curr_pathname)
+{
+  const char *curr_installdir;
+  const char *rel_installdir;
+
+  if (curr_pathname == NULL)
+    return NULL;
+
+  /* Determine the relative installation directory, relative to the prefix.
+     This is simply the difference between orig_installprefix and
+     orig_installdir.  */
+  if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+      != 0)
+    /* Shouldn't happen - nothing should be installed outside $(prefix).  */
+    return NULL;
+  rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+  /* Determine the current installation directory.  */
+  {
+    const char *p_base = curr_pathname + FILE_SYSTEM_PREFIX_LEN (curr_pathname);
+    const char *p = curr_pathname + strlen (curr_pathname);
+    char *q;
+
+    while (p > p_base)
+      {
+	p--;
+	if (ISSLASH (*p))
+	  break;
+      }
+
+    q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+    if (q == NULL)
+      return NULL;
+#endif
+    memcpy (q, curr_pathname, p - curr_pathname);
+    q[p - curr_pathname] = '\0';
+    curr_installdir = q;
+  }
+
+  /* Compute the current installation prefix by removing the trailing
+     rel_installdir from it.  */
+  {
+    const char *rp = rel_installdir + strlen (rel_installdir);
+    const char *cp = curr_installdir + strlen (curr_installdir);
+    const char *cp_base =
+      curr_installdir + FILE_SYSTEM_PREFIX_LEN (curr_installdir);
+
+    while (rp > rel_installdir && cp > cp_base)
+      {
+	bool same = false;
+	const char *rpi = rp;
+	const char *cpi = cp;
+
+	while (rpi > rel_installdir && cpi > cp_base)
+	  {
+	    rpi--;
+	    cpi--;
+	    if (ISSLASH (*rpi) || ISSLASH (*cpi))
+	      {
+		if (ISSLASH (*rpi) && ISSLASH (*cpi))
+		  same = true;
+		break;
+	      }
+	    /* Do case-insensitive comparison if the filesystem is always or
+	       often case-insensitive.  It's better to accept the comparison
+	       if the difference is only in case, rather than to fail.  */
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+	    /* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */
+	    if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+		!= (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+	      break;
+#else
+	    if (*rpi != *cpi)
+	      break;
+#endif
+	  }
+	if (!same)
+	  break;
+	/* The last pathname component was the same.  opi and cpi now point
+	   to the slash before it.  */
+	rp = rpi;
+	cp = cpi;
+      }
+
+    if (rp > rel_installdir)
+      /* Unexpected: The curr_installdir does not end with rel_installdir.  */
+      return NULL;
+
+    {
+      size_t curr_prefix_len = cp - curr_installdir;
+      char *curr_prefix;
+
+      curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (curr_prefix == NULL)
+	return NULL;
+#endif
+      memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+      curr_prefix[curr_prefix_len] = '\0';
+
+      return curr_prefix;
+    }
+  }
+}
+
+#endif /* !IN_LIBRARY || PIC */
+
+#if defined PIC && defined INSTALLDIR
+
+/* Full pathname of shared library, or NULL.  */
+static char *shared_library_fullname;
+
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
+
+/* Determine the full pathname of the shared library when it is loaded.  */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+  (void) reserved;
+
+  if (event == DLL_PROCESS_ATTACH)
+    {
+      /* The DLL is being loaded into an application's address range.  */
+      static char location[MAX_PATH];
+
+      if (!GetModuleFileName (module_handle, location, sizeof (location)))
+	/* Shouldn't happen.  */
+	return FALSE;
+
+      if (!IS_PATH_WITH_DIR (location))
+	/* Shouldn't happen.  */
+	return FALSE;
+
+      {
+#if defined __CYGWIN__
+	/* On Cygwin, we need to convert paths coming from Win32 system calls
+	   to the Unix-like slashified notation.  */
+	static char location_as_posix_path[2 * MAX_PATH];
+	/* There's no error return defined for cygwin_conv_to_posix_path.
+	   See cygwin-api/func-cygwin-conv-to-posix-path.html.
+	   Does it overflow the buffer of expected size MAX_PATH or does it
+	   truncate the path?  I don't know.  Let's catch both.  */
+	cygwin_conv_to_posix_path (location, location_as_posix_path);
+	location_as_posix_path[MAX_PATH - 1] = '\0';
+	if (strlen (location_as_posix_path) >= MAX_PATH - 1)
+	  /* A sign of buffer overflow or path truncation.  */
+	  return FALSE;
+	shared_library_fullname = strdup (location_as_posix_path);
+#else
+	shared_library_fullname = strdup (location);
+#endif
+      }
+    }
+
+  return TRUE;
+}
+
+#else /* Unix except Cygwin */
+
+static void
+find_shared_library_fullname ()
+{
+#if defined __linux__ && __GLIBC__ >= 2
+  /* Linux has /proc/self/maps. glibc 2 has the getline() function.  */
+  FILE *fp;
+
+  /* Open the current process' maps file.  It describes one VMA per line.  */
+  fp = fopen ("/proc/self/maps", "r");
+  if (fp)
+    {
+      unsigned long address = (unsigned long) &find_shared_library_fullname;
+      for (;;)
+	{
+	  unsigned long start, end;
+	  int c;
+
+	  if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+	    break;
+	  if (address >= start && address <= end - 1)
+	    {
+	      /* Found it.  Now see if this line contains a filename.  */
+	      while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+		continue;
+	      if (c == '/')
+		{
+		  size_t size;
+		  int len;
+
+		  ungetc (c, fp);
+		  shared_library_fullname = NULL; size = 0;
+		  len = getline (&shared_library_fullname, &size, fp);
+		  if (len >= 0)
+		    {
+		      /* Success: filled shared_library_fullname.  */
+		      if (len > 0 && shared_library_fullname[len - 1] == '\n')
+			shared_library_fullname[len - 1] = '\0';
+		    }
+		}
+	      break;
+	    }
+	  while (c = getc (fp), c != EOF && c != '\n')
+	    continue;
+	}
+      fclose (fp);
+    }
+#endif
+}
+
+#endif /* (WIN32 or Cygwin) / (Unix except Cygwin) */
+
+/* Return the full pathname of the current shared library.
+   Return NULL if unknown.
+   Guaranteed to work only on Linux, Cygwin and Woe32.  */
+static char *
+get_shared_library_fullname ()
+{
+#if !(defined _WIN32 || defined __WIN32__ || defined __CYGWIN__)
+  static bool tried_find_shared_library_fullname;
+  if (!tried_find_shared_library_fullname)
+    {
+      find_shared_library_fullname ();
+      tried_find_shared_library_fullname = true;
+    }
+#endif
+  return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR
+  static int initialized;
+
+  /* Initialization code for a shared library.  */
+  if (!initialized)
+    {
+      /* At this point, orig_prefix and curr_prefix likely have already been
+	 set through the main program's set_program_name_and_installdir
+	 function.  This is sufficient in the case that the library has
+	 initially been installed in the same orig_prefix.  But we can do
+	 better, to also cover the cases that 1. it has been installed
+	 in a different prefix before being moved to orig_prefix and (later)
+	 to curr_prefix, 2. unlike the program, it has not moved away from
+	 orig_prefix.  */
+      const char *orig_installprefix = INSTALLPREFIX;
+      const char *orig_installdir = INSTALLDIR;
+      const char *curr_prefix_better;
+
+      curr_prefix_better =
+	compute_curr_prefix (orig_installprefix, orig_installdir,
+			     get_shared_library_fullname ());
+      if (curr_prefix_better == NULL)
+	curr_prefix_better = curr_prefix;
+
+      set_relocation_prefix (orig_installprefix, curr_prefix_better);
+
+      initialized = 1;
+    }
+#endif
+
+  /* Note: It is not necessary to perform case insensitive comparison here,
+     even for DOS-like filesystems, because the pathname argument was
+     typically created from the same Makefile variable as orig_prefix came
+     from.  */
+  if (orig_prefix != NULL && curr_prefix != NULL
+      && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+    {
+      if (pathname[orig_prefix_len] == '\0')
+	/* pathname equals orig_prefix.  */
+	return curr_prefix;
+      if (ISSLASH (pathname[orig_prefix_len]))
+	{
+	  /* pathname starts with orig_prefix.  */
+	  const char *pathname_tail = &pathname[orig_prefix_len];
+	  char *result =
+	    (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+	  if (result != NULL)
+#endif
+	    {
+	      memcpy (result, curr_prefix, curr_prefix_len);
+	      strcpy (result + curr_prefix_len, pathname_tail);
+	      return result;
+	    }
+	}
+    }
+  /* Nothing to relocate.  */
+  return pathname;
+}
+
+#endif

Added: tuxmath/trunk/intl/relocatable.h
===================================================================
--- tuxmath/trunk/intl/relocatable.h	                        (rev 0)
+++ tuxmath/trunk/intl/relocatable.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,79 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno at clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This can be enabled through the configure --enable-relocatable option.  */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions.  Note that because
+   this is a private .h file, we don't need to use __declspec(dllimport)
+   in any case.  */
+#if HAVE_VISIBILITY && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __attribute__((__visibility__("default")))
+#elif defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+extern RELOCATABLE_DLL_EXPORTED void
+       set_relocation_prefix (const char *orig_prefix,
+			      const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() leaks memory, because it has to construct
+   a fresh pathname.  If this is a problem because your program calls
+   relocate() frequently, think about caching the result.  */
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+extern const char * compute_curr_prefix (const char *orig_installprefix,
+					 const char *orig_installdir,
+					 const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames.  */
+#define relocate(pathname) (pathname)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RELOCATABLE_H */

Added: tuxmath/trunk/intl/textdomain.c
===================================================================
--- tuxmath/trunk/intl/textdomain.c	                        (rev 0)
+++ tuxmath/trunk/intl/textdomain.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,127 @@
+/* Implementation of the textdomain(3) function.
+   Copyright (C) 1995-1998, 2000-2003, 2005-2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* Handle multi-threaded applications.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+# define gl_rwlock_define __libc_rwlock_define
+# define gl_rwlock_wrlock __libc_rwlock_wrlock
+# define gl_rwlock_unlock __libc_rwlock_unlock
+#else
+# include "lock.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN libintl_textdomain
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+char *
+TEXTDOMAIN (const char *domainname)
+{
+  char *new_domain;
+  char *old_domain;
+
+  /* A NULL pointer requests the current setting.  */
+  if (domainname == NULL)
+    return (char *) _nl_current_default_domain;
+
+  gl_rwlock_wrlock (_nl_state_lock);
+
+  old_domain = (char *) _nl_current_default_domain;
+
+  /* If domain name is the null string set to default domain "messages".  */
+  if (domainname[0] == '\0'
+      || strcmp (domainname, _nl_default_default_domain) == 0)
+    {
+      _nl_current_default_domain = _nl_default_default_domain;
+      new_domain = (char *) _nl_current_default_domain;
+    }
+  else if (strcmp (domainname, old_domain) == 0)
+    /* This can happen and people will use it to signal that some
+       environment variable changed.  */
+    new_domain = old_domain;
+  else
+    {
+      /* If the following malloc fails `_nl_current_default_domain'
+	 will be NULL.  This value will be returned and so signals we
+	 are out of core.  */
+#if defined _LIBC || defined HAVE_STRDUP
+      new_domain = strdup (domainname);
+#else
+      size_t len = strlen (domainname) + 1;
+      new_domain = (char *) malloc (len);
+      if (new_domain != NULL)
+	memcpy (new_domain, domainname, len);
+#endif
+
+      if (new_domain != NULL)
+	_nl_current_default_domain = new_domain;
+    }
+
+  /* We use this possibility to signal a change of the loaded catalogs
+     since this is most likely the case and there is no other easy we
+     to do it.  Do it only when the call was successful.  */
+  if (new_domain != NULL)
+    {
+      ++_nl_msg_cat_cntr;
+
+      if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+	free (old_domain);
+    }
+
+  gl_rwlock_unlock (_nl_state_lock);
+
+  return new_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__textdomain, textdomain);
+#endif

Added: tuxmath/trunk/intl/tsearch.c
===================================================================
--- tuxmath/trunk/intl/tsearch.c	                        (rev 0)
+++ tuxmath/trunk/intl/tsearch.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,684 @@
+/* Copyright (C) 1995, 1996, 1997, 2000, 2006 Free Software Foundation, Inc.
+   Contributed by Bernd Schmidt <crux at Pool.Informatik.RWTH-Aachen.DE>, 1997.
+
+   NOTE: The canonical source of this file is maintained with the GNU C
+   Library.  Bugs can be reported to bug-glibc at gnu.org.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tree search for red/black trees.
+   The algorithm for adding nodes is taken from one of the many "Algorithms"
+   books by Robert Sedgewick, although the implementation differs.
+   The algorithm for deleting nodes can probably be found in a book named
+   "Introduction to Algorithms" by Cormen/Leiserson/Rivest.  At least that's
+   the book that my professor took most algorithms from during the "Data
+   Structures" course...
+
+   Totally public domain.  */
+
+/* Red/black trees are binary trees in which the edges are colored either red
+   or black.  They have the following properties:
+   1. The number of black edges on every path from the root to a leaf is
+      constant.
+   2. No two red edges are adjacent.
+   Therefore there is an upper bound on the length of every path, it's
+   O(log n) where n is the number of nodes in the tree.  No path can be longer
+   than 1+2*P where P is the length of the shortest path in the tree.
+   Useful for the implementation:
+   3. If one of the children of a node is NULL, then the other one is red
+      (if it exists).
+
+   In the implementation, not the edges are colored, but the nodes.  The color
+   interpreted as the color of the edge leading to this node.  The color is
+   meaningless for the root node, but we color the root node black for
+   convenience.  All added nodes are red initially.
+
+   Adding to a red/black tree is rather easy.  The right place is searched
+   with a usual binary tree search.  Additionally, whenever a node N is
+   reached that has two red successors, the successors are colored black and
+   the node itself colored red.  This moves red edges up the tree where they
+   pose less of a problem once we get to really insert the new node.  Changing
+   N's color to red may violate rule 2, however, so rotations may become
+   necessary to restore the invariants.  Adding a new red leaf may violate
+   the same rule, so afterwards an additional check is run and the tree
+   possibly rotated.
+
+   Deleting is hairy.  There are mainly two nodes involved: the node to be
+   deleted (n1), and another node that is to be unchained from the tree (n2).
+   If n1 has a successor (the node with a smallest key that is larger than
+   n1), then the successor becomes n2 and its contents are copied into n1,
+   otherwise n1 becomes n2.
+   Unchaining a node may violate rule 1: if n2 is black, one subtree is
+   missing one black edge afterwards.  The algorithm must try to move this
+   error upwards towards the root, so that the subtree that does not have
+   enough black edges becomes the whole tree.  Once that happens, the error
+   has disappeared.  It may not be necessary to go all the way up, since it
+   is possible that rotations and recoloring can fix the error before that.
+
+   Although the deletion algorithm must walk upwards through the tree, we
+   do not store parent pointers in the nodes.  Instead, delete allocates a
+   small array of parent pointers and fills it while descending the tree.
+   Since we know that the length of a path is O(log n), where n is the number
+   of nodes, this is likely to use less memory.  */
+
+/* Tree rotations look like this:
+      A                C
+     / \              / \
+    B   C            A   G
+   / \ / \  -->     / \
+   D E F G         B   F
+                  / \
+                 D   E
+
+   In this case, A has been rotated left.  This preserves the ordering of the
+   binary tree.  */
+
+#include <config.h>
+
+/* Specification.  */
+#ifdef IN_LIBINTL
+# include "tsearch.h"
+#else
+# include <search.h>
+#endif
+
+#include <stdlib.h>
+
+typedef int (*__compar_fn_t) (const void *, const void *);
+typedef void (*__action_fn_t) (const void *, VISIT, int);
+
+#ifndef weak_alias
+# define __tsearch tsearch
+# define __tfind tfind
+# define __tdelete tdelete
+# define __twalk twalk
+#endif
+
+#ifndef internal_function
+/* Inside GNU libc we mark some function in a special way.  In other
+   environments simply ignore the marking.  */
+# define internal_function
+#endif
+
+typedef struct node_t
+{
+  /* Callers expect this to be the first element in the structure - do not
+     move!  */
+  const void *key;
+  struct node_t *left;
+  struct node_t *right;
+  unsigned int red:1;
+} *node;
+typedef const struct node_t *const_node;
+
+#undef DEBUGGING
+
+#ifdef DEBUGGING
+
+/* Routines to check tree invariants.  */
+
+#include <assert.h>
+
+#define CHECK_TREE(a) check_tree(a)
+
+static void
+check_tree_recurse (node p, int d_sofar, int d_total)
+{
+  if (p == NULL)
+    {
+      assert (d_sofar == d_total);
+      return;
+    }
+
+  check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
+  check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
+  if (p->left)
+    assert (!(p->left->red && p->red));
+  if (p->right)
+    assert (!(p->right->red && p->red));
+}
+
+static void
+check_tree (node root)
+{
+  int cnt = 0;
+  node p;
+  if (root == NULL)
+    return;
+  root->red = 0;
+  for(p = root->left; p; p = p->left)
+    cnt += !p->red;
+  check_tree_recurse (root, 0, cnt);
+}
+
+
+#else
+
+#define CHECK_TREE(a)
+
+#endif
+
+/* Possibly "split" a node with two red successors, and/or fix up two red
+   edges in a row.  ROOTP is a pointer to the lowest node we visited, PARENTP
+   and GPARENTP pointers to its parent/grandparent.  P_R and GP_R contain the
+   comparison values that determined which way was taken in the tree to reach
+   ROOTP.  MODE is 1 if we need not do the split, but must check for two red
+   edges between GPARENTP and ROOTP.  */
+static void
+maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
+			int p_r, int gp_r, int mode)
+{
+  node root = *rootp;
+  node *rp, *lp;
+  rp = &(*rootp)->right;
+  lp = &(*rootp)->left;
+
+  /* See if we have to split this node (both successors red).  */
+  if (mode == 1
+      || ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
+    {
+      /* This node becomes red, its successors black.  */
+      root->red = 1;
+      if (*rp)
+	(*rp)->red = 0;
+      if (*lp)
+	(*lp)->red = 0;
+
+      /* If the parent of this node is also red, we have to do
+	 rotations.  */
+      if (parentp != NULL && (*parentp)->red)
+	{
+	  node gp = *gparentp;
+	  node p = *parentp;
+	  /* There are two main cases:
+	     1. The edge types (left or right) of the two red edges differ.
+	     2. Both red edges are of the same type.
+	     There exist two symmetries of each case, so there is a total of
+	     4 cases.  */
+	  if ((p_r > 0) != (gp_r > 0))
+	    {
+	      /* Put the child at the top of the tree, with its parent
+		 and grandparent as successors.  */
+	      p->red = 1;
+	      gp->red = 1;
+	      root->red = 0;
+	      if (p_r < 0)
+		{
+		  /* Child is left of parent.  */
+		  p->left = *rp;
+		  *rp = p;
+		  gp->right = *lp;
+		  *lp = gp;
+		}
+	      else
+		{
+		  /* Child is right of parent.  */
+		  p->right = *lp;
+		  *lp = p;
+		  gp->left = *rp;
+		  *rp = gp;
+		}
+	      *gparentp = root;
+	    }
+	  else
+	    {
+	      *gparentp = *parentp;
+	      /* Parent becomes the top of the tree, grandparent and
+		 child are its successors.  */
+	      p->red = 0;
+	      gp->red = 1;
+	      if (p_r < 0)
+		{
+		  /* Left edges.  */
+		  gp->left = p->right;
+		  p->right = gp;
+		}
+	      else
+		{
+		  /* Right edges.  */
+		  gp->right = p->left;
+		  p->left = gp;
+		}
+	    }
+	}
+    }
+}
+
+/* Find or insert datum into search tree.
+   KEY is the key to be located, ROOTP is the address of tree root,
+   COMPAR the ordering function.  */
+void *
+__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
+{
+  node q;
+  node *parentp = NULL, *gparentp = NULL;
+  node *rootp = (node *) vrootp;
+  node *nextp;
+  int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler.  */
+
+  if (rootp == NULL)
+    return NULL;
+
+  /* This saves some additional tests below.  */
+  if (*rootp != NULL)
+    (*rootp)->red = 0;
+
+  CHECK_TREE (*rootp);
+
+  nextp = rootp;
+  while (*nextp != NULL)
+    {
+      node root = *rootp;
+      r = (*compar) (key, root->key);
+      if (r == 0)
+	return root;
+
+      maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
+      /* If that did any rotations, parentp and gparentp are now garbage.
+	 That doesn't matter, because the values they contain are never
+	 used again in that case.  */
+
+      nextp = r < 0 ? &root->left : &root->right;
+      if (*nextp == NULL)
+	break;
+
+      gparentp = parentp;
+      parentp = rootp;
+      rootp = nextp;
+
+      gp_r = p_r;
+      p_r = r;
+    }
+
+  q = (struct node_t *) malloc (sizeof (struct node_t));
+  if (q != NULL)
+    {
+      *nextp = q;			/* link new node to old */
+      q->key = key;			/* initialize new node */
+      q->red = 1;
+      q->left = q->right = NULL;
+
+      if (nextp != rootp)
+	/* There may be two red edges in a row now, which we must avoid by
+	   rotating the tree.  */
+	maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
+    }
+
+  return q;
+}
+#ifdef weak_alias
+weak_alias (__tsearch, tsearch)
+#endif
+
+
+/* Find datum in search tree.
+   KEY is the key to be located, ROOTP is the address of tree root,
+   COMPAR the ordering function.  */
+void *
+__tfind (key, vrootp, compar)
+     const void *key;
+     void *const *vrootp;
+     __compar_fn_t compar;
+{
+  node *rootp = (node *) vrootp;
+
+  if (rootp == NULL)
+    return NULL;
+
+  CHECK_TREE (*rootp);
+
+  while (*rootp != NULL)
+    {
+      node root = *rootp;
+      int r;
+
+      r = (*compar) (key, root->key);
+      if (r == 0)
+	return root;
+
+      rootp = r < 0 ? &root->left : &root->right;
+    }
+  return NULL;
+}
+#ifdef weak_alias
+weak_alias (__tfind, tfind)
+#endif
+
+
+/* Delete node with given key.
+   KEY is the key to be deleted, ROOTP is the address of the root of tree,
+   COMPAR the comparison function.  */
+void *
+__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
+{
+  node p, q, r, retval;
+  int cmp;
+  node *rootp = (node *) vrootp;
+  node root, unchained;
+  /* Stack of nodes so we remember the parents without recursion.  It's
+     _very_ unlikely that there are paths longer than 40 nodes.  The tree
+     would need to have around 250.000 nodes.  */
+  int stacksize = 100;
+  int sp = 0;
+  node *nodestack[100];
+
+  if (rootp == NULL)
+    return NULL;
+  p = *rootp;
+  if (p == NULL)
+    return NULL;
+
+  CHECK_TREE (p);
+
+  while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
+    {
+      if (sp == stacksize)
+	abort ();
+
+      nodestack[sp++] = rootp;
+      p = *rootp;
+      rootp = ((cmp < 0)
+	       ? &(*rootp)->left
+	       : &(*rootp)->right);
+      if (*rootp == NULL)
+	return NULL;
+    }
+
+  /* This is bogus if the node to be deleted is the root... this routine
+     really should return an integer with 0 for success, -1 for failure
+     and errno = ESRCH or something.  */
+  retval = p;
+
+  /* We don't unchain the node we want to delete. Instead, we overwrite
+     it with its successor and unchain the successor.  If there is no
+     successor, we really unchain the node to be deleted.  */
+
+  root = *rootp;
+
+  r = root->right;
+  q = root->left;
+
+  if (q == NULL || r == NULL)
+    unchained = root;
+  else
+    {
+      node *parent = rootp, *up = &root->right;
+      for (;;)
+	{
+	  if (sp == stacksize)
+	    abort ();
+	  nodestack[sp++] = parent;
+	  parent = up;
+	  if ((*up)->left == NULL)
+	    break;
+	  up = &(*up)->left;
+	}
+      unchained = *up;
+    }
+
+  /* We know that either the left or right successor of UNCHAINED is NULL.
+     R becomes the other one, it is chained into the parent of UNCHAINED.  */
+  r = unchained->left;
+  if (r == NULL)
+    r = unchained->right;
+  if (sp == 0)
+    *rootp = r;
+  else
+    {
+      q = *nodestack[sp-1];
+      if (unchained == q->right)
+	q->right = r;
+      else
+	q->left = r;
+    }
+
+  if (unchained != root)
+    root->key = unchained->key;
+  if (!unchained->red)
+    {
+      /* Now we lost a black edge, which means that the number of black
+	 edges on every path is no longer constant.  We must balance the
+	 tree.  */
+      /* NODESTACK now contains all parents of R.  R is likely to be NULL
+	 in the first iteration.  */
+      /* NULL nodes are considered black throughout - this is necessary for
+	 correctness.  */
+      while (sp > 0 && (r == NULL || !r->red))
+	{
+	  node *pp = nodestack[sp - 1];
+	  p = *pp;
+	  /* Two symmetric cases.  */
+	  if (r == p->left)
+	    {
+	      /* Q is R's brother, P is R's parent.  The subtree with root
+		 R has one black edge less than the subtree with root Q.  */
+	      q = p->right;
+	      if (q->red)
+		{
+		  /* If Q is red, we know that P is black. We rotate P left
+		     so that Q becomes the top node in the tree, with P below
+		     it.  P is colored red, Q is colored black.
+		     This action does not change the black edge count for any
+		     leaf in the tree, but we will be able to recognize one
+		     of the following situations, which all require that Q
+		     is black.  */
+		  q->red = 0;
+		  p->red = 1;
+		  /* Left rotate p.  */
+		  p->right = q->left;
+		  q->left = p;
+		  *pp = q;
+		  /* Make sure pp is right if the case below tries to use
+		     it.  */
+		  nodestack[sp++] = pp = &q->left;
+		  q = p->right;
+		}
+	      /* We know that Q can't be NULL here.  We also know that Q is
+		 black.  */
+	      if ((q->left == NULL || !q->left->red)
+		  && (q->right == NULL || !q->right->red))
+		{
+		  /* Q has two black successors.  We can simply color Q red.
+		     The whole subtree with root P is now missing one black
+		     edge.  Note that this action can temporarily make the
+		     tree invalid (if P is red).  But we will exit the loop
+		     in that case and set P black, which both makes the tree
+		     valid and also makes the black edge count come out
+		     right.  If P is black, we are at least one step closer
+		     to the root and we'll try again the next iteration.  */
+		  q->red = 1;
+		  r = p;
+		}
+	      else
+		{
+		  /* Q is black, one of Q's successors is red.  We can
+		     repair the tree with one operation and will exit the
+		     loop afterwards.  */
+		  if (q->right == NULL || !q->right->red)
+		    {
+		      /* The left one is red.  We perform the same action as
+			 in maybe_split_for_insert where two red edges are
+			 adjacent but point in different directions:
+			 Q's left successor (let's call it Q2) becomes the
+			 top of the subtree we are looking at, its parent (Q)
+			 and grandparent (P) become its successors. The former
+			 successors of Q2 are placed below P and Q.
+			 P becomes black, and Q2 gets the color that P had.
+			 This changes the black edge count only for node R and
+			 its successors.  */
+		      node q2 = q->left;
+		      q2->red = p->red;
+		      p->right = q2->left;
+		      q->left = q2->right;
+		      q2->right = q;
+		      q2->left = p;
+		      *pp = q2;
+		      p->red = 0;
+		    }
+		  else
+		    {
+		      /* It's the right one.  Rotate P left. P becomes black,
+			 and Q gets the color that P had.  Q's right successor
+			 also becomes black.  This changes the black edge
+			 count only for node R and its successors.  */
+		      q->red = p->red;
+		      p->red = 0;
+
+		      q->right->red = 0;
+
+		      /* left rotate p */
+		      p->right = q->left;
+		      q->left = p;
+		      *pp = q;
+		    }
+
+		  /* We're done.  */
+		  sp = 1;
+		  r = NULL;
+		}
+	    }
+	  else
+	    {
+	      /* Comments: see above.  */
+	      q = p->left;
+	      if (q->red)
+		{
+		  q->red = 0;
+		  p->red = 1;
+		  p->left = q->right;
+		  q->right = p;
+		  *pp = q;
+		  nodestack[sp++] = pp = &q->right;
+		  q = p->left;
+		}
+	      if ((q->right == NULL || !q->right->red)
+		       && (q->left == NULL || !q->left->red))
+		{
+		  q->red = 1;
+		  r = p;
+		}
+	      else
+		{
+		  if (q->left == NULL || !q->left->red)
+		    {
+		      node q2 = q->right;
+		      q2->red = p->red;
+		      p->left = q2->right;
+		      q->right = q2->left;
+		      q2->left = q;
+		      q2->right = p;
+		      *pp = q2;
+		      p->red = 0;
+		    }
+		  else
+		    {
+		      q->red = p->red;
+		      p->red = 0;
+		      q->left->red = 0;
+		      p->left = q->right;
+		      q->right = p;
+		      *pp = q;
+		    }
+		  sp = 1;
+		  r = NULL;
+		}
+	    }
+	  --sp;
+	}
+      if (r != NULL)
+	r->red = 0;
+    }
+
+  free (unchained);
+  return retval;
+}
+#ifdef weak_alias
+weak_alias (__tdelete, tdelete)
+#endif
+
+
+/* Walk the nodes of a tree.
+   ROOT is the root of the tree to be walked, ACTION the function to be
+   called at each node.  LEVEL is the level of ROOT in the whole tree.  */
+static void
+internal_function
+trecurse (const void *vroot, __action_fn_t action, int level)
+{
+  const_node root = (const_node) vroot;
+
+  if (root->left == NULL && root->right == NULL)
+    (*action) (root, leaf, level);
+  else
+    {
+      (*action) (root, preorder, level);
+      if (root->left != NULL)
+	trecurse (root->left, action, level + 1);
+      (*action) (root, postorder, level);
+      if (root->right != NULL)
+	trecurse (root->right, action, level + 1);
+      (*action) (root, endorder, level);
+    }
+}
+
+
+/* Walk the nodes of a tree.
+   ROOT is the root of the tree to be walked, ACTION the function to be
+   called at each node.  */
+void
+__twalk (const void *vroot, __action_fn_t action)
+{
+  const_node root = (const_node) vroot;
+
+  CHECK_TREE (root);
+
+  if (root != NULL && action != NULL)
+    trecurse (root, action, 0);
+}
+#ifdef weak_alias
+weak_alias (__twalk, twalk)
+#endif
+
+
+#ifdef _LIBC
+
+/* The standardized functions miss an important functionality: the
+   tree cannot be removed easily.  We provide a function to do this.  */
+static void
+internal_function
+tdestroy_recurse (node root, __free_fn_t freefct)
+{
+  if (root->left != NULL)
+    tdestroy_recurse (root->left, freefct);
+  if (root->right != NULL)
+    tdestroy_recurse (root->right, freefct);
+  (*freefct) ((void *) root->key);
+  /* Free the node itself.  */
+  free (root);
+}
+
+void
+__tdestroy (void *vroot, __free_fn_t freefct)
+{
+  node root = (node) vroot;
+
+  CHECK_TREE (root);
+
+  if (root != NULL)
+    tdestroy_recurse (root, freefct);
+}
+weak_alias (__tdestroy, tdestroy)
+
+#endif /* _LIBC */

Added: tuxmath/trunk/intl/tsearch.h
===================================================================
--- tuxmath/trunk/intl/tsearch.h	                        (rev 0)
+++ tuxmath/trunk/intl/tsearch.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,83 @@
+/* Binary tree data structure.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _TSEARCH_H
+#define _TSEARCH_H
+
+#if HAVE_TSEARCH
+
+/* Get tseach(), tfind(), tdelete(), twalk() declarations.  */
+#include <search.h>
+
+#else
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* See <http://www.opengroup.org/susv3xbd/search.h.html>,
+       <http://www.opengroup.org/susv3xsh/tsearch.html>
+   for details.  */
+
+typedef enum
+{ 
+  preorder,
+  postorder, 
+  endorder,
+  leaf
+}
+VISIT;
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+   If one is found, it is returned.  Otherwise, a new element equal to KEY
+   is inserted in the tree and is returned.  */
+extern void * tsearch (const void *key, void **vrootp,
+		       int (*compar) (const void *, const void *));
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+   If one is found, it is returned.  Otherwise, NULL is returned.  */
+extern void * tfind (const void *key, void *const *vrootp,
+		     int (*compar) (const void *, const void *));
+
+/* Searches an element in the tree *VROOTP that compares equal to KEY.
+   If one is found, it is removed from the tree, and its parent node is
+   returned.  Otherwise, NULL is returned.  */
+extern void * tdelete (const void *key, void **vrootp,
+		       int (*compar) (const void *, const void *));
+
+/* Perform a depth-first, left-to-right traversal of the tree VROOT.
+   The ACTION function is called:
+     - for non-leaf nodes: 3 times, before the left subtree traversal,
+       after the left subtree traversal but before the right subtree traversal,
+       and after the right subtree traversal,
+     - for leaf nodes: once.
+   The arguments passed to ACTION are:
+     1. the node; it can be casted to a 'const void * const *', i.e. into a
+        pointer to the key,
+     2. an indicator which visit of the node this is,
+     3. the level of the node in the tree (0 for the root).  */
+extern void twalk (const void *vroot,
+		   void (*action) (const void *, VISIT, int));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif /* _TSEARCH_H */

Added: tuxmath/trunk/intl/vasnprintf.c
===================================================================
--- tuxmath/trunk/intl/vasnprintf.c	                        (rev 0)
+++ tuxmath/trunk/intl/vasnprintf.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,4677 @@
+/* vsprintf with automatic memory allocation.
+   Copyright (C) 1999, 2002-2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* This file can be parametrized with the following macros:
+     VASNPRINTF         The name of the function being defined.
+     FCHAR_T            The element type of the format string.
+     DCHAR_T            The element type of the destination (result) string.
+     FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+                        in the format string are ASCII. MUST be set if
+                        FCHAR_T and DCHAR_T are not the same type.
+     DIRECTIVE          Structure denoting a format directive.
+                        Depends on FCHAR_T.
+     DIRECTIVES         Structure denoting the set of format directives of a
+                        format string.  Depends on FCHAR_T.
+     PRINTF_PARSE       Function that parses a format string.
+                        Depends on FCHAR_T.
+     DCHAR_CPY          memcpy like function for DCHAR_T[] arrays.
+     DCHAR_SET          memset like function for DCHAR_T[] arrays.
+     DCHAR_MBSNLEN      mbsnlen like function for DCHAR_T[] arrays.
+     SNPRINTF           The system's snprintf (or similar) function.
+                        This may be either snprintf or swprintf.
+     TCHAR_T            The element type of the argument and result string
+                        of the said SNPRINTF function.  This may be either
+                        char or wchar_t.  The code exploits that
+                        sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+                        alignof (TCHAR_T) <= alignof (DCHAR_T).
+     DCHAR_IS_TCHAR     Set to 1 if DCHAR_T and TCHAR_T are the same type.
+     DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+     DCHAR_IS_UINT8_T   Set to 1 if DCHAR_T is uint8_t.
+     DCHAR_IS_UINT16_T  Set to 1 if DCHAR_T is uint16_t.
+     DCHAR_IS_UINT32_T  Set to 1 if DCHAR_T is uint32_t.  */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifndef VASNPRINTF
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification.  */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+#  include "vasnwprintf.h"
+# else
+#  include "vasnprintf.h"
+# endif
+#endif
+
+#include <locale.h>	/* localeconv() */
+#include <stdio.h>	/* snprintf(), sprintf() */
+#include <stdlib.h>	/* abort(), malloc(), realloc(), free() */
+#include <string.h>	/* memcpy(), strlen() */
+#include <errno.h>	/* errno */
+#include <limits.h>	/* CHAR_BIT */
+#include <float.h>	/* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+#  include "wprintf-parse.h"
+# else
+#  include "printf-parse.h"
+# endif
+#endif
+
+/* Checked size_t computations.  */
+#include "xsize.h"
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "float+.h"
+#endif
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnan.h"
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnan.h"
+# include "printf-frexp.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "printf-frexpl.h"
+# include "fpucw.h"
+#endif
+
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW.  */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
+#if HAVE_WCHAR_T
+# if HAVE_WCSLEN
+#  define local_wcslen wcslen
+# else
+   /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+      a dependency towards this library, here is a local substitute.
+      Define this substitute only once, even if this file is included
+      twice in the same compilation unit.  */
+#  ifndef local_wcslen_defined
+#   define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+  const wchar_t *ptr;
+
+  for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+    ;
+  return ptr - s;
+}
+#  endif
+# endif
+#endif
+
+/* Default parameters.  */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+#  define VASNPRINTF vasnwprintf
+#  define FCHAR_T wchar_t
+#  define DCHAR_T wchar_t
+#  define TCHAR_T wchar_t
+#  define DCHAR_IS_TCHAR 1
+#  define DIRECTIVE wchar_t_directive
+#  define DIRECTIVES wchar_t_directives
+#  define PRINTF_PARSE wprintf_parse
+#  define DCHAR_CPY wmemcpy
+# else
+#  define VASNPRINTF vasnprintf
+#  define FCHAR_T char
+#  define DCHAR_T char
+#  define TCHAR_T char
+#  define DCHAR_IS_TCHAR 1
+#  define DIRECTIVE char_directive
+#  define DIRECTIVES char_directives
+#  define PRINTF_PARSE printf_parse
+#  define DCHAR_CPY memcpy
+# endif
+#endif
+#if WIDE_CHAR_VERSION
+  /* TCHAR_T is wchar_t.  */
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+   /* On Windows, the function swprintf() has a different signature than
+      on Unix; we use the _snwprintf() function instead.  */
+#  define SNPRINTF _snwprintf
+# else
+   /* Unix.  */
+#  define SNPRINTF swprintf
+# endif
+#else
+  /* TCHAR_T is char.  */
+# /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+     But don't use it on BeOS, since BeOS snprintf produces no output if the
+     size argument is >= 0x3000000.  */
+# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__
+#  define USE_SNPRINTF 1
+# else
+#  define USE_SNPRINTF 0
+# endif
+# if HAVE_DECL__SNPRINTF
+   /* Windows.  */
+#  define SNPRINTF _snprintf
+# else
+   /* Unix.  */
+#  define SNPRINTF snprintf
+   /* Here we need to call the native snprintf, not rpl_snprintf.  */
+#  undef snprintf
+# endif
+#endif
+/* Here we need to call the native sprintf, not rpl_sprintf.  */
+#undef sprintf
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+/* Determine the decimal-point character according to the current locale.  */
+# ifndef decimal_point_char_defined
+#  define decimal_point_char_defined 1
+static char
+decimal_point_char ()
+{
+  const char *point;
+  /* Determine it in a multithread-safe way.  We know nl_langinfo is
+     multithread-safe on glibc systems, but is not required to be multithread-
+     safe by POSIX.  sprintf(), however, is multithread-safe.  localeconv()
+     is rarely multithread-safe.  */
+#  if HAVE_NL_LANGINFO && __GLIBC__
+  point = nl_langinfo (RADIXCHAR);
+#  elif 1
+  char pointbuf[5];
+  sprintf (pointbuf, "%#.0f", 1.0);
+  point = &pointbuf[1];
+#  else
+  point = localeconv () -> decimal_point;
+#  endif
+  /* The decimal point is always a single byte: either '.' or ','.  */
+  return (point[0] != '\0' ? point[0] : '.');
+}
+# endif
+#endif
+
+#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm.  */
+static int
+is_infinite_or_zero (double x)
+{
+  return isnan (x) || x + x == x;
+}
+
+#endif
+
+#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x), but does not require libm.  */
+static int
+is_infinitel (long double x)
+{
+  return isnanl (x) || (x + x == x && x != 0.0L);
+}
+
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+
+/* Converting 'long double' to decimal without rare rounding bugs requires
+   real bignums.  We use the naming conventions of GNU gmp, but vastly simpler
+   (and slower) algorithms.  */
+
+typedef unsigned int mp_limb_t;
+# define GMP_LIMB_BITS 32
+typedef int mp_limb_verify[2 * (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS) - 1];
+
+typedef unsigned long long mp_twolimb_t;
+# define GMP_TWOLIMB_BITS 64
+typedef int mp_twolimb_verify[2 * (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS) - 1];
+
+/* Representation of a bignum >= 0.  */
+typedef struct
+{
+  size_t nlimbs;
+  mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc().  */
+} mpn_t;
+
+/* Compute the product of two bignums >= 0.
+   Return the allocated memory in case of success, NULL in case of memory
+   allocation failure.  */
+static void *
+multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+{
+  const mp_limb_t *p1;
+  const mp_limb_t *p2;
+  size_t len1;
+  size_t len2;
+
+  if (src1.nlimbs <= src2.nlimbs)
+    {
+      len1 = src1.nlimbs;
+      p1 = src1.limbs;
+      len2 = src2.nlimbs;
+      p2 = src2.limbs;
+    }
+  else
+    {
+      len1 = src2.nlimbs;
+      p1 = src2.limbs;
+      len2 = src1.nlimbs;
+      p2 = src1.limbs;
+    }
+  /* Now 0 <= len1 <= len2.  */
+  if (len1 == 0)
+    {
+      /* src1 or src2 is zero.  */
+      dest->nlimbs = 0;
+      dest->limbs = (mp_limb_t *) malloc (1);
+    }
+  else
+    {
+      /* Here 1 <= len1 <= len2.  */
+      size_t dlen;
+      mp_limb_t *dp;
+      size_t k, i, j;
+
+      dlen = len1 + len2;
+      dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+      if (dp == NULL)
+	return NULL;
+      for (k = len2; k > 0; )
+	dp[--k] = 0;
+      for (i = 0; i < len1; i++)
+	{
+	  mp_limb_t digit1 = p1[i];
+	  mp_twolimb_t carry = 0;
+	  for (j = 0; j < len2; j++)
+	    {
+	      mp_limb_t digit2 = p2[j];
+	      carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+	      carry += dp[i + j];
+	      dp[i + j] = (mp_limb_t) carry;
+	      carry = carry >> GMP_LIMB_BITS;
+	    }
+	  dp[i + len2] = (mp_limb_t) carry;
+	}
+      /* Normalise.  */
+      while (dlen > 0 && dp[dlen - 1] == 0)
+	dlen--;
+      dest->nlimbs = dlen;
+      dest->limbs = dp;
+    }
+  return dest->limbs;
+}
+
+/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+   a is written as  a = q * b + r  with 0 <= r < b.  q is the quotient, r
+   the remainder.
+   Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+   q is incremented.
+   Return the allocated memory in case of success, NULL in case of memory
+   allocation failure.  */
+static void *
+divide (mpn_t a, mpn_t b, mpn_t *q)
+{
+  /* Algorithm:
+     First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+     with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+     If m<n, then q:=0 and r:=a.
+     If m>=n=1, perform a single-precision division:
+       r:=0, j:=m,
+       while j>0 do
+         {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+               = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+         j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+       Normalise [q[m-1],...,q[0]], yields q.
+     If m>=n>1, perform a multiple-precision division:
+       We have a/b < beta^(m-n+1).
+       s:=intDsize-1-(hightest bit in b[n-1]), 0<=s<intDsize.
+       Shift a and b left by s bits, copying them. r:=a.
+       r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+       For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+         Compute q* :
+           q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+           In case of overflow (q* >= beta) set q* := beta-1.
+           Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+           and c3 := b[n-2] * q*.
+           {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+            occurred.  Furthermore 0 <= c3 < beta^2.
+            If there was overflow and
+            r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+            the next test can be skipped.}
+           While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+             Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+           If q* > 0:
+             Put r := r - b * q* * beta^j. In detail:
+               [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+               hence: u:=0, for i:=0 to n-1 do
+                              u := u + q* * b[i],
+                              r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+                              u:=u div beta (+ 1, if carry in subtraction)
+                      r[n+j]:=r[n+j]-u.
+               {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+                               < q* + 1 <= beta,
+                the carry u does not overflow.}
+             If a negative carry occurs, put q* := q* - 1
+               and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+         Set q[j] := q*.
+       Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+       Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+       rest r.
+       The room for q[j] can be allocated at the memory location of r[n+j].
+     Finally, round-to-even:
+       Shift r left by 1 bit.
+       If r > b or if r = b and q[0] is odd, q := q+1.
+   */
+  const mp_limb_t *a_ptr = a.limbs;
+  size_t a_len = a.nlimbs;
+  const mp_limb_t *b_ptr = b.limbs;
+  size_t b_len = b.nlimbs;
+  mp_limb_t *roomptr;
+  mp_limb_t *tmp_roomptr = NULL;
+  mp_limb_t *q_ptr;
+  size_t q_len;
+  mp_limb_t *r_ptr;
+  size_t r_len;
+
+  /* Allocate room for a_len+2 digits.
+     (Need a_len+1 digits for the real division and 1 more digit for the
+     final rounding of q.)  */
+  roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+  if (roomptr == NULL)
+    return NULL;
+
+  /* Normalise a.  */
+  while (a_len > 0 && a_ptr[a_len - 1] == 0)
+    a_len--;
+
+  /* Normalise b.  */
+  for (;;)
+    {
+      if (b_len == 0)
+	/* Division by zero.  */
+	abort ();
+      if (b_ptr[b_len - 1] == 0)
+	b_len--;
+      else
+	break;
+    }
+
+  /* Here m = a_len >= 0 and n = b_len > 0.  */
+
+  if (a_len < b_len)
+    {
+      /* m<n: trivial case.  q=0, r := copy of a.  */
+      r_ptr = roomptr;
+      r_len = a_len;
+      memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+      q_ptr = roomptr + a_len;
+      q_len = 0;
+    }
+  else if (b_len == 1)
+    {
+      /* n=1: single precision division.
+	 beta^(m-1) <= a < beta^m  ==>  beta^(m-2) <= a/b < beta^m  */
+      r_ptr = roomptr;
+      q_ptr = roomptr + 1;
+      {
+	mp_limb_t den = b_ptr[0];
+	mp_limb_t remainder = 0;
+	const mp_limb_t *sourceptr = a_ptr + a_len;
+	mp_limb_t *destptr = q_ptr + a_len;
+	size_t count;
+	for (count = a_len; count > 0; count--)
+	  {
+	    mp_twolimb_t num =
+	      ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+	    *--destptr = num / den;
+	    remainder = num % den;
+	  }
+	/* Normalise and store r.  */
+	if (remainder > 0)
+	  {
+	    r_ptr[0] = remainder;
+	    r_len = 1;
+	  }
+	else
+	  r_len = 0;
+	/* Normalise q.  */
+	q_len = a_len;
+	if (q_ptr[q_len - 1] == 0)
+	  q_len--;
+      }
+    }
+  else
+    {
+      /* n>1: multiple precision division.
+	 beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n  ==>
+	 beta^(m-n-1) <= a/b < beta^(m-n+1).  */
+      /* Determine s.  */
+      size_t s;
+      {
+	mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+	s = 31;
+	if (msd >= 0x10000)
+	  {
+	    msd = msd >> 16;
+	    s -= 16;
+	  }
+	if (msd >= 0x100)
+	  {
+	    msd = msd >> 8;
+	    s -= 8;
+	  }
+	if (msd >= 0x10)
+	  {
+	    msd = msd >> 4;
+	    s -= 4;
+	  }
+	if (msd >= 0x4)
+	  {
+	    msd = msd >> 2;
+	    s -= 2;
+	  }
+	if (msd >= 0x2)
+	  {
+	    msd = msd >> 1;
+	    s -= 1;
+	  }
+      }
+      /* 0 <= s < GMP_LIMB_BITS.
+	 Copy b, shifting it left by s bits.  */
+      if (s > 0)
+	{
+	  tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+	  if (tmp_roomptr == NULL)
+	    {
+	      free (roomptr);
+	      return NULL;
+	    }
+	  {
+	    const mp_limb_t *sourceptr = b_ptr;
+	    mp_limb_t *destptr = tmp_roomptr;
+	    mp_twolimb_t accu = 0;
+	    size_t count;
+	    for (count = b_len; count > 0; count--)
+	      {
+		accu += (mp_twolimb_t) *sourceptr++ << s;
+		*destptr++ = (mp_limb_t) accu;
+		accu = accu >> GMP_LIMB_BITS;
+	      }
+	    /* accu must be zero, since that was how s was determined.  */
+	    if (accu != 0)
+	      abort ();
+	  }
+	  b_ptr = tmp_roomptr;
+	}
+      /* Copy a, shifting it left by s bits, yields r.
+	 Memory layout:
+	 At the beginning: r = roomptr[0..a_len],
+	 at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len]  */
+      r_ptr = roomptr;
+      if (s == 0)
+	{
+	  memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+	  r_ptr[a_len] = 0;
+	}
+      else
+	{
+	  const mp_limb_t *sourceptr = a_ptr;
+	  mp_limb_t *destptr = r_ptr;
+	  mp_twolimb_t accu = 0;
+	  size_t count;
+	  for (count = a_len; count > 0; count--)
+	    {
+	      accu += (mp_twolimb_t) *sourceptr++ << s;
+	      *destptr++ = (mp_limb_t) accu;
+	      accu = accu >> GMP_LIMB_BITS;
+	    }
+	  *destptr++ = (mp_limb_t) accu;
+	}
+      q_ptr = roomptr + b_len;
+      q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+      {
+	size_t j = a_len - b_len; /* m-n */
+	mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+	mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+	mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+	  ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+	/* Division loop, traversed m-n+1 times.
+	   j counts down, b is unchanged, beta/2 <= b[n-1] < beta.  */
+	for (;;)
+	  {
+	    mp_limb_t q_star;
+	    mp_limb_t c1;
+	    if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+	      {
+		/* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow.  */
+		mp_twolimb_t num =
+		  ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+		  | r_ptr[j + b_len - 1];
+		q_star = num / b_msd;
+		c1 = num % b_msd;
+	      }
+	    else
+	      {
+		/* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1].  */
+		q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+		/* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+		   <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+		   <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+		        {<= beta !}.
+		   If yes, jump directly to the subtraction loop.
+		   (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+		    <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+		if (r_ptr[j + b_len] > b_msd
+		    || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+		  /* r[j+n] >= b[n-1]+1 or
+		     r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+		     carry.  */
+		  goto subtract;
+	      }
+	    /* q_star = q*,
+	       c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta).  */
+	    {
+	      mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+		((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+	      mp_twolimb_t c3 = /* b[n-2] * q* */
+		(mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+	      /* While c2 < c3, increase c2 and decrease c3.
+		 Consider c3-c2.  While it is > 0, decrease it by
+		 b[n-1]*beta+b[n-2].  Because of b[n-1]*beta+b[n-2] >= beta^2/2
+		 this can happen only twice.  */
+	      if (c3 > c2)
+		{
+		  q_star = q_star - 1; /* q* := q* - 1 */
+		  if (c3 - c2 > b_msdd)
+		    q_star = q_star - 1; /* q* := q* - 1 */
+		}
+	    }
+	    if (q_star > 0)
+	      subtract:
+	      {
+		/* Subtract r := r - b * q* * beta^j.  */
+		mp_limb_t cr;
+		{
+		  const mp_limb_t *sourceptr = b_ptr;
+		  mp_limb_t *destptr = r_ptr + j;
+		  mp_twolimb_t carry = 0;
+		  size_t count;
+		  for (count = b_len; count > 0; count--)
+		    {
+		      /* Here 0 <= carry <= q*.  */
+		      carry =
+			carry
+			+ (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+			+ (mp_limb_t) ~(*destptr);
+		      /* Here 0 <= carry <= beta*q* + beta-1.  */
+		      *destptr++ = ~(mp_limb_t) carry;
+		      carry = carry >> GMP_LIMB_BITS; /* <= q* */
+		    }
+		  cr = (mp_limb_t) carry;
+		}
+		/* Subtract cr from r_ptr[j + b_len], then forget about
+		   r_ptr[j + b_len].  */
+		if (cr > r_ptr[j + b_len])
+		  {
+		    /* Subtraction gave a carry.  */
+		    q_star = q_star - 1; /* q* := q* - 1 */
+		    /* Add b back.  */
+		    {
+		      const mp_limb_t *sourceptr = b_ptr;
+		      mp_limb_t *destptr = r_ptr + j;
+		      mp_limb_t carry = 0;
+		      size_t count;
+		      for (count = b_len; count > 0; count--)
+			{
+			  mp_limb_t source1 = *sourceptr++;
+			  mp_limb_t source2 = *destptr;
+			  *destptr++ = source1 + source2 + carry;
+			  carry =
+			    (carry
+			     ? source1 >= (mp_limb_t) ~source2
+			     : source1 > (mp_limb_t) ~source2);
+			}
+		    }
+		    /* Forget about the carry and about r[j+n].  */
+		  }
+	      }
+	    /* q* is determined.  Store it as q[j].  */
+	    q_ptr[j] = q_star;
+	    if (j == 0)
+	      break;
+	    j--;
+	  }
+      }
+      r_len = b_len;
+      /* Normalise q.  */
+      if (q_ptr[q_len - 1] == 0)
+	q_len--;
+# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+	  b is shifted left by s bits.  */
+      /* Shift r right by s bits.  */
+      if (s > 0)
+	{
+	  mp_limb_t ptr = r_ptr + r_len;
+	  mp_twolimb_t accu = 0;
+	  size_t count;
+	  for (count = r_len; count > 0; count--)
+	    {
+	      accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+	      accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+	      *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+	    }
+	}
+# endif
+      /* Normalise r.  */
+      while (r_len > 0 && r_ptr[r_len - 1] == 0)
+	r_len--;
+    }
+  /* Compare r << 1 with b.  */
+  if (r_len > b_len)
+    goto increment_q;
+  {
+    size_t i;
+    for (i = b_len;;)
+      {
+	mp_limb_t r_i =
+	  (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+	  | (i < r_len ? r_ptr[i] << 1 : 0);
+	mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+	if (r_i > b_i)
+	  goto increment_q;
+	if (r_i < b_i)
+	  goto keep_q;
+	if (i == 0)
+	  break;
+	i--;
+      }
+  }
+  if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+    /* q is odd.  */
+    increment_q:
+    {
+      size_t i;
+      for (i = 0; i < q_len; i++)
+	if (++(q_ptr[i]) != 0)
+	  goto keep_q;
+      q_ptr[q_len++] = 1;
+    }
+  keep_q:
+  if (tmp_roomptr != NULL)
+    free (tmp_roomptr);
+  q->limbs = q_ptr;
+  q->nlimbs = q_len;
+  return roomptr;
+}
+
+/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+   representation.
+   Destroys the contents of a.
+   Return the allocated memory - containing the decimal digits in low-to-high
+   order, terminated with a NUL character - in case of success, NULL in case
+   of memory allocation failure.  */
+static char *
+convert_to_decimal (mpn_t a, size_t extra_zeroes)
+{
+  mp_limb_t *a_ptr = a.limbs;
+  size_t a_len = a.nlimbs;
+  /* 0.03345 is slightly larger than log(2)/(9*log(10)).  */
+  size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+  char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
+  if (c_ptr != NULL)
+    {
+      char *d_ptr = c_ptr;
+      for (; extra_zeroes > 0; extra_zeroes--)
+	*d_ptr++ = '0';
+      while (a_len > 0)
+	{
+	  /* Divide a by 10^9, in-place.  */
+	  mp_limb_t remainder = 0;
+	  mp_limb_t *ptr = a_ptr + a_len;
+	  size_t count;
+	  for (count = a_len; count > 0; count--)
+	    {
+	      mp_twolimb_t num =
+		((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+	      *ptr = num / 1000000000;
+	      remainder = num % 1000000000;
+	    }
+	  /* Store the remainder as 9 decimal digits.  */
+	  for (count = 9; count > 0; count--)
+	    {
+	      *d_ptr++ = '0' + (remainder % 10);
+	      remainder = remainder / 10;
+	    }
+	  /* Normalize a.  */
+	  if (a_ptr[a_len - 1] == 0)
+	    a_len--;
+	}
+      /* Remove leading zeroes.  */
+      while (d_ptr > c_ptr && d_ptr[-1] == '0')
+	d_ptr--;
+      /* But keep at least one zero.  */
+      if (d_ptr == c_ptr)
+	*d_ptr++ = '0';
+      /* Terminate the string.  */
+      *d_ptr = '\0';
+    }
+  return c_ptr;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0:
+   write x as x = 2^e * m, where m is a bignum.
+   Return the allocated memory in case of success, NULL in case of memory
+   allocation failure.  */
+static void *
+decode_long_double (long double x, int *ep, mpn_t *mp)
+{
+  mpn_t m;
+  int exp;
+  long double y;
+  size_t i;
+
+  /* Allocate memory for result.  */
+  m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+  m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+  if (m.limbs == NULL)
+    return NULL;
+  /* Split into exponential part and mantissa.  */
+  y = frexpl (x, &exp);
+  if (!(y >= 0.0L && y < 1.0L))
+    abort ();
+  /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * LDBL_MANT_BIT), and the
+     latter is an integer.  */
+  /* Convert the mantissa (y * LDBL_MANT_BIT) to a sequence of limbs.
+     I'm not sure whether it's safe to cast a 'long double' value between
+     2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+     'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+     doesn't matter).  */
+#  if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+#   if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+    {
+      mp_limb_t hi, lo;
+      y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+      hi = (int) y;
+      y -= hi;
+      if (!(y >= 0.0L && y < 1.0L))
+	abort ();
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      lo = (int) y;
+      y -= lo;
+      if (!(y >= 0.0L && y < 1.0L))
+	abort ();
+      m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+    }
+#   else
+    {
+      mp_limb_t d;
+      y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+      d = (int) y;
+      y -= d;
+      if (!(y >= 0.0L && y < 1.0L))
+	abort ();
+      m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+    }
+#   endif
+#  endif
+  for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+    {
+      mp_limb_t hi, lo;
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      hi = (int) y;
+      y -= hi;
+      if (!(y >= 0.0L && y < 1.0L))
+	abort ();
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      lo = (int) y;
+      y -= lo;
+      if (!(y >= 0.0L && y < 1.0L))
+	abort ();
+      m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+    }
+  if (!(y == 0.0L))
+    abort ();
+  /* Normalise.  */
+  while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+    m.nlimbs--;
+  *mp = m;
+  *ep = exp - LDBL_MANT_BIT;
+  return m.limbs;
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0:
+   write x as x = 2^e * m, where m is a bignum.
+   Return the allocated memory in case of success, NULL in case of memory
+   allocation failure.  */
+static void *
+decode_double (double x, int *ep, mpn_t *mp)
+{
+  mpn_t m;
+  int exp;
+  double y;
+  size_t i;
+
+  /* Allocate memory for result.  */
+  m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+  m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+  if (m.limbs == NULL)
+    return NULL;
+  /* Split into exponential part and mantissa.  */
+  y = frexp (x, &exp);
+  if (!(y >= 0.0 && y < 1.0))
+    abort ();
+  /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * DBL_MANT_BIT), and the
+     latter is an integer.  */
+  /* Convert the mantissa (y * DBL_MANT_BIT) to a sequence of limbs.
+     I'm not sure whether it's safe to cast a 'double' value between
+     2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+     'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+     doesn't matter).  */
+#  if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+#   if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+    {
+      mp_limb_t hi, lo;
+      y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+      hi = (int) y;
+      y -= hi;
+      if (!(y >= 0.0 && y < 1.0))
+	abort ();
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      lo = (int) y;
+      y -= lo;
+      if (!(y >= 0.0 && y < 1.0))
+	abort ();
+      m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+    }
+#   else
+    {
+      mp_limb_t d;
+      y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+      d = (int) y;
+      y -= d;
+      if (!(y >= 0.0 && y < 1.0))
+	abort ();
+      m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+    }
+#   endif
+#  endif
+  for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+    {
+      mp_limb_t hi, lo;
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      hi = (int) y;
+      y -= hi;
+      if (!(y >= 0.0 && y < 1.0))
+	abort ();
+      y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+      lo = (int) y;
+      y -= lo;
+      if (!(y >= 0.0 && y < 1.0))
+	abort ();
+      m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+    }
+  if (!(y == 0.0))
+    abort ();
+  /* Normalise.  */
+  while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+    m.nlimbs--;
+  *mp = m;
+  *ep = exp - DBL_MANT_BIT;
+  return m.limbs;
+}
+
+# endif
+
+/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+   Returns the decimal representation of round (x * 10^n).
+   Return the allocated memory - containing the decimal digits in low-to-high
+   order, terminated with a NUL character - in case of success, NULL in case
+   of memory allocation failure.  */
+static char *
+scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+{
+  int s;
+  size_t extra_zeroes;
+  unsigned int abs_n;
+  unsigned int abs_s;
+  mp_limb_t *pow5_ptr;
+  size_t pow5_len;
+  unsigned int s_limbs;
+  unsigned int s_bits;
+  mpn_t pow5;
+  mpn_t z;
+  void *z_memory;
+  char *digits;
+
+  if (memory == NULL)
+    return NULL;
+  /* x = 2^e * m, hence
+     y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+       = round (2^s * 5^n * m).  */
+  s = e + n;
+  extra_zeroes = 0;
+  /* Factor out a common power of 10 if possible.  */
+  if (s > 0 && n > 0)
+    {
+      extra_zeroes = (s < n ? s : n);
+      s -= extra_zeroes;
+      n -= extra_zeroes;
+    }
+  /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+     Before converting to decimal, we need to compute
+     z = round (2^s * 5^n * m).  */
+  /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+     sign.  2.322 is slightly larger than log(5)/log(2).  */
+  abs_n = (n >= 0 ? n : -n);
+  abs_s = (s >= 0 ? s : -s);
+  pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+				    + abs_s / GMP_LIMB_BITS + 1)
+				   * sizeof (mp_limb_t));
+  if (pow5_ptr == NULL)
+    {
+      free (memory);
+      return NULL;
+    }
+  /* Initialize with 1.  */
+  pow5_ptr[0] = 1;
+  pow5_len = 1;
+  /* Multiply with 5^|n|.  */
+  if (abs_n > 0)
+    {
+      static mp_limb_t const small_pow5[13 + 1] =
+	{
+	  1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+	  48828125, 244140625, 1220703125
+	};
+      unsigned int n13;
+      for (n13 = 0; n13 <= abs_n; n13 += 13)
+	{
+	  mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+	  size_t j;
+	  mp_twolimb_t carry = 0;
+	  for (j = 0; j < pow5_len; j++)
+	    {
+	      mp_limb_t digit2 = pow5_ptr[j];
+	      carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+	      pow5_ptr[j] = (mp_limb_t) carry;
+	      carry = carry >> GMP_LIMB_BITS;
+	    }
+	  if (carry > 0)
+	    pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+	}
+    }
+  s_limbs = abs_s / GMP_LIMB_BITS;
+  s_bits = abs_s % GMP_LIMB_BITS;
+  if (n >= 0 ? s >= 0 : s <= 0)
+    {
+      /* Multiply with 2^|s|.  */
+      if (s_bits > 0)
+	{
+	  mp_limb_t *ptr = pow5_ptr;
+	  mp_twolimb_t accu = 0;
+	  size_t count;
+	  for (count = pow5_len; count > 0; count--)
+	    {
+	      accu += (mp_twolimb_t) *ptr << s_bits;
+	      *ptr++ = (mp_limb_t) accu;
+	      accu = accu >> GMP_LIMB_BITS;
+	    }
+	  if (accu > 0)
+	    {
+	      *ptr = (mp_limb_t) accu;
+	      pow5_len++;
+	    }
+	}
+      if (s_limbs > 0)
+	{
+	  size_t count;
+	  for (count = pow5_len; count > 0;)
+	    {
+	      count--;
+	      pow5_ptr[s_limbs + count] = pow5_ptr[count];
+	    }
+	  for (count = s_limbs; count > 0;)
+	    {
+	      count--;
+	      pow5_ptr[count] = 0;
+	    }
+	  pow5_len += s_limbs;
+	}
+      pow5.limbs = pow5_ptr;
+      pow5.nlimbs = pow5_len;
+      if (n >= 0)
+	{
+	  /* Multiply m with pow5.  No division needed.  */
+	  z_memory = multiply (m, pow5, &z);
+	}
+      else
+	{
+	  /* Divide m by pow5 and round.  */
+	  z_memory = divide (m, pow5, &z);
+	}
+    }
+  else
+    {
+      pow5.limbs = pow5_ptr;
+      pow5.nlimbs = pow5_len;
+      if (n >= 0)
+	{
+	  /* n >= 0, s < 0.
+	     Multiply m with pow5, then divide by 2^|s|.  */
+	  mpn_t numerator;
+	  mpn_t denominator;
+	  void *tmp_memory;
+	  tmp_memory = multiply (m, pow5, &numerator);
+	  if (tmp_memory == NULL)
+	    {
+	      free (pow5_ptr);
+	      free (memory);
+	      return NULL;
+	    }
+	  /* Construct 2^|s|.  */
+	  {
+	    mp_limb_t *ptr = pow5_ptr + pow5_len;
+	    size_t i;
+	    for (i = 0; i < s_limbs; i++)
+	      ptr[i] = 0;
+	    ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+	    denominator.limbs = ptr;
+	    denominator.nlimbs = s_limbs + 1;
+	  }
+	  z_memory = divide (numerator, denominator, &z);
+	  free (tmp_memory);
+	}
+      else
+	{
+	  /* n < 0, s > 0.
+	     Multiply m with 2^s, then divide by pow5.  */
+	  mpn_t numerator;
+	  mp_limb_t *num_ptr;
+	  num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+					  * sizeof (mp_limb_t));
+	  if (num_ptr == NULL)
+	    {
+	      free (pow5_ptr);
+	      free (memory);
+	      return NULL;
+	    }
+	  {
+	    mp_limb_t *destptr = num_ptr;
+	    {
+	      size_t i;
+	      for (i = 0; i < s_limbs; i++)
+		*destptr++ = 0;
+	    }
+	    if (s_bits > 0)
+	      {
+		const mp_limb_t *sourceptr = m.limbs;
+		mp_twolimb_t accu = 0;
+		size_t count;
+		for (count = m.nlimbs; count > 0; count--)
+		  {
+		    accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+		    *destptr++ = (mp_limb_t) accu;
+		    accu = accu >> GMP_LIMB_BITS;
+		  }
+		if (accu > 0)
+		  *destptr++ = (mp_limb_t) accu;
+	      }
+	    else
+	      {
+		const mp_limb_t *sourceptr = m.limbs;
+		size_t count;
+		for (count = m.nlimbs; count > 0; count--)
+		  *destptr++ = *sourceptr++;
+	      }
+	    numerator.limbs = num_ptr;
+	    numerator.nlimbs = destptr - num_ptr;
+	  }
+	  z_memory = divide (numerator, pow5, &z);
+	  free (num_ptr);
+	}
+    }
+  free (pow5_ptr);
+  free (memory);
+
+  /* Here y = round (x * 10^n) = z * 10^extra_zeroes.  */
+
+  if (z_memory == NULL)
+    return NULL;
+  digits = convert_to_decimal (z, extra_zeroes);
+  free (z_memory);
+  return digits;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+   Returns the decimal representation of round (x * 10^n).
+   Return the allocated memory - containing the decimal digits in low-to-high
+   order, terminated with a NUL character - in case of success, NULL in case
+   of memory allocation failure.  */
+static char *
+scale10_round_decimal_long_double (long double x, int n)
+{
+  int e;
+  mpn_t m;
+  void *memory = decode_long_double (x, &e, &m);
+  return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+   Returns the decimal representation of round (x * 10^n).
+   Return the allocated memory - containing the decimal digits in low-to-high
+   order, terminated with a NUL character - in case of success, NULL in case
+   of memory allocation failure.  */
+static char *
+scale10_round_decimal_double (double x, int n)
+{
+  int e;
+  mpn_t m;
+  void *memory = decode_double (x, &e, &m);
+  return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and > 0:
+   Return an approximation for n with 10^n <= x < 10^(n+1).
+   The approximation is usually the right n, but may be off by 1 sometimes.  */
+static int
+floorlog10l (long double x)
+{
+  int exp;
+  long double y;
+  double z;
+  double l;
+
+  /* Split into exponential part and mantissa.  */
+  y = frexpl (x, &exp);
+  if (!(y >= 0.0L && y < 1.0L))
+    abort ();
+  if (y == 0.0L)
+    return INT_MIN;
+  if (y < 0.5L)
+    {
+      while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+	{
+	  y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+	  exp -= GMP_LIMB_BITS;
+	}
+      if (y < (1.0L / (1 << 16)))
+	{
+	  y *= 1.0L * (1 << 16);
+	  exp -= 16;
+	}
+      if (y < (1.0L / (1 << 8)))
+	{
+	  y *= 1.0L * (1 << 8);
+	  exp -= 8;
+	}
+      if (y < (1.0L / (1 << 4)))
+	{
+	  y *= 1.0L * (1 << 4);
+	  exp -= 4;
+	}
+      if (y < (1.0L / (1 << 2)))
+	{
+	  y *= 1.0L * (1 << 2);
+	  exp -= 2;
+	}
+      if (y < (1.0L / (1 << 1)))
+	{
+	  y *= 1.0L * (1 << 1);
+	  exp -= 1;
+	}
+    }
+  if (!(y >= 0.5L && y < 1.0L))
+    abort ();
+  /* Compute an approximation for l = log2(x) = exp + log2(y).  */
+  l = exp;
+  z = y;
+  if (z < 0.70710678118654752444)
+    {
+      z *= 1.4142135623730950488;
+      l -= 0.5;
+    }
+  if (z < 0.8408964152537145431)
+    {
+      z *= 1.1892071150027210667;
+      l -= 0.25;
+    }
+  if (z < 0.91700404320467123175)
+    {
+      z *= 1.0905077326652576592;
+      l -= 0.125;
+    }
+  if (z < 0.9576032806985736469)
+    {
+      z *= 1.0442737824274138403;
+      l -= 0.0625;
+    }
+  /* Now 0.95 <= z <= 1.01.  */
+  z = 1 - z;
+  /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
+     Four terms are enough to get an approximation with error < 10^-7.  */
+  l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+  /* Finally multiply with log(2)/log(10), yields an approximation for
+     log10(x).  */
+  l *= 0.30102999566398119523;
+  /* Round down to the next integer.  */
+  return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and > 0:
+   Return an approximation for n with 10^n <= x < 10^(n+1).
+   The approximation is usually the right n, but may be off by 1 sometimes.  */
+static int
+floorlog10 (double x)
+{
+  int exp;
+  double y;
+  double z;
+  double l;
+
+  /* Split into exponential part and mantissa.  */
+  y = frexp (x, &exp);
+  if (!(y >= 0.0 && y < 1.0))
+    abort ();
+  if (y == 0.0)
+    return INT_MIN;
+  if (y < 0.5)
+    {
+      while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+	{
+	  y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+	  exp -= GMP_LIMB_BITS;
+	}
+      if (y < (1.0 / (1 << 16)))
+	{
+	  y *= 1.0 * (1 << 16);
+	  exp -= 16;
+	}
+      if (y < (1.0 / (1 << 8)))
+	{
+	  y *= 1.0 * (1 << 8);
+	  exp -= 8;
+	}
+      if (y < (1.0 / (1 << 4)))
+	{
+	  y *= 1.0 * (1 << 4);
+	  exp -= 4;
+	}
+      if (y < (1.0 / (1 << 2)))
+	{
+	  y *= 1.0 * (1 << 2);
+	  exp -= 2;
+	}
+      if (y < (1.0 / (1 << 1)))
+	{
+	  y *= 1.0 * (1 << 1);
+	  exp -= 1;
+	}
+    }
+  if (!(y >= 0.5 && y < 1.0))
+    abort ();
+  /* Compute an approximation for l = log2(x) = exp + log2(y).  */
+  l = exp;
+  z = y;
+  if (z < 0.70710678118654752444)
+    {
+      z *= 1.4142135623730950488;
+      l -= 0.5;
+    }
+  if (z < 0.8408964152537145431)
+    {
+      z *= 1.1892071150027210667;
+      l -= 0.25;
+    }
+  if (z < 0.91700404320467123175)
+    {
+      z *= 1.0905077326652576592;
+      l -= 0.125;
+    }
+  if (z < 0.9576032806985736469)
+    {
+      z *= 1.0442737824274138403;
+      l -= 0.0625;
+    }
+  /* Now 0.95 <= z <= 1.01.  */
+  z = 1 - z;
+  /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ...
+     Four terms are enough to get an approximation with error < 10^-7.  */
+  l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+  /* Finally multiply with log(2)/log(10), yields an approximation for
+     log10(x).  */
+  l *= 0.30102999566398119523;
+  /* Round down to the next integer.  */
+  return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+#endif
+
+DCHAR_T *
+VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+	    const FCHAR_T *format, va_list args)
+{
+  DIRECTIVES d;
+  arguments a;
+
+  if (PRINTF_PARSE (format, &d, &a) < 0)
+    /* errno is already set.  */
+    return NULL;
+
+#define CLEANUP() \
+  free (d.dir);								\
+  if (a.arg)								\
+    free (a.arg);
+
+  if (PRINTF_FETCHARGS (args, &a) < 0)
+    {
+      CLEANUP ();
+      errno = EINVAL;
+      return NULL;
+    }
+
+  {
+    size_t buf_neededlength;
+    TCHAR_T *buf;
+    TCHAR_T *buf_malloced;
+    const FCHAR_T *cp;
+    size_t i;
+    DIRECTIVE *dp;
+    /* Output string accumulator.  */
+    DCHAR_T *result;
+    size_t allocated;
+    size_t length;
+
+    /* Allocate a small buffer that will hold a directive passed to
+       sprintf or snprintf.  */
+    buf_neededlength =
+      xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+    if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+      {
+	buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+	buf_malloced = NULL;
+      }
+    else
+#endif
+      {
+	size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+	if (size_overflow_p (buf_memsize))
+	  goto out_of_memory_1;
+	buf = (TCHAR_T *) malloc (buf_memsize);
+	if (buf == NULL)
+	  goto out_of_memory_1;
+	buf_malloced = buf;
+      }
+
+    if (resultbuf != NULL)
+      {
+	result = resultbuf;
+	allocated = *lengthp;
+      }
+    else
+      {
+	result = NULL;
+	allocated = 0;
+      }
+    length = 0;
+    /* Invariants:
+       result is either == resultbuf or == NULL or malloc-allocated.
+       If length > 0, then result != NULL.  */
+
+    /* Ensures that allocated >= needed.  Aborts through a jump to
+       out_of_memory if needed is SIZE_MAX or otherwise too big.  */
+#define ENSURE_ALLOCATION(needed) \
+    if ((needed) > allocated)						     \
+      {									     \
+	size_t memory_size;						     \
+	DCHAR_T *memory;						     \
+									     \
+	allocated = (allocated > 0 ? xtimes (allocated, 2) : 12);	     \
+	if ((needed) > allocated)					     \
+	  allocated = (needed);						     \
+	memory_size = xtimes (allocated, sizeof (DCHAR_T));		     \
+	if (size_overflow_p (memory_size))				     \
+	  goto out_of_memory;						     \
+	if (result == resultbuf || result == NULL)			     \
+	  memory = (DCHAR_T *) malloc (memory_size);			     \
+	else								     \
+	  memory = (DCHAR_T *) realloc (result, memory_size);		     \
+	if (memory == NULL)						     \
+	  goto out_of_memory;						     \
+	if (result == resultbuf && length > 0)				     \
+	  DCHAR_CPY (memory, result, length);				     \
+	result = memory;						     \
+      }
+
+    for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+      {
+	if (cp != dp->dir_start)
+	  {
+	    size_t n = dp->dir_start - cp;
+	    size_t augmented_length = xsum (length, n);
+
+	    ENSURE_ALLOCATION (augmented_length);
+	    /* This copies a piece of FCHAR_T[] into a DCHAR_T[].  Here we
+	       need that the format string contains only ASCII characters
+	       if FCHAR_T and DCHAR_T are not the same type.  */
+	    if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+	      {
+		DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+		length = augmented_length;
+	      }
+	    else
+	      {
+		do
+		  result[length++] = (unsigned char) *cp++;
+		while (--n > 0);
+	      }
+	  }
+	if (i == d.count)
+	  break;
+
+	/* Execute a single directive.  */
+	if (dp->conversion == '%')
+	  {
+	    size_t augmented_length;
+
+	    if (!(dp->arg_index == ARG_NONE))
+	      abort ();
+	    augmented_length = xsum (length, 1);
+	    ENSURE_ALLOCATION (augmented_length);
+	    result[length] = '%';
+	    length = augmented_length;
+	  }
+	else
+	  {
+	    if (!(dp->arg_index != ARG_NONE))
+	      abort ();
+
+	    if (dp->conversion == 'n')
+	      {
+		switch (a.arg[dp->arg_index].type)
+		  {
+		  case TYPE_COUNT_SCHAR_POINTER:
+		    *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+		    break;
+		  case TYPE_COUNT_SHORT_POINTER:
+		    *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+		    break;
+		  case TYPE_COUNT_INT_POINTER:
+		    *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+		    break;
+		  case TYPE_COUNT_LONGINT_POINTER:
+		    *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+		    break;
+#if HAVE_LONG_LONG_INT
+		  case TYPE_COUNT_LONGLONGINT_POINTER:
+		    *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+		    break;
+#endif
+		  default:
+		    abort ();
+		  }
+	      }
+#if ENABLE_UNISTDIO
+	    /* The unistdio extensions.  */
+	    else if (dp->conversion == 'U')
+	      {
+		arg_type type = a.arg[dp->arg_index].type;
+		int flags = dp->flags;
+		int has_width;
+		size_t width;
+		int has_precision;
+		size_t precision;
+
+		has_width = 0;
+		width = 0;
+		if (dp->width_start != dp->width_end)
+		  {
+		    if (dp->width_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->width_arg_index].a.a_int;
+			if (arg < 0)
+			  {
+			    /* "A negative field width is taken as a '-' flag
+			        followed by a positive field width."  */
+			    flags |= FLAG_LEFT;
+			    width = (unsigned int) (-arg);
+			  }
+			else
+			  width = arg;
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->width_start;
+
+			do
+			  width = xsum (xtimes (width, 10), *digitp++ - '0');
+			while (digitp != dp->width_end);
+		      }
+		    has_width = 1;
+		  }
+
+		has_precision = 0;
+		precision = 0;
+		if (dp->precision_start != dp->precision_end)
+		  {
+		    if (dp->precision_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->precision_arg_index].a.a_int;
+			/* "A negative precision is taken as if the precision
+			    were omitted."  */
+			if (arg >= 0)
+			  {
+			    precision = arg;
+			    has_precision = 1;
+			  }
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->precision_start + 1;
+
+			precision = 0;
+			while (digitp != dp->precision_end)
+			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+			has_precision = 1;
+		      }
+		  }
+
+		switch (type)
+		  {
+		  case TYPE_U8_STRING:
+		    {
+		      const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+		      const uint8_t *arg_end;
+		      size_t characters;
+
+		      if (has_precision)
+			{
+			  /* Use only PRECISION characters, from the left.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (; precision > 0; precision--)
+			    {
+			      int count = u8_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else if (has_width)
+			{
+			  /* Use the entire string, and count the number of
+			     characters.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (;;)
+			    {
+			      int count = u8_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else
+			{
+			  /* Use the entire string.  */
+			  arg_end = arg + u8_strlen (arg);
+			  /* The number of characters doesn't matter.  */
+			  characters = 0;
+			}
+
+		      if (has_width && width > characters
+			  && !(dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+
+# if DCHAR_IS_UINT8_T
+		      {
+			size_t n = arg_end - arg;
+			ENSURE_ALLOCATION (xsum (length, n));
+			DCHAR_CPY (result + length, arg, n);
+			length += n;
+		      }
+# else
+		      { /* Convert.  */
+			DCHAR_T *converted = result + length;
+			size_t converted_len = allocated - length;
+#  if DCHAR_IS_TCHAR
+			/* Convert from UTF-8 to locale encoding.  */
+			if (u8_conv_to_encoding (locale_charset (),
+						 iconveh_question_mark,
+						 arg, arg_end - arg, NULL,
+						 &converted, &converted_len)
+			    < 0)
+#  else
+			/* Convert from UTF-8 to UTF-16/UTF-32.  */
+			converted =
+			  U8_TO_DCHAR (arg, arg_end - arg,
+				       converted, &converted_len);
+			if (converted == NULL)
+#  endif
+			  {
+			    int saved_errno = errno;
+			    if (!(result == resultbuf || result == NULL))
+			      free (result);
+			    if (buf_malloced != NULL)
+			      free (buf_malloced);
+			    CLEANUP ();
+			    errno = saved_errno;
+			    return NULL;
+			  }
+			if (converted != result + length)
+			  {
+			    ENSURE_ALLOCATION (xsum (length, converted_len));
+			    DCHAR_CPY (result + length, converted, converted_len);
+			    free (converted);
+			  }
+			length += converted_len;
+		      }
+# endif
+
+		      if (has_width && width > characters
+			  && (dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+		    }
+		    break;
+
+		  case TYPE_U16_STRING:
+		    {
+		      const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+		      const uint16_t *arg_end;
+		      size_t characters;
+
+		      if (has_precision)
+			{
+			  /* Use only PRECISION characters, from the left.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (; precision > 0; precision--)
+			    {
+			      int count = u16_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else if (has_width)
+			{
+			  /* Use the entire string, and count the number of
+			     characters.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (;;)
+			    {
+			      int count = u16_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else
+			{
+			  /* Use the entire string.  */
+			  arg_end = arg + u16_strlen (arg);
+			  /* The number of characters doesn't matter.  */
+			  characters = 0;
+			}
+
+		      if (has_width && width > characters
+			  && !(dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+
+# if DCHAR_IS_UINT16_T
+		      {
+			size_t n = arg_end - arg;
+			ENSURE_ALLOCATION (xsum (length, n));
+			DCHAR_CPY (result + length, arg, n);
+			length += n;
+		      }
+# else
+		      { /* Convert.  */
+			DCHAR_T *converted = result + length;
+			size_t converted_len = allocated - length;
+#  if DCHAR_IS_TCHAR
+			/* Convert from UTF-16 to locale encoding.  */
+			if (u16_conv_to_encoding (locale_charset (),
+						  iconveh_question_mark,
+						  arg, arg_end - arg, NULL,
+						  &converted, &converted_len)
+			    < 0)
+#  else
+			/* Convert from UTF-16 to UTF-8/UTF-32.  */
+			converted =
+			  U16_TO_DCHAR (arg, arg_end - arg,
+					converted, &converted_len);
+			if (converted == NULL)
+#  endif
+			  {
+			    int saved_errno = errno;
+			    if (!(result == resultbuf || result == NULL))
+			      free (result);
+			    if (buf_malloced != NULL)
+			      free (buf_malloced);
+			    CLEANUP ();
+			    errno = saved_errno;
+			    return NULL;
+			  }
+			if (converted != result + length)
+			  {
+			    ENSURE_ALLOCATION (xsum (length, converted_len));
+			    DCHAR_CPY (result + length, converted, converted_len);
+			    free (converted);
+			  }
+			length += converted_len;
+		      }
+# endif
+
+		      if (has_width && width > characters
+			  && (dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+		    }
+		    break;
+
+		  case TYPE_U32_STRING:
+		    {
+		      const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+		      const uint32_t *arg_end;
+		      size_t characters;
+
+		      if (has_precision)
+			{
+			  /* Use only PRECISION characters, from the left.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (; precision > 0; precision--)
+			    {
+			      int count = u32_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else if (has_width)
+			{
+			  /* Use the entire string, and count the number of
+			     characters.  */
+			  arg_end = arg;
+			  characters = 0;
+			  for (;;)
+			    {
+			      int count = u32_strmblen (arg_end);
+			      if (count == 0)
+				break;
+			      if (count < 0)
+				{
+				  if (!(result == resultbuf || result == NULL))
+				    free (result);
+				  if (buf_malloced != NULL)
+				    free (buf_malloced);
+				  CLEANUP ();
+				  errno = EILSEQ;
+				  return NULL;
+				}
+			      arg_end += count;
+			      characters++;
+			    }
+			}
+		      else
+			{
+			  /* Use the entire string.  */
+			  arg_end = arg + u32_strlen (arg);
+			  /* The number of characters doesn't matter.  */
+			  characters = 0;
+			}
+
+		      if (has_width && width > characters
+			  && !(dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+
+# if DCHAR_IS_UINT32_T
+		      {
+			size_t n = arg_end - arg;
+			ENSURE_ALLOCATION (xsum (length, n));
+			DCHAR_CPY (result + length, arg, n);
+			length += n;
+		      }
+# else
+		      { /* Convert.  */
+			DCHAR_T *converted = result + length;
+			size_t converted_len = allocated - length;
+#  if DCHAR_IS_TCHAR
+			/* Convert from UTF-32 to locale encoding.  */
+			if (u32_conv_to_encoding (locale_charset (),
+						  iconveh_question_mark,
+						  arg, arg_end - arg, NULL,
+						  &converted, &converted_len)
+			    < 0)
+#  else
+			/* Convert from UTF-32 to UTF-8/UTF-16.  */
+			converted =
+			  U32_TO_DCHAR (arg, arg_end - arg,
+					converted, &converted_len);
+			if (converted == NULL)
+#  endif
+			  {
+			    int saved_errno = errno;
+			    if (!(result == resultbuf || result == NULL))
+			      free (result);
+			    if (buf_malloced != NULL)
+			      free (buf_malloced);
+			    CLEANUP ();
+			    errno = saved_errno;
+			    return NULL;
+			  }
+			if (converted != result + length)
+			  {
+			    ENSURE_ALLOCATION (xsum (length, converted_len));
+			    DCHAR_CPY (result + length, converted, converted_len);
+			    free (converted);
+			  }
+			length += converted_len;
+		      }
+# endif
+
+		      if (has_width && width > characters
+			  && (dp->flags & FLAG_LEFT))
+			{
+			  size_t n = width - characters;
+			  ENSURE_ALLOCATION (xsum (length, n));
+			  DCHAR_SET (result + length, ' ', n);
+			  length += n;
+			}
+		    }
+		    break;
+
+		  default:
+		    abort ();
+		  }
+	      }
+#endif
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+	    else if ((dp->conversion == 'a' || dp->conversion == 'A')
+# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+		     && (0
+#  if NEED_PRINTF_DOUBLE
+			 || a.arg[dp->arg_index].type == TYPE_DOUBLE
+#  endif
+#  if NEED_PRINTF_LONG_DOUBLE
+			 || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+#  endif
+			)
+# endif
+		    )
+	      {
+		arg_type type = a.arg[dp->arg_index].type;
+		int flags = dp->flags;
+		int has_width;
+		size_t width;
+		int has_precision;
+		size_t precision;
+		size_t tmp_length;
+		DCHAR_T tmpbuf[700];
+		DCHAR_T *tmp;
+		DCHAR_T *pad_ptr;
+		DCHAR_T *p;
+
+		has_width = 0;
+		width = 0;
+		if (dp->width_start != dp->width_end)
+		  {
+		    if (dp->width_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->width_arg_index].a.a_int;
+			if (arg < 0)
+			  {
+			    /* "A negative field width is taken as a '-' flag
+			        followed by a positive field width."  */
+			    flags |= FLAG_LEFT;
+			    width = (unsigned int) (-arg);
+			  }
+			else
+			  width = arg;
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->width_start;
+
+			do
+			  width = xsum (xtimes (width, 10), *digitp++ - '0');
+			while (digitp != dp->width_end);
+		      }
+		    has_width = 1;
+		  }
+
+		has_precision = 0;
+		precision = 0;
+		if (dp->precision_start != dp->precision_end)
+		  {
+		    if (dp->precision_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->precision_arg_index].a.a_int;
+			/* "A negative precision is taken as if the precision
+			    were omitted."  */
+			if (arg >= 0)
+			  {
+			    precision = arg;
+			    has_precision = 1;
+			  }
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->precision_start + 1;
+
+			precision = 0;
+			while (digitp != dp->precision_end)
+			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+			has_precision = 1;
+		      }
+		  }
+
+		/* Allocate a temporary buffer of sufficient size.  */
+		if (type == TYPE_LONGDOUBLE)
+		  tmp_length =
+		    (unsigned int) ((LDBL_DIG + 1)
+				    * 0.831 /* decimal -> hexadecimal */
+				   )
+		    + 1; /* turn floor into ceil */
+		else
+		  tmp_length =
+		    (unsigned int) ((DBL_DIG + 1)
+				    * 0.831 /* decimal -> hexadecimal */
+				   )
+		    + 1; /* turn floor into ceil */
+		if (tmp_length < precision)
+		  tmp_length = precision;
+		/* Account for sign, decimal point etc. */
+		tmp_length = xsum (tmp_length, 12);
+
+		if (tmp_length < width)
+		  tmp_length = width;
+
+		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+		if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+		  tmp = tmpbuf;
+		else
+		  {
+		    size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+		    if (size_overflow_p (tmp_memsize))
+		      /* Overflow, would lead to out of memory.  */
+		      goto out_of_memory;
+		    tmp = (DCHAR_T *) malloc (tmp_memsize);
+		    if (tmp == NULL)
+		      /* Out of memory.  */
+		      goto out_of_memory;
+		  }
+
+		pad_ptr = NULL;
+		p = tmp;
+		if (type == TYPE_LONGDOUBLE)
+		  {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+		    if (isnanl (arg))
+		      {
+			if (dp->conversion == 'A')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+			DECL_LONG_DOUBLE_ROUNDING
+
+			BEGIN_LONG_DOUBLE_ROUNDING ();
+
+			if (signbit (arg)) /* arg < 0.0L or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0L && arg + arg == arg)
+			  {
+			    if (dp->conversion == 'A')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+			    int exponent;
+			    long double mantissa;
+
+			    if (arg > 0.0L)
+			      mantissa = printf_frexpl (arg, &exponent);
+			    else
+			      {
+				exponent = 0;
+				mantissa = 0.0L;
+			      }
+
+			    if (has_precision
+				&& precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+			      {
+				/* Round the mantissa.  */
+				long double tail = mantissa;
+				size_t q;
+
+				for (q = precision; ; q--)
+				  {
+				    int digit = (int) tail;
+				    tail -= digit;
+				    if (q == 0)
+				      {
+					if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+					  tail = 1 - tail;
+					else
+					  tail = - tail;
+					break;
+				      }
+				    tail *= 16.0L;
+				  }
+				if (tail != 0.0L)
+				  for (q = precision; q > 0; q--)
+				    tail *= 0.0625L;
+				mantissa += tail;
+			      }
+
+			    *p++ = '0';
+			    *p++ = dp->conversion - 'A' + 'X';
+			    pad_ptr = p;
+			    {
+			      int digit;
+
+			      digit = (int) mantissa;
+			      mantissa -= digit;
+			      *p++ = '0' + digit;
+			      if ((flags & FLAG_ALT)
+				  || mantissa > 0.0L || precision > 0)
+				{
+				  *p++ = decimal_point_char ();
+				  /* This loop terminates because we assume
+				     that FLT_RADIX is a power of 2.  */
+				  while (mantissa > 0.0L)
+				    {
+				      mantissa *= 16.0L;
+				      digit = (int) mantissa;
+				      mantissa -= digit;
+				      *p++ = digit
+					     + (digit < 10
+						? '0'
+						: dp->conversion - 10);
+				      if (precision > 0)
+					precision--;
+				    }
+				  while (precision > 0)
+				    {
+				      *p++ = '0';
+				      precision--;
+				    }
+				}
+			      }
+			      *p++ = dp->conversion - 'A' + 'P';
+#  if WIDE_CHAR_VERSION
+			      {
+				static const wchar_t decimal_format[] =
+				  { '%', '+', 'd', '\0' };
+				SNPRINTF (p, 6 + 1, decimal_format, exponent);
+			      }
+			      while (*p != '\0')
+				p++;
+#  else
+			      if (sizeof (DCHAR_T) == 1)
+				{
+				  sprintf ((char *) p, "%+d", exponent);
+				  while (*p != '\0')
+				    p++;
+				}
+			      else
+				{
+				  char expbuf[6 + 1];
+				  const char *ep;
+				  sprintf (expbuf, "%+d", exponent);
+				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+				    p++;
+				}
+#  endif
+			  }
+
+			END_LONG_DOUBLE_ROUNDING ();
+		      }
+# else
+		    abort ();
+# endif
+		  }
+		else
+		  {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+		    double arg = a.arg[dp->arg_index].a.a_double;
+
+		    if (isnan (arg))
+		      {
+			if (dp->conversion == 'A')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+
+			if (signbit (arg)) /* arg < 0.0 or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0 && arg + arg == arg)
+			  {
+			    if (dp->conversion == 'A')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+			    int exponent;
+			    double mantissa;
+
+			    if (arg > 0.0)
+			      mantissa = printf_frexp (arg, &exponent);
+			    else
+			      {
+				exponent = 0;
+				mantissa = 0.0;
+			      }
+
+			    if (has_precision
+				&& precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+			      {
+				/* Round the mantissa.  */
+				double tail = mantissa;
+				size_t q;
+
+				for (q = precision; ; q--)
+				  {
+				    int digit = (int) tail;
+				    tail -= digit;
+				    if (q == 0)
+				      {
+					if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+					  tail = 1 - tail;
+					else
+					  tail = - tail;
+					break;
+				      }
+				    tail *= 16.0;
+				  }
+				if (tail != 0.0)
+				  for (q = precision; q > 0; q--)
+				    tail *= 0.0625;
+				mantissa += tail;
+			      }
+
+			    *p++ = '0';
+			    *p++ = dp->conversion - 'A' + 'X';
+			    pad_ptr = p;
+			    {
+			      int digit;
+
+			      digit = (int) mantissa;
+			      mantissa -= digit;
+			      *p++ = '0' + digit;
+			      if ((flags & FLAG_ALT)
+				  || mantissa > 0.0 || precision > 0)
+				{
+				  *p++ = decimal_point_char ();
+				  /* This loop terminates because we assume
+				     that FLT_RADIX is a power of 2.  */
+				  while (mantissa > 0.0)
+				    {
+				      mantissa *= 16.0;
+				      digit = (int) mantissa;
+				      mantissa -= digit;
+				      *p++ = digit
+					     + (digit < 10
+						? '0'
+						: dp->conversion - 10);
+				      if (precision > 0)
+					precision--;
+				    }
+				  while (precision > 0)
+				    {
+				      *p++ = '0';
+				      precision--;
+				    }
+				}
+			      }
+			      *p++ = dp->conversion - 'A' + 'P';
+#  if WIDE_CHAR_VERSION
+			      {
+				static const wchar_t decimal_format[] =
+				  { '%', '+', 'd', '\0' };
+				SNPRINTF (p, 6 + 1, decimal_format, exponent);
+			      }
+			      while (*p != '\0')
+				p++;
+#  else
+			      if (sizeof (DCHAR_T) == 1)
+				{
+				  sprintf ((char *) p, "%+d", exponent);
+				  while (*p != '\0')
+				    p++;
+				}
+			      else
+				{
+				  char expbuf[6 + 1];
+				  const char *ep;
+				  sprintf (expbuf, "%+d", exponent);
+				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+				    p++;
+				}
+#  endif
+			  }
+		      }
+# else
+		    abort ();
+# endif
+		  }
+		/* The generated string now extends from tmp to p, with the
+		   zero padding insertion point being at pad_ptr.  */
+		if (has_width && p - tmp < width)
+		  {
+		    size_t pad = width - (p - tmp);
+		    DCHAR_T *end = p + pad;
+
+		    if (flags & FLAG_LEFT)
+		      {
+			/* Pad with spaces on the right.  */
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+		      {
+			/* Pad with zeroes.  */
+			DCHAR_T *q = end;
+
+			while (p > pad_ptr)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = '0';
+		      }
+		    else
+		      {
+			/* Pad with spaces on the left.  */
+			DCHAR_T *q = end;
+
+			while (p > tmp)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+
+		    p = end;
+		  }
+
+		{
+		  size_t count = p - tmp;
+
+		  if (count >= tmp_length)
+		    /* tmp_length was incorrectly calculated - fix the
+		       code above!  */
+		    abort ();
+
+		  /* Make room for the result.  */
+		  if (count >= allocated - length)
+		    {
+		      size_t n = xsum (length, count);
+
+		      ENSURE_ALLOCATION (n);
+		    }
+
+		  /* Append the result.  */
+		  memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+		  if (tmp != tmpbuf)
+		    free (tmp);
+		  length += count;
+		}
+	      }
+#endif
+#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+	    else if ((dp->conversion == 'f' || dp->conversion == 'F'
+		      || dp->conversion == 'e' || dp->conversion == 'E'
+		      || dp->conversion == 'g' || dp->conversion == 'G'
+		      || dp->conversion == 'a' || dp->conversion == 'A')
+		     && (0
+# if NEED_PRINTF_DOUBLE
+			 || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# elif NEED_PRINTF_INFINITE_DOUBLE
+			 || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+			     /* The systems (mingw) which produce wrong output
+				for Inf, -Inf, and NaN also do so for -0.0.
+				Therefore we treat this case here as well.  */
+			     && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+			 || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+			 || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+			     /* Some systems produce wrong output for Inf,
+				-Inf, and NaN.  */
+			     && is_infinitel (a.arg[dp->arg_index].a.a_longdouble))
+# endif
+			))
+	      {
+# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+		arg_type type = a.arg[dp->arg_index].type;
+# endif
+		int flags = dp->flags;
+		int has_width;
+		size_t width;
+		int has_precision;
+		size_t precision;
+		size_t tmp_length;
+		DCHAR_T tmpbuf[700];
+		DCHAR_T *tmp;
+		DCHAR_T *pad_ptr;
+		DCHAR_T *p;
+
+		has_width = 0;
+		width = 0;
+		if (dp->width_start != dp->width_end)
+		  {
+		    if (dp->width_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->width_arg_index].a.a_int;
+			if (arg < 0)
+			  {
+			    /* "A negative field width is taken as a '-' flag
+			        followed by a positive field width."  */
+			    flags |= FLAG_LEFT;
+			    width = (unsigned int) (-arg);
+			  }
+			else
+			  width = arg;
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->width_start;
+
+			do
+			  width = xsum (xtimes (width, 10), *digitp++ - '0');
+			while (digitp != dp->width_end);
+		      }
+		    has_width = 1;
+		  }
+
+		has_precision = 0;
+		precision = 0;
+		if (dp->precision_start != dp->precision_end)
+		  {
+		    if (dp->precision_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->precision_arg_index].a.a_int;
+			/* "A negative precision is taken as if the precision
+			    were omitted."  */
+			if (arg >= 0)
+			  {
+			    precision = arg;
+			    has_precision = 1;
+			  }
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->precision_start + 1;
+
+			precision = 0;
+			while (digitp != dp->precision_end)
+			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+			has_precision = 1;
+		      }
+		  }
+
+		/* POSIX specifies the default precision to be 6 for %f, %F,
+		   %e, %E, but not for %g, %G.  Implementations appear to use
+		   the same default precision also for %g, %G.  */
+		if (!has_precision)
+		  precision = 6;
+
+		/* Allocate a temporary buffer of sufficient size.  */
+# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+		tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+		tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+# elif NEED_PRINTF_LONG_DOUBLE
+		tmp_length = LDBL_DIG + 1;
+# elif NEED_PRINTF_DOUBLE
+		tmp_length = DBL_DIG + 1;
+# else
+		tmp_length = 0;
+# endif
+		if (tmp_length < precision)
+		  tmp_length = precision;
+# if NEED_PRINTF_LONG_DOUBLE
+#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+		if (type == TYPE_LONGDOUBLE)
+#  endif
+		  if (dp->conversion == 'f' || dp->conversion == 'F')
+		    {
+		      long double arg = a.arg[dp->arg_index].a.a_longdouble;
+		      if (!(isnanl (arg) || arg + arg == arg))
+			{
+			  /* arg is finite and nonzero.  */
+			  int exponent = floorlog10l (arg < 0 ? -arg : arg);
+			  if (exponent >= 0 && tmp_length < exponent + precision)
+			    tmp_length = exponent + precision;
+			}
+		    }
+# endif
+# if NEED_PRINTF_DOUBLE
+#  if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+		if (type == TYPE_DOUBLE)
+#  endif
+		  if (dp->conversion == 'f' || dp->conversion == 'F')
+		    {
+		      double arg = a.arg[dp->arg_index].a.a_double;
+		      if (!(isnan (arg) || arg + arg == arg))
+			{
+			  /* arg is finite and nonzero.  */
+			  int exponent = floorlog10 (arg < 0 ? -arg : arg);
+			  if (exponent >= 0 && tmp_length < exponent + precision)
+			    tmp_length = exponent + precision;
+			}
+		    }
+# endif
+		/* Account for sign, decimal point etc. */
+		tmp_length = xsum (tmp_length, 12);
+
+		if (tmp_length < width)
+		  tmp_length = width;
+
+		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+		if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+		  tmp = tmpbuf;
+		else
+		  {
+		    size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+		    if (size_overflow_p (tmp_memsize))
+		      /* Overflow, would lead to out of memory.  */
+		      goto out_of_memory;
+		    tmp = (DCHAR_T *) malloc (tmp_memsize);
+		    if (tmp == NULL)
+		      /* Out of memory.  */
+		      goto out_of_memory;
+		  }
+
+		pad_ptr = NULL;
+		p = tmp;
+
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+		if (type == TYPE_LONGDOUBLE)
+#  endif
+		  {
+		    long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+		    if (isnanl (arg))
+		      {
+			if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+			DECL_LONG_DOUBLE_ROUNDING
+
+			BEGIN_LONG_DOUBLE_ROUNDING ();
+
+			if (signbit (arg)) /* arg < 0.0L or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0L && arg + arg == arg)
+			  {
+			    if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+#  if NEED_PRINTF_LONG_DOUBLE
+			    pad_ptr = p;
+
+			    if (dp->conversion == 'f' || dp->conversion == 'F')
+			      {
+				char *digits;
+				size_t ndigits;
+
+				digits =
+				  scale10_round_decimal_long_double (arg, precision);
+				if (digits == NULL)
+				  {
+				    END_LONG_DOUBLE_ROUNDING ();
+				    goto out_of_memory;
+				  }
+				ndigits = strlen (digits);
+
+				if (ndigits > precision)
+				  do
+				    {
+				      --ndigits;
+				      *p++ = digits[ndigits];
+				    }
+				  while (ndigits > precision);
+				else
+				  *p++ = '0';
+				/* Here ndigits <= precision.  */
+				if ((flags & FLAG_ALT) || precision > 0)
+				  {
+				    *p++ = decimal_point_char ();
+				    for (; precision > ndigits; precision--)
+				      *p++ = '0';
+				    while (ndigits > 0)
+				      {
+					--ndigits;
+					*p++ = digits[ndigits];
+				      }
+				  }
+
+				free (digits);
+			      }
+			    else if (dp->conversion == 'e' || dp->conversion == 'E')
+			      {
+				int exponent;
+
+				if (arg == 0.0L)
+				  {
+				    exponent = 0;
+				    *p++ = '0';
+				    if ((flags & FLAG_ALT) || precision > 0)
+				      {
+					*p++ = decimal_point_char ();
+					for (; precision > 0; precision--)
+					  *p++ = '0';
+				      }
+				  }
+				else
+				  {
+				    /* arg > 0.0L.  */
+				    int adjusted;
+				    char *digits;
+				    size_t ndigits;
+
+				    exponent = floorlog10l (arg);
+				    adjusted = 0;
+				    for (;;)
+				      {
+					digits =
+					  scale10_round_decimal_long_double (arg,
+									     (int)precision - exponent);
+					if (digits == NULL)
+					  {
+					    END_LONG_DOUBLE_ROUNDING ();
+					    goto out_of_memory;
+					  }
+					ndigits = strlen (digits);
+
+					if (ndigits == precision + 1)
+					  break;
+					if (ndigits < precision
+					    || ndigits > precision + 2)
+					  /* The exponent was not guessed
+					     precisely enough.  */
+					  abort ();
+					if (adjusted)
+					  /* None of two values of exponent is
+					     the right one.  Prevent an endless
+					     loop.  */
+					  abort ();
+					free (digits);
+					if (ndigits == precision)
+					  exponent -= 1;
+					else
+					  exponent += 1;
+					adjusted = 1;
+				      }
+
+				    /* Here ndigits = precision+1.  */
+				    *p++ = digits[--ndigits];
+				    if ((flags & FLAG_ALT) || precision > 0)
+				      {
+					*p++ = decimal_point_char ();
+					while (ndigits > 0)
+					  {
+					    --ndigits;
+					    *p++ = digits[ndigits];
+					  }
+				      }
+
+				    free (digits);
+				  }
+
+				*p++ = dp->conversion; /* 'e' or 'E' */
+#   if WIDE_CHAR_VERSION
+				{
+				  static const wchar_t decimal_format[] =
+				    { '%', '+', '.', '2', 'd', '\0' };
+				  SNPRINTF (p, 6 + 1, decimal_format, exponent);
+				}
+				while (*p != '\0')
+				  p++;
+#   else
+				if (sizeof (DCHAR_T) == 1)
+				  {
+				    sprintf ((char *) p, "%+.2d", exponent);
+				    while (*p != '\0')
+				      p++;
+				  }
+				else
+				  {
+				    char expbuf[6 + 1];
+				    const char *ep;
+				    sprintf (expbuf, "%+.2d", exponent);
+				    for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+				      p++;
+				  }
+#   endif
+			      }
+			    else if (dp->conversion == 'g' || dp->conversion == 'G')
+			      {
+				if (precision == 0)
+				  precision = 1;
+				/* precision >= 1.  */
+
+				if (arg == 0.0L)
+				  /* The exponent is 0, >= -4, < precision.
+				     Use fixed-point notation.  */
+				  {
+				    size_t ndigits = precision;
+				    /* Number of trailing zeroes that have to be
+				       dropped.  */
+				    size_t nzeroes =
+				      (flags & FLAG_ALT ? 0 : precision - 1);
+
+				    --ndigits;
+				    *p++ = '0';
+				    if ((flags & FLAG_ALT) || ndigits > nzeroes)
+				      {
+					*p++ = decimal_point_char ();
+					while (ndigits > nzeroes)
+					  {
+					    --ndigits;
+					    *p++ = '0';
+					  }
+				      }
+				  }
+				else
+				  {
+				    /* arg > 0.0L.  */
+				    int exponent;
+				    int adjusted;
+				    char *digits;
+				    size_t ndigits;
+				    size_t nzeroes;
+
+				    exponent = floorlog10l (arg);
+				    adjusted = 0;
+				    for (;;)
+				      {
+					digits =
+					  scale10_round_decimal_long_double (arg,
+									     (int)(precision - 1) - exponent);
+					if (digits == NULL)
+					  {
+					    END_LONG_DOUBLE_ROUNDING ();
+					    goto out_of_memory;
+					  }
+					ndigits = strlen (digits);
+
+					if (ndigits == precision)
+					  break;
+					if (ndigits < precision - 1
+					    || ndigits > precision + 1)
+					  /* The exponent was not guessed
+					     precisely enough.  */
+					  abort ();
+					if (adjusted)
+					  /* None of two values of exponent is
+					     the right one.  Prevent an endless
+					     loop.  */
+					  abort ();
+					free (digits);
+					if (ndigits < precision)
+					  exponent -= 1;
+					else
+					  exponent += 1;
+					adjusted = 1;
+				      }
+				    /* Here ndigits = precision.  */
+
+				    /* Determine the number of trailing zeroes
+				       that have to be dropped.  */
+				    nzeroes = 0;
+				    if ((flags & FLAG_ALT) == 0)
+				      while (nzeroes < ndigits
+					     && digits[nzeroes] == '0')
+					nzeroes++;
+
+				    /* The exponent is now determined.  */
+				    if (exponent >= -4
+					&& exponent < (long)precision)
+				      {
+					/* Fixed-point notation:
+					   max(exponent,0)+1 digits, then the
+					   decimal point, then the remaining
+					   digits without trailing zeroes.  */
+					if (exponent >= 0)
+					  {
+					    size_t count = exponent + 1;
+					    /* Note: count <= precision = ndigits.  */
+					    for (; count > 0; count--)
+					      *p++ = digits[--ndigits];
+					    if ((flags & FLAG_ALT) || ndigits > nzeroes)
+					      {
+						*p++ = decimal_point_char ();
+						while (ndigits > nzeroes)
+						  {
+						    --ndigits;
+						    *p++ = digits[ndigits];
+						  }
+					      }
+					  }
+					else
+					  {
+					    size_t count = -exponent - 1;
+					    *p++ = '0';
+					    *p++ = decimal_point_char ();
+					    for (; count > 0; count--)
+					      *p++ = '0';
+					    while (ndigits > nzeroes)
+					      {
+						--ndigits;
+						*p++ = digits[ndigits];
+					      }
+					  }
+				      }
+				    else
+				      {
+					/* Exponential notation.  */
+					*p++ = digits[--ndigits];
+					if ((flags & FLAG_ALT) || ndigits > nzeroes)
+					  {
+					    *p++ = decimal_point_char ();
+					    while (ndigits > nzeroes)
+					      {
+						--ndigits;
+						*p++ = digits[ndigits];
+					      }
+					  }
+					*p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+#   if WIDE_CHAR_VERSION
+					{
+					  static const wchar_t decimal_format[] =
+					    { '%', '+', '.', '2', 'd', '\0' };
+					  SNPRINTF (p, 6 + 1, decimal_format, exponent);
+					}
+					while (*p != '\0')
+					  p++;
+#   else
+					if (sizeof (DCHAR_T) == 1)
+					  {
+					    sprintf ((char *) p, "%+.2d", exponent);
+					    while (*p != '\0')
+					      p++;
+					  }
+					else
+					  {
+					    char expbuf[6 + 1];
+					    const char *ep;
+					    sprintf (expbuf, "%+.2d", exponent);
+					    for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+					      p++;
+					  }
+#   endif
+				      }
+
+				    free (digits);
+				  }
+			      }
+			    else
+			      abort ();
+#  else
+			    /* arg is finite.  */
+			    abort ();
+#  endif
+			  }
+
+			END_LONG_DOUBLE_ROUNDING ();
+		      }
+		  }
+#  if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+		else
+#  endif
+# endif
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+		  {
+		    double arg = a.arg[dp->arg_index].a.a_double;
+
+		    if (isnan (arg))
+		      {
+			if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+			  {
+			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+			  }
+			else
+			  {
+			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+			  }
+		      }
+		    else
+		      {
+			int sign = 0;
+
+			if (signbit (arg)) /* arg < 0.0 or negative zero */
+			  {
+			    sign = -1;
+			    arg = -arg;
+			  }
+
+			if (sign < 0)
+			  *p++ = '-';
+			else if (flags & FLAG_SHOWSIGN)
+			  *p++ = '+';
+			else if (flags & FLAG_SPACE)
+			  *p++ = ' ';
+
+			if (arg > 0.0 && arg + arg == arg)
+			  {
+			    if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+			      {
+				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+			      }
+			    else
+			      {
+				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+			      }
+			  }
+			else
+			  {
+#  if NEED_PRINTF_DOUBLE
+			    pad_ptr = p;
+
+			    if (dp->conversion == 'f' || dp->conversion == 'F')
+			      {
+				char *digits;
+				size_t ndigits;
+
+				digits =
+				  scale10_round_decimal_double (arg, precision);
+				if (digits == NULL)
+				  goto out_of_memory;
+				ndigits = strlen (digits);
+
+				if (ndigits > precision)
+				  do
+				    {
+				      --ndigits;
+				      *p++ = digits[ndigits];
+				    }
+				  while (ndigits > precision);
+				else
+				  *p++ = '0';
+				/* Here ndigits <= precision.  */
+				if ((flags & FLAG_ALT) || precision > 0)
+				  {
+				    *p++ = decimal_point_char ();
+				    for (; precision > ndigits; precision--)
+				      *p++ = '0';
+				    while (ndigits > 0)
+				      {
+					--ndigits;
+					*p++ = digits[ndigits];
+				      }
+				  }
+
+				free (digits);
+			      }
+			    else if (dp->conversion == 'e' || dp->conversion == 'E')
+			      {
+				int exponent;
+
+				if (arg == 0.0)
+				  {
+				    exponent = 0;
+				    *p++ = '0';
+				    if ((flags & FLAG_ALT) || precision > 0)
+				      {
+					*p++ = decimal_point_char ();
+					for (; precision > 0; precision--)
+					  *p++ = '0';
+				      }
+				  }
+				else
+				  {
+				    /* arg > 0.0.  */
+				    int adjusted;
+				    char *digits;
+				    size_t ndigits;
+
+				    exponent = floorlog10 (arg);
+				    adjusted = 0;
+				    for (;;)
+				      {
+					digits =
+					  scale10_round_decimal_double (arg,
+									(int)precision - exponent);
+					if (digits == NULL)
+					  goto out_of_memory;
+					ndigits = strlen (digits);
+
+					if (ndigits == precision + 1)
+					  break;
+					if (ndigits < precision
+					    || ndigits > precision + 2)
+					  /* The exponent was not guessed
+					     precisely enough.  */
+					  abort ();
+					if (adjusted)
+					  /* None of two values of exponent is
+					     the right one.  Prevent an endless
+					     loop.  */
+					  abort ();
+					free (digits);
+					if (ndigits == precision)
+					  exponent -= 1;
+					else
+					  exponent += 1;
+					adjusted = 1;
+				      }
+
+				    /* Here ndigits = precision+1.  */
+				    *p++ = digits[--ndigits];
+				    if ((flags & FLAG_ALT) || precision > 0)
+				      {
+					*p++ = decimal_point_char ();
+					while (ndigits > 0)
+					  {
+					    --ndigits;
+					    *p++ = digits[ndigits];
+					  }
+				      }
+
+				    free (digits);
+				  }
+
+				*p++ = dp->conversion; /* 'e' or 'E' */
+#   if WIDE_CHAR_VERSION
+				{
+				  static const wchar_t decimal_format[] =
+				    /* Produce the same number of exponent digits
+				       as the native printf implementation.  */
+#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+				    { '%', '+', '.', '3', 'd', '\0' };
+#    else
+				    { '%', '+', '.', '2', 'd', '\0' };
+#    endif
+				  SNPRINTF (p, 6 + 1, decimal_format, exponent);
+				}
+				while (*p != '\0')
+				  p++;
+#   else
+				{
+				  static const char decimal_format[] =
+				    /* Produce the same number of exponent digits
+				       as the native printf implementation.  */
+#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+				    "%+.3d";
+#    else
+				    "%+.2d";
+#    endif
+				  if (sizeof (DCHAR_T) == 1)
+				    {
+				      sprintf ((char *) p, decimal_format, exponent);
+				      while (*p != '\0')
+					p++;
+				    }
+				  else
+				    {
+				      char expbuf[6 + 1];
+				      const char *ep;
+				      sprintf (expbuf, decimal_format, exponent);
+				      for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+					p++;
+				    }
+				}
+#   endif
+			      }
+			    else if (dp->conversion == 'g' || dp->conversion == 'G')
+			      {
+				if (precision == 0)
+				  precision = 1;
+				/* precision >= 1.  */
+
+				if (arg == 0.0)
+				  /* The exponent is 0, >= -4, < precision.
+				     Use fixed-point notation.  */
+				  {
+				    size_t ndigits = precision;
+				    /* Number of trailing zeroes that have to be
+				       dropped.  */
+				    size_t nzeroes =
+				      (flags & FLAG_ALT ? 0 : precision - 1);
+
+				    --ndigits;
+				    *p++ = '0';
+				    if ((flags & FLAG_ALT) || ndigits > nzeroes)
+				      {
+					*p++ = decimal_point_char ();
+					while (ndigits > nzeroes)
+					  {
+					    --ndigits;
+					    *p++ = '0';
+					  }
+				      }
+				  }
+				else
+				  {
+				    /* arg > 0.0.  */
+				    int exponent;
+				    int adjusted;
+				    char *digits;
+				    size_t ndigits;
+				    size_t nzeroes;
+
+				    exponent = floorlog10 (arg);
+				    adjusted = 0;
+				    for (;;)
+				      {
+					digits =
+					  scale10_round_decimal_double (arg,
+									(int)(precision - 1) - exponent);
+					if (digits == NULL)
+					  goto out_of_memory;
+					ndigits = strlen (digits);
+
+					if (ndigits == precision)
+					  break;
+					if (ndigits < precision - 1
+					    || ndigits > precision + 1)
+					  /* The exponent was not guessed
+					     precisely enough.  */
+					  abort ();
+					if (adjusted)
+					  /* None of two values of exponent is
+					     the right one.  Prevent an endless
+					     loop.  */
+					  abort ();
+					free (digits);
+					if (ndigits < precision)
+					  exponent -= 1;
+					else
+					  exponent += 1;
+					adjusted = 1;
+				      }
+				    /* Here ndigits = precision.  */
+
+				    /* Determine the number of trailing zeroes
+				       that have to be dropped.  */
+				    nzeroes = 0;
+				    if ((flags & FLAG_ALT) == 0)
+				      while (nzeroes < ndigits
+					     && digits[nzeroes] == '0')
+					nzeroes++;
+
+				    /* The exponent is now determined.  */
+				    if (exponent >= -4
+					&& exponent < (long)precision)
+				      {
+					/* Fixed-point notation:
+					   max(exponent,0)+1 digits, then the
+					   decimal point, then the remaining
+					   digits without trailing zeroes.  */
+					if (exponent >= 0)
+					  {
+					    size_t count = exponent + 1;
+					    /* Note: count <= precision = ndigits.  */
+					    for (; count > 0; count--)
+					      *p++ = digits[--ndigits];
+					    if ((flags & FLAG_ALT) || ndigits > nzeroes)
+					      {
+						*p++ = decimal_point_char ();
+						while (ndigits > nzeroes)
+						  {
+						    --ndigits;
+						    *p++ = digits[ndigits];
+						  }
+					      }
+					  }
+					else
+					  {
+					    size_t count = -exponent - 1;
+					    *p++ = '0';
+					    *p++ = decimal_point_char ();
+					    for (; count > 0; count--)
+					      *p++ = '0';
+					    while (ndigits > nzeroes)
+					      {
+						--ndigits;
+						*p++ = digits[ndigits];
+					      }
+					  }
+				      }
+				    else
+				      {
+					/* Exponential notation.  */
+					*p++ = digits[--ndigits];
+					if ((flags & FLAG_ALT) || ndigits > nzeroes)
+					  {
+					    *p++ = decimal_point_char ();
+					    while (ndigits > nzeroes)
+					      {
+						--ndigits;
+						*p++ = digits[ndigits];
+					      }
+					  }
+					*p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+#   if WIDE_CHAR_VERSION
+					{
+					  static const wchar_t decimal_format[] =
+					    /* Produce the same number of exponent digits
+					       as the native printf implementation.  */
+#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+					    { '%', '+', '.', '3', 'd', '\0' };
+#    else
+					    { '%', '+', '.', '2', 'd', '\0' };
+#    endif
+					  SNPRINTF (p, 6 + 1, decimal_format, exponent);
+					}
+					while (*p != '\0')
+					  p++;
+#   else
+					{
+					  static const char decimal_format[] =
+					    /* Produce the same number of exponent digits
+					       as the native printf implementation.  */
+#    if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+					    "%+.3d";
+#    else
+					    "%+.2d";
+#    endif
+					  if (sizeof (DCHAR_T) == 1)
+					    {
+					      sprintf ((char *) p, decimal_format, exponent);
+					      while (*p != '\0')
+						p++;
+					    }
+					  else
+					    {
+					      char expbuf[6 + 1];
+					      const char *ep;
+					      sprintf (expbuf, decimal_format, exponent);
+					      for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+						p++;
+					    }
+					}
+#   endif
+				      }
+
+				    free (digits);
+				  }
+			      }
+			    else
+			      abort ();
+#  else
+			    /* arg is finite.  */
+			    if (!(arg == 0.0))
+			      abort ();
+
+			    pad_ptr = p;
+
+			    if (dp->conversion == 'f' || dp->conversion == 'F')
+			      {
+				*p++ = '0';
+				if ((flags & FLAG_ALT) || precision > 0)
+				  {
+				    *p++ = decimal_point_char ();
+				    for (; precision > 0; precision--)
+				      *p++ = '0';
+				  }
+			      }
+			    else if (dp->conversion == 'e' || dp->conversion == 'E')
+			      {
+				*p++ = '0';
+				if ((flags & FLAG_ALT) || precision > 0)
+				  {
+				    *p++ = decimal_point_char ();
+				    for (; precision > 0; precision--)
+				      *p++ = '0';
+				  }
+				*p++ = dp->conversion; /* 'e' or 'E' */
+				*p++ = '+';
+				/* Produce the same number of exponent digits as
+				   the native printf implementation.  */
+#   if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+				*p++ = '0';
+#   endif
+				*p++ = '0';
+				*p++ = '0';
+			      }
+			    else if (dp->conversion == 'g' || dp->conversion == 'G')
+			      {
+				*p++ = '0';
+				if (flags & FLAG_ALT)
+				  {
+				    size_t ndigits =
+				      (precision > 0 ? precision - 1 : 0);
+				    *p++ = decimal_point_char ();
+				    for (; ndigits > 0; --ndigits)
+				      *p++ = '0';
+				  }
+			      }
+			    else
+			      abort ();
+#  endif
+			  }
+		      }
+		  }
+# endif
+
+		/* The generated string now extends from tmp to p, with the
+		   zero padding insertion point being at pad_ptr.  */
+		if (has_width && p - tmp < width)
+		  {
+		    size_t pad = width - (p - tmp);
+		    DCHAR_T *end = p + pad;
+
+		    if (flags & FLAG_LEFT)
+		      {
+			/* Pad with spaces on the right.  */
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+		      {
+			/* Pad with zeroes.  */
+			DCHAR_T *q = end;
+
+			while (p > pad_ptr)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = '0';
+		      }
+		    else
+		      {
+			/* Pad with spaces on the left.  */
+			DCHAR_T *q = end;
+
+			while (p > tmp)
+			  *--q = *--p;
+			for (; pad > 0; pad--)
+			  *p++ = ' ';
+		      }
+
+		    p = end;
+		  }
+
+		{
+		  size_t count = p - tmp;
+
+		  if (count >= tmp_length)
+		    /* tmp_length was incorrectly calculated - fix the
+		       code above!  */
+		    abort ();
+
+		  /* Make room for the result.  */
+		  if (count >= allocated - length)
+		    {
+		      size_t n = xsum (length, count);
+
+		      ENSURE_ALLOCATION (n);
+		    }
+
+		  /* Append the result.  */
+		  memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+		  if (tmp != tmpbuf)
+		    free (tmp);
+		  length += count;
+		}
+	      }
+#endif
+	    else
+	      {
+		arg_type type = a.arg[dp->arg_index].type;
+		int flags = dp->flags;
+#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+		int has_width;
+		size_t width;
+#endif
+#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+		int has_precision;
+		size_t precision;
+#endif
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+		int prec_ourselves;
+#else
+#		define prec_ourselves 0
+#endif
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+		int pad_ourselves;
+#else
+#		define pad_ourselves 0
+#endif
+		TCHAR_T *fbp;
+		unsigned int prefix_count;
+		int prefixes[2];
+#if !USE_SNPRINTF
+		size_t tmp_length;
+		TCHAR_T tmpbuf[700];
+		TCHAR_T *tmp;
+#endif
+
+#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+		has_width = 0;
+		width = 0;
+		if (dp->width_start != dp->width_end)
+		  {
+		    if (dp->width_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->width_arg_index].a.a_int;
+			if (arg < 0)
+			  {
+			    /* "A negative field width is taken as a '-' flag
+			        followed by a positive field width."  */
+			    flags |= FLAG_LEFT;
+			    width = (unsigned int) (-arg);
+			  }
+			else
+			  width = arg;
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->width_start;
+
+			do
+			  width = xsum (xtimes (width, 10), *digitp++ - '0');
+			while (digitp != dp->width_end);
+		      }
+		    has_width = 1;
+		  }
+#endif
+
+#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+		has_precision = 0;
+		precision = 6;
+		if (dp->precision_start != dp->precision_end)
+		  {
+		    if (dp->precision_arg_index != ARG_NONE)
+		      {
+			int arg;
+
+			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+			  abort ();
+			arg = a.arg[dp->precision_arg_index].a.a_int;
+			/* "A negative precision is taken as if the precision
+			    were omitted."  */
+			if (arg >= 0)
+			  {
+			    precision = arg;
+			    has_precision = 1;
+			  }
+		      }
+		    else
+		      {
+			const FCHAR_T *digitp = dp->precision_start + 1;
+
+			precision = 0;
+			while (digitp != dp->precision_end)
+			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+			has_precision = 1;
+		      }
+		  }
+#endif
+
+#if !USE_SNPRINTF
+		/* Allocate a temporary buffer of sufficient size for calling
+		   sprintf.  */
+		{
+		  switch (dp->conversion)
+		    {
+
+		    case 'd': case 'i': case 'u':
+# if HAVE_LONG_LONG_INT
+		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+					  * 0.30103 /* binary -> decimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+# endif
+		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+					  * 0.30103 /* binary -> decimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+					  * 0.30103 /* binary -> decimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      if (tmp_length < precision)
+			tmp_length = precision;
+		      /* Multiply by 2, as an estimate for FLAG_GROUP.  */
+		      tmp_length = xsum (tmp_length, tmp_length);
+		      /* Add 1, to account for a leading sign.  */
+		      tmp_length = xsum (tmp_length, 1);
+		      break;
+
+		    case 'o':
+# if HAVE_LONG_LONG_INT
+		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+					  * 0.333334 /* binary -> octal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+# endif
+		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+					  * 0.333334 /* binary -> octal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+					  * 0.333334 /* binary -> octal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      if (tmp_length < precision)
+			tmp_length = precision;
+		      /* Add 1, to account for a leading sign.  */
+		      tmp_length = xsum (tmp_length, 1);
+		      break;
+
+		    case 'x': case 'X':
+# if HAVE_LONG_LONG_INT
+		      if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+					  * 0.25 /* binary -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+# endif
+		      if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+					  * 0.25 /* binary -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+			tmp_length =
+			  (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+					  * 0.25 /* binary -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      if (tmp_length < precision)
+			tmp_length = precision;
+		      /* Add 2, to account for a leading sign or alternate form.  */
+		      tmp_length = xsum (tmp_length, 2);
+		      break;
+
+		    case 'f': case 'F':
+		      if (type == TYPE_LONGDOUBLE)
+			tmp_length =
+			  (unsigned int) (LDBL_MAX_EXP
+					  * 0.30103 /* binary -> decimal */
+					  * 2 /* estimate for FLAG_GROUP */
+					 )
+			  + 1 /* turn floor into ceil */
+			  + 10; /* sign, decimal point etc. */
+		      else
+			tmp_length =
+			  (unsigned int) (DBL_MAX_EXP
+					  * 0.30103 /* binary -> decimal */
+					  * 2 /* estimate for FLAG_GROUP */
+					 )
+			  + 1 /* turn floor into ceil */
+			  + 10; /* sign, decimal point etc. */
+		      tmp_length = xsum (tmp_length, precision);
+		      break;
+
+		    case 'e': case 'E': case 'g': case 'G':
+		      tmp_length =
+			12; /* sign, decimal point, exponent etc. */
+		      tmp_length = xsum (tmp_length, precision);
+		      break;
+
+		    case 'a': case 'A':
+		      if (type == TYPE_LONGDOUBLE)
+			tmp_length =
+			  (unsigned int) (LDBL_DIG
+					  * 0.831 /* decimal -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      else
+			tmp_length =
+			  (unsigned int) (DBL_DIG
+					  * 0.831 /* decimal -> hexadecimal */
+					 )
+			  + 1; /* turn floor into ceil */
+		      if (tmp_length < precision)
+			tmp_length = precision;
+		      /* Account for sign, decimal point etc. */
+		      tmp_length = xsum (tmp_length, 12);
+		      break;
+
+		    case 'c':
+# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+		      if (type == TYPE_WIDE_CHAR)
+			tmp_length = MB_CUR_MAX;
+		      else
+# endif
+			tmp_length = 1;
+		      break;
+
+		    case 's':
+# if HAVE_WCHAR_T
+		      if (type == TYPE_WIDE_STRING)
+			{
+			  tmp_length =
+			    local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
+
+#  if !WIDE_CHAR_VERSION
+			  tmp_length = xtimes (tmp_length, MB_CUR_MAX);
+#  endif
+			}
+		      else
+# endif
+			tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+		      break;
+
+		    case 'p':
+		      tmp_length =
+			(unsigned int) (sizeof (void *) * CHAR_BIT
+					* 0.25 /* binary -> hexadecimal */
+				       )
+			  + 1 /* turn floor into ceil */
+			  + 2; /* account for leading 0x */
+		      break;
+
+		    default:
+		      abort ();
+		    }
+
+# if ENABLE_UNISTDIO
+		  /* Padding considers the number of characters, therefore the
+		     number of elements after padding may be
+		       > max (tmp_length, width)
+		     but is certainly
+		       <= tmp_length + width.  */
+		  tmp_length = xsum (tmp_length, width);
+# else
+		  /* Padding considers the number of elements, says POSIX.  */
+		  if (tmp_length < width)
+		    tmp_length = width;
+# endif
+
+		  tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+		}
+
+		if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+		  tmp = tmpbuf;
+		else
+		  {
+		    size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+
+		    if (size_overflow_p (tmp_memsize))
+		      /* Overflow, would lead to out of memory.  */
+		      goto out_of_memory;
+		    tmp = (TCHAR_T *) malloc (tmp_memsize);
+		    if (tmp == NULL)
+		      /* Out of memory.  */
+		      goto out_of_memory;
+		  }
+#endif
+
+		/* Decide whether to handle the precision ourselves.  */
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+		switch (dp->conversion)
+		  {
+		  case 'd': case 'i': case 'u':
+		  case 'o':
+		  case 'x': case 'X': case 'p':
+		    prec_ourselves = has_precision && (precision > 0);
+		    break;
+		  default:
+		    prec_ourselves = 0;
+		    break;
+		  }
+#endif
+
+		/* Decide whether to perform the padding ourselves.  */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+		switch (dp->conversion)
+		  {
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+		  /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+		     to perform the padding after this conversion.  Functions
+		     with unistdio extensions perform the padding based on
+		     character count rather than element count.  */
+		  case 'c': case 's':
+# endif
+# if NEED_PRINTF_FLAG_ZERO
+		  case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+		  case 'a': case 'A':
+# endif
+		    pad_ourselves = 1;
+		    break;
+		  default:
+		    pad_ourselves = prec_ourselves;
+		    break;
+		  }
+#endif
+
+		/* Construct the format string for calling snprintf or
+		   sprintf.  */
+		fbp = buf;
+		*fbp++ = '%';
+#if NEED_PRINTF_FLAG_GROUPING
+		/* The underlying implementation doesn't support the ' flag.
+		   Produce no grouping characters in this case; this is
+		   acceptable because the grouping is locale dependent.  */
+#else
+		if (flags & FLAG_GROUP)
+		  *fbp++ = '\'';
+#endif
+		if (flags & FLAG_LEFT)
+		  *fbp++ = '-';
+		if (flags & FLAG_SHOWSIGN)
+		  *fbp++ = '+';
+		if (flags & FLAG_SPACE)
+		  *fbp++ = ' ';
+		if (flags & FLAG_ALT)
+		  *fbp++ = '#';
+		if (!pad_ourselves)
+		  {
+		    if (flags & FLAG_ZERO)
+		      *fbp++ = '0';
+		    if (dp->width_start != dp->width_end)
+		      {
+			size_t n = dp->width_end - dp->width_start;
+			/* The width specification is known to consist only
+			   of standard ASCII characters.  */
+			if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+			  {
+			    memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+			    fbp += n;
+			  }
+			else
+			  {
+			    const FCHAR_T *mp = dp->width_start;
+			    do
+			      *fbp++ = (unsigned char) *mp++;
+			    while (--n > 0);
+			  }
+		      }
+		  }
+		if (!prec_ourselves)
+		  {
+		    if (dp->precision_start != dp->precision_end)
+		      {
+			size_t n = dp->precision_end - dp->precision_start;
+			/* The precision specification is known to consist only
+			   of standard ASCII characters.  */
+			if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+			  {
+			    memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+			    fbp += n;
+			  }
+			else
+			  {
+			    const FCHAR_T *mp = dp->precision_start;
+			    do
+			      *fbp++ = (unsigned char) *mp++;
+			    while (--n > 0);
+			  }
+		      }
+		  }
+
+		switch (type)
+		  {
+#if HAVE_LONG_LONG_INT
+		  case TYPE_LONGLONGINT:
+		  case TYPE_ULONGLONGINT:
+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+		    *fbp++ = 'I';
+		    *fbp++ = '6';
+		    *fbp++ = '4';
+		    break;
+# else
+		    *fbp++ = 'l';
+		    /*FALLTHROUGH*/
+# endif
+#endif
+		  case TYPE_LONGINT:
+		  case TYPE_ULONGINT:
+#if HAVE_WINT_T
+		  case TYPE_WIDE_CHAR:
+#endif
+#if HAVE_WCHAR_T
+		  case TYPE_WIDE_STRING:
+#endif
+		    *fbp++ = 'l';
+		    break;
+		  case TYPE_LONGDOUBLE:
+		    *fbp++ = 'L';
+		    break;
+		  default:
+		    break;
+		  }
+#if NEED_PRINTF_DIRECTIVE_F
+		if (dp->conversion == 'F')
+		  *fbp = 'f';
+		else
+#endif
+		  *fbp = dp->conversion;
+#if USE_SNPRINTF
+# if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3))
+		fbp[1] = '%';
+		fbp[2] = 'n';
+		fbp[3] = '\0';
+# else
+		/* On glibc2 systems from glibc >= 2.3 - probably also older
+		   ones - we know that snprintf's returns value conforms to
+		   ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes.
+		   Therefore we can avoid using %n in this situation.
+		   On glibc2 systems from 2004-10-18 or newer, the use of %n
+		   in format strings in writable memory may crash the program
+		   (if compiled with _FORTIFY_SOURCE=2), so we should avoid it
+		   in this situation.  */
+		fbp[1] = '\0';
+# endif
+#else
+		fbp[1] = '\0';
+#endif
+
+		/* Construct the arguments for calling snprintf or sprintf.  */
+		prefix_count = 0;
+		if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+		  {
+		    if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+		      abort ();
+		    prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+		  }
+		if (dp->precision_arg_index != ARG_NONE)
+		  {
+		    if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+		      abort ();
+		    prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+		  }
+
+#if USE_SNPRINTF
+		/* The SNPRINTF result is appended after result[0..length].
+		   The latter is an array of DCHAR_T; SNPRINTF appends an
+		   array of TCHAR_T to it.  This is possible because
+		   sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+		   alignof (TCHAR_T) <= alignof (DCHAR_T).  */
+# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+		/* Prepare checking whether snprintf returns the count
+		   via %n.  */
+		ENSURE_ALLOCATION (xsum (length, 1));
+		*(TCHAR_T *) (result + length) = '\0';
+#endif
+
+		for (;;)
+		  {
+		    int count = -1;
+
+#if USE_SNPRINTF
+		    int retcount = 0;
+		    size_t maxlen = allocated - length;
+		    /* SNPRINTF can fail if its second argument is
+		       > INT_MAX.  */
+		    if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+		      maxlen = INT_MAX / TCHARS_PER_DCHAR;
+		    maxlen = maxlen * TCHARS_PER_DCHAR;
+# define SNPRINTF_BUF(arg) \
+		    switch (prefix_count)				    \
+		      {							    \
+		      case 0:						    \
+			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+					     maxlen, buf,		    \
+					     arg, &count);		    \
+			break;						    \
+		      case 1:						    \
+			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+					     maxlen, buf,		    \
+					     prefixes[0], arg, &count);	    \
+			break;						    \
+		      case 2:						    \
+			retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+					     maxlen, buf,		    \
+					     prefixes[0], prefixes[1], arg, \
+					     &count);			    \
+			break;						    \
+		      default:						    \
+			abort ();					    \
+		      }
+#else
+# define SNPRINTF_BUF(arg) \
+		    switch (prefix_count)				    \
+		      {							    \
+		      case 0:						    \
+			count = sprintf (tmp, buf, arg);		    \
+			break;						    \
+		      case 1:						    \
+			count = sprintf (tmp, buf, prefixes[0], arg);	    \
+			break;						    \
+		      case 2:						    \
+			count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+					 arg);				    \
+			break;						    \
+		      default:						    \
+			abort ();					    \
+		      }
+#endif
+
+		    switch (type)
+		      {
+		      case TYPE_SCHAR:
+			{
+			  int arg = a.arg[dp->arg_index].a.a_schar;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_UCHAR:
+			{
+			  unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_SHORT:
+			{
+			  int arg = a.arg[dp->arg_index].a.a_short;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_USHORT:
+			{
+			  unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_INT:
+			{
+			  int arg = a.arg[dp->arg_index].a.a_int;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_UINT:
+			{
+			  unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_LONGINT:
+			{
+			  long int arg = a.arg[dp->arg_index].a.a_longint;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_ULONGINT:
+			{
+			  unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#if HAVE_LONG_LONG_INT
+		      case TYPE_LONGLONGINT:
+			{
+			  long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_ULONGLONGINT:
+			{
+			  unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#endif
+		      case TYPE_DOUBLE:
+			{
+			  double arg = a.arg[dp->arg_index].a.a_double;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_LONGDOUBLE:
+			{
+			  long double arg = a.arg[dp->arg_index].a.a_longdouble;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      case TYPE_CHAR:
+			{
+			  int arg = a.arg[dp->arg_index].a.a_char;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#if HAVE_WINT_T
+		      case TYPE_WIDE_CHAR:
+			{
+			  wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#endif
+		      case TYPE_STRING:
+			{
+			  const char *arg = a.arg[dp->arg_index].a.a_string;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#if HAVE_WCHAR_T
+		      case TYPE_WIDE_STRING:
+			{
+			  const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+#endif
+		      case TYPE_POINTER:
+			{
+			  void *arg = a.arg[dp->arg_index].a.a_pointer;
+			  SNPRINTF_BUF (arg);
+			}
+			break;
+		      default:
+			abort ();
+		      }
+
+#if USE_SNPRINTF
+		    /* Portability: Not all implementations of snprintf()
+		       are ISO C 99 compliant.  Determine the number of
+		       bytes that snprintf() has produced or would have
+		       produced.  */
+		    if (count >= 0)
+		      {
+			/* Verify that snprintf() has NUL-terminated its
+			   result.  */
+			if (count < maxlen
+			    && ((TCHAR_T *) (result + length)) [count] != '\0')
+			  abort ();
+			/* Portability hack.  */
+			if (retcount > count)
+			  count = retcount;
+		      }
+		    else
+		      {
+			/* snprintf() doesn't understand the '%n'
+			   directive.  */
+			if (fbp[1] != '\0')
+			  {
+			    /* Don't use the '%n' directive; instead, look
+			       at the snprintf() return value.  */
+			    fbp[1] = '\0';
+			    continue;
+			  }
+			else
+			  {
+			    /* Look at the snprintf() return value.  */
+			    if (retcount < 0)
+			      {
+				/* HP-UX 10.20 snprintf() is doubly deficient:
+				   It doesn't understand the '%n' directive,
+				   *and* it returns -1 (rather than the length
+				   that would have been required) when the
+				   buffer is too small.  */
+				size_t bigger_need =
+				  xsum (xtimes (allocated, 2), 12);
+				ENSURE_ALLOCATION (bigger_need);
+				continue;
+			      }
+			    else
+			      count = retcount;
+			  }
+		      }
+#endif
+
+		    /* Attempt to handle failure.  */
+		    if (count < 0)
+		      {
+			if (!(result == resultbuf || result == NULL))
+			  free (result);
+			if (buf_malloced != NULL)
+			  free (buf_malloced);
+			CLEANUP ();
+			errno = EINVAL;
+			return NULL;
+		      }
+
+#if USE_SNPRINTF
+		    /* Handle overflow of the allocated buffer.
+		       If such an overflow occurs, a C99 compliant snprintf()
+		       returns a count >= maxlen.  However, a non-compliant
+		       snprintf() function returns only count = maxlen - 1.  To
+		       cover both cases, test whether count >= maxlen - 1.  */
+		    if ((unsigned int) count + 1 >= maxlen)
+		      {
+			/* If maxlen already has attained its allowed maximum,
+			   allocating more memory will not increase maxlen.
+			   Instead of looping, bail out.  */
+			if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+			  goto overflow;
+			else
+			  {
+			    /* Need at least count * sizeof (TCHAR_T) bytes.
+			       But allocate proportionally, to avoid looping
+			       eternally if snprintf() reports a too small
+			       count.  */
+			    size_t n =
+			      xmax (xsum (length,
+					  (count + TCHARS_PER_DCHAR - 1)
+					  / TCHARS_PER_DCHAR),
+				    xtimes (allocated, 2));
+
+			    ENSURE_ALLOCATION (n);
+			    continue;
+			  }
+		      }
+#endif
+
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+		    if (prec_ourselves)
+		      {
+			/* Handle the precision.  */
+			TCHAR_T *prec_ptr = 
+# if USE_SNPRINTF
+			  (TCHAR_T *) (result + length);
+# else
+			  tmp;
+# endif
+			size_t prefix_count;
+			size_t move;
+
+			prefix_count = 0;
+			/* Put the additional zeroes after the sign.  */
+			if (count >= 1
+			    && (*prec_ptr == '-' || *prec_ptr == '+'
+				|| *prec_ptr == ' '))
+			  prefix_count = 1;
+			/* Put the additional zeroes after the 0x prefix if
+			   (flags & FLAG_ALT) || (dp->conversion == 'p').  */
+			else if (count >= 2
+				 && prec_ptr[0] == '0'
+				 && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+			  prefix_count = 2;
+
+			move = count - prefix_count;
+			if (precision > move)
+			  {
+			    /* Insert zeroes.  */
+			    size_t insert = precision - move;
+			    TCHAR_T *prec_end;
+
+# if USE_SNPRINTF
+			    size_t n =
+			      xsum (length,
+				    (count + insert + TCHARS_PER_DCHAR - 1)
+				    / TCHARS_PER_DCHAR);
+			    length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+			    ENSURE_ALLOCATION (n);
+			    length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+			    prec_ptr = (TCHAR_T *) (result + length);
+# endif
+
+			    prec_end = prec_ptr + count;
+			    prec_ptr += prefix_count;
+
+			    while (prec_end > prec_ptr)
+			      {
+				prec_end--;
+				prec_end[insert] = prec_end[0];
+			      }
+
+			    prec_end += insert;
+			    do
+			      *--prec_end = '0';
+			    while (prec_end > prec_ptr);
+
+			    count += insert;
+			  }
+		      }
+#endif
+
+#if !DCHAR_IS_TCHAR
+# if !USE_SNPRINTF
+		    if (count >= tmp_length)
+		      /* tmp_length was incorrectly calculated - fix the
+			 code above!  */
+		      abort ();
+# endif
+
+		    /* Convert from TCHAR_T[] to DCHAR_T[].  */
+		    if (dp->conversion == 'c' || dp->conversion == 's')
+		      {
+			/* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+			   TYPE_WIDE_STRING.
+			   The result string is not certainly ASCII.  */
+			const TCHAR_T *tmpsrc;
+			DCHAR_T *tmpdst;
+			size_t tmpdst_len;
+			/* This code assumes that TCHAR_T is 'char'.  */
+			typedef int TCHAR_T_verify
+				    [2 * (sizeof (TCHAR_T) == 1) - 1];
+# if USE_SNPRINTF
+			tmpsrc = (TCHAR_T *) (result + length);
+# else
+			tmpsrc = tmp;
+# endif
+			tmpdst = NULL;
+			tmpdst_len = 0;
+			if (DCHAR_CONV_FROM_ENCODING (locale_charset (),
+						      iconveh_question_mark,
+						      tmpsrc, count,
+						      NULL,
+						      &tmpdst, &tmpdst_len)
+			    < 0)
+			  {
+			    int saved_errno = errno;
+			    if (!(result == resultbuf || result == NULL))
+			      free (result);
+			    if (buf_malloced != NULL)
+			      free (buf_malloced);
+			    CLEANUP ();
+			    errno = saved_errno;
+			    return NULL;
+			  }
+			ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+			DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+			free (tmpdst);
+			count = tmpdst_len;
+		      }
+		    else
+		      {
+			/* The result string is ASCII.
+			   Simple 1:1 conversion.  */
+# if USE_SNPRINTF
+			/* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+			   no-op conversion, in-place on the array starting
+			   at (result + length).  */
+			if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+# endif
+			  {
+			    const TCHAR_T *tmpsrc;
+			    DCHAR_T *tmpdst;
+			    size_t n;
+
+# if USE_SNPRINTF
+			    if (result == resultbuf)
+			      {
+				tmpsrc = (TCHAR_T *) (result + length);
+				/* ENSURE_ALLOCATION will not move tmpsrc
+				   (because it's part of resultbuf).  */
+				ENSURE_ALLOCATION (xsum (length, count));
+			      }
+			    else
+			      {
+				/* ENSURE_ALLOCATION will move the array
+				   (because it uses realloc().  */
+				ENSURE_ALLOCATION (xsum (length, count));
+				tmpsrc = (TCHAR_T *) (result + length);
+			      }
+# else
+			    tmpsrc = tmp;
+			    ENSURE_ALLOCATION (xsum (length, count));
+# endif
+			    tmpdst = result + length;
+			    /* Copy backwards, because of overlapping.  */
+			    tmpsrc += count;
+			    tmpdst += count;
+			    for (n = count; n > 0; n--)
+			      *--tmpdst = (unsigned char) *--tmpsrc;
+			  }
+		      }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+		    /* Make room for the result.  */
+		    if (count > allocated - length)
+		      {
+			/* Need at least count elements.  But allocate
+			   proportionally.  */
+			size_t n =
+			  xmax (xsum (length, count), xtimes (allocated, 2));
+
+			ENSURE_ALLOCATION (n);
+		      }
+#endif
+
+		    /* Here count <= allocated - length.  */
+
+		    /* Perform padding.  */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+		    if (pad_ourselves && has_width)
+		      {
+			size_t w;
+# if ENABLE_UNISTDIO
+			/* Outside POSIX, it's preferrable to compare the width
+			   against the number of _characters_ of the converted
+			   value.  */
+			w = DCHAR_MBSNLEN (result + length, count);
+# else
+			/* The width is compared against the number of _bytes_
+			   of the converted value, says POSIX.  */
+			w = count;
+# endif
+			if (w < width)
+			  {
+			    size_t pad = width - w;
+# if USE_SNPRINTF
+			    /* Make room for the result.  */
+			    if (xsum (count, pad) > allocated - length)
+			      {
+				/* Need at least count + pad elements.  But
+				   allocate proportionally.  */
+				size_t n =
+				  xmax (xsum3 (length, count, pad),
+					xtimes (allocated, 2));
+
+				length += count;
+				ENSURE_ALLOCATION (n);
+				length -= count;
+			      }
+			    /* Here count + pad <= allocated - length.  */
+# endif
+			    {
+# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+			      DCHAR_T * const rp = result + length;
+# else
+			      DCHAR_T * const rp = tmp;
+# endif
+			      DCHAR_T *p = rp + count;
+			      DCHAR_T *end = p + pad;
+# if NEED_PRINTF_FLAG_ZERO
+			      DCHAR_T *pad_ptr;
+#  if !DCHAR_IS_TCHAR
+			      if (dp->conversion == 'c'
+				  || dp->conversion == 's')
+				/* No zero-padding for string directives.  */
+				pad_ptr = NULL;
+			      else
+#  endif
+				{
+				  pad_ptr = (*rp == '-' ? rp + 1 : rp);
+				  /* No zero-padding of "inf" and "nan".  */
+				  if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+				      || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+				    pad_ptr = NULL;
+				}
+# endif
+			      /* The generated string now extends from rp to p,
+				 with the zero padding insertion point being at
+				 pad_ptr.  */
+
+			      count = count + pad; /* = end - rp */
+
+			      if (flags & FLAG_LEFT)
+				{
+				  /* Pad with spaces on the right.  */
+				  for (; pad > 0; pad--)
+				    *p++ = ' ';
+				}
+# if NEED_PRINTF_FLAG_ZERO
+			      else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+				{
+				  /* Pad with zeroes.  */
+				  DCHAR_T *q = end;
+
+				  while (p > pad_ptr)
+				    *--q = *--p;
+				  for (; pad > 0; pad--)
+				    *p++ = '0';
+				}
+# endif
+			      else
+				{
+				  /* Pad with spaces on the left.  */
+				  DCHAR_T *q = end;
+
+				  while (p > rp)
+				    *--q = *--p;
+				  for (; pad > 0; pad--)
+				    *p++ = ' ';
+				}
+			    }
+			  }
+		      }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+		    if (count >= tmp_length)
+		      /* tmp_length was incorrectly calculated - fix the
+			 code above!  */
+		      abort ();
+#endif
+
+		    /* Here still count <= allocated - length.  */
+
+#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+		    /* The snprintf() result did fit.  */
+#else
+		    /* Append the sprintf() result.  */
+		    memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+#endif
+#if !USE_SNPRINTF
+		    if (tmp != tmpbuf)
+		      free (tmp);
+#endif
+
+#if NEED_PRINTF_DIRECTIVE_F
+		    if (dp->conversion == 'F')
+		      {
+			/* Convert the %f result to upper case for %F.  */
+			DCHAR_T *rp = result + length;
+			size_t rc;
+			for (rc = count; rc > 0; rc--, rp++)
+			  if (*rp >= 'a' && *rp <= 'z')
+			    *rp = *rp - 'a' + 'A';
+		      }
+#endif
+
+		    length += count;
+		    break;
+		  }
+	      }
+	  }
+      }
+
+    /* Add the final NUL.  */
+    ENSURE_ALLOCATION (xsum (length, 1));
+    result[length] = '\0';
+
+    if (result != resultbuf && length + 1 < allocated)
+      {
+	/* Shrink the allocated memory if possible.  */
+	DCHAR_T *memory;
+
+	memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+	if (memory != NULL)
+	  result = memory;
+      }
+
+    if (buf_malloced != NULL)
+      free (buf_malloced);
+    CLEANUP ();
+    *lengthp = length;
+    /* Note that we can produce a big string of a length > INT_MAX.  POSIX
+       says that snprintf() fails with errno = EOVERFLOW in this case, but
+       that's only because snprintf() returns an 'int'.  This function does
+       not have this limitation.  */
+    return result;
+
+  overflow:
+    if (!(result == resultbuf || result == NULL))
+      free (result);
+    if (buf_malloced != NULL)
+      free (buf_malloced);
+    CLEANUP ();
+    errno = EOVERFLOW;
+    return NULL;
+
+  out_of_memory:
+    if (!(result == resultbuf || result == NULL))
+      free (result);
+    if (buf_malloced != NULL)
+      free (buf_malloced);
+  out_of_memory_1:
+    CLEANUP ();
+    errno = ENOMEM;
+    return NULL;
+  }
+}
+
+#undef TCHARS_PER_DCHAR
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef DCHAR_CPY
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef DCHAR_IS_TCHAR
+#undef TCHAR_T
+#undef DCHAR_T
+#undef FCHAR_T
+#undef VASNPRINTF

Added: tuxmath/trunk/intl/vasnprintf.h
===================================================================
--- tuxmath/trunk/intl/vasnprintf.h	                        (rev 0)
+++ tuxmath/trunk/intl/vasnprintf.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,78 @@
+/* vsprintf with automatic memory allocation.
+   Copyright (C) 2002-2004 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+/* Get size_t.  */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later.  */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+#  define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+#  define __format__ format
+#  define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+   You can pass a preallocated buffer for the result in RESULTBUF and its
+   size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+   If successful, return the address of the string (this may be = RESULTBUF
+   if no dynamic memory allocation was necessary) and set *LENGTHP to the
+   number of resulting bytes, excluding the trailing NUL.  Upon error, set
+   errno and return NULL.
+
+   When dynamic memory allocation occurs, the preallocated buffer is left
+   alone (with possibly modified contents).  This makes it possible to use
+   a statically allocated or stack-allocated buffer, like this:
+
+          char buf[100];
+          size_t len = sizeof (buf);
+          char *output = vasnprintf (buf, &len, format, args);
+          if (output == NULL)
+            ... error handling ...;
+          else
+            {
+              ... use the output string ...;
+              if (output != buf)
+                free (output);
+            }
+  */
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+       __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+       __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */

Added: tuxmath/trunk/intl/vasnwprintf.h
===================================================================
--- tuxmath/trunk/intl/vasnwprintf.h	                        (rev 0)
+++ tuxmath/trunk/intl/vasnwprintf.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,46 @@
+/* vswprintf with automatic memory allocation.
+   Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _VASNWPRINTF_H
+#define _VASNWPRINTF_H
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+/* Get wchar_t, size_t.  */
+#include <stddef.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+   You can pass a preallocated buffer for the result in RESULTBUF and its
+   size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+   If successful, return the address of the string (this may be = RESULTBUF
+   if no dynamic memory allocation was necessary) and set *LENGTHP to the
+   number of resulting bytes, excluding the trailing NUL.  Upon error, set
+   errno and return NULL.  */
+extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
+extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _VASNWPRINTF_H */

Added: tuxmath/trunk/intl/version.c
===================================================================
--- tuxmath/trunk/intl/version.c	                        (rev 0)
+++ tuxmath/trunk/intl/version.c	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,26 @@
+/* libintl library version.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgnuintl.h"
+
+/* Version number: (major<<16) + (minor<<8) + subminor */
+int libintl_version = LIBINTL_VERSION;

Added: tuxmath/trunk/intl/wprintf-parse.h
===================================================================
--- tuxmath/trunk/intl/wprintf-parse.h	                        (rev 0)
+++ tuxmath/trunk/intl/wprintf-parse.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _WPRINTF_PARSE_H
+#define _WPRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP	 1	/* ' flag */
+#define FLAG_LEFT	 2	/* - flag */
+#define FLAG_SHOWSIGN	 4	/* + flag */
+#define FLAG_SPACE	 8	/* space flag */
+#define FLAG_ALT	16	/* # flag */
+#define FLAG_ZERO	32
+
+/* arg_index value indicating that no argument is consumed.  */
+#define ARG_NONE	(~(size_t)0)
+
+/* A parsed directive.  */
+typedef struct
+{
+  const wchar_t* dir_start;
+  const wchar_t* dir_end;
+  int flags;
+  const wchar_t* width_start;
+  const wchar_t* width_end;
+  size_t width_arg_index;
+  const wchar_t* precision_start;
+  const wchar_t* precision_end;
+  size_t precision_arg_index;
+  wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+  size_t arg_index;
+}
+wchar_t_directive;
+
+/* A parsed format string.  */
+typedef struct
+{
+  size_t count;
+  wchar_t_directive *dir;
+  size_t max_width_length;
+  size_t max_precision_length;
+}
+wchar_t_directives;
+
+
+/* Parses the format string.  Fills in the number N of directives, and fills
+   in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+   to the end of the format string.  Also fills in the arg_type fields of the
+   arguments and the needed count of arguments.  */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a);
+
+#endif /* _WPRINTF_PARSE_H */

Added: tuxmath/trunk/intl/xsize.h
===================================================================
--- tuxmath/trunk/intl/xsize.h	                        (rev 0)
+++ tuxmath/trunk/intl/xsize.h	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,109 @@
+/* xsize.h -- Checked size_t computations.
+
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Get SIZE_MAX.  */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* The size of memory objects is often computed through expressions of
+   type size_t. Example:
+      void* p = malloc (header_size + n * element_size).
+   These computations can lead to overflow.  When this happens, malloc()
+   returns a piece of memory that is way too small, and the program then
+   crashes while attempting to fill the memory.
+   To avoid this, the functions and macros in this file check for overflow.
+   The convention is that SIZE_MAX represents overflow.
+   malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+   implementation that uses mmap --, it's recommended to use size_overflow_p()
+   or size_in_bounds_p() before invoking malloc().
+   The example thus becomes:
+      size_t size = xsum (header_size, xtimes (n, element_size));
+      void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t.  */
+#define xcast_size_t(N) \
+  ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum (size_t size1, size_t size2)
+{
+  size_t sum = size1 + size2;
+  return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+  return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+  return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+  /* No explicit check is needed here, because for any n:
+     max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX.  */
+  return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+   The count must be >= 0 and the element size must be > 0.
+   This is a macro, not an inline function, so that it works correctly even
+   when N is of a wider tupe and N > SIZE_MAX.  */
+#define xtimes(N, ELSIZE) \
+  ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow.  */
+#define size_overflow_p(SIZE) \
+  ((SIZE) == SIZE_MAX)
+/* Check against overflow.  */
+#define size_in_bounds_p(SIZE) \
+  ((SIZE) != SIZE_MAX)
+
+#endif /* _XSIZE_H */

Added: tuxmath/trunk/po/CMakeLists.txt
===================================================================
--- tuxmath/trunk/po/CMakeLists.txt	                        (rev 0)
+++ tuxmath/trunk/po/CMakeLists.txt	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,28 @@
+# The following lists the translations that require SDL_Pango to
+# display properly; if we don't have SDL_Pango support, the text is
+# blank, which is worse than displaying the English. So if we don't
+# have Pango, we want to exclude those translations.
+set(TUXMATH_PO_REQUIRES_PANGO
+  ar.po
+  he.po
+  zh*.po
+  ru.po
+  ja.po
+)
+
+# Some translations may be so complete that they should be excluded
+# for now. List them here.
+set (TUXMATH_EXCLUDE_PO
+  fi.po
+)
+
+file (GLOB PO_FILES *.po)
+file (GLOB PANGO_FILES ${TUXMATH_PO_REQUIRES_PANGO})
+file (GLOB EXCLUDE_FILES ${TUXMATH_EXCLUDE_PO})
+
+list(REMOVE_ITEM PO_FILES ${EXCLUDE_FILES})
+if(NOT SDLPANGO_FOUND)
+  list(REMOVE_ITEM PO_FILES ${PANGO_FILES})
+endif(NOT SDLPANGO_FOUND)
+
+add_translations (tuxmath ${PO_FILES})

Added: tuxmath/trunk/po/ChangeLog
===================================================================
--- tuxmath/trunk/po/ChangeLog	                        (rev 0)
+++ tuxmath/trunk/po/ChangeLog	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,12 @@
+2007-10-15  gettextize  <bug-gnu-gettext at gnu.org>
+
+	* Makefile.in.in: New file, from gettext-0.16.1.
+	* boldquot.sed: New file, from gettext-0.16.1.
+	* en at boldquot.header: New file, from gettext-0.16.1.
+	* en at quot.header: New file, from gettext-0.16.1.
+	* insert-header.sin: New file, from gettext-0.16.1.
+	* quot.sed: New file, from gettext-0.16.1.
+	* remove-potcdate.sin: New file, from gettext-0.16.1.
+	* Rules-quot: New file, from gettext-0.16.1.
+	* POTFILES.in: New file.
+

Added: tuxmath/trunk/po/LINGUAS
===================================================================
--- tuxmath/trunk/po/LINGUAS	                        (rev 0)
+++ tuxmath/trunk/po/LINGUAS	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,27 @@
+# Set of available languages.
+ar
+cs
+de
+en at quot
+en at boldquot
+en_GB
+es
+fi
+fr
+ga
+he
+hu
+it
+ja
+nb
+nl
+nn
+oc
+pl
+pt
+pt_BR
+ru
+sk
+sv
+tr
+zh_CN

Added: tuxmath/trunk/po/Makefile.in.in
===================================================================
--- tuxmath/trunk/po/Makefile.in.in	                        (rev 0)
+++ tuxmath/trunk/po/Makefile.in.in	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,429 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper <drepper at gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+#
+# Origin: gettext-0.17
+GETTEXT_MACRO_VERSION = 0.17
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SHELL = /bin/sh
+ at SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+	@echo "$(MSGFMT) -c -o $@ $<"; \
+	$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+	@lang=`echo $* | sed -e 's,.*/,,'`; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
+	cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+	sed -e '/^#/d' $< > t-$@
+	mv t-$@ $@
+
+
+all: check-macro-version all- at USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+check-macro-version:
+	@test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+	  || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+	       exit 1; \
+	     }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+	test ! -f $(srcdir)/$(DOMAIN).pot || \
+	  test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+	@test ! -f $(srcdir)/$(DOMAIN).pot || { \
+	  echo "touch stamp-po" && \
+	  echo timestamp > stamp-poT && \
+	  mv stamp-poT stamp-po; \
+	}
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+	if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
+	  package_gnu='GNU '; \
+	else \
+	  package_gnu=''; \
+	fi; \
+	if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+	  msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+	else \
+	  msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+	fi; \
+	case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	  *) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --package-name="$${package_gnu}@PACKAGE@" \
+	      --package-version='@VERSION@' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	esac
+	test ! -f $(DOMAIN).po || { \
+	  if test -f $(srcdir)/$(DOMAIN).pot; then \
+	    sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+	    sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+	    if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+	    else \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+	      mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	    fi; \
+	  else \
+	    mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	  fi; \
+	}
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+	$(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+	@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+	if test -f "$(srcdir)/$${lang}.po"; then \
+	  test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	  echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+	  cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+	else \
+	  $(MAKE) $${lang}.po-create; \
+	fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data- at USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    $(INSTALL_DATA) $(srcdir)/$$file \
+			    $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	  for file in Makevars; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+install-data-no: all
+install-data-yes: all
+	$(mkdir_p) $(DESTDIR)$(datadir)
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+	  $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+	  echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	      rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+	    fi; \
+	  done; \
+	done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data- at USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	else \
+	  : ; \
+	fi
+installdirs-data-no:
+installdirs-data-yes:
+	$(mkdir_p) $(DESTDIR)$(datadir)
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	    fi; \
+	  done; \
+	done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data- at USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+uninstall-data-no:
+uninstall-data-yes:
+	catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+	    rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	  done; \
+	done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+	rm -f remove-potcdate.sed
+	rm -f stamp-poT
+	rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+	rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+	$(MAKE) update-po
+	@$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+	dists="$(DISTFILES)"; \
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  dists="$$dists Makevars.template"; \
+	fi; \
+	if test -f $(srcdir)/$(DOMAIN).pot; then \
+	  dists="$$dists $(DOMAIN).pot stamp-po"; \
+	fi; \
+	if test -f $(srcdir)/ChangeLog; then \
+	  dists="$$dists ChangeLog"; \
+	fi; \
+	for i in 0 1 2 3 4 5 6 7 8 9; do \
+	  if test -f $(srcdir)/ChangeLog.$$i; then \
+	    dists="$$dists ChangeLog.$$i"; \
+	  fi; \
+	done; \
+	if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+	for file in $$dists; do \
+	  if test -f $$file; then \
+	    cp -p $$file $(distdir) || exit 1; \
+	  else \
+	    cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+	  fi; \
+	done
+
+update-po: Makefile
+	$(MAKE) $(DOMAIN).pot-update
+	test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+	$(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+	@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+	echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+	exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+	@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+	if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+	cd $(srcdir); \
+	if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "msgmerge for $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+	@:
+
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+	cd $(top_builddir) \
+	  && $(SHELL) ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: tuxmath/trunk/po/Makevars
===================================================================
--- tuxmath/trunk/po/Makevars	                        (rev 0)
+++ tuxmath/trunk/po/Makevars	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = tuxmath-devel at lists.sourceforge.net
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =

Added: tuxmath/trunk/po/Makevars.template
===================================================================
--- tuxmath/trunk/po/Makevars.template	                        (rev 0)
+++ tuxmath/trunk/po/Makevars.template	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =

Added: tuxmath/trunk/po/POTFILES.in
===================================================================
--- tuxmath/trunk/po/POTFILES.in	                        (rev 0)
+++ tuxmath/trunk/po/POTFILES.in	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,9 @@
+# List of source files which contain translatable strings.
+src/campaign.h
+src/campaign.c
+src/factoroids.c
+src/game.c
+src/highscore.c
+src/titlescreen.c
+src/campaign.h
+data/missions/lessons/descr_lessons

Added: tuxmath/trunk/po/Rules-quot
===================================================================
--- tuxmath/trunk/po/Rules-quot	                        (rev 0)
+++ tuxmath/trunk/po/Rules-quot	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,47 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en at quot.header en at boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en at quot.po-create:
+	$(MAKE) en at quot.po-update
+en at boldquot.po-create:
+	$(MAKE) en at boldquot.po-update
+
+en at quot.po-update: en at quot.po-update-en
+en at boldquot.po-update: en at boldquot.po-update-en
+
+.insert-header.po-update-en:
+	@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+	if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	ll=`echo $$lang | sed -e 's/@.*//'`; \
+	LC_ALL=C; export LC_ALL; \
+	cd $(srcdir); \
+	if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "creation of $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+en at quot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en at quot.header/g' $(srcdir)/insert-header.sin > en at quot.insert-header
+
+en at boldquot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en at boldquot.header/g' $(srcdir)/insert-header.sin > en at boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+	rm -f *.insert-header

Added: tuxmath/trunk/po/ar.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/ar.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/ar.po
===================================================================
--- tuxmath/trunk/po/ar.po	                        (rev 0)
+++ tuxmath/trunk/po/ar.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,668 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-02-15 03:00+0100\n"
+"Last-Translator: Caroline Ford <caroline.ford.work at googlemail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: UNITED KINGDOM\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "مرحبا بكم في tuxmath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "مهمتكم هو انقاذ"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "اكواخ البطاريق من"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "المذنبات المتساقطة."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "أوقف المذنب بكتابة"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "الجواب على مشكلة الرياضيات"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "والضغط على زر اﻷدخال او المساقة"
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "جربها الآن!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "رميه جيده!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "اذا اصيب كوخ اﻷسكيمو"
+
+#: src/game.c:777
+#, fuzzy
+msgid "it melts. But don't worry: the"
+msgstr "فسيذاب ولكن لا تقلق"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "البطريق بخير!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "اﻷن شاهد ما يحدث :"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(الصحافة مفتاح البدأ)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "اشعار الاجابه"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "اما اذا صدم مرة أخرى"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "فأن البطريق سيغادر."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(اضغط اى مفتاح عندما تستعد)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "يمكنك اصلاح اكواخ الاسكيمو"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "بوقف مكافاه المذنبات."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "انطلق الآن!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "رائع!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "يمكنك الخروج اى وقت بالضغط على"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "'ESC' أو 'X'"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "في الركن الايمن العلوي."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "افعلها اﻷن, ثم ابدأ اللعب !"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "قاعة الشهره"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "مبتدئ"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "الكشفيه"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "حارس"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "اس"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "! العمل يتقدم"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "هذه الخاصية ليست جاهزة حتى الآن"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "ناقش مستقبل اللعبة فى"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "Tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "مساعدة"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "مزيد من الخيارات"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "خروج"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "اكاديميه التدريب"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "لعبه تقليدية"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "لعبة مخصصة"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "القائمة الرئيسية"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "حرر ملف 'الخيارات' فى مجلدك الافتراضى"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "لإنشاء لعبة مخصصة"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "اضغط فوق مفتاح أو انقر الماوس لبدء اللعبة."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Readme.txt انظر لمزيد من المعلومات"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "ديمو"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "معلومات المشروع"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "فريق العمل"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "القائمة الرئيسية"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath برنامج حر مفتوح المصدر"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "يمكنك المساعدة بجعلها افضل بإرسال اى مشاكل تواجها,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "أو اى مقترحات أو كتابة أكواد"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net ناقش المستقبل على "
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "عدد الطباعه"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "جمع : من 1 الى 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "حمع: من 1 الى 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "جمع : المبالغ الى 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "حمع : المبالغ الى 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "جمع : المبالغ الى 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "جمع : رقم مكون من رقمين "
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "جمع : رقم مفقود"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "طرح: ارقام من 0 الى 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "طرح: ارقام من 0 الى 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "الطرح : رقم مكون من رقمين"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "مراجعة على الجمع ولطرح"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "ضرب : 0 الى 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "مضاعفات 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "من 3 إضعاف"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "مضاعفات العدد 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "مضاعفات العدد 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "الضرب: 0 الى 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "مضاعفات 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "مضاعفات 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "الضرب : 0 الى 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "مضاعفات العدد 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "مضاعفات العدد 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "مضاعفات العدد 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "ضرب: 0 الى 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "مضاعفات اﻷعداد 11 و 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "ضرب : من 0 الى 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "مضاعفات الأعداد 13و 14و 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "ضرب: من 0 الى 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "ضرب : اعداد مفقودة"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "قسمة على 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "3 قسمة على"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "قسمة على 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "قسمة على 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "قسمة: 1 الى 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "قسمة على 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "قسمة على 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "قسمة على 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "9 قسمة على"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "قسمة على 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "قسمة : من 1 الى 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "قسمة على 11 و 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "قسمة : من 1 الى 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "قسمة على 12 و 13 و 14 و 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "قسمة : من 1 الى 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "مراجعة الضرب والقسمة"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "كتابة الأرقام السلبيه"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "الطرح : ارقام سالب"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "اضافة ارقام سالبة الى ارقام موجبة"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "اضافة ارقام سالب الى ارقام موجب"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "طرح ارقام سالب من ارقام موجب"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "طرح ارقام سالب من ارقام موجب"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "اضافة ارقام سالب الى ارقام موجب"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "طرح ارقام سالب من ارقام موجب"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "مراجعة الارقام السالبة والموجبة"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "ضرب وقسمة اﻷرقام السالبة"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "ضرب الأرقام الموجية والسالبة "
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "قسمة الأرقام الموجية والسالبة"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "اكواخ البطاريق من"

Added: tuxmath/trunk/po/boldquot.sed
===================================================================
--- tuxmath/trunk/po/boldquot.sed	                        (rev 0)
+++ tuxmath/trunk/po/boldquot.sed	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“/g
+s/”/”/g
+s/‘/‘/g
+s/’/’/g

Added: tuxmath/trunk/po/cs.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/cs.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/cs.po
===================================================================
--- tuxmath/trunk/po/cs.po	                        (rev 0)
+++ tuxmath/trunk/po/cs.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,668 @@
+# translation of tuxmath.po to czech
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# JardaK <krejci at zstenis.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2007-11-12 20:54+0100\n"
+"Last-Translator: JardaK <krejci at zstenis.com>\n"
+"Language-Team: czech <cs at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Síň slávy"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Nováček"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Průzkumník"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Střelec"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Borec"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Ve výstavbě!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Tato vlastnost ještě nefunguje"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskutuj o budoucnosti TuxMath na"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Nápověda"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Více možností"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Ukončit"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Akademie vesmírné matematiky"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Hra"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Vlastní hra"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hlavní menu"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Uprav soubor «options » ve své domovské složce,"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "abys mohl vytvořit vlastní hru!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Zmáčkni klávesu nebo klikni tlačítkem myši, abys začal hru"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Pokud chceš více informací, podívej se na README.txt"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Info o projektu"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Poděkování"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hlavní menu"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath je svobodný software!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "I ty ho můžeš vylepšit, když oznámíš chyby, "
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "navrhneš vylepšení nebo přidáš svůj kód"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Diskutuj o budoucnosti na tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Psaní číslic"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Sčítání: Od 1 do 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Sčítání: Od 0 do 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Sčítání: Součty do 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Sčítání: Součty do 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Sčítání: Součty do 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Sčítání: Dvouciferná čísla"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Sčítání: Vynechaná čísla"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Odčítání: Od 0 do 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Odčítání: Od 0 do 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Odčítání: Dvojciferná čísla"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Sčítání a odčítání: Opakování"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Násobení: Od 0 do 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Násobilka 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Násobilka 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Násobilka 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Násobilka 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Násobení: Od 0 do 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Násobilka 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Násobilka 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Násobení: od 0 do 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Násobilka 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Násobilka 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Násobilka 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Násobení: Od 0 do 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Násobilka 10 a 11"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Násobení: Od 0 do 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Násobilka 13, 14 a 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Násobení: Od 0 do 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Násobení: Vynechaná čísla"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Dělení 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Dělení 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Dělení 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Dělení 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Dělení 1 až 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Dělení 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Dělení 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Dělení 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Dělení 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Dělení 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Dělení 1 až 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Dělení 11 a 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Dělení 1 až 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Dělení 13, 14 a 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Dělení 1 až 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Násobení a dělení: Opakování"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Psaní záporných čísel"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Odčítání: Včetně záporných čísel"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Sčítání a odčítání kladných a záporných čísel"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Sčítání záporných čísel"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Odčítání záporných od kladných čísel"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Odčítání záporných čísel"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Sčítání záporných čísel"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Odčítání záporných čísel"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Kladná a záporná čísla: Opakování"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Násobení a dělení záporných čísel"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Násobení kladných a záporných čísel"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Dělení kladných a záporných čísel"

Added: tuxmath/trunk/po/de.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/de.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/de.po
===================================================================
--- tuxmath/trunk/po/de.po	                        (rev 0)
+++ tuxmath/trunk/po/de.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,671 @@
+# translation of TuxMath to Deutsch
+# This file is put in the public domain.
+#
+# Lars Vogdt <lars at linux-schulserver.de>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-05-02 16:08+0200\n"
+"Last-Translator: Lars Vogdt <lars at linux-schulserver.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Willkommen bei TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Deine Mission besteht darin, "
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "die Iglus der Pinguine vor den "
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "herabfallenden Kometen zu schützen."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stoppe einen Kometen, indem du "
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "die Antwort auf das mathematische Problem"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "eingibst und die \"Leertaste\" oder \"Enter\" drückst. "
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Versuch es jetzt!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Guter Schuß!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Wenn ein Iglu von einem Kometen getroffen wird, "
+
+#: src/game.c:777
+#, fuzzy
+msgid "it melts. But don't worry: the"
+msgstr "schmilzt es. Aber keine Angst, dem "
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "Pingiun geht es gut!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Sie einfach zu was passiert "
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Eine Taste zum starten drücken)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Beachte die Antwort"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "wenn es noch einmal getroffen wird, "
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "wird der Pinguin verschwinden."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Wenn fertig, bitte Taste drücken)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Du kannst die kaputten Iglus reparieren"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "wenn du Bonus-Kometen aufhälst."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Knall ihn jetzt ab!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Super Arbeit!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Beende das Spiel zu jeder Zeit durch Drücken von "
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "'Esc' oder durch klicken auf das 'X'"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "in der oberen rechten Ecke."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Tu es jetzt - und dann spiele!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Ruhmeshalle"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Raumkadett"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Aufklärer"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Jäger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ass"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "In Arbeit!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Dieser Bereich ist noch nicht fertig."
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskutiere über die Zukunft von TuxMath auf "
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Hilfe"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Weitere Optionen"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Ende"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Math Command Trainings-Akademie"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Spiele Arcade Spiel"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Spiele angepasstes Spiel"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hauptmenü"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Editiere die 'options' Datei in deinem Benutzerverzeichnis"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "um ein angepasstes Spiel zu erzeugen."
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Drücke eine Taste oder klicke mit der Maus um ein Spiel zu starten"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Lies die README.txt Datei für weitere Infrormationen"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstration"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Projekt Information"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Abspann"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hauptmenü"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath ist frei und OpenSource!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Du kannst bei der Verbesserung helfen, wenn du Probleme "
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "meldest, Wünsche außerst oder Programmcode beisteuerst."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+"Diskutiere die Zukunft von TuxMath auf tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Zahlen eingeben"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition: 1 bis 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition: 0 bis 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Summen bis 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Summen bis 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: SUmmen bis 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Zweistellige Zahlen"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Fehlende Zahlen"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraktion: 0 bis 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraktion: 0 bis 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraktion: Zweistellige Zahlen"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Bericht Addition und Subtraktion"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplikation 0 bis 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Vielfache von 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Vielfache von 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Vielfache von 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Vielfache von 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplikation: 0 bis 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Vielfache von 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Vielfache von 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplikation: 0 bis 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Vielfache von 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Vielfache von 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Vielfache von 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplikation: 0 bis 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Vielfache von 11 und 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplikation: 0 bis 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Vielfache von 13, 14 und 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplikation: 0 bis 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplikation: fehlende Zahlen"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division durch 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division durch 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division durch 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division durch 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 bis 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division durch 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division durch 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division durch 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division durch 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division durch 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 bis 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division durch 11 und 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 bis 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division durch 13, 14 und 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 bis 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Bericht Multiplikation und Division"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Negative Zahlen eingeben"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraktion: Negative Ergebnisse"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Negative Zahlen zu positiven hinzufügen"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Negative Zahlen zu negativen hinzufügen"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Negative Zahlen von positven subtrahieren"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Negative Zahlen von negativen abziehen"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Negative Zahlen zu negativen hinzufügen"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Negative Zahlen von negativen abziehen"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Bericht: Negative und positive Zahlen"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplikation und Division von negativen Zahlen"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplikation von positiven und negativen Zahlen"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division von positiven und negativen Zahlen"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "die Iglus der Pinguine vor den "

Added: tuxmath/trunk/po/en at boldquot.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/en at boldquot.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/en at boldquot.header
===================================================================
--- tuxmath/trunk/po/en at boldquot.header	                        (rev 0)
+++ tuxmath/trunk/po/en at boldquot.header	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#

Added: tuxmath/trunk/po/en at boldquot.po
===================================================================
--- tuxmath/trunk/po/en at boldquot.po	                        (rev 0)
+++ tuxmath/trunk/po/en at boldquot.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,712 @@
+# English translations for Tux Of Math Command package.
+# This file is put in the public domain.
+# Automatically generated, 2009.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath 1.7.1\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2009-02-14 16:59-0600\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "-[Esc] to skip"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "Mission One: Careful Cadet"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "I'm so glad you've come!"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "Do your best!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "Mission Two: Smart Scout"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "But you can save them!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "Mission Three: Royal Ranger"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "Mission Four: Imperial Ace"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "Now is no time for resting; the city needs your help!"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "Final Mission: Computing Commando"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "I hope that hint helps!"
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "This is it! You can stop these attacks forever, Commando!"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "Congratulations! You win!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "Round"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "Sorry, try again!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "Mission accomplished. The galaxy is safe!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr "FACTOROIDS: to win, you need destroy all the asteroids."
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "type one of its factors, and press space or return"
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr "to split it into its factors.  Rocks with prime numbers are destroyed!"
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "FRACTIONS: to win, you need destroy all the asteroids"
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+"type a number that can simplify the fraction, and press space or return"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Welcome to TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Your mission is to save your"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "penguins' igloos from the"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "falling comets."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stop a comet by typing"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "the answer to the math problem"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "and hitting ‘space’ or 'enter'."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Try it now!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Good shot!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "If an igloo gets hit by a comet,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "it melts. But don't worry: the"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "penguin is OK!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Just watch what happens:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Press a key to start)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Notice the answer"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "If it gets hit again, the"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "penguin leaves."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Press a key when ready)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "You can fix the igloos"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "by stopping bonus comets."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Zap it now!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Great job!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Quit at any time by pressing"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "‘Esc’ or clicking the ‘X’"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "in the upper right corner."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Do it now, and then play!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Hall Of Fame"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Space Cadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ace"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Commando"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Factors"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Fractions"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr "You Are In The Hall of Fame!"
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr "Enter Your Name:"
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Work In Progress!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "This feature is not ready yet"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discuss the future of TuxMath at"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Play Alone"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "Play With Friends"
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr "Factoroids!"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Help"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "More Options"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Quit"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Math Command Training Academy"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Math Command Fleet Missions"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Play Arcade Game"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Play Custom Game"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Main menu"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr "Score Sweep"
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr "Elimination"
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr "How many kids are playing?"
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr "(Between 2 and 4 players)"
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Edit ‘options’ file in your home directory"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "to create customized game!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Press a key or click your mouse to start game."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "See README.txt for more information"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Project Info"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Credits"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Main Menu"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath is free and open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "You can help make it better by reporting problems,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "suggesting improvements, or adding code."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Number Typing"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition: 1 to 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Sums to 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Sums to 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: Sums to 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraction: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraction: 0 to 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraction: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Addition and Subtraction Review"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplication: 0 to 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiples of 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiples of 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiples of 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiples of 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplication: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiples of 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiples of 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplication: 0 to 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiples of 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiples of 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiples of 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplication: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiples of 11 and 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplication: 0 to 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiples of 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplication: 0 to 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplication: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division by 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division by 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division by 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division by 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 to 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division by 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division by 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division by 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division by 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division by 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 to 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division by 11 and 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 to 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division by 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 to 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Multiplication and Division Review"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Typing Negative Numbers"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraction: Negative Answers"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Adding Negatives to Positives"
+
+#: data/missions/lessons/descr_lessons:50
+msgid "Adding Positives to Negatives"
+msgstr "Adding Positives to Negatives"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtracting Negatives From Positives"
+
+#: data/missions/lessons/descr_lessons:52
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtracting Positives From Negatives"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Adding Negatives to Negatives"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtracting Negatives From Negatives"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Negative and Positive Numbers Review"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplication and Division of Negatives"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplication of Positives and Negatives"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division of Positives and Negatives"

Added: tuxmath/trunk/po/en at quot.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/en at quot.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/en at quot.header
===================================================================
--- tuxmath/trunk/po/en at quot.header	                        (rev 0)
+++ tuxmath/trunk/po/en at quot.header	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#

Added: tuxmath/trunk/po/en at quot.po
===================================================================
--- tuxmath/trunk/po/en at quot.po	                        (rev 0)
+++ tuxmath/trunk/po/en at quot.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,709 @@
+# English translations for Tux Of Math Command package.
+# This file is put in the public domain.
+# Automatically generated, 2009.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath 1.7.1\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2009-02-14 16:59-0600\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "-[Esc] to skip"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "Mission One: Careful Cadet"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "I'm so glad you've come!"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "Do your best!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "Mission Two: Smart Scout"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "But you can save them!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "Mission Three: Royal Ranger"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "Mission Four: Imperial Ace"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "Now is no time for resting; the city needs your help!"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "Final Mission: Computing Commando"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "I hope that hint helps!"
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "This is it! You can stop these attacks forever, Commando!"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "Congratulations! You win!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "Round"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "Sorry, try again!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "Mission accomplished. The galaxy is safe!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr "FACTOROIDS: to win, you need destroy all the asteroids."
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "type one of its factors, and press space or return"
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr "to split it into its factors.  Rocks with prime numbers are destroyed!"
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "FRACTIONS: to win, you need destroy all the asteroids"
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+"type a number that can simplify the fraction, and press space or return"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Welcome to TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Your mission is to save your"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "penguins' igloos from the"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "falling comets."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stop a comet by typing"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "the answer to the math problem"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "and hitting ‘space’ or 'enter'."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Try it now!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Good shot!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "If an igloo gets hit by a comet,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "it melts. But don't worry: the"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "penguin is OK!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Just watch what happens:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Press a key to start)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Notice the answer"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "If it gets hit again, the"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "penguin leaves."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Press a key when ready)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "You can fix the igloos"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "by stopping bonus comets."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Zap it now!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Great job!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Quit at any time by pressing"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "‘Esc’ or clicking the ‘X’"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "in the upper right corner."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Do it now, and then play!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Hall Of Fame"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Space Cadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ace"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Commando"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Factors"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Fractions"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr "You Are In The Hall of Fame!"
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr "Enter Your Name:"
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Work In Progress!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "This feature is not ready yet"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discuss the future of TuxMath at"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Play Alone"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "Play With Friends"
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr "Factoroids!"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Help"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "More Options"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Quit"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Math Command Training Academy"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Math Command Fleet Missions"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Play Arcade Game"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Play Custom Game"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Main menu"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr "Score Sweep"
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr "Elimination"
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr "How many kids are playing?"
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr "(Between 2 and 4 players)"
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Edit ‘options’ file in your home directory"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "to create customized game!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Press a key or click your mouse to start game."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "See README.txt for more information"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Project Info"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Credits"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Main Menu"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath is free and open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "You can help make it better by reporting problems,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "suggesting improvements, or adding code."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Number Typing"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition: 1 to 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Sums to 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Sums to 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: Sums to 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraction: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraction: 0 to 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraction: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Addition and Subtraction Review"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplication: 0 to 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiples of 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiples of 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiples of 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiples of 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplication: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiples of 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiples of 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplication: 0 to 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiples of 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiples of 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiples of 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplication: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiples of 11 and 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplication: 0 to 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiples of 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplication: 0 to 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplication: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division by 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division by 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division by 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division by 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 to 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division by 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division by 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division by 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division by 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division by 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 to 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division by 11 and 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 to 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division by 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 to 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Multiplication and Division Review"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Typing Negative Numbers"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraction: Negative Answers"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Adding Negatives to Positives"
+
+#: data/missions/lessons/descr_lessons:50
+msgid "Adding Positives to Negatives"
+msgstr "Adding Positives to Negatives"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtracting Negatives From Positives"
+
+#: data/missions/lessons/descr_lessons:52
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtracting Positives From Negatives"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Adding Negatives to Negatives"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtracting Negatives From Negatives"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Negative and Positive Numbers Review"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplication and Division of Negatives"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplication of Positives and Negatives"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division of Positives and Negatives"

Added: tuxmath/trunk/po/en_GB.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/en_GB.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/en_GB.po
===================================================================
--- tuxmath/trunk/po/en_GB.po	                        (rev 0)
+++ tuxmath/trunk/po/en_GB.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,671 @@
+# Translation of en_GB to Norwegian Nynorsk
+# Karl Ove Hufthammer <karl at huftis.org>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-05-09 21:05+0200\n"
+"Last-Translator: Karl Ove Hufthammer <karl at huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <i18n-nn at lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: English\n"
+"X-Poedit-Country: UNITED KINGDOM\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Welcome to TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Your mission is to save your"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "penguins’ igloos from the"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "falling comets."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stop a comet by typing"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "the answer to the maths problem"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "and hitting ‘space’ or ‘enter’."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Try it now!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Good shot!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "If an igloo gets hit by a comet,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "it melts. But don’t worry: the"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "penguin is OK!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Just watch what happens:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Press a key to start)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Notice the answer"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "If it gets hit again, the"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "penguin leaves."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Press a key when ready)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "You can fix the igloos"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "by stopping bonus comets."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Zap it now!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Great job!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Quit at any time by pressing"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "‘Esc’ or clicking the ‘X’"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "in the upper right corner."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Do it now, and then play!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Hall Of Fame"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Space Cadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ace"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Work In Progress!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "This feature is not ready yet"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discuss the future of TuxMath at"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Help"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "More Options"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Quit"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Math Command Training Academy"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Play Arcade Game"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Play Custom Game"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Main menu"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Edit ‘options’ file in your home directory"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "to create customised game!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Press a key or click your mouse to start game."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "See README.txt for more information"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Project Info"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Credits"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Main Menu"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath is free and open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "You can help make it better by reporting problems,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "suggesting improvements, or adding code."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Number Typing"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition: 1 to 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Sums to 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Sums to 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: Sums to 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraction: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraction: 0 to 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraction: Two Digit Numbers"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Addition and Subtraction Review"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplication: 0 to 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiples of 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiples of 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiples of 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiples of 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplication: 0 to 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiples of 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiples of 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplication: 0 to 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiples of 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiples of 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiples of 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplication: 0 to 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiples of 11 and 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplication: 0 to 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiples of 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplication: 0 to 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplication: Missing Numbers"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division by 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division by 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division by 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division by 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 to 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division by 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division by 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division by 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division by 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division by 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 to 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division by 11 and 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 to 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division by 13, 14, and 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 to 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Multiplication and Division Review"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Typing Negative Numbers"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraction: Negative Answers"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Adding Negatives to Positives"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Adding Negatives to Negatives"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtracting Negatives From Positives"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtracting Negatives From Negatives"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Adding Negatives to Negatives"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtracting Negatives From Negatives"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Negative and Positive Numbers Review"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplication and Division of Negatives"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplication of Positives and Negatives"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division of Positives and Negatives"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "penguins’ igloos from the"

Added: tuxmath/trunk/po/es.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/es.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/es.po
===================================================================
--- tuxmath/trunk/po/es.po	                        (rev 0)
+++ tuxmath/trunk/po/es.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,673 @@
+# Spanish translation for Tux, Of Math Command.
+# This file is put in the public domain.
+# Angela Ruiz <angieruiz211 at hotmail.com>
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.6.2\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-04-26\n"
+"Last-Translator: Angela Ruiz <angieruiz211 at hotmail.com>\n"
+"Language-Team: espanol <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "bien benido a tuxmath"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "tu mision es salvar"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "los igloos de tus pinguinos"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "de los cometas que caen"
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "para parar el cometa"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "debes teclar la respuesta correcta al problema matematico"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "y oprimir la decla de espacio"
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "tratalo ahora"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "buen tiro"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "si uno de los igloos es derramado por el cometa"
+
+#: src/game.c:777
+#, fuzzy
+msgid "it melts. But don't worry: the"
+msgstr "se derritira, pero no te preocupes"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "que el pinguino estara asalvo"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "observa lo que sucede"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "aprieta una tecla para empezar"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "nota la respuesta"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "si el igloo es pegado por el cometa de nuevo "
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "el pinguino se va"
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "aprieta una tecla cuando estes listo "
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr " tu puedes areglar los igloos"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr " si logras parrar a los cometas de bono"
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "disparale ahora"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "bien hecho"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "si quieres parrarel juego en cualquier momento"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "lo puedes hacer oprimiendo la tecla de ESC or la x en la pantalla"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "en la equinq derecha"
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "haclo ahora y luego juega"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "sala de fama"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "cadete espacial"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "escout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "guardador"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "ace"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr " trabajo bajo progresso"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "esta opcion no funciona todavia"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "para discutir el futuro de TuxMath puedes ir a"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "ayda"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "mas opciones"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "terminar"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Academia de entrenamiento de matematicas"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Juega el juego de arcade"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "juega el juego hecho especialmente"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "menu principal"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "editar opciones del archivo del directorio principal"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "para crear un juego especialmente"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "aprieta un tecla y con tu mouse oprime la opcion de empesar el juego"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "ver README.txt para mas informacion"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "demostracion"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "informacion del projecto"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "creditos"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "menu principal"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath es gratis y es una opcion abierta"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr ""
+"puedes hacer que el programa funcione mejor si reportas problems con el "
+"programa"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "sugestiones para mejorar el programa o para anadir un codigo"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "discute el futuro en tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "tegldo del numero"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "sumando: 1 a 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "sumando: 0 a 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "sumando: hasta 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "sumando hasta 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "sumando hasta 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "sumando: numeros de dos dijitos"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "sumando :con nuemors que faltan"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "resta: de 0 a 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "resta: de 0 a 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "resta: numeros de dos dijitos"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "repaso de suma y resta"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "multiplicacion: de 0 a 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "mulipos de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "multipos de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "multipos de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "multipos de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "multiplicacion de 0 a 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "multipos de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "multipos de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "multiplicacion de 0 a 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "multipos de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "multipos de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "multipos de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "multiplicacion de 0 a 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "multipos de 11 y 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "multiplicacion de 0 a 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "multipos de 13, 14, 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "multiplicacion de 0 a 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "multiplicacion con un numero que falta"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "division de 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "division de 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "divicion de 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "division de 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "division de 1 a 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "division de 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "division de 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "division de 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "division de 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "division de 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "division de 1 a 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "division de 11 a 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "division de 1 a 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "division de 13,14 y 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "division de 1 a 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "repaSO de multiplicacion y division"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "teclando numeros negativos"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "resta de numeros negativos"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "sumando numeros negativos a numeros positivos"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "sumando numeros negativos a numeros negativos"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "restando numeros negativos de numeros positivos"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "restando numeros negativos de negativos"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "sumando numeros negativos a numeros negativos"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "restando numeros negativos de negativos"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "repaso de numeros negativos y positivos"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "multiplicacion de numeros positivos y negativos"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "division de numeros positivos y negativos"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "los igloos de tus pinguinos"

Added: tuxmath/trunk/po/fi.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/fi.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/fi.po
===================================================================
--- tuxmath/trunk/po/fi.po	                        (rev 0)
+++ tuxmath/trunk/po/fi.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,673 @@
+# Finnish translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Marten
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-22 06:59+0000\n"
+"Last-Translator: Miika Metsälä <Unknown>\n"
+"Language-Team: Finnish <fi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Parhaat tulokset"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Astronautti"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Tiedustelija"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Jousimies"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr ""
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Työn alla!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Tämä ominaisuus ei ole vielä valmis"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr ""
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "O_hje"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Lisää asetuksia"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Lopeta"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr ""
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Pelaa arcade-peliä"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr ""
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Päävalikko"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Muokkaa 'options' tiedostoa kotikansiossasi"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "tehdäksesi kustomoidun pelin!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr ""
+"Paina mitä tahansa näppäintä tai napsauta hiirellä aloittaaksesi pelin."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Katso README.txt saadaksesi lisätietoja"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr ""
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Tietoa projektista"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Tekijät"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Päävalikko"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath on vapaa ja avointa koodia!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Voit auttaa meitä tekemään sen paremmaksi ilmoittamalla ongelmista,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "ehdottamalla parannuksista, tai lisäämällä koodia."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+"Keskustele tuxmathin tulevaisuudesta osoitteesta tuxmath-devel at lists."
+"sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Numeroiden kirjoitus"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Yhteenlasku: Puuttuvat numerot"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Kertominen: 0 kertaa 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Kertominen luvulla 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Kertominen: 0 kertaa 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Kertominen luvulla 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Kertominen luvulla 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Kertominen: 0 kertaa 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Kertominen luvulla 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Kertominen luvulla 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Kertominen luvulla 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Kertominen: 0 kertaa 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Kertominen luvuilla 11 ja 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Kertominen: 0 kertaa 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Kertominen luvuilla 13, 14 ja 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Kertominen: 0 kertaa 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Kertominen: Puuttuvat numerot"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Jakaminen luvulla 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Jakaminen luvulla 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Jakaminen luvulla 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Jakaminen luvulla 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Jakaminen: 5 jaettuna 1"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Jakaminen luvulla 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Jakaminen luvulla 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Jakaminen luvulla 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Jakaminen luvulla 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Jakaminen luvulla 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Jakaminen: 10 jaettuna 1"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Negatiivisten lukujen yhteenlasku"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Negatiivisten lukujen vähennyslasku"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Negatiivisten lukujen yhteenlasku"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Negatiivisten lukujen vähennyslasku"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Negatiivisten lukujen kerto- ja jakolasku"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Positiivisten ja negatiivisten lukujen kertolasku"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Positiivisten ja negatiivisten lukujen jakolasku"

Added: tuxmath/trunk/po/fr.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/fr.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/fr.po
===================================================================
--- tuxmath/trunk/po/fr.po	                        (rev 0)
+++ tuxmath/trunk/po/fr.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,666 @@
+# French translation of tuxmath.pot for TuxMath
+# This file is put in the public domain.
+# Grumeau Rémi <remi at beosfrance.com>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.5.8\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2007-11-15 09:00+0100\n"
+"Last-Translator: Grumeau Rémi <remi at beosfrance.com>\n"
+"Language-Team: Dutch <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Tableau des scores"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Cadet de l'espace"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "As"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Chargement"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Cette option n'est pas encore disponible"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Participer au futur de TuxMath au"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Aide"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Plus d'options"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Quitter"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Ecole d'entrainement au Math"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Jouer en mode arcade"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Jouer en mode personnalisé"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menu principal"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Editer le fichier 'option' dans le dossier home"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "pour créer une partie personnalisée !"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Appuyez sur une touche ou cliquez pour commencer"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Lisez README.txt pour plus d'informations"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "A propos"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Crédits"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menu principal"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath est gratuit et open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Participez à l'amélioration du jeu en nous signalant des problemes,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "vos suggestions, ou en développement."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Parlons-en sur tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Taper un nombre"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition 1 à 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition 1 à 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Somme de 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Somme de 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: Somme de 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Nombres à deux chiffres"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Nombre manquant"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Addition: 0 à 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Soustraction: 0 à 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Soustraction: Nombre à deux chiffres"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Rapport d'addition et soustraction"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplication: 0 à 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiples de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiples de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiples de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiples de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplication: 0 à 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiples de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiples de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplication: 0 à 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiples de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiples de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiples de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplication: 0 à 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiples de 11 et 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplication: 0 à 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiples de 13, 14 et 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplication: 0 à 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplication: Nombres manquants"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division par 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division par 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division par 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division par 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 à 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division par 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division par 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division par 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division par 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division par 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 à 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division par 11 et 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 à 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division par 13, 14 et 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 à 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Rapport de multiplication et division"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Nombres négatifs entrés"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Soustraction: fausses réponses"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Addition: négatifs aux positifs"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Ajout de négatifs aux positifs"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Soustraction de négatifs au positifs"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Soustraction de négatifs aux négatifs"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Ajout de négatifs aux positifs"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Soustraction de négatifs aux négatifs"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Rapport des nombres négatifs au positifs"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplication et division de négatifs"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplication de positifs et négatifs"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division de positifs et négatifs"

Added: tuxmath/trunk/po/ga.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/ga.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/ga.po
===================================================================
--- tuxmath/trunk/po/ga.po	                        (rev 0)
+++ tuxmath/trunk/po/ga.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,669 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-07-13 23:16-0000\n"
+"Last-Translator: Seanán à Coistín <seananoc at gmail.com>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Fáilte go TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "An cúram atá agat ná"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "íoglúanna do phiongain a chosaint"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "ó na réalta mhongach atá ag titim anuas."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stad réalt mhongach trí an"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "freagra don ceist mata a chlóscríobh"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "agus brúigh 'bearna' nó 'isteach'."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Imir anois é!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Amas iontach!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Má bhuaileann réalt mhongach íoglú,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "leáitear é. Ach ná bí buartha:"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "tá an phiogain togha!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Féach cad a tharlaíonn:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Brúigh cnaipe chun tosú)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Tabhair faoi deara an freagra"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "Má bhuailfí arís é,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "fágann an piongain."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Brúigh cnaipe ar bith nuair atá tú réidh)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Is fédir na hioglúanna a dheisiú"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "trí réalta mhongach breise a stadadh."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Buail anois é!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Maith thú!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Scoir ag am ar bith trí brúigh"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "'Esc' nó brúigh an 'X'"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "sa chúinne uachtarach ar dheis."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Déan anois é, agus ansin imir!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Réim na gCuradh"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Glasearcach"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Gasóg"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ránaí"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Curadh"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Obair Idir Lámha!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Níl an ghné seo réidh fós"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Plé todhchaí TuzMath ag"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Cabhair"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Tuilleadh Roghanna"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Scoir"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Lárionad Oiliúna an Cheannais Mata"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Imir an Gnáthchluiche"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Imir Cluiche Saincheaptha"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "An Príomh Roghchlár"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Cuir in eagar an comhad 'roghanna' i do chomhadlann baile"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "chun cluiche saincheaptha a chruthú!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Brúigh cnaipe nó brúigh do luchóg chun an cluiche a thosú."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Féach ar README.txt le haghaidh breis eolas"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Taispeántas"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Faisnéis an Tionscadail"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Buíochas le"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "An Príomh Roghchlár"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "Tá TuxMath ar fáil saor in aisce agus le foinse oscailte!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Is féidir leat cuidiú é a fheabhsú trí fadhbanna a fhógrú,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "feabhsaithe a mholadh, nó trí cód a chur leis."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Plé an todhchaí ag tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Clóscríobh Uimhreacha"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Suimiú: 1 go dtí a 13"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Suimiú: 1 go dtí a 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Suimiú: Suimeanna go dtí a 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Suimiú: Suimeanna go dtí a 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Suimiú: Suimeanna go dtí a 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Suimiú: Uimhreacha Dhá Dhigit"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Suimiú: Uimhreacha In Easnamh"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Dealú: 0 go dtí a 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Dealú: 0 go dtí a 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Dealú: Uimhreacha Dhá Dhigit"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Súil Siar ar Suimiú agus Dealú"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Iolrú: 0 go dtí a 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Iolraithe de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Iolraithe de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Iolracha de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Iolracha de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Iolrú: 0 go dtí a 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Iolracha de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Iolracha de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Iolrú: 0 go dtí a 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Iolracha de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Iolracha de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Iolracha de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Iolrú: 0 go dtí a 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Iolraithe de a 11 agus a 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Iolrú: 0 go dtí a 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Iolraithe de a 13, a 14, agus a 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Iolrú: 0 go dtí a 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Iolrú: Uimhreacha In Easnamh"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Roinnt faoi na a 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Roinnt faoi na a 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Roinnt faoi na a 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Roinnt faoi na a 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Roinnt: 1 go dtí a 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Roinnt faoi na a 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Roinnt faoi na a 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Roinnt faoi na a 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Roinnt faoi na a 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Roinnt faoi na a 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Roinnt: 1 go dtí a 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Roinnt faoi na a 11 agus a 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Roinnt: 1 go dtí a 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Roinnt faoi na a 13, a 14, agus a 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Roinnt: 1 go dtí a 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Súil Siar ar Iolrú agus Roinnt"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Ag Clóscríobh Uimhreacha Diúltacha"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Dealú: Freagraí Diúltacha"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Ag Suimiú Diúltacha le Deimhneacha"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Ag Suimiú Diúltacha le Diúltacha"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Ag Dealú Diúltacha ó Deimhneacha"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Ag Dealú Diúltacha ó Diúltacha"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Ag Suimiú Diúltacha le Diúltacha"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Ag Dealú Diúltacha ó Diúltacha"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Súil Siar ar Uimhreacha Dhiúltacha agus Dheimhneacha"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Iolrú agus Roinnt Diúltacha"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Iolrú Deimhneacha agus Diúltacha"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Roinnt Deimhneacha agus Diúltacha"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "íoglúanna do phiongain a chosaint"

Added: tuxmath/trunk/po/he.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/he.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/he.po
===================================================================
--- tuxmath/trunk/po/he.po	                        (rev 0)
+++ tuxmath/trunk/po/he.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,678 @@
+# Hebrew translation for tuxmath
+# Copyright (c) 2008 Tux4Kids
+# This file is distributed under the same license as the tuxmath package.
+# Yaron Shahrbani <sh.yaron at gmail.com>, 2008.
+#
+# Contributors:
+# Yaron Shahrabani
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2009-01-17 10:32+0200\n"
+"Last-Translator: Yaron Shahrabani <sh.yaron at gmail.com>\n"
+"Language-Team: Hebrew <sh.yaron at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2009-01-17 08:28+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+"Plural-Forms: n!=1\n"
+"X-Poedit-Language: Hebrew\n"
+"X-Poedit-Country: ISRAEL\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "ברוכים הבאים לטאקסמטיקה!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "מטרתך היא להציל את"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "הפינגווינים שלך מפני"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "הכוכבים הנופלים."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "תוכל להדוף כוכב על ידי"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "הקלדת התשובה לבעיה המתמטית"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "ולחיצה על 'רווח' או 'Enter'."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "נסה זאת כעת!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "פגיעה יפה!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "אם פוגע כוכב באיגלו,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "האיגלו נמס. אך אל דאגה:"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "הפינגווינים בסדר גמור!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "פשוט שים לב מה קורה:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(לחץ על מקש להתחלה)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "שים לב לתשובה"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "אם האיגלו נפגע שוב,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "הפינגווין עוזב."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(לחץ על מקש כשאתה מוכן)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "תוכלו לתקן את האיגלואים"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "על ידי הדיפת כוכבי בונוס."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "תירה בו כעת!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "עבודה יפה!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "תוכל לצאת בכל על על ידי"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "לחיצה על 'Esc' או על ה־'X'"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "בפינה השמאלית העליונה."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "עשה זאת כעת, שחק לאחר מכן!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "היכל התהילה"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "טירון"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "תלמיד"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "מתמצא"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "תותח"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "עבודה בתהליכים!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "תכונה זו אינה מוכנה עדיין"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "דון בעתידה של טאקסמתיקה בקבוצת הדיון"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "עזרה"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "אפשרויות נוספות"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "יציאה"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "האקדמיה לאימון פעולות מתמטיות"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "שחק משחק ארקייד"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "שחק משחק מותאם"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "תפריט ראשי"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "ערוך את קובץ האפשרויות ('options') בתיקיית הבית שלך"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "כדי ליצור משחק מותאם אישית!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "לחץ על מקש במקלדת או בעכבר כדי להתחיל במשחק."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "עיין בקובץ README.TXT למידע נוסף"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "הדגמה"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "מידע על המיזם"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "תודות"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "תפריט ראשי"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "טאקסמטיקה הינה חופשית ובעלת קוד פתוח!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "תוכל לעזור לנו לשפר אותו על ידי דיווח תקלות,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "הצעת שיפורים או הוספת קוד."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "דון בעתיד טאקסמטיקה ברשימת הדיוור tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "הקלדת מספרים"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "חיבור: 1 עד 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "חיבור: 0 עד 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "חיבור: סכומים עד 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "חיבור: סכומים עד 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "חיבור: סכומים עד 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "חיבור: מספרים דו-ספרתיים"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "חיבור: מספרים חסרים"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "חיסור: 0 עד 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "חיסור: 0 עד 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "חיסור: מספרים דו-ספרתיים"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "סקירת חיבור וחיסור"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "כפל: 0 עד 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "כפולות של 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "כפולות של 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "כפולות של 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "כפולות של 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "כפל: 0 עד 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "כפולות של 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "כפולות של 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "כפל: 0 עד 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "כפולות של 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "כפולות של 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "כפולות של 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "כפולות: 0 עד 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "כפולות של 11 ו-12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "כפל: 0 עד 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "כפולות של 13, 14 ו-15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "כפל: 0 עד 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "כפל: מספרים חסרים"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "חילוק ב-2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "חילוק ב-3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "חילוק ב-4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "חילוק ב-5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "חילוק: 1עד 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "חילוק ב-6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "חילוק ב-7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "חילוק ב-8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "חילוק ב-9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "חילוק ב-10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "חילוק: 1 עד 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "חילוק ב-11 ו-12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "חילוק: 1 עד 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "חילוק ב-13, 14 ו-15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "חילוק: 1 עד 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "סקירת כפל וחילוק"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "הקלדת מספרים שליליים"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "חיסור: תוצאות שליליות"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "הוספת מספרים שליליים לחיוביים"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "הוספת שליליים לשליליים"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "חיסור מספרים שליליים מחיוביים"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "חיסור שליליים משליליים"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "הוספת שליליים לשליליים"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "חיסור שליליים משליליים"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "סקירת מספרים חיוביים ושליליים"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "כפל וחילוק של מספרים שליליים"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "הכפלת מספרים חיוביים בשליליים"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "חלוקת מספרים חיוביים בשליליים"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "הפינגווינים שלך מפני"

Added: tuxmath/trunk/po/hu.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/hu.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/hu.po
===================================================================
--- tuxmath/trunk/po/hu.po	                        (rev 0)
+++ tuxmath/trunk/po/hu.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,670 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-02-11 21:56+0100\n"
+"Last-Translator: Miklos Merenyi <mermik at freemail.hu>\n"
+"Language-Team: LANGUAGE <HU at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Üdvözöllek a TuxMath-ban!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Küldetésed a pingvinek"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "jégkunyhóinak megvédése"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "az aláhulló meteoritoktól."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Gépeld be a matematikai feladat "
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "eredményét, és üss Enter-t"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "a meteor megállításához!"
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Próbáld meg most!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Szép lövés!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Ha egy jégkunyhót eltalál"
+
+#: src/game.c:777
+#, fuzzy
+msgid "it melts. But don't worry: the"
+msgstr "egy meteor, megolvad, de a"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "pingvinnek még nem lesz baja!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Nézd, mi történik:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Nyomj meg egy gombot!)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Látod a választ?"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "A második találat után"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "a pingvin elmenekül."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Nyomj meg egy gombot!)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "A jégkunyhókat a bónusz meteorok"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "szétlövésével javíthatod meg."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Adj neki!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Szép munka!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Akármikor kiléphetsz az 'ESC'"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "gomb megnyomásával, vagy "
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "az 'X'-re való kattintással."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Lépj ki, és kezdd a játékot!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Dicsőséglista"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Újonc"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Felderítő"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Járőrparancsnok"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Mesterpilóta"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Fejlesztés alatt."
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Ez a funkció még nem működik"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "A TuxMath jövőjét itt vitathatod meg:"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Segítség"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Egyebek"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Kilépés"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Matek-Parancsnok Képző Akadémia"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Beépített játékok"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Testreszabott játékok"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Főmenü"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "A home-könyvtáradban levő 'options' fájl "
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "szerkesztésével készíthetsz testreszabott játékot."
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Nyomj le egy billentyűt vagy egy egérgombot a kezdéshez!"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "További részletek a README.txt fájlban."
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Projekt információ"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Köszönetnyilvánítás"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Főmenü"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "A TuxMath ingyenes és nyílt forráskódú!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Te is segíthetsz még jobbá tenni az észlelt hibák bejelentésével,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "továbbfejlesztési ötletekkel, vagy programkóddal."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Levelezőlista (angol nyelvű): tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Számok gépelése"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Összeadás: 1 - 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Összeadás: 0 - 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Összeadás: az összeg max. 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Összeadás: az összeg max. 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Összeadás: az összeg max. 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Összeadás: kétjegyű számok"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Összeadás: hiányzó számok"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Kivonás: 0 - 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Kivonás: 0 - 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Kivonás: kétjegyű számok"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Összeadás és kivonás összefoglaló"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Szorzás: 0-3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "2 többszörösei"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "3 többszörösei"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "4 többszörösei"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "5 többszörösei"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Szorzás: 0 - 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "6 többszörösei"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "7 többszörösei"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Szorzás: 0 - 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "8 többszörösei"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "9 többszörösei"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "10 többszörösei"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Szorzás: 0 - 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "11 és 12 többszörösei"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Szorzás: 0 - 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "13, 14 és 15 többszörösei"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Szorzás: 0 - 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Szorzás: hiányzó számok"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Osztás kettővel"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Osztás 3-mal"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Osztás 4-gyel"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Osztás 5-tel"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Osztás: 1 - 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Osztás 6-tal"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Osztás 7-tel"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Osztás 8-cal"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Osztás 9-cel"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Osztás 10-zel"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Osztás: 1 - 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Osztás 11-gyel és 12-vel"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Osztás: 1 - 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Osztás 13-mal, 14-gyel és 15-tel"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Osztás: 1 - 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Szorzás és osztás összefoglaló"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Negatív számok gépelése"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Kivonás: negatív eredmény"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Negatív és pozitív számok összeadása"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Negatív számok összeadása"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Negatív számok kivonása pozitívakból"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Negatív számok kivonása negatívokból"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Negatív számok összeadása"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Negatív számok kivonása negatívokból"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Pozitív és negatív számok összefoglaló"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Negatív számok szorzása és osztása"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Pozitív és negatív számok szorzása"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Pozitív és negatív számok osztása"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "jégkunyhóinak megvédése"

Added: tuxmath/trunk/po/insert-header.sin
===================================================================
--- tuxmath/trunk/po/insert-header.sin	                        (rev 0)
+++ tuxmath/trunk/po/insert-header.sin	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}

Added: tuxmath/trunk/po/it.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/it.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/it.po
===================================================================
--- tuxmath/trunk/po/it.po	                        (rev 0)
+++ tuxmath/trunk/po/it.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,676 @@
+# Italian translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Giovanni Condello <condellog at gmail.com>
+# Sergio Zanchetta
+# cenoura
+# lucabaffa
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-01 11:49+0000\n"
+"Last-Translator: Giovanni Condello <condellog at gmail.com>\n"
+"Language-Team: Italian <it at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Galleria dei campioni"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Cadetto spaziale"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Asso"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Lavori in corso!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Questa caratteristica non è ancora pronta."
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discuti del futuro di TuxMatch su"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Aiuto"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Altre opzioni"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Esci"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr ""
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr ""
+
+#: src/titlescreen.c:744
+#, fuzzy
+msgid "Play Custom Game"
+msgstr "Gioca una partita personalizzata"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menu principale"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Modifica il file 'options' nella tua cartella home"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "per creare una partita personalizzata!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Premi un tasto o fai click con il mouse per iniziare il gioco."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Vedi il file README.txt per maggiori informazioni"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Informazioni sul progetto"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Ringraziamenti"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menu principale"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath è gratuito ed open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Puoi aiutare a migliorarlo riportando i problemi,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "proponendo miglioramenti o con l'aggiunta di codice."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discuti del futuro su tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addizione: da 1 a 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addizione: da 0 a 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addizione: somme fino a 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addizione: somme fino a 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addizione: somme fino a 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addizione: numeri a due cifre"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addizione: numeri mancanti"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Sottrazione: da 0 a 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Sottrazione: da 0 a 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Sottrazione: numeri a due cifre"
+
+#: data/missions/lessons/descr_lessons:12
+#, fuzzy
+msgid "Addition and Subtraction Review"
+msgstr "Ripasso su addizioni e sottrazioni"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Moltiplicazione: da 0 a 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multipli di 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multipli di 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multipli di 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multipli di 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Moltiplicazione: da 0 a 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multipli di 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multipli di 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Moltiplicazione: da 0 a 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multipli di 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multipli di 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multipli di 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Moltiplicazione: da 0 a 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multipli di 11 e 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Moltiplicazione: da 0 a 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multipli di 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Moltiplicazione: da 0 a 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Moltiplicazione: numeri mancanti"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Divisione per 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Divisione per 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Divisione per 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Divisione per 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Divisione: da 1 a 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Divisione per 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Divisione per 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Divisione per 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Divisione per 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Divisione per 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Divisione: da 1 a 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Divisione per 11 e 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Divisione: da 1 a 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Divisione per 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Divisione: da 1 a 15"
+
+#: data/missions/lessons/descr_lessons:46
+#, fuzzy
+msgid "Multiplication and Division Review"
+msgstr "Ripasso su moltiplicazioni e divisioni"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Scrittura di numeri negativi"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Sottrazione: risultati negativi"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Sommare numeri negativi a positivi"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Sommare numeri negativi a negativi"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Sottrarre numeri negativi da positivi"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Sottrarre numeri negativi da negativi"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Sommare numeri negativi a negativi"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Sottrarre numeri negativi da negativi"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Ripasso sui numeri positivi e negativi"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Moltiplicazione e divisione di numeri negativi"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Moltiplicazione di numeri positivi e negativi"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Divisione di numeri positivi e negativi"

Added: tuxmath/trunk/po/ja.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/ja.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/ja.po
===================================================================
--- tuxmath/trunk/po/ja.po	                        (rev 0)
+++ tuxmath/trunk/po/ja.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,671 @@
+# Japanese translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# CMasami
+# Yuji Kaneko
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-05 15:29+0000\n"
+"Last-Translator: CMasami <Unknown>\n"
+"Language-Team: Japanese <ja at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "殿堂入り"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "訓練生"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "上等兵"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "特殊部隊"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "超能力者"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "作業中!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "この機能はまだありません"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "TuxMathについての要望は"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "ヘルプ"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "他のオプション"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "終了"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "計算戦隊訓練学校"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "一般訓練開始"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "特殊訓練開始"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "メインメニュー"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "ホーム・ディレクトリの'optoins'ファイルを編集して"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "オリジナルのゲームを作ろう!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "キーを押すかクリックしてゲーム開始"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "詳しい説明はREADME.txtを見てください"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "デモ"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "プロジェクト情報"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "クレジット"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "メインメニュー"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath は自由でオープンソースです!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "問題点を報告してゲームを改善することができます。"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "新機能の提案や、コードの追加も歓迎します。"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "連絡先はこちら tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "数字を入力する"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "足し算: 1 から 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "足し算: 0 から 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "足し算: 合計を 10 にする"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "足し算: 合計を 15 にする"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "足し算: 合計を 20 にする"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "足し算: 2桁の数"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "足し算: 数字の穴埋め"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "引き算: 0 から 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "引き算: 0 から 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "引き算: 2桁の数"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "足し算と引き算のまとめ"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "掛け算: 0 から 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "2の掛け算"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "3の掛け算"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "4の掛け算"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "5の掛け算"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "掛け算: 0 から 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "6の掛け算"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "7の掛け算"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "掛け算: 0 から 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "8の掛け算"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "9の掛け算"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "10の掛け算"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "掛け算: 0 から 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "11 と12の掛け算"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "掛け算: 0 から 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "13から15の掛け算"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "掛け算: 0 から15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "掛け算: 穴埋め"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "2の割り算"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "3の割り算"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "4の割り算"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "5の割り算"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "割り算: 1 から 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "6の割り算"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "7の割り算"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "8の割り算"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "9の割り算"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "10の割り算"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "割り算: 1 から 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "11と12の割り算"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "割り算: 1 から 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "13から15の割り算"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "割り算: 1 から 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "掛け算と割り算のまとめ"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "負の数の入力"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "引き算: 負の数の答え"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "負の数と正の数の足し算"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "負の数と負の数の足し算"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "正の数から負の数を引く"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "負の数から負の数を引く"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "負の数と負の数の足し算"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "負の数から負の数を引く"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "負の数と正の数のまとめ"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "負の数の掛け算と割り算"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "正の数と負の数の掛け算"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "正の数と負の数の割り算"

Added: tuxmath/trunk/po/nb.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/nb.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/nb.po
===================================================================
--- tuxmath/trunk/po/nb.po	                        (rev 0)
+++ tuxmath/trunk/po/nb.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,680 @@
+# Translation of nb to Norwegian Nynorsk
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Karl Ove Hufthammer <karl at huftis.org>, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: nb\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-09-21 19:08+0200\n"
+"Last-Translator: Karl Ove Hufthammer <karl at huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <i18n-nn at lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 0.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Velkommen til TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Oppdraget ditt er å redde"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "igloene til pingvinene fra"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "kometer fra verdensrommet."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Du kan stoppe en komet ved"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "å skrive inn svaret, og så"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "«Mellomrom» eller «Enter»."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Prøv det nå!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Bra skudd!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Hvis en iglo blir truffet av en"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "komet, smelter den. Men ta det"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "med ro: pingvinen klarer seg!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Berre se hva som skjer."
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Trykk en tast for å se.)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Legg merke til rett svar."
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "Hvis igloen blir truffet på nytt,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "vandrer pingvinen bort."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Trykk en tast når du er klar.)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Du kan bygge opp igjen igloene"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "ved å stoppe bonuskometer."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Skyt kometen nå!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Kjempebra!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Du kan når som helst gi deg,"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "ved å trykke «Escape» eller"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "klikke på X-en oppe til høyre."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Prøv det nå, og start spillet!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Rekordar"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Romkadett"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Romlærling"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Romvokter"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Romsjef"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Romkommandør"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Faktorer"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Brøker"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Uferdig!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Denne funksjonen er ikke klar ennå."
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskuter fremtiden til TuxMath på"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Spill alene"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "Spill med venner"
+
+#: src/titlescreen.c:664
+#, fuzzy
+msgid "Factoroids!"
+msgstr "Faktorer"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Hjelp"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Flere valg"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Avslutt"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Kadettskole"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Oppdrag"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Arkadespill"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Selvlaget spill"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hovedmeny"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Rediger «options»-fila i hjemmemappa di"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "for å lage ditt eget spill."
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Trykk en tast eller med musen for å starte spillet."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Se «README.txt» for mer informasjon."
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstrasjon"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Prosjektinfo"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Bidragsytere"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hovedmeny"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath er fri programvare!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Du kan være med på å gjøre spillet bedre, ved å melde fra"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "om feil, foreslå forbedringer eller bidra med programkode."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Diskuter framtiden på tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Tallskriving"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addisjon: 1 til 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addisjon: 0 til 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addisjon: Summer til 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addisjon: Summer til 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addisjon: Summer til 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addisjon: Tosifrede tall"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addisjon: Manglende tall"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraksjon: 0 til 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraksjon: 0 til 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraksjon: Tosifrede tall"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Gjennomgang: Addisjon og subtraksjon"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplikasjon: 0 til 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiplum av 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiplum av 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiplum av 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiplum av 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplikasjon: 0 til 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiplum av 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiplum av 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplikasjon: 0 til 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiplum av 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiplum av 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiplum av 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplikasjon: 0 til 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiplum av 11 og 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplikasjon: 0 til 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiplum av 13, 14 og 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplikasjon: 0 til 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplikasjon: Manglende tall"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Divisjon med 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Divisjon med 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Divisjon med 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Divisjon med 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Divisjon: 1 til 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Divisjon med 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Divisjon med 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Divisjon med 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Divisjon med 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Divisjon med 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Divisjon: 1 til 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Divisjon med 11 og 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Divisjon: 1 til 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Divisjon med 13, 14 og 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Divisjon: 1 til 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Gjennomgang: Multiplikasjon og divisjon"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Negative tall"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraksjon: Negative svar"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Addisjon av negative til positive tall"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Addisjon av negative til negative tall"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtraksjon av negative fra positive tall"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtraksjon av negative fra negative tall"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Addisjon av negative til negative tall"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtraksjon av negative fra negative tall"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Gjennomgang: Negative og positive tall"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplikasjon og divisjon av negative tall"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplikasjon av positive og negative tall"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Divisjon av positive og negative tall"
+
+#, fuzzy
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "igloene til pingvinene fra"
+
+#, fuzzy
+#~ msgid "forever, Commando!"
+#~ msgstr "Romkommandør"
+
+#~ msgid "Other Math Command Activities"
+#~ msgstr "Andre aktiviteter"

Added: tuxmath/trunk/po/nl.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/nl.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/nl.po
===================================================================
--- tuxmath/trunk/po/nl.po	                        (rev 0)
+++ tuxmath/trunk/po/nl.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,666 @@
+# Dutch translation of tuxmath.pot for TuxMath
+# This file is put in the public domain.
+# Schrijvers Luc <Begasus at skynet.be>, 2007.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2007-11-15 09:00+0100\n"
+"Last-Translator: Schrijvers Luc <Begasus at skynet.be>\n"
+"Language-Team: Dutch <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Hoogste scores"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Ruimte kadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Ranger"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ace"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Werk in uitvoering"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Deze functie is nog niet beschikbaar"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Praat over de toekomst van TuxMath op"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Help"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Meer opties"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Afsluiten"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Reken commando training academie"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Speel Arcade spel"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Speel je eigen spel"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hoofdmenu"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Bewerk 'options' bestand in je home folder"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "voor een eigen spel!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Druk op een toets of de muis om het spel te starten."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Lees README.txt voor meer informatie"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Projekt info"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Kredieten"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hoofdmenu"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath is gratis en open-source!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Je kan helpen met het verbeteren door problemen te melden,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "suggesties verbeteringen, of code toevoegen."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Praat over de toekomst via tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Nummers typen"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Optellen 1 tot 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Optellen 1 tot 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Optellen: sommen tot 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Optellen: sommen tot 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Optellen: sommen tot 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Optellen: dubbele getallen"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Optellen: missende getallen"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Aftellen: 0 tot 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Aftellen: 0 tot 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Aftellen: dubbele getallen"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Optellen en aftellen test"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Vermenigvuldigen: 0 tot 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Vermenigvuldigingen van 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Vermenigvuldigingen van 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Vermenigvuldigingen van 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Vermenigvuldigingen van 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Vermenigvuldig: 0 tot 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Vermenigvuldigingen van 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Vermenigvuldigingen van 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Vermenigvuldig: 0 tot 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Vermenigvuldigingen van 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Vermenigvuldigingen van 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Vermenigvuldigingen van 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Vermenigvuldig: 0 tot 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Vermenigvuldigingen van 11 en 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Vermenigvuldig: 0 tot 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Vermenigvuldigingen van 13, 14 en 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Vermenigvuldig: 0 tot 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Vermenigvuldig: missende getallen"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Delen door 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Delen door 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Delen door 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Delen door 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Delen: 1 tot 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Delen door 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Delen door 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Delen door 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Delen door 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Delen door 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Delen: 1 tot 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Delen door 11 en 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Delen: 1 tot 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Delen door 13, 14 en 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Delen: 1 tot 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Vermenigvuldigen en delen test"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Typ negatieve getallen"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Aftellen: negatieve antwoorden"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Optellen: negatief naar positief"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Optellen: negatief naar negatief"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Aftellen: negatief van positief"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Aftellen: negatief van negatief"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Optellen: negatief naar negatief"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Aftellen: negatief van negatief"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Negatieve en positieve getallen test"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Vermenigvuldigen en delen van negatieven"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Vermenigvuldigen van positieven en negatieven"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Delen van positieven en negatieven"

Added: tuxmath/trunk/po/nn.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/nn.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/nn.po
===================================================================
--- tuxmath/trunk/po/nn.po	                        (rev 0)
+++ tuxmath/trunk/po/nn.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,774 @@
+# Translation of nn to Norwegian Nynorsk
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Karl Ove Hufthammer <karl at huftis.org>, 2007, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: nn\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2009-01-13 23:58+0100\n"
+"Last-Translator: Karl Ove Hufthammer <karl at huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <i18n-nn at lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 0.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "(Trykk «Escape» for å hoppa over.)"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "Oppdrag 1: Kampklare kadett"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "Eg er så glad du endeleg er her!"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "Gjer ditt beste!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "Oppdrag 2: Listige læring"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "Men du kan redda dei!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "Oppdrag 3: Vaktsam vaktar"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "Oppdrag fire: Supersjef"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+#, fuzzy
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr "kjem det eit angrep frå deleland!"
+
+#: src/campaign.h:68
+#, fuzzy
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "Inga tid til å kvila på laurbæra; byen"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "Siste oppdrag: Kodeknekkingskommandør"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "HÃ¥par tipset er til hjelp!"
+
+#: src/campaign.h:79
+#, fuzzy
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "Endeleg! No kan du klara å stoppa angrepa"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "Gratulerer! Du vann!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "Runde"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "Prøv på nytt!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "Oppdrag utførd. Galaksen er no trygg!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr "FAKTOROIDAR: For å vinna må du øydeleggja elle asteroidane."
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr "Bruk piltastane til å dreia rundt eller fly framover. Sikt på ein"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "asteroide, skriv inn éin av faktorane og trykk «Enter»"
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+"eller «Mellomrom» for å dela han opp. Primtalsasteroidar vert øydelagde."
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "BRØKAR: For å vinna må du øydeleggja elle asteroidane."
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr "Skriv inn eit tal som kan forenkla brøken, og trykk «Enter»"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+"eller «Mellomrom» for å dela han. Øydelegg brøkar som ikkje kan forenklast "
+"med eit enkeltskot."
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Velkommen til TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Oppdraget ditt er å redda"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "igloane til pingvinane frå"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "kometar frå verdsrommet."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Du kan stoppa ein komet ved"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "å skriva inn svaret, og så"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "«Mellomrom» eller «Enter»."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Prøv det no!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Bra skot!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Viss ein iglo vert treft av ein"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "komet, smeltar han. Men ta det"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "med ro: pingvinen klarer seg!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Berre sjå kva som skjer."
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Trykk ein tast for å sjå.)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Legg merke til rett svar."
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "Viss igloen vert treft på nytt,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "vandrar pingvinen vekk."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Trykk ein tast når du er klar.)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Du kan byggja opp att igloane"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "ved å stoppa bonuskometar."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Skyt kometen no!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Kjempebra!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Du kan når som helst gje deg,"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "ved å trykkja «Escape» eller"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "klikka på X-en oppe til høgre."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Prøv det no, og start spelet!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Rekordar"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Romkadett"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Romlærling"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Romvaktar"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Romsjef"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Romkommandør"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Faktorar"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Brøkar"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Uferdig!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Denne funksjonen er ikkje klar enno."
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskuter framtida til TuxMath på"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Spel åleine"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "Spel med venner"
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr "Faktoroidar!"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Hjelp"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Fleire val"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Avslutt"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Kadettskule"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Oppdrag"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Arkadespel"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Sjølvlaga spel"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hovudmeny"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr "Poengsamling"
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr "Eliminering"
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr "Kor mange spelar?"
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr "(2 til 4 spelarar)"
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Rediger «options»-fila i heimemappa di"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "for å laga ditt eige spel."
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Trykk ein tast eller med musa for å starta spelet."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Sjå «README.txt» for meir informasjon."
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstrasjon"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Prosjektinfo"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Bidragsytarar"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hovudmeny"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath er fri programvare!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Du kan vera med på å gjera spelet betre, ved å melda frå"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "om feil, foreslå forbetringar eller bidra med programkode."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Diskuter framtida på tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Talskriving"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addisjon: 1 til 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addisjon: 0 til 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addisjon: Summar til 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addisjon: Summar til 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addisjon: Summar til 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addisjon: Tosifra tal"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addisjon: Manglande tal"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraksjon: 0 til 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraksjon: 0 til 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraksjon: Tosifra tal"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Gjennomgang: Addisjon og subtraksjon"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplikasjon: 0 til 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiplum av 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiplum av 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiplum av 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiplum av 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplikasjon: 0 til 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiplum av 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiplum av 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplikasjon: 0 til 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiplum av 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiplum av 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiplum av 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplikasjon: 0 til 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiplum av 11 og 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplikasjon: 0 til 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiplum av 13, 14 og 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplikasjon: 0 til 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplikasjon: Manglande tal"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Divisjon med 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Divisjon med 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Divisjon med 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Divisjon med 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Divisjon: 1 til 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Divisjon med 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Divisjon med 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Divisjon med 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Divisjon med 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Divisjon med 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Divisjon: 1 til 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Divisjon med 11 og 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Divisjon: 1 til 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Divisjon med 13, 14 og 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Divisjon: 1 til 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Gjennomgang: Multiplikasjon og divisjon"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Negative tal"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraksjon: Negative svar"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Addisjon av negative til positive tal"
+
+#: data/missions/lessons/descr_lessons:50
+msgid "Adding Positives to Negatives"
+msgstr "Addisjon av positive til negative tal"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtraksjon av negative frå positive tal"
+
+#: data/missions/lessons/descr_lessons:52
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtraksjon av positive frå negative tal"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Addisjon av negative til negative tal"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtraksjon av negative frå negative tal"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Gjennomgang: Negative og positive tal"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplikasjon og divisjon av negative tal"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplikasjon av positive og negative tal"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Divisjon av positive og negative tal"
+
+#~ msgid "The penguins need your help! Comets"
+#~ msgstr "Pingvinane treng hjelp frå deg! Det fell"
+
+#~ msgid "are falling from the sky, and are melting"
+#~ msgstr "kometar frå himmelen, og dei smeltar"
+
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "igloane til pingvinane. For å redda heimane"
+
+#~ msgid "we need you to find the secret code that"
+#~ msgstr "deira, må du finna dei hemmelege kodane"
+
+#~ msgid " will zap each comet."
+#~ msgstr "som øydeleggjer kometane."
+
+#~ msgid "Great job! Since you saved the penguins' homes,"
+#~ msgstr "Bra jobba! Sidan du klarte å redda heimane til"
+
+#~ msgid "we are promoting you to Scout. Scouts are good"
+#~ msgstr "pingvinane, forfremjar me deg til romlærling."
+
+#~ msgid "for keeping an eye out for trouble..."
+#~ msgstr "Håpar du har lært å hanska vanskar …"
+
+#~ msgid "...like what's happening right now!"
+#~ msgstr "… for no får du nokon rett i hendene!"
+
+#~ msgid "The TakeAways have come, and they're sending"
+#~ msgstr "TaVekk-arane kjem, og dei sender nye og"
+
+#~ msgid "new, trickier comets against the penguins!"
+#~ msgstr "endå skumlare kometar mot pingvinane!"
+
+#~ msgid "You've done it again! The Penguin Emperor has"
+#~ msgstr "Du klarte det igjen! Keisarpingvinen har valt"
+
+#~ msgid "chosen you to join his team of Rangers that"
+#~ msgstr "deg til å delta i den offisielle romvaktargruppa"
+
+#~ msgid "help protect the city.  We're sending you"
+#~ msgstr "som vernar om byen. Me sender deg"
+
+#~ msgid "there now..."
+#~ msgstr "der no …"
+
+#~ msgid "...oh no! Now the Emperor himself is under attack,"
+#~ msgstr "Å nei, å nei! Keisarpingvinen sjølv vert no angripen,"
+
+#~ msgid "from new types of comets: these problems are"
+#~ msgstr "av dei nye gongekometane. Desse er endå"
+
+#~ msgid "multiplying! To fight these, you need great"
+#~ msgstr "vanskelegare, og for å øydeleggja dei må du"
+
+#~ msgid "skill. We think you can do it. Join the"
+#~ msgstr "vera dugande dyktig. Men me trur du vil"
+
+#~ msgid "Rangers and help save the city!"
+#~ msgstr "klara det. Vert med romvaktarane og redd byen!"
+
+#~ msgid "You did it! The Emperor wants to thank you"
+#~ msgstr "Du klarte det! Keisaren ønskjer å takka deg"
+
+#~ msgid "in person. We are taking you to his ice palace"
+#~ msgstr "personleg. Me tek deg med til ispalasset hans,"
+
+#~ msgid "for a great honor: you will become"
+#~ msgstr "der du får æra av å verta utnemnd"
+
+#~ msgid "the Imperial Ace!"
+#~ msgstr "til keisarleg romsjef!"
+
+#~ msgid "But right in the middle of the ceremony,"
+#~ msgstr "Men midt under seremonien"
+
+#~ msgid "needs your help!"
+#~ msgstr "treng di hjelp!"
+
+#~ msgid "Penguin scientists have learned that all"
+#~ msgstr "Forskarpingvinane har funne ut alle"
+
+#~ msgid "these attacks are coming from a secret"
+#~ msgstr "angrepa kjem frå ein hemmeleg base,"
+
+#~ msgid "base, and they need you to go fight"
+#~ msgstr "og dei treng hjelp frå deg til å"
+
+#~ msgid "the final battle. They also give you"
+#~ msgstr "øydeleggja basen. Dei har òg eit"
+
+#~ msgid "this clue: first do multiplication and"
+#~ msgstr "lite tips: Gonga først, dela så, og"
+
+#~ msgid "division, and then do addition and subtraction."
+#~ msgstr "avslutt med å leggja til og trekkja frå."
+
+#~ msgid "forever, Commando!"
+#~ msgstr "for alltid, romkommandør!"
+
+#~ msgid "Other Math Command Activities"
+#~ msgstr "Andre aktivitetar"

Added: tuxmath/trunk/po/oc.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/oc.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/oc.po
===================================================================
--- tuxmath/trunk/po/oc.po	                        (rev 0)
+++ tuxmath/trunk/po/oc.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,668 @@
+# Occitan (post 1500) translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Yannig MARCHEGAY (Kokoyaya) <yannig at marchegay.org>
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-02-25 16:55+0000\n"
+"Last-Translator: Yannig MARCHEGAY (Kokoyaya) <yannig at marchegay.org>\n"
+"Language-Team: Occitan (post 1500) <oc at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr ""
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr ""
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr ""
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr ""
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr ""
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr ""
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr ""
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr ""
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Ajuda"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Mai d'opcions"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Sortir"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr ""
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr ""
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr ""
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menut principal"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr ""
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr ""
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr ""
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr ""
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr ""
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr ""
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Mercejaments"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menut principal"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr ""
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr ""
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr ""
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Adicion  : de 1 a 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Adicion  : de 0 a 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Adicion  : sumas fins a 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Adicion  : sumas fins a 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Adicion  : sumas fins a 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Sostraccion : de 0 a 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Sostraccion : de 0 a 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Sostraccions : nombres de doas chifras"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplicacion : de 0 a 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multiples de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multiples de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multiples de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multiples de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplicacion : de 0 a 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multiples de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multiples de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplicacion : de 0 a 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multiples de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multiples de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multiples de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplicacion : de 0 a 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multiples de 11 e 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplicacion : de 0 a 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multiples de 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplicacion : de 0 a 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division per 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division per 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division per 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division per 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division : de 1 a 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division per 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division per 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division per 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division per 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division per 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division : de 1 a 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division per 11 e 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division : de 1 a 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division per 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division : de 1 a 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:50
+msgid "Adding Positives to Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:52
+msgid "Subtracting Positives From Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr ""

Added: tuxmath/trunk/po/pl.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/pl.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/pl.po
===================================================================
--- tuxmath/trunk/po/pl.po	                        (rev 0)
+++ tuxmath/trunk/po/pl.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,679 @@
+# Polish translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Mateusz Tybura <wujciol at gmail.com>
+# Mateusz Owczarek
+# Mr G.
+# wojtusm
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-02-25 18:43+0000\n"
+"Last-Translator: Mateusz Tybura <wujciol at gmail.com>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Lista najlepszych"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Kosmiczny Kadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Strzelec"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Strażnik"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "As"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Prace trwajÄ…!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Ta cecha jeszcze nie jest gotowa"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Dyskusje na temat przyszłości Tuxmath na"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Pomoc"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Więcej opcji"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Wyjdź"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Akademia Treningowa Poleceń Math"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Zagraj w grę zręcznościową"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Zagraj w wybranÄ… grÄ™"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menu główne"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Edytuj pik 'options' w swoim katalogu domowym"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr ""
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Naciśnij klawisz albo kliknij myszką aby uruchomić grę."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Przeczytaj README.txt, żeby uzyskać więcej informacji"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstracja"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Informacja o projekcie"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Twórcy"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menu główne"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath jest wolny i ma otwarte źródła"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Możesz pomóc uczynić go lepszym zgłaszając błędy."
+
+#: src/titlescreen.c:1130
+#, fuzzy
+msgid "suggesting improvements, or adding code."
+msgstr "Zasugeruj ulepszenia lub dodaj kod"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Dyskutuj na temat przyszłości na tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+#, fuzzy
+msgid "Number Typing"
+msgstr "Wpisywanie numerów"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Dodawanie: 1 do 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Dodawanie: 0 do 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Dodawanie: Sumy do 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Dodawanie: Sumy do 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Dodawanie: Sumy do 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Dodawanie: Dwucyfrowe liczby"
+
+#: data/missions/lessons/descr_lessons:8
+#, fuzzy
+msgid "Addition: Missing Numbers"
+msgstr "Dodawanie: z niewiadomÄ…"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Odejmowanie: 0 do 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Odejmowanie: 0 do 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Odejmowanie: dwucyfrowe liczby"
+
+#: data/missions/lessons/descr_lessons:12
+#, fuzzy
+msgid "Addition and Subtraction Review"
+msgstr "Powtórka z dodawania i odejmowania"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Mnożenie: 0 do 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Wielokrotności liczby 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Wielokrotności liczby 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Wielokrotności liczby 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Wielokrotności liczby 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Mnożenie: 0 do 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Wielokrotności liczby 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Wielokrotności liczby 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Mnożenie: 0 do 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Wielokrotności liczby 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Wielokrotności liczby 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Wielokrotności liczby 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Mnożenie: 0 do 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Wielokrotności liczb 11 i 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Mnożenie: 0 do 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Wielokrotności liczb 13,14 i 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Mnożenie: 0 do 15"
+
+#: data/missions/lessons/descr_lessons:30
+#, fuzzy
+msgid "Multiplication: Missing Numbers"
+msgstr "Mnożenie: z niewiadomą"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Dzielenie przez 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Dzielenie przez 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Dzielenie przez 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Dzielenie przez 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Dzielenie: 1 do 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Dzielenie przez 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Dzielenie przez 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Dzielenie przez 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Dzielenie przez 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Dzielenie przez 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Dzielenie: 1 do 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Dzielenie przez 11 i 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Dzielenie: 1 do 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Dzielenie przez 13,14 i 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Dzielenie: 1 do 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Powtórka z mnożenia i dzielenia"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Pisanie liczb ujemnych"
+
+#: data/missions/lessons/descr_lessons:48
+#, fuzzy
+msgid "Subtraction: Negative Answers"
+msgstr "Odejmowanie: ujemne odpowiedzi"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Dodawanie liczb ujemnych do dodatnich"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Dodawanie liczb ujemnych do ujemnych"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Odejmowanie liczb ujemnych od dodatnich"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Odejmowanie liczb ujemnych od dodatnich"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Dodawanie liczb ujemnych do ujemnych"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Odejmowanie liczb ujemnych od dodatnich"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Powtórka z liczb dodatnich i ujemnych"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Mnożenie i dzielenie liczb ujemnych"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Mnożenie liczb dodatnich i ujemnych"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Dzielenie liczb dodatnich i ujemnych"

Added: tuxmath/trunk/po/pt.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/pt.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/pt.po
===================================================================
--- tuxmath/trunk/po/pt.po	                        (rev 0)
+++ tuxmath/trunk/po/pt.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,672 @@
+# Portuguese translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Mykas0 <Mykas0 at gmail.com>
+# Tiago Silva
+# sandro
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-04-12 04:12+0000\n"
+"Last-Translator: Mykas0 <Mykas0 at gmail.com>\n"
+"Language-Team: Portuguese <pt at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Corredor da Fama"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Cadete Espacial"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Batedor"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr ""
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ás"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Trabalho em Progresso!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr ""
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discuta o futuro do TuxMath em"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Ajuda"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Mais Opções"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Sair"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr ""
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr ""
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr ""
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menu principal"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr ""
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr ""
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Pressione uma tecla ou clique o rato para começar o jogo."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Veja o README.txt para mais informações!"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstração"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Informação do Projecto"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Créditos"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menu Principal"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath é livre e com código aberto!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Você pode ajudar o TuxMath ao reportar problemas,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "sugerindo melhorias, ou adicionando código."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discuta o futuro em tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Adição: 1 até 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Adição: 0 até 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Adição: Somas até 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Adição: Somas até 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Adição: Somas até 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Adição: Números com Dois Dígitos"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtracção: 0 até 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtracção: 0 até 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtracção: Números com Dois Dígitos"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplicação: 0 até 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Múltiplos de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Múltiplos de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Múltiplos de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Múltiplos de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplicação: 0 até 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Múltiplos de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Múltiplos de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplicação: 0 até 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Múltiplos de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Múltiplos de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Múltiplos de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplicação: 0 até 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Múltiplos de 11 e 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplicação: 0 até 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Múltiplos de 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplicação: 0 até 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Divisão por 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Divisão por 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Divisão por 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Divisão por 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Divisão: 1 até 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Divisão por 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Divisão por 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Divisão por 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Divisão por 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Divisão por 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Divisão: 1 até 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Divisão por 11 e 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Divisão: 1 até 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Divisão por 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Divisão: 1 até 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Substracção: Respostas Negativas"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Divisão de Positivos e Negativos"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Multiplicação de Positivos e Negativos"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplicação e Divisão de Negativos"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplicação de Positivos e Negativos"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Divisão de Positivos e Negativos"

Added: tuxmath/trunk/po/pt_BR.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/pt_BR.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/pt_BR.po
===================================================================
--- tuxmath/trunk/po/pt_BR.po	                        (rev 0)
+++ tuxmath/trunk/po/pt_BR.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,674 @@
+# Brazilian Portuguese translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# Laudeci Oliveira <laudeci at gmail.com>
+# Andrews Medina
+# André Gondim
+# Julio
+# daniellibanori
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-03 21:35+0000\n"
+"Last-Translator: Laudeci Oliveira <laudeci at gmail.com>\n"
+"Language-Team: Brazilian Portuguese <pt_BR at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Hall da Fama"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Cadete Espacial"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Sentinela"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Defensor"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Especialista"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Trabalho em curso"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Esta função ainda não está disponível"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Discutir o futuro do TuxMath em"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Ajuda"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Mais Opções"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Sair"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Comando de Treinamento Matemático Acadêmico"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Jogar jogo de Arcade"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Jogar um Jogo Personalizado"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Menu Principal"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Edite o arquivo 'options\" no seu diretório home"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "criar jogo personalizado!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Pressione uma tecla ou clique com seu mouse para iniciar o jogo."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Leia o README.txt para mais informações"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstração"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Informação do Projeto"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Créditos"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Menu Principal"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath é gratuíto e software livre!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Você pode ajudar a torná-lo melhor reportando problemas."
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "sugerindo melhorias, ou programando."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Discutir o futuro em tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Digitar Número"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Adição: 1 até 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Adição: 0 até 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Adição: Somar até 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Adição: Somar até 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Adição: Somar até 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Adição: Números de Dois Dígitos"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Adição: Números Perdidos"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtração: 0 até 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtração: 0 até 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtração: Números de Dois Digitos"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Revisão de Adição e Subtração"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplicação: 0 até 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Múltiplos de 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Múltiplos de 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Múltiplos de 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Múltiplos de 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplicação: 0 até 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Múltiplos de 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Múltiplos de 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplicação: 0 a 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Múltiplos de 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Múltiplos de 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Múltiplos de 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplicação: 0 até 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Múltiplos de 11 e 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplicação: 0 até 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Múltiplos de 13, 14 e 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplicação: 0 até 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplicação: Números Perdidos"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Divisão por 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Divisão por 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Divisão por 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Divisão por 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Divisão: 1 até 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Divisão por 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Divisão por 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Divisão por 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Divisão por 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Divisão por 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Divisão: 1 até 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Divisão por 11 e 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Divisão: 1 até 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Divisão por 13, 14, e 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Divisão: 1 até 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Revisar Multiplicação e Divisão"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Entre com um Número Negativo"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtração: Respostas Negativas"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Adicionando Negativos para Positivos"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Adicionando Negativos para Negativos"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtrair Negativos de Positivos"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtrair Negativos de Negativos"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Adicionando Negativos para Negativos"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtrair Negativos de Negativos"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Revisar Números Negativos e Positivos"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplicação e Divisão de Negativos"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplicação de Positivos e Negativos"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Divisão de Positivos e Negativos"

Added: tuxmath/trunk/po/quot.sed
===================================================================
--- tuxmath/trunk/po/quot.sed	                        (rev 0)
+++ tuxmath/trunk/po/quot.sed	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g

Added: tuxmath/trunk/po/remove-potcdate.sin
===================================================================
--- tuxmath/trunk/po/remove-potcdate.sin	                        (rev 0)
+++ tuxmath/trunk/po/remove-potcdate.sin	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}

Added: tuxmath/trunk/po/ru.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/ru.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/ru.po
===================================================================
--- tuxmath/trunk/po/ru.po	                        (rev 0)
+++ tuxmath/trunk/po/ru.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,671 @@
+# Russian translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+#  Ivan Kliouchenkov
+# ¡ÝÖÜãÑßÕâ AldeX ¬âíÝàÓ
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-01 06:56+0000\n"
+"Last-Translator: Александр AldeX Крылов <Unknown>\n"
+"Language-Team: Russian <ru at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Зал славы"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Космический курсант"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Разведчик"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Рейнджер"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Ас"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Работа продолжается!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Эта функция пока не готова"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Обсудить будущее TuxMath на"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Помощь"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Дополнительные настройки"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Выход"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Учебная академия по арифметике"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Играть в аркадную игру"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Играть в пользовательскую игру"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Главное меню"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Редактировать файл параметров в вашей домашней директории"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "для создания пользовательской игры!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Нажмите клавишу или кликните мышью для запуска игры."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Смотрите README.txt для дополнительной информации"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Демонстрация"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Информация о проекте"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Разработчики"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Главное меню"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath свободный и открытый!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Вы можете улучшить этот продукт, сообщив о проблеме,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "предложив улучшение или добавив код."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Обсудите будущее программы на tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Числовой ввод"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Сложение: от 1 до 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Сложение: от 0 до 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Сложение: Суммы до 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Сложение: Суммы до 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Сложение: Суммы до 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Сложение: Двузначные числа"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Сложение: Пропущенные числа"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Вычитание: от 0 до 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Вычитание: от 0 до 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Вычитание: Двузначные числа"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Обзор сложения и вычитания"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Умножение: от 0 до 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Умножение на 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Умножение на 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Умножение на 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Умножение на 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Умножение: от 0 до 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Умножение на 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Умножение на 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Умножение: от 0 до 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Умножение на 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Умножение на 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Умножение на 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Умножение: от 0 до 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Умножение на 11 и 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Умножение: от 0 до 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Умножение на 13, 14 и 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Умножение: от 0 до 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Умножение: Пропущенные числа"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Деление на 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Деление на 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Деление на 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Деление на 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Деление: от 1 до 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Деление на 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Деление на 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Деление на 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Деление на 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Деление на 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Деление: от 1 до 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Деление на 11 и 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Деление: от 1 до 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Деление на 13, 14 и 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Деление: от 1 до 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Обзор умножения и деления"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Ввод отрицательных чисел"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Вычитание: Отрицательный результат"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Сложение отрицательных и положительных"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Сложение отрицательных с отрицательными"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Вычитание отрицательных из положительных"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Вычитание отрицательных из отрицательных"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Сложение отрицательных с отрицательными"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Вычитание отрицательных из отрицательных"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Обзор отрицательных и положительных"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Умножение и деление отрицательных"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Умножение положительных на отрицательные"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Деление положительных и отрицательных"

Added: tuxmath/trunk/po/sk.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/sk.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/sk.po
===================================================================
--- tuxmath/trunk/po/sk.po	                        (rev 0)
+++ tuxmath/trunk/po/sk.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,671 @@
+# Slovak translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+#  salwator
+# %GÅ %@tefan Lu%Gč%@ivjanský
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-03-16 09:41+0000\n"
+"Last-Translator: Štefan Lučivjanský <lucorp at azet.sk>\n"
+"Language-Team: Slovak <sk at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Sieň slávy"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Vesmírny kadet"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Skaut"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Poručík"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Eso"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Spracováva sa!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Táto vlastnosť ešte nie je pripravená"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskutuj o budúcnosti TuxMath na"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Pomocník"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Viac možností"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Koniec"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Cvičná akadémia matematického ovládania"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Hrať arkádovú hru"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Hrať vlastnú hru"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Hlavná ponuka"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Uprav súbor «options » vo svojom domovskom priečinku,"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "aby si mohol vytvoriť svoju vlastnú hru!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Pre spustenie hry stlačte ľubovoľnú klávesu, alebo kliknite myšou."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Pre viac informácií pozrite README.txt"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demo"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Informácie o projekte"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Tvorcovia"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Hlavná ponuka"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath je slobodný software!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Môžeš ho vylepšiť aj ty oznamovaním problémov,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "navrhovaním vylepšení, alebo pridaním kódu"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Diskutuj o budúcnosti na tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Písanie čísiel"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Sčítanie: od 1 do 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Sčítanie: Od 0 do 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Sčítanie: Súčty do 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Sčítanie: Súčty do 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Sčítanie: Súčty do 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Sčítanie: Dvojciferné čísla"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Sčítanie: Vynechané čísla"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Odčítanie: Od 0 do 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Odčítanie: Od 0 do 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Odčítanie: Dvojciferné čísla"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Sčítanie a odčítanie: Opakovanie"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Násobenie: Od 0 do 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Násobky 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Násobky 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Násobky 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Násobky 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Násobenie: Od 0 do 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Násobky 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Násobky 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Násobenie: Od 0 do 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Násobky 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Násobky 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Násobky 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Násobenie: Od 0 do 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Násobky 10 a 11"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Násobenie: Od 0 do 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Násobky 13, 14 a 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Násobenie: Od 0 do 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Násobenie: Vynechané čísla"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Delenie 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Delenie 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Delenie 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Delenie 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Delenie 1 až 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Delenie 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Delenie 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Delenie 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Delenie 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Delenie 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Delenie 1 až 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Delenie 11 a 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Delenie 1 až 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Delenie 13, 14 a 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Delenie 1 až 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Násobanie a delenie: Opakovanie"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Písanie záporných čisiel"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Odčítavanie: Záporné čísla"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Sčítavanie a odčítavanie kladných a záporných čísiel"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Sčítanie záporných čísiel so zápornými číslami"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Odčítavanie záporných od kladných čísiel"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Odčítanie záporných čísiel od záporných čísiel"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Sčítanie záporných čísiel so zápornými číslami"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Odčítanie záporných čísiel od záporných čísiel"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Kladné a záporné čísla: Opakovanie"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Násobenie a delenie záporných čísiel"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Násobenie kladných a záporných čísiel"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Delenie kladných a záporných čísiel"

Added: tuxmath/trunk/po/sv.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/sv.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/sv.po
===================================================================
--- tuxmath/trunk/po/sv.po	                        (rev 0)
+++ tuxmath/trunk/po/sv.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,776 @@
+# Swedish translation for tuxmath.
+# This file is put in the public domain.
+# Daniel Nylander <po at danielnylander.se>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: \n"
+"Last-Translator: Daniel Nylander <po at danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv at listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Swedish\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "-[Esc] för att hoppa över"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "Uppdrag 1: Försiktig kadett"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "Jag är så glad att du kom!"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "Gör ditt yttersta!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "Uppdrag 2: Smart scout"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "Du kan rädda dem!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "Uppdrag 3: Kunglig jägare"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "Uppdrag 4: Empirisk mästare"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+#, fuzzy
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr "en ny attack från Divisionslandet!"
+
+#: src/campaign.h:68
+#, fuzzy
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "Det finns ingen tid att förlora. Staden"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "Sista uppdraget: Beräknande kommandosoldat"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "Jag hoppas att tipset hjälper!"
+
+#: src/campaign.h:79
+#, fuzzy
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "Nu gäller det! Du kan stoppa dessa"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "Gratulerar! Du vann!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "Omgång"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "Tyvärr, försök igen!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "Uppdraget slutfört! Galaxen är säker!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr "NÄMNARE: för att vinna behöver du förstöra alla asteroider."
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+"Använd piltangenterna för att svänga eller gå framåt. Sikta på en asteroid,"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "skriv in en av dess nämnare och tryck på Blanksteg eller Return"
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr "för att dela den i sina nämnare. Stenar med primtal förstörs!"
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "BRÅK: för att vinna behöver du förstöra alla asteroider"
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+"skriv in ett tal som kan förenkla bråket och tryck på Blanksteg eller Return"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+"för att dela det. Förstör bråken som inte kan förenklas mer i ett enda skott!"
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "Välkommen till TuxMath!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Ditt uppdrag är att rädda dina"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "pingviners igloos från"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "fallande kometer."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Stoppa en komet genom att"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "skriva in svaret på matteproblemet,"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "trycka på \"blanksteg\" eller \"Enter\"."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Prova det nu!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "Bra skjutet!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Om en igloo träffas av en komet,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "så smälter den. Men var lugn,"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "pingvinen är OK!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Se vad som händer:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Tryck på en tangent)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Observera svaret"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "Om den blir träffad igen,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "kommer pingvinen att gå."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Tryck på en tangent)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Du kan bygga nya igloos"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "genom att stoppa bonuskometer."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Skjut den nu!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Bra jobbat!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Avsluta när du vill genom att"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "trycka \"Esc\" eller klicka på \"X\""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "i övre högra hörnet."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Gör det nu och spela sedan!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Poänglistan"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Rymdkadett"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Scout"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Jägare"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "Mästare"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Kommandosoldat"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Nämnare"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Bråk"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr "Du kom med på poänglistan!"
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr "Skriv ditt namn:"
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Arbete pågår!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Denna funktion är inte färdig ännu"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Diskutera framtiden för TuxMath på"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Spela ensam"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "Spela med vänner"
+
+#: src/titlescreen.c:664
+#, fuzzy
+msgid "Factoroids!"
+msgstr "Nämnare"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Hjälp"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Fler alternativ"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Avsluta"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Akademin för matematikträning"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Uppdrag för matematikflottan"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "Spela arkadspel"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Spela anpassat spel"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Huvudmeny"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Redigera filen \"options\" i din hemkatalog"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "för att skapa anpassade spel!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Tryck på en tangent eller klicka med musen för att starta spelet."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Se README.txt för mer information"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Demonstration"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Projektinformation"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Tack till"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Huvudmeny"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath är gratis och öppen källkod!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Du kan hjälpa oss att göra det bättre genom att rapportera problem,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "föreslå förbättringar eller bidra med programkod."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "Diskutera framtiden på tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Skriv in tal"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Addition: 1 till 3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Addition: 0 till 5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Addition: Summor upp till 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Addition: Summor upp till 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Addition: Summor upp till 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Addition: Tal med två siffror"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Addition: Saknade tal"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Subtraktion: 0 till 10"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Subtraktion: 0 till 20"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Subtraktion: Tal med två siffror"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Mer addition och subtraktion"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Multiplikation: 0 till 3"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "Multipler av 2"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "Multipler av 3"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "Multipler av 4"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "Multipler av 5"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Multiplikation: 0 till 5"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "Multipler av 6"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "Multipler av 7"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Multiplikation: 0 till 7"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "Multipler av 8"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "Multipler av 9"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "Multipler av 10"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Multiplikation: 0 till 10"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "Multipler av 11 och 12"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Multiplikation: 0 till 12"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "Multipler av 13, 14 och 15"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Multiplikation: 0 till 15"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Multiplikation: Saknade tal"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "Division med 2"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "Division med 3"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "Division med 4"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "Division med 5"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Division: 1 till 5"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "Division med 6"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "Division med 7"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "Division med 8"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "Division med 9"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "Division med 10"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Division: 1 till 10"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "Division med 11 och 12"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Division: 1 till 12"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "Division med 13, 14 och 15"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Division: 1 till 15"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Mer multiplikation och division"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Skriv in negativa tal"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Subtraktion: Negativa svar"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Addera negativa till positiva tal"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Addera negativa med negativa tal"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Subtrahera negativa från positiva tal"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Subtrahera negativa från negativa tal"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Addera negativa med negativa tal"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Subtrahera negativa från negativa tal"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Fler negativa och positiva tal"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Multiplikation och division med negativa tal"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Multiplikation med positiva och negativa tal"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Division med positiva och negativa tal"
+
+#~ msgid "The penguins need your help! Comets"
+#~ msgstr "Pingvinerna behöver din hjälp! Kometer"
+
+#~ msgid "are falling from the sky, and are melting"
+#~ msgstr "faller från himlen och smälter"
+
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "pingvinernas igloos. Vi behöver dig"
+
+#~ msgid "we need you to find the secret code that"
+#~ msgstr "för att hitta hemliga koden som kan"
+
+#~ msgid " will zap each comet."
+#~ msgstr "förstöra varje komet för att rädda dem."
+
+#~ msgid "Great job! Since you saved the penguins' homes,"
+#~ msgstr "Bra jobbat! Eftersom du räddat pingvinernas hem"
+
+#~ msgid "we are promoting you to Scout. Scouts are good"
+#~ msgstr "så befordrar vi dig till Scout. Scoter är bra"
+
+#~ msgid "for keeping an eye out for trouble..."
+#~ msgstr "på att se upp för problem..."
+
+#~ msgid "...like what's happening right now!"
+#~ msgstr "... precis det som händer just nu!"
+
+#~ msgid "The TakeAways have come, and they're sending"
+#~ msgstr "Bortförarna har kommit och de skickar nya"
+
+#~ msgid "new, trickier comets against the penguins!"
+#~ msgstr "svårare kometer mot pingvinerna!"
+
+#~ msgid "You've done it again! The Penguin Emperor has"
+#~ msgstr "Du har lyckats igen! Pingvinernas kejsare har"
+
+#~ msgid "chosen you to join his team of Rangers that"
+#~ msgstr "valt dig till sin grupp av jägare som ska"
+
+#~ msgid "help protect the city.  We're sending you"
+#~ msgstr "hjälpa till att skydda staden. Vi skickar dit"
+
+#~ msgid "there now..."
+#~ msgstr "dig nu..."
+
+#~ msgid "...oh no! Now the Emperor himself is under attack,"
+#~ msgstr "... Åh nej! Nu är själva kejsaren under attack"
+
+#~ msgid "from new types of comets: these problems are"
+#~ msgstr "från nya typer av kometer. Problemen bara"
+
+#~ msgid "multiplying! To fight these, you need great"
+#~ msgstr "förökar sig! Du behöver erfarenhet för"
+
+#~ msgid "skill. We think you can do it. Join the"
+#~ msgstr "att bekämpa dessa. Vi tror att du kan göra"
+
+#~ msgid "Rangers and help save the city!"
+#~ msgstr "det. Gå med jägarna och rädda staden!"
+
+#~ msgid "You did it! The Emperor wants to thank you"
+#~ msgstr "Du klarade det! Kejsaren vill tacka dig"
+
+#~ msgid "in person. We are taking you to his ice palace"
+#~ msgstr "personligen. Vi tar dig till hans ispalats"
+
+#~ msgid "for a great honor: you will become"
+#~ msgstr "för att ge dig ära. Du kommer att"
+
+#~ msgid "the Imperial Ace!"
+#~ msgstr "bli en Empirisk mästare!"
+
+#~ msgid "But right in the middle of the ceremony,"
+#~ msgstr "Men just i mitten av ceremonin så inleds"
+
+#~ msgid "needs your help!"
+#~ msgstr "behöver din hjälp!"
+
+#~ msgid "Penguin scientists have learned that all"
+#~ msgstr "Pingvinvetenskapsmännen har upptäckt att"
+
+#~ msgid "these attacks are coming from a secret"
+#~ msgstr "alla dessa attacker kommer från en hemlig"
+
+#~ msgid "base, and they need you to go fight"
+#~ msgstr "bas och de behöver dig för att utkämpa"
+
+#~ msgid "the final battle. They also give you"
+#~ msgstr "den sista striden. De har även gett dig"
+
+#~ msgid "this clue: first do multiplication and"
+#~ msgstr "denna ledtråd: multiplicera och dividera"
+
+#~ msgid "division, and then do addition and subtraction."
+#~ msgstr "först, gör sedan addition och subtraktion."
+
+#~ msgid "forever, Commando!"
+#~ msgstr "attacker för alltid, Kommandosoldat!"
+
+#~ msgid "Other Math Command Activities"
+#~ msgstr "Andra matematikaktiviteter"

Added: tuxmath/trunk/po/tr.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/tr.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/tr.po
===================================================================
--- tuxmath/trunk/po/tr.po	                        (rev 0)
+++ tuxmath/trunk/po/tr.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,776 @@
+# translation of tr2.po to Turkish
+# This file is put in the public domain.
+#
+# Doruk Fisek <dfisek at fisek.com.tr>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: tr2\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2008-12-07 15:54+0200\n"
+"Last-Translator: Doruk Fisek <dfisek at fisek.com.tr>\n"
+"Language-Team: Turkish <gnu-tr-u12a at lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "-Atlamak için [Esc]"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "Görev Bir : Dikkatli Tertip"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "Geldiğine çok sevindim!"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "En iyisini yap!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "Görev İki: Akıllı İzci"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "Ama sen onları kurtarabilirsin!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "Görev Üç: Asil Korucu"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "Görev Dört: İmparatorluk Ası"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+#, fuzzy
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr "yeni bir saldırı başlar!"
+
+#: src/campaign.h:68
+#, fuzzy
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "Şimdi dinlenmek için zaman yok; şehrin"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "Son Görev: Hesaplama Komandosu"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "Umarım bu ipucu işine yarar!"
+
+#: src/campaign.h:79
+#, fuzzy
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "Hepsi bu! Bu saldırıları sonsuza dek"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "Tebrikler! Kazandın!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "Tur"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "Üzgünüm, tekrar dene!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "Görev başarıyla tamamlandı. Galaksi güvenli!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr "Ok tuşlarını kullanarak dön ya da ileri git. Bir asteroidi hedef al,"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "çarpanlarından birini yaz ve boşluk ya da enter'e "
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr "basarak çarpanlarına ayır. Asal sayılar olan kayalar yok oluyor!"
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "KESİRLER: Kazanmak için tüm asteroitleri yok etmen gerekiyor."
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+"Kesiri basitleştirebilecek bir sayıyı yazıp boşluk ya da enter'e basarak onu"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+"parçalayın. Daha fazla basitleştirilemeyen kesirleri tek bir atışta yok et!"
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "TuxMath'e HoÅŸ Geldin!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "Görevin penguenlerin evlerini"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "düşen kuyruklu yıldızlardan"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "korumak."
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "Kuyruklu yıldızı durdurmak için"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "matematik probleminin yanıtını yaz"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "ve 'boÅŸluk' ya da 'enter' tuÅŸuna bas."
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "Åžimdi dene!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "İyi atış!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "Eğer bir ev kuyruklu yıldız tarafından"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "vurulursa erir. Ama merak etme :"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "içindeki penguene zarar gelmez!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "Yalnız ne olduğunu izle:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(Başlamak için bir tuşa bas)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "Yanıta dikkat et"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "EÄŸer ev tekrar vurulursa,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "içindeki penguen evi terk eder."
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(Hazır olunca herhangi bir tuşa basın)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "Ek kuyruklu yıldızları durdurarak"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "evlerini tamir edebilirsin."
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "Hemen vur onu!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "Ä°yi iÅŸ!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "Her an 'Esc'e basarak ya da"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "sağ üst köşedeki 'X'e"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "tıklayarak çıkabilirsin."
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "Hemen ÅŸimdi yap ve sonra oyna!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "Gurur Tablosu"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "Uzay Tertibi"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "Ä°zci"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "Korucu"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "As"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "Komando"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "Çarpanlar"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "Kesirler"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "Çalışmalar Sürüyor!"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "Bu özellik henüz hazır değil"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "Tuxmath'in geleceğini tartışıldığı liste :"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "Yalnız Oyna"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "ArkadaÅŸlarla Oyna"
+
+#: src/titlescreen.c:664
+#, fuzzy
+msgid "Factoroids!"
+msgstr "Çarpanlar"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "Yardım"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "Daha Çok Seçenek"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "Çıkış"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "Matematik Komutanlığı Eğitim Akademisi"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "Matematik Komutanlığı Donanması Görevleri"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "EÄŸlence Oyunu Oyna"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "Özel Oyun Oyna"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "Ana menü"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "Özelleştirilmiş oyun yaratmak için"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "ev dizinindeki 'options' dosyasını düzenle!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "Oyuna başlamak için bir tuşa basın ya da fareye tıklayın."
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "Daha fazla bilgi için README.txt dosyasına bakın"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "Gösteri (Demo)"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "Proje Bilgisi"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "Hazırlayanlar"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "Ana Menü"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath özgür ve açık kaynak kodlu!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "Sorunları bildirerek, iyileştirmeler önererek ya da kod yazarak"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "daha iyi olmasına yardımcı olabilirsin."
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+"tuxmath-devel at lists.sourceforge.net e-posta listesinde TuxMath'in geleceÄŸini "
+"tartışabilirsin"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "Sayı Yazmak"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "Toplama: 1'den 3'e"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "Toplama: 0'dan 5'e"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "Toplama: Toplamı 10"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "Toplama: Toplamı 15"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "Toplama: Toplamı 20"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "Toplama : İki Basamaklı Sayılar"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "Toplama : Eksik Sayılar"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "Çıkarma: 0'dan 10'a"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "Çıkarma: 0'dan 20'ye"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "Çıkarma: İki Basamaklı Sayılar"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "Toplama ve Çıkarma Değerlendirmesi"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "Çarpma: 0'dan 3'e"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "2'nin Katları"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "3'ün Katları"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "4'ün Katları"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "5'in Katları"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "Çarpma: 0'dan 5'e"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "6'nın Katları"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "7'nin Katları"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "Çarpma: 0'dan 7'ye"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "8'in Katları"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "9'un Katları"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "10'un Katları"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "Çarpma: 0'dan 10'a"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "11 ve 12'nin Katları"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "Çarpma: 0'dan 12'ye"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "13, 14 ve 15'in Katları"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "Çarpma: 0'dan 15'e"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "Çarpma: Eksik Sayılar"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "2'ye Bölme"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "3'e Bölme"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "4'e Bölme"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "5'e Bölme"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "Bölme: 1'den 5'e"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "6'ya Bölme"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "7'ye Bölme"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "8'e Bölme"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "9'a Bölme"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "10'a Bölme"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "Bölme: 1'den 10'a"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "11 ve 12'ye Bölme"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "Bölme: 1'den 12'ye"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "13, 14 ve 15'e Bölme"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "Bölme: 1'den 15'e"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "Çarpım ve Bölme Değerlendirmesi"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "Negatif Sayıların Yazımı"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "Çıkartma: Negatif Sonuçlar"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "Negatiflerle Pozitiflerin Toplanması"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "Negatiflerin Negatiflerle Toplanması"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "Pozitiflerden Negatiflerin Çıkartılması"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "Negatiflerin Negatiflerden Çıkartılması"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "Negatiflerin Negatiflerle Toplanması"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "Negatiflerin Negatiflerden Çıkartılması"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "Negatif ve Pozitif Sayıların Değerlendirmesi"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "Negatif Sayıların Çarpma ve Bölmesi"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "Pozitiflerle Negatiflerin Çarpılması"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "Pozitif ve Negatiflerin Bölünmesi"
+
+#~ msgid "The penguins need your help! Comets"
+#~ msgstr "Penguenlerin yardımına ihtiyacı var!"
+
+#~ msgid "are falling from the sky, and are melting"
+#~ msgstr "Kuyruklu yıldızlar gökten düşüyor ve"
+
+#~ msgid "the penguins' igloos. To save their homes,"
+#~ msgstr "penguenlerin evlerini eritiyor. Evlerini kurtarmak için,"
+
+#~ msgid "we need you to find the secret code that"
+#~ msgstr "her kuyruklu yıldızı düşürecek"
+
+#~ msgid " will zap each comet."
+#~ msgstr "gizli kodu bulmanı istiyoruz"
+
+#~ msgid "Great job! Since you saved the penguins' homes,"
+#~ msgstr "İyi iş çıkardın! Penguenlerin evlerini kurtardığın için,"
+
+#~ msgid "we are promoting you to Scout. Scouts are good"
+#~ msgstr "seni \"İzci\"liğe yükseltiyoruz. İzciler"
+
+#~ msgid "for keeping an eye out for trouble..."
+#~ msgstr "olası bir soruna karşı tetikte olurlar"
+
+#~ msgid "...like what's happening right now!"
+#~ msgstr "... tıpkı şimdi olan gibi!"
+
+#~ msgid "The TakeAways have come, and they're sending"
+#~ msgstr "Paket servisleri geldi ve penguenlere yeni  daha becerikli"
+
+#~ msgid "new, trickier comets against the penguins!"
+#~ msgstr "kuyruklu yıldızlar gönderiyorlar!"
+
+#~ msgid "You've done it again! The Penguin Emperor has"
+#~ msgstr "Tekrar başardın! İmparator Penguen seni"
+
+#~ msgid "chosen you to join his team of Rangers that"
+#~ msgstr "şehri korumaya yardımcı olan kendi korucular"
+
+#~ msgid "help protect the city.  We're sending you"
+#~ msgstr "takımına katılman için seçti. Şimdi seni"
+
+#~ msgid "there now..."
+#~ msgstr "oraya gönderiyoruz..."
+
+#~ msgid "...oh no! Now the Emperor himself is under attack,"
+#~ msgstr "... oo hayır! Şimdi İmparator'un kendisine saldırılıyor,"
+
+#~ msgid "from new types of comets: these problems are"
+#~ msgstr "hem de yeni tip kuyruklu yıldızlarla : problemler"
+
+#~ msgid "multiplying! To fight these, you need great"
+#~ msgstr "katlanıyor! Bunlarla savaşmak için, harika yeteneklere"
+
+#~ msgid "skill. We think you can do it. Join the"
+#~ msgstr "gereksinim var. Yapabileceğini düşünüyoruz."
+
+#~ msgid "Rangers and help save the city!"
+#~ msgstr "Koruculara katıl ve şehri kurtarmaya yardım et!"
+
+#~ msgid "You did it! The Emperor wants to thank you"
+#~ msgstr "Başardın! İmparator sana bizzat kendisi teşekkür"
+
+#~ msgid "in person. We are taking you to his ice palace"
+#~ msgstr "etmek istiyor. Seni büyük bir onur kazanman için"
+
+#~ msgid "for a great honor: you will become"
+#~ msgstr "buzdan kalesine götürüyoruz :"
+
+#~ msgid "the Imperial Ace!"
+#~ msgstr "İmparatorluk Ası olacaksın!"
+
+#~ msgid "But right in the middle of the ceremony,"
+#~ msgstr "Törenin tam ortasında Bölme Ülkesi'nden"
+
+#~ msgid "needs your help!"
+#~ msgstr "yardımında gereksinimi var!"
+
+#~ msgid "Penguin scientists have learned that all"
+#~ msgstr "Penguen bilim adamları tüm bu saldırıların"
+
+#~ msgid "these attacks are coming from a secret"
+#~ msgstr "gizli bir üsten geldiğini öğrendi ve senin"
+
+#~ msgid "base, and they need you to go fight"
+#~ msgstr "gidip bu işi sona erdirecek savaşı"
+
+#~ msgid "the final battle. They also give you"
+#~ msgstr "kazanmana ihtiyaçları var. Sana bir de ipuuc"
+
+#~ msgid "this clue: first do multiplication and"
+#~ msgstr "verdiler: Önce çarpma ve bölmeyi, ondan"
+
+#~ msgid "division, and then do addition and subtraction."
+#~ msgstr "sonra toplama ve çıkarmayı yap."
+
+#~ msgid "forever, Commando!"
+#~ msgstr "durdurabilirsin Komando!"
+
+#~ msgid "Other Math Command Activities"
+#~ msgstr "Diğer Matematik Komutanlığı Etkinlikleri"

Added: tuxmath/trunk/po/tuxmath.pot
===================================================================
--- tuxmath/trunk/po/tuxmath.pot	                        (rev 0)
+++ tuxmath/trunk/po/tuxmath.pot	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,664 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath 1.7.1\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr ""
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr ""
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr ""
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr ""
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr ""
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr ""
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr ""
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr ""
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr ""
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr ""
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr ""
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr ""
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr ""
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr ""
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr ""
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr ""
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr ""
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr ""
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr ""
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr ""
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr ""
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr ""
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr ""
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr ""
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr ""
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr ""
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr ""
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr ""
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr ""
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr ""
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr ""
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr ""
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr ""
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr ""
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr ""
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr ""
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr ""
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr ""
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr ""
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr ""
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr ""
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr ""
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr ""
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr ""
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr ""
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr ""
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr ""
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr ""
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr ""
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr ""
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr ""
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr ""
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr ""
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr ""
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr ""
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr ""
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr ""
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr ""
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr ""
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr ""
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr ""
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr ""
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr ""
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr ""
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr ""
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr ""
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr ""
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr ""
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr ""
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr ""
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr ""
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr ""
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr ""
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr ""
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr ""
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr ""
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr ""
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr ""
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr ""
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr ""
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr ""
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr ""
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr ""
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr ""
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr ""
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr ""
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:50
+msgid "Adding Positives to Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:52
+msgid "Subtracting Positives From Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr ""
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr ""

Added: tuxmath/trunk/po/zh_CN.gmo
===================================================================
(Binary files differ)


Property changes on: tuxmath/trunk/po/zh_CN.gmo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: tuxmath/trunk/po/zh_CN.po
===================================================================
--- tuxmath/trunk/po/zh_CN.po	                        (rev 0)
+++ tuxmath/trunk/po/zh_CN.po	2009-02-15 16:47:57 UTC (rev 888)
@@ -0,0 +1,680 @@
+# Simplified Chinese translation for tuxmath
+# Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008
+# This file is distributed under the same license as the tuxmath package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2008.
+#
+# Contributors:
+# TeliuTe <teliute at 163.com>
+msgid ""
+msgstr ""
+"Project-Id-Version: tuxmath\n"
+"Report-Msgid-Bugs-To: tuxmath-devel at lists.sourceforge.net\n"
+"POT-Creation-Date: 2009-02-14 16:59-0600\n"
+"PO-Revision-Date: 2009-02-07 18:04+0800\n"
+"Last-Translator: Xavier <XavierXavierye at gmail.com>\n"
+"Language-Team: Simplified Chinese <zh_CN at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2008-05-06 22:24+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#: src/campaign.h:29
+msgid "-[Esc] to skip"
+msgstr "按Esc键跳过"
+
+#: src/campaign.h:30
+msgid "Mission One: Careful Cadet"
+msgstr "第一个任务:认真的军校学员"
+
+#: src/campaign.h:32
+msgid "I'm so glad you've come!"
+msgstr "很高兴你来了"
+
+#: src/campaign.h:34
+msgid ""
+"The penguins need your help! Comets are falling from the sky, and are "
+"melting the penguins' igloos. To save their homes, we need you to find the "
+"secret code that will zap each comet."
+msgstr ""
+"企鹅需要你的帮助!彗星从天而降,正在融化企鹅的小屋。为了保护它们的房子,需要"
+"你找到密码打败"
+
+#: src/campaign.h:36
+msgid "Do your best!"
+msgstr "尽你所能!"
+
+#: src/campaign.h:42
+msgid "Mission Two: Smart Scout"
+msgstr "第二个任务:聪明的侦察员"
+
+#: src/campaign.h:44
+msgid ""
+"Great job! Since you saved the penguins' homes, we are promoting you to "
+"Scout. Scouts are good for keeping an eye out for trouble..."
+msgstr "干的好!因为你保护了企鹅的小屋,提升你为侦察员,监控可能的麻烦..."
+
+#: src/campaign.h:46
+msgid ""
+"...like what's happening right now! The TakeAways have come, and they're "
+"sending new, trickier comets against the penguins!"
+msgstr ""
+"...就象正在发生的!掠夺者来了,他们正在发射新的,更狡猾的彗星来攻击企鹅!"
+
+#: src/campaign.h:47
+msgid "But you can save them!"
+msgstr "但是你可以保护他们!"
+
+#: src/campaign.h:53
+msgid "Mission Three: Royal Ranger"
+msgstr "第三个任务:皇家突击队"
+
+#: src/campaign.h:55
+msgid ""
+"You've done it again! The Penguin Emperor has chosen you to join his team of "
+"Rangers that help protect the city.  We're sending you there now..."
+msgstr ""
+"你又做到了!企鹅国王挑选你参加他的突击队,保卫城市。我们现在就送你到那儿去..."
+
+#: src/campaign.h:57
+msgid ""
+"...oh no! Now the Emperor himself is under attack, from new types of comets: "
+"these problems are multiplying! To fight these, you need great skill. We "
+"think you can do it. Join the Rangers and help save the city!"
+msgstr ""
+"...哦不!现在国王自己受到来自新的彗星攻击了,这些是乘法问题!你需要更强的技能"
+"击败攻击。我们相信你能做到。加入突击队保卫城市吧!"
+
+#: src/campaign.h:63
+msgid "Mission Four: Imperial Ace"
+msgstr "第四个任务:皇家王牌飞行员"
+
+#: src/campaign.h:65
+msgid ""
+"You did it! The Emperor wants to thank you in person. We are taking you to "
+"his ice palace for a great honor: you will become the Imperial Ace!"
+msgstr ""
+"你做到了!国外想亲自感谢你。我们非常荣幸地带你到他的冰做的宫殿去:你将成为皇"
+"家王牌飞行员!"
+
+#: src/campaign.h:67
+msgid ""
+"But right in the middle of the ceremony, a new attack from the land of "
+"Division starts!"
+msgstr "但就在庆典时,一个来自除法之地的新攻击开始了!"
+
+#: src/campaign.h:68
+msgid "Now is no time for resting; the city needs your help!"
+msgstr "现在没有时间让你休息;城市需要你的帮助!"
+
+#: src/campaign.h:74
+msgid "Final Mission: Computing Commando"
+msgstr "最后任务:计算突击队"
+
+#: src/campaign.h:76
+msgid ""
+"Penguin scientists have learned that all these attacks are coming from a "
+"secret base, and they need you to go fight the final battle. They also give "
+"you this clue: first do multiplication and division, and then do addition "
+"and subtraction."
+msgstr ""
+"企鹅科学家研究后发显,所有的攻击都来自一个秘密基地,他们需要你去打赢这最后的"
+"战斗。科学家们还给你一个线索:先做乘法再做除法,然后做加法和减法。"
+
+#: src/campaign.h:77
+msgid "I hope that hint helps!"
+msgstr "希望提示能帮到你!"
+
+#: src/campaign.h:79
+msgid "This is it! You can stop these attacks forever, Commando!"
+msgstr "就是这样!你是突击队员,你可以永远制止这些攻击,"
+
+#: src/campaign.c:31
+msgid "Congratulations! You win!"
+msgstr "恭喜!你赢了!"
+
+#: src/campaign.c:49
+msgid "Round"
+msgstr "回合"
+
+#: src/campaign.c:159
+msgid "Sorry, try again!"
+msgstr "对不起,请再试一次!"
+
+#: src/campaign.c:166
+msgid "Mission accomplished. The galaxy is safe!"
+msgstr "任务完成。银河系安全了!"
+
+#: src/factoroids.c:558
+msgid "FACTOROIDS: to win, you need destroy all the asteroids."
+msgstr "因数分解游戏:要赢的话,你得击毁所有的小行星。"
+
+#: src/factoroids.c:559 src/factoroids.c:570
+msgid "Use the arrow keys to turn or go forward.  Aim at an asteroid,"
+msgstr "用键盘上的方向键转动或前进。瞄准一个小行星,"
+
+#: src/factoroids.c:560
+msgid "type one of its factors, and press space or return"
+msgstr "输入其中一个的系数,然后按空格或回车"
+
+#: src/factoroids.c:561
+msgid "to split it into its factors.  Rocks with prime numbers are destroyed!"
+msgstr "分解成系数。带有质数的岩石会被摧毁"
+
+#: src/factoroids.c:569
+msgid "FRACTIONS: to win, you need destroy all the asteroids"
+msgstr "分数:要赢的话,你得消灭所有的小行星"
+
+#: src/factoroids.c:571
+msgid "type a number that can simplify the fraction, and press space or return"
+msgstr "输入可以简化分数的数,然后按空格或回车键"
+
+#: src/factoroids.c:572
+msgid ""
+"to split it.  Destroy fractions that can not be further simplified in a "
+"single shot!"
+msgstr "分解它。"
+
+#: src/game.c:717
+msgid "Welcome to TuxMath!"
+msgstr "欢迎来到TuxMax!"
+
+#: src/game.c:734
+msgid "Your mission is to save your"
+msgstr "你的任务是保护你的"
+
+#: src/game.c:735
+msgid "penguins' igloos from the"
+msgstr "企鹅的小屋"
+
+#: src/game.c:736
+msgid "falling comets."
+msgstr "正在降落的彗星。"
+
+#: src/game.c:755
+msgid "Stop a comet by typing"
+msgstr "要制止彗星的话,按"
+
+#: src/game.c:756
+msgid "the answer to the math problem"
+msgstr "数学问题的答案"
+
+#: src/game.c:757
+msgid "and hitting 'space' or 'enter'."
+msgstr "按空格或回车键"
+
+#: src/game.c:758
+msgid "Try it now!"
+msgstr "现在就试一试吧!"
+
+#: src/game.c:766
+msgid "Good shot!"
+msgstr "打的好!"
+
+#: src/game.c:776
+msgid "If an igloo gets hit by a comet,"
+msgstr "如果一个小屋被彗星击中的话,"
+
+#: src/game.c:777
+msgid "it melts. But don't worry: the"
+msgstr "如果融化的话,别担心:"
+
+#: src/game.c:778
+msgid "penguin is OK!"
+msgstr "企鹅正常!"
+
+#: src/game.c:779
+msgid "Just watch what happens:"
+msgstr "只要观察发生了什么:"
+
+#: src/game.c:780
+msgid "(Press a key to start)"
+msgstr "(按任意键开始)"
+
+#: src/game.c:793
+msgid "Notice the answer"
+msgstr "注意答案"
+
+#: src/game.c:803
+msgid "If it gets hit again, the"
+msgstr "如果再次被击中的话,"
+
+#: src/game.c:804
+msgid "penguin leaves."
+msgstr "企鹅离开了。"
+
+#: src/game.c:805
+msgid "(Press a key when ready)"
+msgstr "(准备好后按任意键)"
+
+#: src/game.c:824
+msgid "You can fix the igloos"
+msgstr "你可以修复小屋"
+
+#: src/game.c:825
+msgid "by stopping bonus comets."
+msgstr "通过停止奖励的彗星"
+
+#: src/game.c:834
+msgid "Zap it now!"
+msgstr "现在攻击!"
+
+#: src/game.c:838
+msgid "Great job!"
+msgstr "干的好!"
+
+#: src/game.c:852
+msgid "Quit at any time by pressing"
+msgstr "任何时间退出,按"
+
+#: src/game.c:853
+msgid "'Esc' or clicking the 'X'"
+msgstr "按'Esc'键或点击'X'"
+
+#: src/game.c:854
+msgid "in the upper right corner."
+msgstr "在右上角"
+
+#: src/game.c:855
+msgid "Do it now, and then play!"
+msgstr "现在就做,开始吧!"
+
+#: src/highscore.c:213 src/titlescreen.c:864
+msgid "Hall Of Fame"
+msgstr "排行榜"
+
+#: src/highscore.c:235 src/highscore.c:256 src/titlescreen.c:800
+#: src/titlescreen.c:859
+msgid "Space Cadet"
+msgstr "太空警"
+
+#: src/highscore.c:238 src/titlescreen.c:801 src/titlescreen.c:860
+msgid "Scout"
+msgstr "童子军"
+
+#: src/highscore.c:241 src/titlescreen.c:802 src/titlescreen.c:861
+msgid "Ranger"
+msgstr "巡逻兵"
+
+#: src/highscore.c:244 src/titlescreen.c:803 src/titlescreen.c:862
+msgid "Ace"
+msgstr "王牌飞行员"
+
+#: src/highscore.c:247 src/titlescreen.c:804 src/titlescreen.c:863
+msgid "Commando"
+msgstr "突击队"
+
+#: src/highscore.c:250 src/titlescreen.c:983
+msgid "Factors"
+msgstr "系数"
+
+#: src/highscore.c:253 src/titlescreen.c:984
+msgid "Fractions"
+msgstr "分数"
+
+#: src/highscore.c:359
+msgid "You Are In The Hall of Fame!"
+msgstr ""
+
+#: src/highscore.c:359
+msgid "Enter Your Name:"
+msgstr ""
+
+#: src/titlescreen.c:486
+msgid "Work In Progress!"
+msgstr "运行中"
+
+#: src/titlescreen.c:487
+msgid "This feature is not ready yet"
+msgstr "角色还没准备好"
+
+#: src/titlescreen.c:488
+msgid "Discuss the future of TuxMath at"
+msgstr "讨论TuxMath:"
+
+#: src/titlescreen.c:489
+msgid "tuxmath-devel at lists.sourceforge.net"
+msgstr "tuxmath-devel at lists.sourceforge.net"
+
+#: src/titlescreen.c:662
+msgid "Play Alone"
+msgstr "自己玩"
+
+#: src/titlescreen.c:663
+msgid "Play With Friends"
+msgstr "和朋友一起玩"
+
+#: src/titlescreen.c:664
+msgid "Factoroids!"
+msgstr "因数分解!"
+
+#: src/titlescreen.c:665
+msgid "Help"
+msgstr "帮助"
+
+#: src/titlescreen.c:666
+msgid "More Options"
+msgstr "更多选项"
+
+#: src/titlescreen.c:667
+msgid "Quit"
+msgstr "退出"
+
+#: src/titlescreen.c:741
+msgid "Math Command Training Academy"
+msgstr "数学运算练习"
+
+#: src/titlescreen.c:742
+msgid "Math Command Fleet Missions"
+msgstr "数学命令舰队任务"
+
+#: src/titlescreen.c:743
+msgid "Play Arcade Game"
+msgstr "街机游戏"
+
+#: src/titlescreen.c:744
+msgid "Play Custom Game"
+msgstr "自定义游戏"
+
+#: src/titlescreen.c:745 src/titlescreen.c:796 src/titlescreen.c:805
+#: src/titlescreen.c:865 src/titlescreen.c:985
+msgid "Main menu"
+msgstr "主菜单"
+
+#: src/titlescreen.c:794
+msgid "Score Sweep"
+msgstr "消除得分"
+
+#: src/titlescreen.c:795
+msgid "Elimination"
+msgstr "消减"
+
+#: src/titlescreen.c:839
+msgid "How many kids are playing?"
+msgstr "参加游戏的小朋友数量?"
+
+#: src/titlescreen.c:840
+msgid "(Between 2 and 4 players)"
+msgstr "(2到4个玩家)"
+
+#: src/titlescreen.c:959
+msgid "Edit 'options' file in your home directory"
+msgstr "在你的主文件夹编辑'options' 选项文件"
+
+#: src/titlescreen.c:960
+msgid "to create customized game!"
+msgstr "创建自定义游戏!"
+
+#: src/titlescreen.c:961
+msgid "Press a key or click your mouse to start game."
+msgstr "按任意键或点击鼠标开始游戏。"
+
+#: src/titlescreen.c:962
+msgid "See README.txt for more information"
+msgstr "查看 README.txt 文件以获得更多信息"
+
+#: src/titlescreen.c:1077
+msgid "Demo"
+msgstr "演示"
+
+#: src/titlescreen.c:1078
+msgid "Project Info"
+msgstr "工程信息"
+
+#: src/titlescreen.c:1079
+msgid "Credits"
+msgstr "贡献者"
+
+#: src/titlescreen.c:1080
+msgid "Main Menu"
+msgstr "主菜单"
+
+#: src/titlescreen.c:1128
+msgid "TuxMath is free and open-source!"
+msgstr "TuxMath 是自由软件而且是开放源代码的!"
+
+#: src/titlescreen.c:1129
+msgid "You can help make it better by reporting problems,"
+msgstr "你可以改进它或报告程序错误,"
+
+#: src/titlescreen.c:1130
+msgid "suggesting improvements, or adding code."
+msgstr "提出改进建议或增加代码。"
+
+#: src/titlescreen.c:1131
+msgid "Discuss the future at tuxmath-devel at lists.sourceforge.net"
+msgstr "讨论TuxMath: tuxmath-devel at lists.sourceforge.net"
+
+#: data/missions/lessons/descr_lessons:1
+msgid "Number Typing"
+msgstr "输入数字"
+
+#: data/missions/lessons/descr_lessons:2
+msgid "Addition: 1 to 3"
+msgstr "加法:1-3"
+
+#: data/missions/lessons/descr_lessons:3
+msgid "Addition: 0 to 5"
+msgstr "加法:0-5"
+
+#: data/missions/lessons/descr_lessons:4
+msgid "Addition: Sums to 10"
+msgstr "加法:10以内"
+
+#: data/missions/lessons/descr_lessons:5
+msgid "Addition: Sums to 15"
+msgstr "加法:15以内"
+
+#: data/missions/lessons/descr_lessons:6
+msgid "Addition: Sums to 20"
+msgstr "加法:20以内"
+
+#: data/missions/lessons/descr_lessons:7
+msgid "Addition: Two Digit Numbers"
+msgstr "加法:两位数加法"
+
+#: data/missions/lessons/descr_lessons:8
+msgid "Addition: Missing Numbers"
+msgstr "加法:缺少的数字"
+
+#: data/missions/lessons/descr_lessons:9
+msgid "Subtraction: 0 to 10"
+msgstr "减法:10以内"
+
+#: data/missions/lessons/descr_lessons:10
+msgid "Subtraction: 0 to 20"
+msgstr "减法:20以内"
+
+#: data/missions/lessons/descr_lessons:11
+msgid "Subtraction: Two Digit Numbers"
+msgstr "减法:两位数"
+
+#: data/missions/lessons/descr_lessons:12
+msgid "Addition and Subtraction Review"
+msgstr "加减法复习"
+
+#: data/missions/lessons/descr_lessons:13
+msgid "Multiplication: 0 to 3"
+msgstr "乘法:3以内"
+
+#: data/missions/lessons/descr_lessons:14
+msgid "Multiples of 2"
+msgstr "2的倍数"
+
+#: data/missions/lessons/descr_lessons:15
+msgid "Multiples of 3"
+msgstr "3的倍数"
+
+#: data/missions/lessons/descr_lessons:16
+msgid "Multiples of 4"
+msgstr "4的倍数"
+
+#: data/missions/lessons/descr_lessons:17
+msgid "Multiples of 5"
+msgstr "5的倍数"
+
+#: data/missions/lessons/descr_lessons:18
+msgid "Multiplication: 0 to 5"
+msgstr "乘法:5以内"
+
+#: data/missions/lessons/descr_lessons:19
+msgid "Multiples of 6"
+msgstr "6的倍数"
+
+#: data/missions/lessons/descr_lessons:20
+msgid "Multiples of 7"
+msgstr "7的倍数"
+
+#: data/missions/lessons/descr_lessons:21
+msgid "Multiplication: 0 to 7"
+msgstr "乘法:7以内"
+
+#: data/missions/lessons/descr_lessons:22
+msgid "Multiples of 8"
+msgstr "8的倍数"
+
+#: data/missions/lessons/descr_lessons:23
+msgid "Multiples of 9"
+msgstr "9的倍数"
+
+#: data/missions/lessons/descr_lessons:24
+msgid "Multiples of 10"
+msgstr "10的倍数"
+
+#: data/missions/lessons/descr_lessons:25
+msgid "Multiplication: 0 to 10"
+msgstr "乘法:10以内"
+
+#: data/missions/lessons/descr_lessons:26
+msgid "Multiples of 11 and 12"
+msgstr "11和12的倍数"
+
+#: data/missions/lessons/descr_lessons:27
+msgid "Multiplication: 0 to 12"
+msgstr "乘法:12以内"
+
+#: data/missions/lessons/descr_lessons:28
+msgid "Multiples of 13, 14, and 15"
+msgstr "13,14和15的倍数"
+
+#: data/missions/lessons/descr_lessons:29
+msgid "Multiplication: 0 to 15"
+msgstr "乘法:15以内"
+
+#: data/missions/lessons/descr_lessons:30
+msgid "Multiplication: Missing Numbers"
+msgstr "乘法:缺少的数字"
+
+#: data/missions/lessons/descr_lessons:31
+msgid "Division by 2"
+msgstr "2的除法"
+
+#: data/missions/lessons/descr_lessons:32
+msgid "Division by 3"
+msgstr "3的除法"
+
+#: data/missions/lessons/descr_lessons:33
+msgid "Division by 4"
+msgstr "4的除法"
+
+#: data/missions/lessons/descr_lessons:34
+msgid "Division by 5"
+msgstr "5的除法"
+
+#: data/missions/lessons/descr_lessons:35
+msgid "Division: 1 to 5"
+msgstr "除法:5以内"
+
+#: data/missions/lessons/descr_lessons:36
+msgid "Division by 6"
+msgstr "6的除法"
+
+#: data/missions/lessons/descr_lessons:37
+msgid "Division by 7"
+msgstr "7的除法"
+
+#: data/missions/lessons/descr_lessons:38
+msgid "Division by 8"
+msgstr "8的除法"
+
+#: data/missions/lessons/descr_lessons:39
+msgid "Division by 9"
+msgstr "9的除法"
+
+#: data/missions/lessons/descr_lessons:40
+msgid "Division by 10"
+msgstr "10的除法"
+
+#: data/missions/lessons/descr_lessons:41
+msgid "Division: 1 to 10"
+msgstr "除法:10以内"
+
+#: data/missions/lessons/descr_lessons:42
+msgid "Division by 11 and 12"
+msgstr "11和12的除法"
+
+#: data/missions/lessons/descr_lessons:43
+msgid "Division: 1 to 12"
+msgstr "除法:12以内"
+
+#: data/missions/lessons/descr_lessons:44
+msgid "Division by 13, 14, and 15"
+msgstr "13,14,15的除法"
+
+#: data/missions/lessons/descr_lessons:45
+msgid "Division: 1 to 15"
+msgstr "除法:15以内"
+
+#: data/missions/lessons/descr_lessons:46
+msgid "Multiplication and Division Review"
+msgstr "乘除法复习"
+
+#: data/missions/lessons/descr_lessons:47
+msgid "Typing Negative Numbers"
+msgstr "输入负数"
+
+#: data/missions/lessons/descr_lessons:48
+msgid "Subtraction: Negative Answers"
+msgstr "减法:负数"
+
+#: data/missions/lessons/descr_lessons:49
+msgid "Adding Negatives to Positives"
+msgstr "正负数加法"
+
+#: data/missions/lessons/descr_lessons:50
+#, fuzzy
+msgid "Adding Positives to Negatives"
+msgstr "负数的加法"
+
+#: data/missions/lessons/descr_lessons:51
+msgid "Subtracting Negatives From Positives"
+msgstr "正负数减法"
+
+#: data/missions/lessons/descr_lessons:52
+#, fuzzy
+msgid "Subtracting Positives From Negatives"
+msgstr "负数的减法"
+
+#: data/missions/lessons/descr_lessons:53
+msgid "Adding Negatives to Negatives"
+msgstr "负数的加法"
+
+#: data/missions/lessons/descr_lessons:54
+msgid "Subtracting Negatives From Negatives"
+msgstr "负数的减法"
+
+#: data/missions/lessons/descr_lessons:55
+msgid "Negative and Positive Numbers Review"
+msgstr "正负数运算复习"
+
+#: data/missions/lessons/descr_lessons:56
+msgid "Multiplication and Division of Negatives"
+msgstr "负数的乘除"
+
+#: data/missions/lessons/descr_lessons:57
+msgid "Multiplication of Positives and Negatives"
+msgstr "正负数乘法"
+
+#: data/missions/lessons/descr_lessons:58
+msgid "Division of Positives and Negatives"
+msgstr "正负数除法"




More information about the Tux4kids-commits mailing list